Nginx配置常用參數(shù)梳理(看這一篇就夠了)
引言
最近在全面學(xué)習(xí)Nginx,當(dāng)作筆記了
主模塊
# 配置用戶或者組,默認(rèn)為nobody nobody。 #user www www; #Nginx開啟的worker進(jìn)程數(shù),建議為CPU的核數(shù) #worker_processes 2; #指定nginx進(jìn)程運行文件存放地址 #pid /nginx/pid/nginx.pid; #指定日志路徑,級別。這個設(shè)置可以放入全局塊、http塊、server塊,級別以此為:debug|info|notice|warn|error|crit|alert|emerg error_log log/error.log debug; #可以在任意地方使用include指令實現(xiàn)配置文件的包含,類似于apache中的include方法,可減少主配置文件長度。 include vhosts/*.conf;
事件模塊
events { #設(shè)置網(wǎng)路連接序列化,防止驚群現(xiàn)象發(fā)生,默認(rèn)為on accept_mutex on; #默認(rèn): 500ms 如果一個進(jìn)程沒有互斥鎖,它將延遲至少多長時間。默認(rèn)情況下,延遲是500ms 。 accept_mutex_delay 100ms; #設(shè)置一個進(jìn)程是否同時接受多個網(wǎng)絡(luò)連接,默認(rèn)為off multi_accept on; #事件驅(qū)動模型,select|poll|kqueue|epoll|resig|/dev/poll|eventport,不建議設(shè)置,nginx會自行選擇 #use epoll; #最大連接數(shù),默認(rèn)為512 worker_connections 1024; }
http部分
http { #文件擴(kuò)展名與文件類型映射表 include mime.types; # 默認(rèn)文件類型,默認(rèn)為text/plain default_type application/octet-stream; #取消服務(wù)日志 #access_log off; #允許sendfile方式傳輸文件,默認(rèn)為off,可以在http塊,server塊,location塊。 sendfile on; #每個進(jìn)程每次調(diào)用傳輸數(shù)量不能大于設(shè)定的值,默認(rèn)為0,即不設(shè)上限。 sendfile_max_chunk 100k; #連接超時時間,默認(rèn)為75s,可以在http,server,location塊。 keepalive_timeout 65; #開啟gzip資源壓縮 gzip on; # 負(fù)載均衡,詳細(xì)可看了一篇文章:https://learnku.com/articles/36737 upstream blog { server 192.167.20.19:8081; server 192.168.10.121:8080 weight=5; } #設(shè)定請求緩沖 client_header_buffer_size 128k; large_client_header_buffers 4 128k; #上傳文件的大小限制 默認(rèn)1m client_max_body_size 8m; server { #單連接請求上限次數(shù)。 keepalive_requests 120; #監(jiān)聽端口 listen 80; #監(jiān)聽地址 server_name blog.13sai.com; #設(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 /data/logs/access.log main; # 根目錄 root /www/web/public; # 定義錯誤提示頁面 error_page 500 502 503 504 /50x.html; location /static/ { #root與alias主要區(qū)別在于nginx如何解釋location后面的uri,這會使兩者分別以不同的方式將請求映射到服務(wù)器文件上。 #root的處理結(jié)果是:root路徑+location路徑 #alias的處理結(jié)果是:使用alias路徑替換location路徑 alias /www/static/; #過期30天,靜態(tài)文件不怎么更新,過期可以設(shè)大一點,如果頻繁更新,則可以設(shè)置得小一點。 expires 30d; } # 處理php請求到fpm端口 location ~ \.php$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } location / { proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_pass http://blog; #請求轉(zhuǎn)向blog 定義的服務(wù)器列表 } #禁止訪問文件 location ~ /.git { deny all; allow 127.0.0.1; #允許的ip } } }
部分參數(shù)詳細(xì)說明
server_name
1.首先選擇所有字符串完全匹配的server_name,如 blog.13sai.com 。
2.其次選擇通配符在前面的server_name,如 *.13sai.com。
3.再次選擇通配符在后面的server_name,如www.13sai.* 。
4.最后選擇使用正則表達(dá)式才匹配的server_name,如 ~^\.sai\.com$
如果都不匹配
- 1、優(yōu)先選擇listen配置項后有default或default_server的
- 2、找到匹配listen端口的第一個server塊
location
location
語法: location[=|~|~*|^~|@]/uri/{...}
配置塊: server location會嘗試根據(jù)用戶請求中的URI來匹配上面的/uri表達(dá)式,如果可以匹配,就選擇 location{}塊中的配置來處理用戶請求。
location表達(dá)式類型
~ 表示執(zhí)行一個正則匹配,區(qū)分大小寫;
~* 表示執(zhí)行一個正則匹配,不區(qū)分大小寫;
^~ 表示普通字符匹配。使用前綴匹配。如果匹配成功,則不再匹配其他location;
= 進(jìn)行普通字符精確匹配。也就是完全匹配;
@ 它定義一個命名的 location,使用在內(nèi)部定向時,例如 error_page, try_files
優(yōu)先級:
- 等號類型(=)的優(yōu)先級最高。一旦匹配成功,則不再查找其他匹配項
- 前綴普通匹配(^~)優(yōu)先級次之。不支持正則表達(dá)式。使用前綴匹配,如果有多個location匹配的話,則使用表達(dá)式最長的那個
- 正則表達(dá)式類型(~ ~*)的優(yōu)先級次之。一旦匹配成功,則不再查找其他匹配項
- 常規(guī)字符串匹配,如果有多個location匹配的話,則使用表達(dá)式最長的那個
return
語法:return code [text] return code URL;
return URL;
配置塊:server,location,if
該指令用于結(jié)束規(guī)則的執(zhí)行并返回狀態(tài)嗎給客戶端。
狀態(tài)碼包括:
204(No Content)、
400(Bad Request)、
402(Payment Required)、
403(Forbidden)
404(Not Found)、
405(Method Not Allowed)、
406(Not Acceptable)、
408(Request Timeout)、
410(Gone)、
411(Length Required)、
413(Request Entity Too Large)、
416(Requested Range Not Satisfiable)、 500(Internal Server Error)、
501(Not Implemented)、
502(Bad Gateway)、
503(Service Unavailable)
504(Gateway Timeout)。
例如,示例,如果訪問的URL以.sh .bash 結(jié)尾,返回狀態(tài)碼403
location ~ .*\.(sh|bash)?$ {
return 403;
}
rewrite
語法:rewrite regex replacement [flag];
默認(rèn)值:—
配置塊:server, location, if
rewrite是實現(xiàn)URL重寫的關(guān)鍵指令,根據(jù)regex(正則表達(dá)式)部分內(nèi)容,重定向到replacement,結(jié)尾是flag標(biāo)記。 正則:perl兼容正則表達(dá)式語句進(jìn)行規(guī)則匹配
替代內(nèi)容:將正則匹配的內(nèi)容替換成replacement
flag標(biāo)記:rewrite支持的flag標(biāo)記
執(zhí)行順序:
1. 執(zhí)行server塊的rewrite指令(這里的塊指的是server關(guān)鍵字后{}包圍的區(qū)域,其它xx塊類似)
2. 執(zhí)行l(wèi)ocation匹配
3. 執(zhí)行選定的location中的rewrite指令
如果其中某步URI被重寫,則重新循環(huán)執(zhí)行1-3,直到找到真實存在的文件
如果循環(huán)超過10次,則返回500 Internal Server Error錯誤
if指令
語法:if(condition){...}
默認(rèn)值:無
配置塊:server,location
對給定的條件condition進(jìn)行判斷。如果為真,大括號內(nèi)的rewrite指令將被執(zhí)行。
if條件(conditon)可以是如下任何內(nèi)容:
一個變量名;false如果這個變量是空字符串或者以0開始的字符串;
使用= ,!= 比較的一個變量和字符串
是用~, ~*與正則表達(dá)式匹配的變量,如果這個正則表達(dá)式中包含},;則整個表達(dá)式需要用" 或' 包圍
使用-f ,!-f 檢查一個文件是否存在
使用-d, !-d 檢查一個目錄是否存在
使用-e ,!-e 檢查一個文件、目錄、符號鏈接是否存在
使用-x , !-x 檢查一個文件是否可執(zhí)行
if實例
if ($http_user_agent~*(mobile|nokia|iphone|ipad|android|samsung|htc|blackberry)) { rewrite ^.+ /mobile last; #跳轉(zhuǎn)到手機(jī)站 } if ($request_method = POST) { return 405; } if ($slow) { limit_rate 10k; } if ($invalid_referer) { return 403; }
last & break
(1)last 和 break 當(dāng)出現(xiàn)在location 之外時,兩者的作用是一致的沒有任何差異。
注意一點就是,他們會跳過所有的在他們之后的rewrite 模塊中的指令,去選擇自己匹配的location
(2)last 和 break 當(dāng)出現(xiàn)在location 內(nèi)部時,兩者就存在了差異
-- last: 使用了last 指令,rewrite 后會跳出location 作用域,重新開始再走一次剛剛的行為
-- break: 使用了break 指令,rewrite后不會跳出location 作用域。它的生命也在這個location中終結(jié)。
解釋通俗易懂:
- last:
重新將rewrite后的地址在server標(biāo)簽中執(zhí)行
- break:
將rewrite后的地址在當(dāng)前l(fā)ocation標(biāo)簽中執(zhí)行
permanent & redirect:
- permanent: 永久性重定向。請求日志中的狀態(tài)碼為301
- redirect:臨時重定向。請求日志中的狀態(tài)碼為302
從實現(xiàn)功能的角度上去看,permanent 和 redirect 是一樣的。不存在好壞。也不存在什么性能上的問題。但是對seo會有影響,這里要根據(jù)需要做出選擇
在 permanent 和 redirect 中提到了 狀態(tài)碼 301 和 302。
記?。簂ast 和 break 想對于的訪問日志的請求狀態(tài)碼為200
當(dāng)你打開一個網(wǎng)頁,同時打開debug 模式時,會發(fā)現(xiàn)301 和 302 時的行為是這樣的。
第一個請求301 或者 302 后,瀏覽器重新獲取了一個新的URL ,然后會對這個新的URL 重新進(jìn)行訪問。所以當(dāng)你配置的是permanent 和 redirect ,你對一個URL 的訪問請求,落到服務(wù)器上至少為2次;而當(dāng)你配置了last 或者是break 時,你最終的URL 確定下來后,不會將這個URL返回給瀏覽器,而是將其扔給了fastcgi_pass或者是proxy_pass指令去處理。請求一個URL ,落到服務(wù)器上的次數(shù)就為1次。
注意:配置last 在跨域的時候效果和redirect一致,都是返回302狀態(tài)碼,請求地址也發(fā)生改變
應(yīng)用
估算并發(fā)
nginx作為http服務(wù)器的時候:
max_clients = worker_processes * worker_connections/2
nginx作為反向代理服務(wù)器的時候:
max_clients = worker_processes * worker_connections/4
限制每個IP的并發(fā)連接數(shù)
demo:定義一個叫“two”的記錄區(qū),總?cè)萘繛?10M(超過大小將請求失敗,以變量 $binary_remote_addr 作為會話的判斷基準(zhǔn)(即一個地址一個會話)。 限制 /download/ 目錄下,一個會話只能進(jìn)行一個連接。 簡單點,就是限制 /download/ 目錄下,一個IP只能發(fā)起一個連接,多過一個,一律503。
http { ... limit_conn_zone $binary_remote_addr zone=two:10m; server { ... location /download { limit_conn two 1; } } }
限流
demo:定義一個叫“one”的記錄區(qū),占用空間大小為10m(超過大小將請求失敗),平均處理的請求頻率不能超過每秒一次,也可以設(shè)置分鐘速率
http { ... limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s; server { ... location / { #緩存區(qū)隊列burst=5個,nodelay表示不延期(超過的請求失敗),即每秒最多可處理rate+burst個,同時處理rate個。 limit_req zone=one burst=5 nodelay; } } }
白名單
http{ ... #判斷客戶端的ip地址是否在白名單列表當(dāng)中,如果返回為0,則在白名單列表當(dāng)中,否則返回為1 geo $whiteIpList { default 1; 118.24.109.254 0; 47.98.147.0/24 1; #可以引入一些白名單配置 include 'whiteIP.conf' } #如果不在白名單之內(nèi),返回客戶端的二進(jìn)制的ip地址 map $whiteIpList $limit { default ""; 1 $binary_remote_addr; 0 ""; } #如果返回的是空字符串那么速率限制會失效 limit_req_zone $limit zone=test:2m rate=1r/m; ... }
防盜鏈
http { ... server { ... #valid_referers后面的referer列表進(jìn)行匹配,如果匹配到了就invalid_referer字段值為0 否則設(shè)置該值為1 location ~* \.(gif|jpg|png|swf|flv)$ { valid_referers none blocked *.13sai.com; if ($invalid_referer) { rewrite ^/ blog.13sai.com } } } }
以上就是Nginx配置常用參數(shù)梳理看這一篇就夠了的詳細(xì)內(nèi)容,更多關(guān)于Nginx 配置常用參數(shù)的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Nginx?502?bad?gateway錯誤解決的九種方案及原因
一般在訪問某些網(wǎng)站或者我們在做本地測試的時候,服務(wù)器突然返回502?Bad?Gateway?Nginx,這種問題相信大家也遇到不少了,下面這篇文章主要給大家介紹了關(guān)于Nginx?502?bad?gateway錯誤解決的九種方案及原因,文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-08-08通過nginx反向代理來調(diào)試代碼的實現(xiàn)
這篇文章主要介紹了通過nginx反向代理來調(diào)試代碼的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-01-01Nginx優(yōu)化服務(wù)之網(wǎng)頁壓縮的實現(xiàn)方法
這篇文章主要介紹了Nginx優(yōu)化服務(wù)之網(wǎng)頁壓縮的實現(xiàn)方法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-01-01利用Nginx實現(xiàn)反向代理Node.js的方法詳解
這篇文章主要給大家介紹了關(guān)于利用Nginx實現(xiàn)反向代理Node.js的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-08-08Nginx學(xué)習(xí)筆記之事件驅(qū)動框架處理流程
Nginx對請求的處理是通過事件觸發(fā)的,模塊作為事件消費者,只能被事件收集、分發(fā)器調(diào)用。在Nginx中,接收到一個請求時,不會產(chǎn)生一個單獨的進(jìn)程來處理該請求,而是由事件收集、分發(fā)器(進(jìn)程)調(diào)用某個模塊,由模塊處理請求,處理完后再返回到事件收集、分發(fā)器2014-07-07nginx 自定義 404、50x 錯誤頁面的實現(xiàn)
本文主要介紹了nginx 自定義 404、50x 錯誤頁面的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-12-12