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