Nginx常見(jiàn)用法總結(jié)(面試必備)
Nginx在日常開(kāi)發(fā)過(guò)程中主要作為靜態(tài)資源服務(wù)器(http服務(wù)器)和反向代理服務(wù)器。
Nginx常用變量
$host: 請(qǐng)求的主機(jī)頭
if ($host = 'bbs.gitlib.com') {
rewrite ^/$ http://bbs.bliwan.com permanent;
}
$remote_addr: 客戶端IP地址
$remote_port: 客戶端端口號(hào)
$remote_user: 已經(jīng)經(jīng)過(guò)Auth Basic Module驗(yàn)證的用戶名
$http_referer: 請(qǐng)求引用地址
$http_user_agent: 客戶端代理信息(UA)
$http_x_forwarded_for: 相當(dāng)于網(wǎng)絡(luò)訪問(wèn)路徑
$body_bytes_sent: 頁(yè)面?zhèn)魉偷淖止?jié)數(shù)
$time_local: 服務(wù)器時(shí)間
$request: 客戶端請(qǐng)求
$request_uri: 請(qǐng)求的URI,帶參數(shù), 不包含主機(jī)名
$request_filename: 請(qǐng)求的文件路徑
$request_method: 請(qǐng)求的方法,如GET、POST
$args: 客戶端請(qǐng)求中的參數(shù)
$query_string: 等同于$args, 客戶端請(qǐng)求的參數(shù)
$nginx_version: 當(dāng)前nginx版本
$status: 服務(wù)器響應(yīng)狀態(tài)碼
$server_addr: 服務(wù)器地址
$server_port: 請(qǐng)求到達(dá)的服務(wù)器端口號(hào)
$server_protocol: 請(qǐng)求的協(xié)議版本
$content_type: HTTP請(qǐng)求信息里的Content-Type字段
$content_length: HTTP請(qǐng)求信息里的Content-Length字段
$uri: 請(qǐng)求中的當(dāng)前URI(不帶請(qǐng)求參數(shù),參數(shù)位于$args)
$document_root: 當(dāng)前請(qǐng)求在root指令中指定的值
$document_uri: 與$uri相同
定義日志格式示例:
log_format access '$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" $http_x_forwarded_for';
輸入格式:
14.18.29.118 - - [24/Jun/2017:20:53:09 +0800] "GET /index.html HTTP/1.1" 200 23 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36" -
Nginx設(shè)置重定向
return形式
# 301永久重定向,302臨時(shí)重定向
return 301 https://example.com$request_uri;
# return 返回形式
return code;
return code URL;
return URL;
rewrite形式
rewrite ^/$ http://bbs.gitlib.com permanent;
rewrite flag說(shuō)明:
last: 停止處理后續(xù)rewrite指令集,然后對(duì)當(dāng)前重寫(xiě)的新URI在rewrite指令集上重新查找
break: 停止處理后續(xù)rewrite指令集,并不在重新查找,但是當(dāng)前l(fā)ocation內(nèi)剩余非rewrite語(yǔ)句和location外的非rewrite語(yǔ)句可以執(zhí)行
redirect: 如果replacement不是以http:// 或https://開(kāi)始,返回302臨時(shí)重定向
permant: 返回301永久重定向
Nginx條件判斷
if判斷
if ($http_user_agent ~ (125LA|WinHttpRequest|360Spider)) {
return 444;
}
if ($http_referer ~* "filter=author&orderby=dateline") {
return 444;
}
if ($host = 'bbs.gitlib.com') {
rewrite ^/$ http://bbs1.gitlib.com permanent;
}
比較符說(shuō)明:
使用=、!= 比較的一個(gè)變量和字符串,true/false
使用~、~*與正則表達(dá)式匹配的變量,如果這個(gè)正則表達(dá)式中包含右花括號(hào)}或者分號(hào);則必須給整個(gè)正則表達(dá)式加引號(hào)
使用-f、!-f 檢查一個(gè)文件是否存在
使用-d、!-d 檢查一個(gè)目錄是否存在
使用-e、!-e 檢查一個(gè)文件、目錄、符號(hào)鏈接是否存在
使用-x、!-x 檢查一個(gè)文件是否可執(zhí)行
set設(shè)置變量
if ( $host ~* (.*)\.yzz\.cn) {
set $domain ;
}
root /www/website/www/gitlib/$domain/;
# set語(yǔ)法
set variable value;
Nginx反向代理
proxy_pass
proxy_pass將請(qǐng)求傳遞給HTTP服務(wù)器
proxy_buffering: on; # 設(shè)置是否開(kāi)啟Proxy Buffer,默認(rèn)為on
proxy_pass http://upload.gitlib.com; # 設(shè)置被代理服務(wù)器的地址
proxy_connect_timeout 600;# 設(shè)置Nginx服務(wù)器與后端被代理服務(wù)器嘗試建立連接的超時(shí)時(shí)間,默認(rèn)為60s
proxy_read_timeout 600; # 設(shè)置Nginx服務(wù)器向后端被代理服務(wù)器發(fā)出read請(qǐng)求后,等待響應(yīng)的超時(shí)時(shí)間,默認(rèn)為60s
proxy_send_timeout 600; # 設(shè)置Nginx服務(wù)器向后端被代理服務(wù)器發(fā)出write請(qǐng)求后,等待響應(yīng)的超時(shí)時(shí)間,默認(rèn)為60s
proxy_buffer_size 8k; # 設(shè)置Nginx服務(wù)器從被代理服務(wù)器獲取的第一段數(shù)據(jù)buffer大小,一般和proxy_buffers設(shè)置的buffer大小一致,或者更小, 默認(rèn)為4k或者8k
proxy_buffers 4 32k; # 設(shè)置Proxy Buffer的個(gè)數(shù)和每個(gè)Buffer的大小
proxy_busy_buffers_size 64k; # 設(shè)置處在Busy狀態(tài)的Buffer總大小上限,默認(rèn)為8K或者16K
proxy_temp_file_write_size 64k; #
proxy_next_upstream error timeout invalid_header http_500 http_503 http_404; # upstream設(shè)置被代理服務(wù)器集群時(shí),設(shè)置組內(nèi)服務(wù)器出現(xiàn)哪些異常時(shí),可以依次輪詢到下一個(gè)組內(nèi)服務(wù)器處理
proxy_redirect off; # 修改響應(yīng)頭Location值,off表示直接返回proxy_pass后的值,默認(rèn)為default(客戶端請(qǐng)求的URI),
fastcgi_pass
fastcgi_pass將請(qǐng)求傳遞給FastCGI服務(wù)器
fastcgi_connect_timeout 3000;
fastcgi_send_timeout 3000;
fastcgi_read_timeout 3000;
fastcgi_buffer_size 200k;
fastcgi_buffers 8 200k;
fastcgi_busy_buffers_size 200k;
fastcgi_max_temp_file_size:1024M; # 設(shè)置臨時(shí)文件大小,默認(rèn)為1024M
fastcgi_temp_file_write_size 200k;# 配置同時(shí)寫(xiě)入臨時(shí)文件的數(shù)據(jù)量的大小,合理的配置可以避免磁盤(pán)IO負(fù)載過(guò)高,導(dǎo)致系統(tǒng)性能下降,默認(rèn)為8KB或16KB
fastcgi_temp_path /dev/shm; # 配置磁盤(pán)上的一個(gè)文件路徑,用于臨時(shí)存放代理服務(wù)器的大體積響應(yīng)數(shù)據(jù),如果proxy buffer 被裝滿后,響應(yīng)數(shù)據(jù)仍然沒(méi)有被Nginx服務(wù)器完全接收,響應(yīng)數(shù)據(jù)就被會(huì)臨時(shí)存放在該文件中
uwsgi_pass
uwsgi_pass將請(qǐng)求傳遞給uwsgi服務(wù)器(如python服務(wù))
scgi_pass
scgi_pass將請(qǐng)求傳遞給SCGI服務(wù)器
memcached_pass
memcached_pass將請(qǐng)求傳遞給memcached服務(wù)器
Nginx負(fù)載均衡
Nginx通過(guò)proxy_pass和upstream指令實(shí)現(xiàn)負(fù)載均衡,Nginx原生支持的負(fù)載均衡算法有如下幾種:
輪詢
每個(gè)請(qǐng)求按時(shí)間順序逐一分配到不同的應(yīng)用服務(wù)器,如果應(yīng)用服務(wù)器down掉,自動(dòng)剔除,剩下的繼續(xù)輪詢
權(quán)重
通過(guò)配置權(quán)重,指定輪詢幾率,權(quán)重和訪問(wèn)比率成正比,用于應(yīng)用服務(wù)器性能不均的情況
ip_hash
每個(gè)請(qǐng)求按訪問(wèn)ip的hash結(jié)果分配,這樣每個(gè)訪客固定訪問(wèn)一個(gè)應(yīng)用服務(wù)器,可以解決session共享的問(wèn)題。
least_conn
最小連接數(shù)
示例:
upstream php {
server 127.0.0.1:9000 max_fails=3 fail_timeout=30s;
server 192.168.1.16 backup;
server 192.168.1.17 down;
}
upstream php {
server 192.168.10.2 weight=1;
server 192.168.10.3 weight=2;
}
upstream php {
ip_hash;
server 192.168.10.16;
server 192.168.10.17;
}
Nginx緩存
Proxy Cache
Nginx通過(guò)proxy_cache來(lái)實(shí)現(xiàn)緩存。Buffer和Cache都是用于提供IO吞吐小路的,但是概念不同。Buffer(緩沖)主要用于傳輸效率不同步或者優(yōu)先級(jí)不相同的設(shè)備之間傳輸數(shù)據(jù),一般通過(guò)對(duì)一方數(shù)據(jù)進(jìn)行臨時(shí)存放,再統(tǒng)一發(fā)送的辦法傳遞給另一方,以降低進(jìn)程之間的等待時(shí)間,保證速度較快的進(jìn)程不發(fā)生間斷,臨時(shí)存放的數(shù)據(jù)一旦傳送給另一方,這些數(shù)據(jù)本身也就沒(méi)有用處了;Cache(緩存)主要用于將硬盤(pán)上已有的數(shù)據(jù)在內(nèi)存中建立緩存數(shù)據(jù),提高數(shù)據(jù)的訪問(wèn)效率,對(duì)于過(guò)期不用的緩存可以隨時(shí)銷毀。
Proxy Cache機(jī)制依賴于Proxy Buffer機(jī)制,只有在Proxy Buffer機(jī)制開(kāi)啟的情況下Proxy Cache的配置才會(huì)發(fā)揮作用。
相關(guān)配置參數(shù)說(shuō)明:
proxy_cache: zone | off; # 默認(rèn)為off,即關(guān)閉proxy_cache功能,zone為用于存放緩存的內(nèi)存區(qū)域名稱
proxy_cache_path: path [levels=levels] keys_zone=name:size [inactive=time] [max_size=size];
path設(shè)置緩存數(shù)據(jù)存放的路徑;
levels設(shè)置目錄層級(jí),如levels=1:2,表示有兩級(jí)子目錄,第一個(gè)目錄名取md5值的倒數(shù)第一個(gè)值,第二個(gè)目錄名取md5值的第2和3個(gè)值。
keys_zone設(shè)置內(nèi)存zone的名字和大小,如keys_zone=my_zone:10m
inactive設(shè)置緩存多長(zhǎng)時(shí)間就失效,當(dāng)硬盤(pán)上的緩存數(shù)據(jù)在該時(shí)間段內(nèi)沒(méi)有被訪問(wèn)過(guò),就會(huì)失效了,該數(shù)據(jù)就會(huì)被刪除,默認(rèn)為10s。
max_size設(shè)置硬盤(pán)中最多可以緩存多少數(shù)據(jù),當(dāng)?shù)竭_(dá)該數(shù)值時(shí),nginx會(huì)刪除最少訪問(wèn)的數(shù)據(jù)
示例
proxy_cache_path /data/nginx_cache/ levels=1:2 keys_zone=my_zone:10m inactive=300s max_size=5g;
location / {
proxy_cache my_zone;
proxy_pass http://192.168.10.110:8080/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
Expires
location ~ .*\.(jpg|jpeg|gif|png|ico|swf)?$
{
expires 1d; #設(shè)置過(guò)期時(shí)間
}
Nginx實(shí)現(xiàn)Gzip壓縮
通過(guò)gzip相關(guān)指令可以配置Gzip壓縮,對(duì)響應(yīng)數(shù)據(jù)進(jìn)行在線實(shí)時(shí)壓縮。
相關(guān)配置參數(shù)說(shuō)明:
gzip: on; # 開(kāi)啟或關(guān)閉gzip功能,默認(rèn)為off
gzip_buffers: 16 8K; # 配置Gzip壓縮文件時(shí)使用的緩存空間大小,默認(rèn)number*size=128K
gzip_comp_level: 9; # 壓縮級(jí)別,壓縮程度越高,壓縮效率最低,最費(fèi)時(shí)間
gzip_min_length:# 配置最小壓縮的數(shù)據(jù)大小,如果響應(yīng)頁(yè)面的大小大于該值,才開(kāi)啟Gzip功能(一些小文件會(huì)導(dǎo)致壓縮后的大小比源文件還大),默認(rèn)為20,建議設(shè)置為1k(1024)
gzip_http_version:1.0; # 配置只有高于指定版本的HTTP協(xié)議才能開(kāi)啟Gzip,默認(rèn)為1.1, 目前絕大多數(shù)瀏覽器都支持Gzip自解壓,一般采用默認(rèn)值即可
gzip_proxied:any; # 設(shè)置是否對(duì)被代理服務(wù)器返回的數(shù)據(jù)進(jìn)行壓縮,默認(rèn)為off
gzip_vary: on; # 開(kāi)啟壓縮標(biāo)記,開(kāi)啟后在響應(yīng)頭部添加 Vary: Accept-Encoding,默認(rèn)為off
gzip_types:text/plain application/x-javascript text/css application/xml text/javascript; # 對(duì)指定類型的文檔進(jìn)行Gzip壓縮
gzip_static:on; # 對(duì)于存在服務(wù)器上.gz作為后綴的文件,且客戶端瀏覽器支持gzip壓縮,就直接返回壓縮后的數(shù)據(jù)
示例:
gzip on;
gzip_static on;
gzip_comp_level 9;
gzip_min_length 1k;
gzip_buffers 4 8k;
gzip_http_version 1.0;
gzip_vary on;
gzip_proxied any;
gzip_types text/plain application/x-javascript text/css application/xml text/javascript;
Nginx常見(jiàn)配置參數(shù)
server_names_hash_max_size 1024;
server_names_hash_bucket_size 512;
client_header_buffer_size 32k; # 客戶端請(qǐng)求頭部的緩沖區(qū)大
large_client_header_buffers 4 32k;
client_max_body_size 10m;#設(shè)置最大的允許客戶端請(qǐng)求主體的大小(上傳文件大小限制), 默認(rèn)為1m
client_body_buffer_size 128k;
keepalive_timeout 60; #客戶端連接超時(shí)時(shí)間,單位是秒, 默認(rèn)是75秒
sendfile on; # 開(kāi)啟高效傳輸模式,默認(rèn)為off
tcp_nopush on;
tcp_nodelay on;
ssi on; # 開(kāi)啟ssi支持,默認(rèn)為false
ssi_silent_errors on; # 設(shè)置為on表示在處理ssi文件時(shí)不輸出錯(cuò)誤信息,默認(rèn)為false
ssi_types text/html; # 默認(rèn)支持html ,如果需要支持shtml(服務(wù)器執(zhí)行腳本),需要設(shè)置為ssi_types text/shtml
server_tokens off; # 關(guān)閉nginx版本號(hào)的顯示,默認(rèn)為on
Nginx優(yōu)化相關(guān)參數(shù)
worker_processes 2; # 配置生成的worker process數(shù)量,一般為cpu核數(shù)
worker_rlimit_nofile 65536; # 一個(gè)nginx進(jìn)程打開(kāi)的最多文件描述符數(shù)目,一般設(shè)置為與系統(tǒng)設(shè)定的值相同(ulimit -n)
worker_cpu_affinity 01 10;# 為每個(gè)進(jìn)程分配CPU的工作內(nèi)核
use epoll; # 事務(wù)模型
events {
use epoll; # 事務(wù)模型
worker_connections 20000; # 一個(gè)nginx進(jìn)程的連接數(shù),nginx服務(wù)器允許的同事連接的客戶端最大數(shù)量Client = worker_processes * worker_connections/2;
}
Nginx常見(jiàn)用法
依據(jù)UA屏蔽爬蟲(chóng)
if ($http_user_agent ~* "qihoobot|Baiduspider|Googlebot|Googlebot-Mobile|Googlebot-Image|Mediapartners-Google|Adsbot-Google|Feedfetcher-Google|Yahoo! Slurp|Yahoo! Slurp China|YoudaoBot|Sosospider|Sogou
spider|Sogou web spider|MSNBot|ia_archiver|Tomato Bot") {
return 403;
}
屏蔽IP訪問(wèn)
allow 133.27.182.82;
allow 113.106.18.0/24;
allow 121.201.104.0/24;
deny all;
使用Auth權(quán)限訪問(wèn)
auth_basic "bbs-auth";
auth_basic_user_file /usr/local/nginx/conf/bbsauthpwd;
限制帶寬
# 用戶下載達(dá)到 500k 后,便控制其速度在 50k 以內(nèi)
location /download/ {
limit_rate_after 500k;
limit_rate 50k;
}
限制連接
# 定義了一個(gè)名為“down”,10M大小,以連接IP為key的連接數(shù)據(jù)存儲(chǔ)空間
limit_conn_zone $binary_remote_addr zone=down:10m;
# 讀取名為`down`連接數(shù)據(jù)存儲(chǔ)空間的數(shù)據(jù),限制每個(gè)key(上面是以ip作為IP) 最大同時(shí)連接數(shù)為4
location ~ .*\.(rar|zip|apk)?$ {
limit_conn down 4;
limit_rate 150k;
}
limit_conn_log_level notice: 指定當(dāng)觸發(fā)limit的時(shí)候日志打印級(jí)別
限制請(qǐng)求
# 定義一個(gè)名為”one”, 10M大小,每秒1個(gè)請(qǐng)求的請(qǐng)求數(shù)據(jù)存儲(chǔ)空間
limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s;
# 引用名為“one”的存儲(chǔ)空間,burst為等待請(qǐng)求數(shù)量數(shù),當(dāng)?shù)却?qǐng)求數(shù)量超過(guò)50個(gè)時(shí),則拋出503錯(cuò)誤,nodelay 針對(duì)的是 burst 參數(shù),burst=50 nodelay 表示這50個(gè)請(qǐng)求立馬處理,不能延遲,相當(dāng)于特事特辦。不過(guò),即使這20個(gè)突發(fā)請(qǐng)求立馬處理結(jié)束,后續(xù)來(lái)了請(qǐng)求也不會(huì)立馬處理。burst=50 相當(dāng)于緩存隊(duì)列中占了50個(gè)坑,即使請(qǐng)求被處理了,這20個(gè)位置這只能按 100ms一個(gè)來(lái)釋放
limit_req zone=one burst=50 nodelay;
limit_req_log_level notice: 指定當(dāng)觸發(fā)limit的時(shí)候日志打印級(jí)別
實(shí)時(shí)顯示Nginx運(yùn)行狀況
在安裝nginx是編譯http_stub_status_module即可,使用參數(shù)為–with-http_stub_status_module
location /ngx_status {
stub_status on;
access_log on;
}
設(shè)置錯(cuò)誤頁(yè)面
error_page 404 /404.html
Nginx 常見(jiàn)錯(cuò)誤碼
301 永久重定向
302 臨時(shí)重定向
403 禁止訪問(wèn)
404 文件不存在
413 文件上傳超過(guò)限制
500 服務(wù)器錯(cuò)誤
502 后臺(tái)服務(wù)器無(wú)響應(yīng)
504 Nginx超時(shí),請(qǐng)求過(guò)多,工作進(jìn)程不足
本文來(lái)自:“IT大咖說(shuō)”
閱讀原文:點(diǎn)擊
Nginx
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。