Nginx
簡(jiǎn)介
nginx [engine x]是一個(gè)HTTP和反向代理服務(wù)器薛躬,一個(gè)郵件代理服務(wù)器和一個(gè)通用的TCP / UDP代理服務(wù)器熙兔。
Nginx 相對(duì)于 Apache 優(yōu)點(diǎn)如下
- 高并發(fā)響應(yīng)性能好抛寝,對(duì)靜態(tài)處理文件并發(fā) 5w/s
- 負(fù)載均衡 和 反向代理 性能非常強(qiáng)
- 內(nèi)存 cpu 占用率低
- 提供健康檢查
- 支持 PHP CGI 和Fast CGI
- 可以作為緩存服務(wù)器球恤、郵件代理服務(wù)器
Nginx常用命令
# fast shutdown
nginx -s stop
# graceful shutdown
nginx -s quit
# reloading the configuration file
nginx -s reload
# reopening the log files
nginx -s reopen
# 為 Nginx 指定一個(gè)配置文件趁冈,來代替缺省的
nginx -c filename
# 不運(yùn)行nginx悔捶,只檢查配置文件的語法的正確性,并嘗試打開配置文件中所引用到的文件
nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
# 顯示 nginx 的版本
nginx -v
# 顯示 nginx 的版本掉奄,編譯器版本和配置參數(shù)
nginx -V
Nginx信號(hào)控制
TERM规个、INT | 快速關(guān)閉進(jìn)程 |
---|---|
QUIT | 優(yōu)雅的關(guān)閉進(jìn)程,即等請(qǐng)求結(jié)束之后再關(guān)閉 |
HUP | 改變配置文件之后姓建、平滑的重讀配置文件 |
USR1 | 切割日志 |
USR2 | Nginx平滑的升級(jí) |
WINCH | 優(yōu)雅的關(guān)閉舊進(jìn)程诞仓,配合USR2進(jìn)行升級(jí) |
kill -HUP `cat /var/run/nginx.pid`
正向代理
局域網(wǎng)中的客戶端要訪問Internet,通過nginx代理服務(wù)器來訪問目標(biāo)網(wǎng)站速兔,代理向原始服務(wù)器轉(zhuǎn)交請(qǐng)求并將獲得的內(nèi)容返回給客戶端墅拭。
server{
listen 82; #代理監(jiān)聽端口
resolver 8.8.8.8; #DNS
resolver_timeout 10s; # DNS解析超時(shí)時(shí)間
location / {
# 配置正向代理參數(shù)
proxy_pass $scheme://$host$request_uri;
# 解決如果URL中帶"."后Nginx 503錯(cuò)誤
proxy_set_header Host $http_host;
# 配置緩存大小
proxy_buffers 256 4k;
# 關(guān)閉磁盤緩存讀寫減少I/O
proxy_max_temp_file_size 0;
# 代理連接超時(shí)時(shí)間
proxy_connect_timeout 30;
# 配置代理服務(wù)器HTTP狀態(tài)緩存時(shí)間
proxy_cache_valid 200 302 10m;
proxy_cache_valid 301 1h;
proxy_cache_valid any 1m;
}
}
反向代理
反向代理(Reverse Proxy)方式是指以代理服務(wù)器來接受internet上的連接請(qǐng)求,然后將請(qǐng)求轉(zhuǎn)發(fā)給內(nèi)部網(wǎng)絡(luò)上的服務(wù)器涣狗,并將從服務(wù)器上得到的結(jié)果返回給internet上請(qǐng)求連接的客戶端谍婉,此時(shí)代理服務(wù)器對(duì)外就表現(xiàn)為一個(gè)反向代理服務(wù)器。nginx一般均作為反向代理使用
Load Balancer 負(fù)載均衡(upstream{}
)
負(fù)載均衡利用一定的分配策略把網(wǎng)絡(luò)負(fù)載平衡的分?jǐn)偟骄W(wǎng)絡(luò)集群的各個(gè)節(jié)點(diǎn)上镀钓。Nginx基于優(yōu)先級(jí)的加權(quán)輪詢方法穗熬。
NGINX 負(fù)載均衡策略
- Round Robin:默認(rèn)策略,請(qǐng)求在服務(wù)器之間均勻分布丁溅,并考慮服務(wù)器權(quán)重
- least_conn:將請(qǐng)求發(fā)送到具有最少活動(dòng)連接數(shù)的服務(wù)器唤蔗,同時(shí)考慮服務(wù)器權(quán)重
- ip_hash ,從客戶端IP地址確定發(fā)送請(qǐng)求的服務(wù)器窟赏,保證同個(gè)請(qǐng)求分配的服務(wù)器不變妓柜;如果需要從負(fù)載平衡輪換中臨時(shí)刪除其中一個(gè)服務(wù)器,則可以使用該down參數(shù)對(duì)其進(jìn)行標(biāo)記涯穷,以便保留客戶端IP地址的當(dāng)前哈希值棍掐。可以解決session不共享的問題拷况。
- hash:發(fā)送請(qǐng)求的服務(wù)器是從用戶定義的密鑰確定的作煌,該密鑰可以是文本字符串,變量或組合赚瘦,在 upstream 中有應(yīng)用服務(wù)器被加入或刪除時(shí)最疆,會(huì)重新計(jì)算散列進(jìn)行分發(fā);hash $request_uri consistent;
NGINX Plus 新增2種策略
- least_time:對(duì)于每個(gè)請(qǐng)求蚤告,nginx plus選擇具有最低平均延遲和最低數(shù)量的活動(dòng)連接努酸,參數(shù):header - 從服務(wù)器接收第一個(gè)字節(jié)的時(shí)間;last_byte - 從服務(wù)器接收完整響應(yīng)的時(shí)間杜恰;last_byte inflight - 考慮到不完整的請(qǐng)求获诈,是時(shí)候從服務(wù)器接收完整的響應(yīng)(least_time header ;)
- random:nginx plus每個(gè)請(qǐng)求都將傳遞給隨機(jī)選擇的服務(wù)器參數(shù):least_conn - 活動(dòng)連接數(shù)最少;least_time=header - 從服務(wù)器接收響應(yīng)頭的平均時(shí)間最短
upstream_response_time舔涎;(random two least_time=last_byte;)
HTTP負(fù)載均衡(常用) http{ upstream{} }
將HTTP流量代理到一組服務(wù)器《旱跨多個(gè)應(yīng)用程序?qū)嵗呢?fù)載平衡是一種常用技術(shù)亡嫌,用于優(yōu)化資源利用率嚎于,最大化吞吐量,減少延遲并確保容錯(cuò)配置挟冠。在http{}
模塊配置
http {
upstream backend {
ip_hash; # 均衡策略
server backend1.example.com weight=5; # weight默認(rèn)是1
server backend2.example.com;
server 192.0.0.1 backup; # 定義為備份
server 192.0.0.1 down; # 臨時(shí)刪除服務(wù)器于购,保留客戶端IP地址的當(dāng)前哈希值
}
server {
location / {
proxy_pass http://backend;
}
}
}
TCP和UDP負(fù)載均衡 stream{ upstream{} }
可以代理和負(fù)載均衡TCP流量和UDP流量。Nginx Plus或者Nginx 編譯時(shí)怎加--with-stream選項(xiàng)知染。在stream {}
模塊配置肋僧。
- TCP(傳輸控制協(xié)議)是許多流行應(yīng)用程序和服務(wù)的協(xié)議,例如LDAP控淡,MySQL和RTMP嫌吠。
- UDP(用戶數(shù)據(jù)報(bào)協(xié)議)是許多流行的非事務(wù)性應(yīng)用程序的協(xié)議,例如DNS掺炭,syslog和RADIUS辫诅。
stream {
upstream stream_backend {
server backend1.example.com:12345 weight=5;
server backend2.example.com:12345;
}
upstream dns_servers {
server 192.168.136.130:53;
server 192.168.136.131:53;
}
server {
listen 12345; # TCP流量將會(huì)被轉(zhuǎn)發(fā)到"stream_backend"的upstream
proxy_pass stream_backend;
proxy_timeout 3s;
proxy_connect_timeout 1s;
}
server {
listen 53 udp; # UDP流量將會(huì)被轉(zhuǎn)發(fā)到"dns_servers"的upstream
proxy_pass dns_servers;
}
}
upstream健康檢查
upstream study-steam-kada {
server 10.172.131.172:16042;
server 10.172.131.167:16042;
check interval=3000 rise=2 fall=3 timeout=5000 type=http;
check_http_send "HEAD /health/status HTTP/1.0\r\n\r\n";
check_http_expect_alive http_2xx http_3xx;
}
NGINX 服務(wù)器提供兩種不同的健康檢測(cè)方案
- 開源版的 NGINX 提供被動(dòng)檢測(cè)功能:
被動(dòng)檢測(cè)的實(shí)現(xiàn)原理是:NGINX 服務(wù)器通過檢測(cè)客戶端發(fā)送的請(qǐng)求及被代理(被負(fù)載均衡)服務(wù)器的響應(yīng)結(jié)果進(jìn)行判斷被代理服務(wù)器是否失效。被動(dòng)檢測(cè)方案涧狮,可以有效降低被代理服務(wù)器的負(fù)載壓力泥栖。
upstream backend {
server backend1.example.com:1234 max_fails=3 fail_timeout=3s;
server backend2.example.com:1234 max_fails=3 fail_timeout=3s;
}
- NGINX PLUS 提供主動(dòng)檢測(cè)功能:
主動(dòng)檢測(cè)的實(shí)現(xiàn)原理是,NGINX 代理服務(wù)向被代理服務(wù)器定時(shí)的發(fā)送連接請(qǐng)求勋篓,如果被代理服務(wù)器正常響應(yīng)吧享,則說明被代理服務(wù)器正常運(yùn)行。主動(dòng)檢測(cè)則能夠在客戶端發(fā)送請(qǐng)求之前譬嚣,就能夠剔除掉失效服務(wù)器钢颂。
# 通過向被代理服務(wù)器每隔 2 秒,發(fā)送一個(gè)到 '/' URI 的請(qǐng)求來檢測(cè)被代理服務(wù)器是否失效拜银。
# 被代理服務(wù)器連續(xù)接收 5 個(gè)請(qǐng)求殊鞭,如果其中有 2 個(gè)連續(xù)請(qǐng)求響應(yīng)失敗,將被視作服務(wù)器失效
# 被代理服務(wù)器的健康響應(yīng)格式在 match 塊級(jí)指令中配置
# 規(guī)定響應(yīng)狀態(tài)碼為 200, 響應(yīng) Content-Type類型為'text/html',響應(yīng) body 為 "Welcome to nginx!" 字符串的響應(yīng)為有效服務(wù)器
http {
upstream backend {
server backend1.example.com:1234 max_fails=3 fail_timeout=3s;
server backend2.example.com:1234 max_fails=3 fail_timeout=3s;
health_check interval=2s fails=2 passes=5 uri=/ match=welcome;
}
match welcome {
status 200;
header Content-Type = text/html;
body ~ "Welcome to nginx!";
}
server {
location / {
proxy_pass http://backend;
}
}
}
upstream服務(wù)器慢啟動(dòng)
最近恢復(fù)的服務(wù)器很容易被連接淹沒尼桶,這可能導(dǎo)致服務(wù)器再次被標(biāo)記為不可用操灿。慢啟動(dòng)允許上游服務(wù)器在恢復(fù)或變得可用之后逐漸將其權(quán)重從零恢復(fù)到其標(biāo)稱值。
upstream backend {
server backend1.example.com slow_start=30s;
server backend2.example.com;
}
Web server(http{ server{} }
)
虛擬主機(jī)的配置在 http
上下文的server
里泵督,配置完成后綁定/etc/hosts
測(cè)試
server {
listen 192.168.0.100:80; # 監(jiān)聽ip和端口
server_name www.example.com ~^www\d+\.example\.com$; # 虛擬服務(wù)器的名稱
charset utf-8;
access_log /var/log/nginx/access.log; # 訪問日志
error_log /var/log/nginx/error.log; # 錯(cuò)誤日志
allow 192.168.1.0/32; # 白名單
deny all;
location / { # 匹配uri
proxy_set_header X-Real-IP $remote_addr; # $remote_addr為客戶端的ip
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 記錄整個(gè)的代理過程
proxy_set_header Host $host; # $host就是nginx代理服務(wù)器
proxy_http_version 1.1; # 長(zhǎng)連接
proxy_next_upstream error timeout; # 重試機(jī)制趾盐,出現(xiàn) 錯(cuò)誤、連接超時(shí)小腊,嘗試下一個(gè)后端
proxy_pass http://web_backend; # 轉(zhuǎn)發(fā)
}
}
location {}
= :精確匹配
^~ :匹配開頭
~ :區(qū)分大小寫的正則匹配結(jié)尾
~* :不區(qū)分大小寫的正則匹配結(jié)尾
! :不匹配
/ :通用匹配救鲤,任何請(qǐng)求都會(huì)匹配到。
location / 匹配任何以/開頭的路由
location =/ 表示只匹配/秩冈,也就是根目錄
按匹配優(yōu)先級(jí)進(jìn)行匹配本缠,匹配到了會(huì)停止其他location
location = / { # 精確匹配/,會(huì)加快訪問速度
[ configuration A ]
}
location / {
[ configuration B ] # 匹配任何請(qǐng)求入问,最低優(yōu)先級(jí)丹锹,更長(zhǎng)字符匹配或者正則表達(dá)式匹配會(huì)優(yōu)先匹配
}
location /documents/ {
[ configuration C ]
}
location ^~ /images/ { # 前綴匹配
[ configuration D ]
}
location ~* \.(gif|jpg|jpeg)$ { # 正則匹配稀颁,所有 /images/ 目錄的請(qǐng)求將由 [Configuration D]處理.
[ configuration E ]
}
帶/與不帶/的區(qū)別
location /some/path/ { } # 帶/會(huì)認(rèn)為是一個(gè)路徑
location /some/file { } # 不帶/會(huì)認(rèn)為是一個(gè)文件
HTTPS
server {
listen 443 ssl; # 啟用https
server_name www.example.com;
ssl_certificate /etc/nginx/ssl/www.example.com.crt; # crt文件
ssl_certificate_key /etc/nginx/ssl/www.example.com.key; # key文件
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # ssl協(xié)議
ssl_ciphers HIGH:!aNULL:!MD5; # 啟用的密碼
}
HTTPS服務(wù)器優(yōu)化
SSL操作會(huì)消耗額外的CPU資源。最耗CPU的操作是SSL握手楣黍。有兩種方法可以最大程度地減少每個(gè)客戶端執(zhí)行這些操作的次數(shù):
啟用保持連接以通過一個(gè)連接發(fā)送多個(gè)請(qǐng)求
-
重用SSL會(huì)話參數(shù)以避免并行和后續(xù)連接的SSL握手
http { ssl_session_cache shared:SSL:10m; # 設(shè)置存儲(chǔ)會(huì)話參數(shù)的緩存的類型和大小,1m大約4000個(gè)會(huì)話 ssl_session_timeout 10m; # 默認(rèn)5分鐘 server { listen 443 ssl; server_name www.example.com; keepalive_timeout 70; ssl_certificate /etc/nginx/ssl/www.example.com.crt; ssl_certificate_key /etc/nginx/ssl/www.example.com.key; } }
proxy_set_header
重新定義傳遞給代理服務(wù)器的請(qǐng)求標(biāo)頭匾灶,預(yù)定義變量見 (http://nginx.org/en/docs/http/ngx_http_core_module.html#variables)
Syntax: proxy_set_header field value;
Default:
proxy_set_header Host $proxy_host;
proxy_set_header Connection close;
Context: http, server, location
proxy_http_version
代理的HTTP協(xié)議版本(長(zhǎng)連接),HTTP1.1之后锡凝,HTTP協(xié)議支持持久連接,優(yōu)點(diǎn)在于在一個(gè)TCP連接上可以傳送多個(gè)HTTP請(qǐng)求和響應(yīng)垢啼,減少了建立和關(guān)閉連接的消耗和延遲窜锯。
Syntax: proxy_http_version 1.0 | 1.1;
Default: proxy_http_version 1.0;
Context: http, server, location
proxy_next_upstream 重試機(jī)制
當(dāng)請(qǐng)求服務(wù)器發(fā)生錯(cuò)誤或超時(shí)時(shí),會(huì)嘗試到下一臺(tái)服務(wù)器
Syntax: proxy_next_upstream error | timeout | invalid_header | http_500 | http_502 | http_503 | http_504 | http_403 | http_404 | http_429 | non_idempotent | off ...;
Default:
proxy_next_upstream error timeout;
Context: http, server, location
proxy_pass 設(shè)置代理服務(wù)器的協(xié)議和地址
- url帶
/
和不帶/
- 在nginx中配置
proxy_pass
代理轉(zhuǎn)發(fā)時(shí)芭析,如果在proxy_pass
后面的url加/
锚扎,表示絕對(duì)根路徑; - 如果沒有
/
馁启,表示相對(duì)路徑驾孔,把匹配的路徑部分也給代理走。
# http://127.0.0.1/index.html
location /proxy/ {
proxy_pass http://127.0.0.1/;
}
# http://127.0.0.1/proxy/index.html
location /proxy/ {
proxy_pass http://127.0.0.1;
}
將請(qǐng)求傳遞給非HTTP代理服務(wù)器
-
fastcgi_pass
將請(qǐng)求傳遞給FastCGI服務(wù)器 -
uwsgi_pass
將請(qǐng)求傳遞給uwsgi服務(wù)器 -
scgi_pass
將請(qǐng)求傳遞給SCGI服務(wù)器 -
memcached_pass
將請(qǐng)求傳遞給memcached服務(wù)器
server {
root /www/data;
location / {
index index.$geo.html index.htm index.html; # 按指定的順序搜索文件并返回它找到的第一個(gè)文件
}
location /images/ {
autoindex on;
}
location ~ \.(mp3|mp4) {
root /www/media;
}
location ~ \.php {
fastcgi_pass localhost:8000;
}
location ~ .*\.(gif|jpg|jpeg|png)$ { # 靜態(tài)文件
expires 24h; # 本地緩存24小時(shí)
root /data/nginx/2/image1/;
}
}
proxy_buffering 緩存頭
location /some/path/ {
proxy_buffering on; # 默認(rèn)就是on
proxy_buffers 16 4k;
proxy_buffer_size 2k;
proxy_pass http://localhost:8000;
}
proxy_bind 配置出口ip
location /app1/ {
proxy_bind 127.0.0.1;
proxy_pass http://example.com/app1/;
}
location /app3/ {
proxy_bind $server_addr;
proxy_pass http://example.com/app3/;
}
if
upstream hilinux_01 {
server 192.168.1.100:8080 max_fails=1 fail_timeout=60;
}
upstream hilinux_02 {
server 192.168.1.200:8080 max_fails=1 fail_timeout=60;
}
server {
listen 80;
server_name www.hi-linux.com;
access_log logs/www.hi-linux.com.log main;
#match cookie
set $group "default";
if ($http_cookie ~* "version=V1"){
set $group hilinux_01;
}
if ($http_cookie ~* "version=V2"){
set $group hilinux_02;
}
if ($remote_addr ~ "211.118.119.11") {
set $group hilinux_02;
}
location / {
proxy_pass http://$group;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
index index.html index.htm;
}
}
return 返回
Syntax: return code [text];
return code URL;
return URL;
Context: server, location, if
uri重定向惯疙,301
, 302
, 303
, and 307
可以重定向至網(wǎng)頁或者文本
location /wrong/url {
return 404;
}
location /permanently/moved/url {
return 301 http://www.example.com/moved/here;
}
實(shí)例:對(duì)訪問xxx.com的請(qǐng)求轉(zhuǎn)到https
server {
server_name xxx.com;
return 307 https://xxx.com$request_uri;
}
server {
server_name xxx.com;
listen 443 ssl;
啟用HSTS307
跳轉(zhuǎn)
HSTS的作用是強(qiáng)制客戶端(如瀏覽器)使用HTTPS與服務(wù)器創(chuàng)建連接翠勉。
server {
server_name xxx.com;
listen 80;
listen 443 ssl http2;
add_header Strict-Transport-Security "max-age=31536000; includeSubdomains;";
if ($scheme = http) {
return 301 https://$server_name$request_uri;
}
rewrite 地址重定向
應(yīng)用場(chǎng)景:
- 調(diào)整用戶瀏覽的URL,看起來規(guī)范
- 為了讓搜索引擎收錄網(wǎng)站內(nèi)容霉颠,讓用戶體驗(yàn)更好
- 網(wǎng)站更換新域名后
- 根據(jù)特殊的變量对碌、目錄、客戶端信息進(jìn)行跳轉(zhuǎn)
Syntax: rewrite regex replacement [flag];
Context: server, location, if
flag:
last 本條規(guī)則匹配完成后繼續(xù)向下匹配新的location URI規(guī)則
break 本條規(guī)則匹配完成后終止蒿偎,不在匹配任何規(guī)則
redirect 返回302臨時(shí)重定向
permanent 返回301永久重定向
重寫uri朽们,第一個(gè)參數(shù)是正則匹配的uri,第二個(gè)參數(shù)是重寫后的uri诉位,第三個(gè)是 返回動(dòng)作或者狀態(tài)碼301
or 302
server {
listen 80;
server_name brian.com;
rewrite ^/(.*) http://www.brian.com/$1 permanent; # 301跳轉(zhuǎn)
location /users/ {
rewrite ^/users/(.*)$ /show?user=$1 break;
rewrite ^(/download/.*)/media/(.*)\..*$ $1/mp3/$2.mp3 last;
rewrite ^(/download/.*)/audio/(.*)\..*$ $1/mp3/$2.ra last;
}
location /images/ {
if ( !-e $request_filename ){ # -f 文件是否存在, -d 目錄是否存在
# -e 文件或目錄是否存在, -x 文件是否可執(zhí)行
rewrite ^/(.*) /$1.php last; # 如果文件不存在骑脱,就在后面加.php(省略u(píng)rl)
}
}
}
gzip
壓縮響應(yīng)通常會(huì)顯著減少傳輸數(shù)據(jù)的大小,降低延遲苍糠。但是叁丧,由于壓縮在運(yùn)行時(shí)發(fā)生,因此它還會(huì)增加相當(dāng)大的處理開銷岳瞭,從而對(duì)性能產(chǎn)生負(fù)面影響歹袁。
Syntax: gzip on | off;
Default: gzip off;
Context: http, server, location, if in location
server {
gzip on; # 啟用gzip
gzip_types text/plain application/xml; # 默認(rèn)使用MIME類型壓縮響應(yīng)text/html
gzip_min_length 1000; # 要指定要壓縮的響應(yīng)的最小長(zhǎng)度,默認(rèn)20字節(jié)
gzip_proxied no-cache no-store private expired auth; # 默認(rèn)情況下寝优,NGINX不會(huì)壓縮對(duì)代理請(qǐng)求(來自代理服務(wù)器的請(qǐng)求)的響應(yīng)条舔。
gunzip on; # 某些客戶端不支持使用gzip編碼方法的響應(yīng),配置動(dòng)態(tài)解壓縮數(shù)據(jù)
}
sendfile 允許上傳文件
sendfile on;
client_max_body_size 10m; #上傳文件大小限制乏矾,默認(rèn)1m
proxy timeout 超時(shí)時(shí)間
proxy_connect_timeout 150; # 與upstream server的連接超時(shí)時(shí)間
proxy_read_timeout 150; # 等待多長(zhǎng)時(shí)間來獲得請(qǐng)求的響應(yīng)
proxy_send_timeout 150; # 發(fā)送請(qǐng)求給upstream服務(wù)器的超時(shí)時(shí)間
set map geo 設(shè)置變量
Syntax: map string $variable { ... }
Context: http
geo [$address] $variable { ... }
從remote_addr
示例
set $vncserver_id vncadmin1; # 創(chuàng)建一個(gè)新變量
# 設(shè)置agent的值迁杨,如果http_user_agent里包含curl,值為curl凄硼;如果http_user_agent里包含apachebench铅协,值為ab;默認(rèn)是
map $http_user_agent $agent {
default "";
~curl curl;
~*apachebench ab;
}
map $uri $value {
/abc /index.php;
~^/teacher/(?<suffix>.*)$ /boy/;
~/fz(/.*) /index.php?fz=1;
}
# 白名單配置
http{
geo $whiteiplist {
default 1; # 默認(rèn)ip獲取到的是1
127.0.0.1 0; # 這些ip獲取到的是0
123.123.123.123 0;
172.27.2.5 0;
}
map $whiteiplist $limit {
1 $binary_remote_addr;
0 "";
}
limit_req_zone $limit zone=req_addr:10m rate=300r/m;
server{
limit_req zone=req_addr burst=50;
limit_req_log_level warn;
}
}
error_page
訪問不存在的圖片摊沉,跳轉(zhuǎn)到指定頁面
server {
location /images/ {
root /data/www;
open_file_cache_errors off;
error_page 404 = /fetch$uri;
}
location /old/path.html {
error_page 404 =301 http:/example.com/new/path.html; # 錯(cuò)誤處理狐史,將404重定向到特定網(wǎng)頁
}
}
auth_basic 登錄認(rèn)證
location / {
auth_basic "這里隨意起個(gè)名字";
auth_basic_user_file /usr/local/openresty/nginx/conf/auth_file;
}
使用
# 使用 wget
wget --http-user=user --http-passwd=123456 http://localhost/
# 使用 curl
curl -u user:123456 -O http://localhost/
阻止惡意壓測(cè)
http {
limit_conn_zone $binary_remote_addr zone=addr:10m;
# 這里使用的是$binary_remote_addr(4字節(jié))變量,而不是$remote_addr(7-15字節(jié))變量说墨,因?yàn)槠湔加袃?nèi)存小骏全。如果共享內(nèi)存空間被耗盡,服務(wù)器將會(huì)對(duì)后續(xù)所有的請(qǐng)求返回 503(Service Temporarily Unavailable) 錯(cuò)誤尼斧。
server {
limit_conn addr 100; # 指定一個(gè)會(huì)話最大的并發(fā)連接數(shù)(與之前的limit_conn_zone配合使用)姜贡,多于100個(gè)返回Services unavailable(503)狀態(tài),生產(chǎn)環(huán)境需考慮辦公室或者局域網(wǎng)共享IP問題
limit_rate_after 1m; # 設(shè)置單連接限速條件(當(dāng)下載文件字節(jié)數(shù)超過1MB后棺棵,limit_rate限速生效楼咳,限速100k)
limit_rate 100k; # 單連接限速
}
}
Content Cache 緩存
配置緩存
啟用緩存后,NGINX會(huì)將響應(yīng)保存在磁盤緩存中烛恤,并使用它們響應(yīng)客戶端母怜,而無需每次都代理對(duì)相同內(nèi)容的請(qǐng)求。減少后端壓力缚柏,提高網(wǎng)站并發(fā)延時(shí)糙申。
- loader_threshold - 迭代持續(xù)時(shí)間,以毫秒為單位(默認(rèn)情況下 200)
- loader_files - 一次迭代期間加載的最大項(xiàng)目數(shù)(默認(rèn)情況下 100)
- loader_sleeps - 迭代之間的延遲船惨,以毫秒為單位(默認(rèn)情況下 50)
示例
http {
...
proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=mycache:10m loader_threshold=300 loader_files=200; # 設(shè)置緩存的路徑柜裸,2級(jí)目錄,大小10m
server {
proxy_cache mycache; # 定義用于緩存的共享內(nèi)存區(qū)域
proxy_cache_valid 200 206 304 301 302 10d; # 緩存10天
proxy_cache_key $uri # 定義緩存唯一key,通過唯一key來進(jìn)行hash存取
location / {
proxy_pass http://localhost:8000;
}
}
}
proxy_cache_valid 帶有代碼的響應(yīng)200或被302認(rèn)為有效10分鐘粱锐,帶代碼的響應(yīng)404有效1分鐘
proxy_cache_valid 200 302 10m;
proxy_cache_valid 404 1m;
proxy_cache_valid any 5m;
proxy_cache_key 定義用于緩存的密鑰
Syntax: proxy_cache_key string;
Default: proxy_cache_key $scheme$proxy_host$request_uri;
Context: http, server, location
清除緩存中 proxy_cache_purge
NGINX可以從緩存中刪除過時(shí)的緩存文件疙挺。這對(duì)于刪除過時(shí)的緩存內(nèi)容以防止同時(shí)提供舊版本和新版本的網(wǎng)頁是必要的。在收到包含自定義HTTP標(biāo)頭或HTTP PURGE方法的特殊“清除”請(qǐng)求時(shí)怜浅,將清除緩存铐然。
http {
proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=mycache:10m purger=on; # 啟用清除緩存
## 配置清除緩存方法
map $request_method $purge_method {
PURGE 1;
default 0;
}
server {
listen 80;
server_name www.example.com;
location / {
proxy_pass https://localhost:8002;
proxy_cache mycache;
proxy_cache_purge $purge_method;
}
}
## 限制發(fā)送清除命令的主機(jī)
geo $purge_allowed {
default 0; # deny from other
10.0.0.1 1; # allow from localhost
192.168.0.0/24 1; # allow from 192.168.0.0/24
}
map $request_method $purge_method {
PURGE $purge_allowed;
default 0;
}
}
發(fā)送清除緩存命令
$ curl -X PURGE -D – "https://www.example.com/*"
HTTP/1.1 204 No Content
Server: nginx/1.15.0
Date: Sat, 19 May 2018 16:33:04 GMT
Connection: keep-alive