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