Nginx 是開源、高性能、高可靠的 Web 和反向代理服務(wù)器,而且支持熱部署,幾乎可以做到 7 * 24 小時(shí)不間斷運(yùn)行,即使運(yùn)行幾個(gè)月也不需要重新啟動(dòng),還能在不間斷服務(wù)的情況下對軟件版本進(jìn)行熱更新。性能是 Nginx 最重要的考量,其占用內(nèi)存少、并發(fā)能力強(qiáng)、能支持高達(dá) 5w 個(gè)并發(fā)連接數(shù),最重要的是, Nginx 是免費(fèi)的并可以商業(yè)化,配置使用也比較簡單。
Nginx特點(diǎn)
高并發(fā)、高性能;
模塊化架構(gòu)使得它的擴(kuò)展性非常好;
異步非阻塞的事件驅(qū)動(dòng)模型這點(diǎn)和 Node.js 相似;
相對于其它服務(wù)器來說它可以連續(xù)幾個(gè)月甚至更長而不需要重啟服務(wù)器使得它具有高可靠性;
熱部署、平滑升級;
完全開源,生態(tài)繁榮;
Nginx作用
Nginx 的最重要的幾個(gè)使用場景:
靜態(tài)資源服務(wù),通過本地文件系統(tǒng)提供服務(wù);
反向代理服務(wù),延伸出包括緩存、負(fù)載均衡等;
API 服務(wù), OpenResty ;
對于前端來說 Node.js 并不陌生, Nginx 和 Node.js 的很多理念類似, HTTP 服務(wù)器、事件驅(qū)動(dòng)、異步非阻塞等,且 Nginx 的大部分功能使用 Node.js 也可以實(shí)現(xiàn),但 Nginx 和 Node.js 并不沖突,都有自己擅長的領(lǐng)域。Nginx 擅長于底層服務(wù)器端資源的處理(靜態(tài)資源處理轉(zhuǎn)發(fā)、反向代理,負(fù)載均衡等), Node.js 更擅長上層具體業(yè)務(wù)邏輯的處理,兩者可以完美組合。
用一張圖表示:
Nginx常用命令
nginx -s reload # 向主進(jìn)程發(fā)送信號(hào),重新加載配置文件,熱重啟 nginx -s reopen # 重啟 Nginx nginx -s stop # 快速關(guān)閉 nginx -s quit # 等待工作進(jìn)程處理完成后關(guān)閉 nginx -T # 查看當(dāng)前 Nginx 最終的配置 nginx -t # 檢查配置是否有問題
Nginx核心配置
nginx.conf配置文件結(jié)構(gòu)
Nginx 的典型配置示例:
# main段配置信息 user nginx; # 運(yùn)行用戶,默認(rèn)即是nginx,可以不進(jìn)行設(shè)置 worker_processes auto; # Nginx 進(jìn)程數(shù),一般設(shè)置為和 CPU 核數(shù)一樣 error_log /var/log/nginx/error.log warn; # Nginx 的錯(cuò)誤日志存放目錄 pid /var/run/nginx.pid; # Nginx 服務(wù)啟動(dòng)時(shí)的 pid 存放位置 # events段配置信息 events { use epoll; # 使用epoll的I/O模型(如果你不知道Nginx該使用哪種輪詢方法,會(huì)自動(dòng)選擇一個(gè)最適合你操作系統(tǒng)的) worker_connections 1024; # 每個(gè)進(jìn)程允許最大并發(fā)數(shù) } # http段配置信息 # 配置使用最頻繁的部分,代理、緩存、日志定義等絕大多數(shù)功能和第三方模塊的配置都在這里設(shè)置 http { # 設(shè)置日志模式 log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main; # Nginx訪問日志存放位置 sendfile on; # 開啟高效傳輸模式 tcp_nopush on; # 減少網(wǎng)絡(luò)報(bào)文段的數(shù)量 tcp_nodelay on; keepalive_timeout 65; # 保持連接的時(shí)間,也叫超時(shí)時(shí)間,單位秒 types_hash_max_size 2048; include /etc/nginx/mime.types; # 文件擴(kuò)展名與類型映射表 default_type application/octet-stream; # 默認(rèn)文件類型 include /etc/nginx/conf.d/*.conf; # 加載子配置項(xiàng) # server段配置信息 server { listen 80; # 配置監(jiān)聽的端口 server_name localhost; # 配置的域名 # location段配置信息 location / { root /usr/share/nginx/html; # 網(wǎng)站根目錄 index index.html index.htm; # 默認(rèn)首頁文件 deny 172.168.22.11; # 禁止訪問的ip地址,可以為all allow 172.168.33.44;# 允許訪問的ip地址,可以為all } error_page 500 502 503 504 /50x.html; # 默認(rèn)50x對應(yīng)的訪問頁面 error_page 400 404 error.html; # 同上 } }
main 全局配置,對全局生效;
events 配置影響 Nginx 服務(wù)器與用戶的網(wǎng)絡(luò)連接;
http 配置代理,緩存,日志定義等絕大多數(shù)功能和第三方模塊的配置;
server 配置虛擬主機(jī)的相關(guān)參數(shù),一個(gè) http 塊中可以有多個(gè) server 塊;
location 用于配置匹配的 uri ;
upstream 配置后端服務(wù)器具體地址,負(fù)載均衡配置不可或缺的部分;
用一張圖清晰的展示它的層級結(jié)構(gòu):
nginx.conf 配置文件的語法規(guī)則:
配置文件由指令與指令塊構(gòu)成
每條指令以 “;” 分號(hào)結(jié)尾,指令與參數(shù)間以空格符號(hào)分隔
指令塊以 {} 大括號(hào)將多條指令組織在一起
include 語句允許組合多個(gè)配置文件以提升可維護(hù)性
通過 # 符號(hào)添加注釋,提高可讀性
通過 $ 符號(hào)使用變量
部分指令的參數(shù)支持正則表達(dá)式,例如常用的 location 指令
配置文件 main 段核心參數(shù)
user
指定運(yùn)行 Nginx 的 woker 子進(jìn)程的屬主和屬組,其中組可以不指定。
#語法:user USERNAME [GROUP] user nginx lion; # 用戶是nginx;組是lion
pid
指定運(yùn)行 Nginx master 主進(jìn)程的 pid 文件存放路徑。
pid /opt/nginx/logs/nginx.pid # master主進(jìn)程的的pid存放在nginx.pid的文件
worker_rlimit_nofile_number
指定worker子進(jìn)程可以打開的最大文件句柄數(shù)。
worker_rlimit_nofile 20480; # 可以理解成每個(gè)worker子進(jìn)程的最大連接數(shù)量。
worker_rlimit_core
指定 worker 子進(jìn)程異常終止后的 core 文件,用于記錄分析問題。
worker_rlimit_core 50M; # 存放大小限制 working_directory /opt/nginx/tmp; # 存放目錄
worker_processes_number
指定 Nginx 啟動(dòng)的 worker 子進(jìn)程數(shù)量。
worker_processes 4; # 指定具體子進(jìn)程數(shù)量 worker_processes auto; # 與當(dāng)前cpu物理核心數(shù)一致
worker_cpu_affinity
將每個(gè) worker 子進(jìn)程與我們的 cpu 物理核心綁定。
worker_cpu_affinity 0001 0010 0100 1000; # 4個(gè)物理核心,4個(gè)worker子進(jìn)程
將每個(gè) worker 子進(jìn)程與特定 CPU 物理核心綁定,優(yōu)勢在于,避免同一個(gè) worker 子進(jìn)程在不同的 CPU 核心上切換,緩存失效,降低性能。但其并不能真正的避免進(jìn)程切換。
worker_priority
指定 worker 子進(jìn)程的 nice 值,以調(diào)整運(yùn)行 Nginx 的優(yōu)先級,通常設(shè)定為負(fù)值,以優(yōu)先調(diào)用 Nginx 。
worker_priority -10; # 120-10=110,110就是最終的優(yōu)先級
Linux 默認(rèn)進(jìn)程的優(yōu)先級值是120,值越小越優(yōu)先;nice 值范圍為 -20 到 +19 。
備注:應(yīng)用的默認(rèn)優(yōu)先級值是120加上 nice 值等于它最終的值,這個(gè)值越小,優(yōu)先級越高。
worker_shutdown_timeout
指定 worker 子進(jìn)程優(yōu)雅退出時(shí)的超時(shí)時(shí)間。
worker_shutdown_timeout 5s;
timer_resolution
worker 子進(jìn)程內(nèi)部使用的計(jì)時(shí)器精度,調(diào)整時(shí)間間隔越大,系統(tǒng)調(diào)用越少,有利于性能提升;反之,系統(tǒng)調(diào)用越多,性能下降。
timer_resolution 100ms;
在 Linux 系統(tǒng)中,用戶需要獲取計(jì)時(shí)器時(shí)需要向操作系統(tǒng)內(nèi)核發(fā)送請求,有請求就必然會(huì)有開銷,因此這個(gè)間隔越大開銷就越小。
daemon
指定 Nginx 的運(yùn)行方式,前臺(tái)還是后臺(tái),前臺(tái)用于調(diào)試,后臺(tái)用于生產(chǎn)。
daemon off; # 默認(rèn)是on,后臺(tái)運(yùn)行模式
配置文件 events 段核心參數(shù)
use
Nginx 使用何種事件驅(qū)動(dòng)模型。
use method; # 不推薦配置它,讓nginx自己選擇
method 可選值為:select、poll、kqueue、epoll、/dev/poll、eventport
worker_connections
worker 子進(jìn)程能夠處理的最大并發(fā)連接數(shù)。
worker_connections 1024 # 每個(gè)子進(jìn)程的最大連接數(shù)為1024
accept_mutex
是否打開負(fù)載均衡互斥鎖。
accept_mutex on # 默認(rèn)是off關(guān)閉的,這里推薦打開
server_name 指令
指定虛擬主機(jī)域名。
#語法:server_name name1 name2 name3 # 示例: server_name www.nginx.com;
域名匹配的四種寫法:
精確匹配:server_name http://www.nginx.com ;
左側(cè)通配:server_name *.http://nginx.com ;
右側(cè)統(tǒng)配:server_name www.nginx.* ;
正則匹配:server_name ~^www.nginx.*$ ;
匹配優(yōu)先級:精確匹配 > 左側(cè)通配符匹配 > 右側(cè)通配符匹配 > 正則表達(dá)式匹配
server_name 配置實(shí)例:
1、配置本地 DNS 解析 hosts
# 添加如下內(nèi)容,其中 121.42.11.34 是阿里云服務(wù)器IP地址 121.42.11.34 www.nginx-test.com 121.42.11.34 mail.nginx-test.com 121.42.11.34 www.nginx-test.org 121.42.11.34 doc.nginx-test.com 121.42.11.34 www.nginx-test.cn 121.42.11.34 fe.nginx-test.club
注意:這里使用的是虛擬域名進(jìn)行測試,因此需要配置本地 DNS 解析,如果使用阿里云上購買的域名,則需要在阿里云上設(shè)置好域名解析。
2、配置阿里云Nginx,vim /etc/nginx/nginx.conf
# 這里只列舉了http端中的sever端配置 # 左匹配
server { listen 80; server_name *.nginx-test.com; root /usr/share/nginx/html/nginx-test/left-match/; location / { index index.html; } }
# 正則匹配
server { listen 80; server_name ~^.*.nginx-test..*$; root /usr/share/nginx/html/nginx-test/reg-match/; location / { index index.html; } }
# 右匹配
server { listen 80; server_name www.nginx-test.*; root /usr/share/nginx/html/nginx-test/right-match/; location / { index index.html; } }
# 完全匹配
server { listen 80; server_name www.nginx-test.com; root /usr/share/nginx/html/nginx-test/all-match/; location / { index index.html; } }
3、訪問分析
當(dāng)訪問 http://www.nginx-test.com 時(shí),都可以被匹配上,因此選擇優(yōu)先級最高的“完全匹配”;
當(dāng)訪問 http://mail.nginx-test.com 時(shí),會(huì)進(jìn)行“左匹配”;
當(dāng)訪問 http://www.nginx-test.org 時(shí),會(huì)進(jìn)行“右匹配”;
當(dāng)訪問 http://doc.nginx-test.com 時(shí),會(huì)進(jìn)行“左匹配”;
當(dāng)訪問 http://www.nginx-test.cn 時(shí),會(huì)進(jìn)行“右匹配”;
當(dāng)訪問 fe.nginx-test.club 時(shí),會(huì)進(jìn)行“正則匹配”;
root
指定靜態(tài)資源目錄位置,它可以寫在 http 、 server 、 location 等配置中。
#root path #例如: location /image { root /opt/nginx/static; } #當(dāng)用戶訪問 www.test.com/image/1.png 時(shí),實(shí)際在服務(wù)器找的路徑是 /opt/nginx/static/image/1.png
注意:root 會(huì)將定義路徑與 URI 疊加, alias 則只取定義路徑。
alias
它也是指定靜態(tài)資源目錄位置,它只能寫在 location 中。
location /image { alias /opt/nginx/static/image/; } #當(dāng)用戶訪問 www.test.com/image/1.png 時(shí),實(shí)際在服務(wù)器找的路徑是 /opt/nginx/static/image/1.png
注意:使用 alias 末尾一定要添加 / ,并且它只能位于 location 中。
location
配置路徑。
location [ = | ~ | ~* | ^~ ] uri { ... }
匹配規(guī)則:
= 精確匹配;
~ 正則匹配,區(qū)分大小寫;
~* 正則匹配,不區(qū)分大小寫;
^~ 匹配到即停止搜索;
匹配優(yōu)先級:=>^~>~>~*> 不帶任何字符。
實(shí)例:
server { listen 80; server_name www.nginx-test.com; # 只有當(dāng)訪問 www.nginx-test.com/match_all/ 時(shí)才會(huì)匹配到/usr/share/nginx/html/match_all/index.html location = /match_all/ { root /usr/share/nginx/html index index.html } # 當(dāng)訪問 www.nginx-test.com/1.jpg 等路徑時(shí)會(huì)去 /usr/share/nginx/images/1.jpg 找對應(yīng)的資源 location ~ .(jpeg|jpg|png|svg)$ { root /usr/share/nginx/images; } # 當(dāng)訪問 www.nginx-test.com/bbs/ 時(shí)會(huì)匹配上 /usr/share/nginx/html/bbs/index.html location ^~ /bbs/ { root /usr/share/nginx/html; index index.html index.htm; } }
location 中的反斜線
location/test{ ... } location /test/ { ... }
不帶 / 當(dāng)訪問 http://www.nginx-test.com/test 時(shí), Nginx 先找是否有 test 目錄,如果有則找 test 目錄下的 index.html ;如果沒有 test 目錄, nginx 則會(huì)找是否有 test 文件。
帶 / 當(dāng)訪問 http://www.nginx-test.com/test 時(shí), Nginx 先找是否有 test 目錄,如果有則找 test 目錄下的 index.html ,如果沒有它也不會(huì)去找是否存在 test 文件。
return
停止處理請求,直接返回響應(yīng)碼或重定向到其他 URL ;執(zhí)行 return 指令后, location 中后續(xù)指令將不會(huì)被執(zhí)行。
#return code [text]; #return code URL; #return URL; #例如: location / { return 404; # 直接返回狀態(tài)碼 } location / { return 404 "pages not found"; # 返回狀態(tài)碼 + 一段文本 } location / { return 302 /bbs ; # 返回狀態(tài)碼 + 重定向地址 } location / { return https://www.baidu.com ; # 返回重定向地址 }
rewrite
根據(jù)指定正則表達(dá)式匹配規(guī)則,重寫 URL 。
#語法:rewrite 正則表達(dá)式 要替換的內(nèi)容 [flag]; #上下文(標(biāo)簽):server、location、if #示例:rewirte /images/(.*.jpg)$ /pic/$1; # $1是前面括號(hào)(.*.jpg)的反向引用
flag 可選值的含義:
last 重寫后的 URL 發(fā)起新請求,再次進(jìn)入 server 段,重試 location 的中的匹配;
break 直接使用重寫后的 URL ,不再匹配其它 location 中語句;
redirect 返回302臨時(shí)重定向;
permanent 返回301永久重定向;
server{ listen 80; server_name fe.lion.club; # 要在本地hosts文件進(jìn)行配置 root html; location /search { rewrite ^/(.*) https://www.baidu.com redirect; } location /images { rewrite /images/(.*) /pics/$1; } location /pics { rewrite /pics/(.*) /photos/$1; } location /photos { } }
按照這個(gè)配置我們來分析:
當(dāng)訪問 fe.lion.club/search 時(shí),會(huì)自動(dòng)幫我們重定向到 https://www.baidu.com。
當(dāng)訪問 fe.lion.club/images/1.jpg 時(shí),第一步重寫 URL 為 fe.lion.club/pics/1.jpg ,找到 pics 的 location ,繼續(xù)重寫 URL 為 fe.lion.club/photos/1.jpg ,找到 /photos 的 location 后,去 html/photos 目錄下尋找 1.jpg 靜態(tài)資源。
if 指令
#語法:if (condition) {...} #上下文:server、location #示例: if($http_user_agent ~ Chrome){ rewrite /(.*)/browser/$1 break; }
condition 判斷條件:
$variable 僅為變量時(shí),值為空或以0開頭字符串都會(huì)被當(dāng)做 false 處理;
= 或 != 相等或不等;
~ 正則匹配;
! ~ 非正則匹配;
~* 正則匹配,不區(qū)分大小寫;
-f 或 ! -f 檢測文件存在或不存在;
-d 或 ! -d 檢測目錄存在或不存在;
-e 或 ! -e 檢測文件、目錄、符號(hào)鏈接等存在或不存在;
-x 或 ! -x 檢測文件可以執(zhí)行或不可執(zhí)行;
實(shí)例:
server { listen 8080; server_name localhost; root html; location / { if ( $uri = "/images/" ){ rewrite (.*) /pics/ break; } } }
當(dāng)訪問 localhost:8080/images/ 時(shí),會(huì)進(jìn)入 if 判斷里面執(zhí)行 rewrite 命令。
autoindex
用戶請求以 / 結(jié)尾時(shí),列出目錄結(jié)構(gòu),可以用于快速搭建靜態(tài)資源下載網(wǎng)站。
autoindex.conf 配置信息:
server { listen 80; server_name fe.lion-test.club; location /download/ { root /opt/source; autoindex on; # 打開 autoindex,,可選參數(shù)有 on | off autoindex_exact_size on; # 修改為off,以KB、MB、GB顯示文件大小,默認(rèn)為on,以bytes顯示出?件的確切?? autoindex_format html; # 以html的方式進(jìn)行格式化,可選參數(shù)有 html | json | xml autoindex_localtime off; # 顯示的?件時(shí)間為?件的服務(wù)器時(shí)間。默認(rèn)為off,顯示的?件時(shí)間為GMT時(shí)間 } }
當(dāng)訪問 http://fe.xxx.com/download/ 時(shí),會(huì)把服務(wù)器 /opt/source/download/ 路徑下的文件展示出來。
審核編輯:湯梓紅
-
服務(wù)器
+關(guān)注
關(guān)注
12文章
9160瀏覽量
85426 -
開源
+關(guān)注
關(guān)注
3文章
3349瀏覽量
42501 -
命令
+關(guān)注
關(guān)注
5文章
684瀏覽量
22027 -
nginx
+關(guān)注
關(guān)注
0文章
149瀏覽量
12176
原文標(biāo)題:Nginx 常用配置與命令,必收藏~~
文章出處:【微信號(hào):magedu-Linux,微信公眾號(hào):馬哥Linux運(yùn)維】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論