Nginx

Nginx

簡(jiǎn)介

nginx [engine x]是一個(gè)HTTP和反向代理服務(wù)器薛躬,一個(gè)郵件代理服務(wù)器和一個(gè)通用的TCP / UDP代理服務(wù)器熙兔。

Nginx 相對(duì)于 Apache 優(yōu)點(diǎn)如下

  1. 高并發(fā)響應(yīng)性能好抛寝,對(duì)靜態(tài)處理文件并發(fā) 5w/s
  2. 負(fù)載均衡 和 反向代理 性能非常強(qiáng)
  3. 內(nèi)存 cpu 占用率低
  4. 提供健康檢查
  5. 支持 PHP CGI 和Fast CGI
  6. 可以作為緩存服務(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_header_time心褐;least_time=last_byte - 從服務(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è)方案

  1. 開源版的 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;
}
  1. 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 { ... }address獲取IP地址孟抗,默認(rèn)是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
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市恶座,隨后出現(xiàn)的幾起案子搀暑,更是在濱河造成了極大的恐慌,老刑警劉巖跨琳,帶你破解...
    沈念sama閱讀 222,464評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件自点,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡脉让,警方通過查閱死者的電腦和手機(jī)桂敛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,033評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門功炮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人术唬,你說我怎么就攤上這事薪伏。” “怎么了粗仓?”我有些...
    開封第一講書人閱讀 169,078評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵嫁怀,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我借浊,道長(zhǎng)塘淑,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,979評(píng)論 1 299
  • 正文 為了忘掉前任巴碗,我火速辦了婚禮朴爬,結(jié)果婚禮上即寒,老公的妹妹穿的比我還像新娘橡淆。我一直安慰自己,他們只是感情好母赵,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,001評(píng)論 6 398
  • 文/花漫 我一把揭開白布逸爵。 她就那樣靜靜地躺著,像睡著了一般凹嘲。 火紅的嫁衣襯著肌膚如雪师倔。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,584評(píng)論 1 312
  • 那天周蹭,我揣著相機(jī)與錄音趋艘,去河邊找鬼。 笑死凶朗,一個(gè)胖子當(dāng)著我的面吹牛瓷胧,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播棚愤,決...
    沈念sama閱讀 41,085評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼搓萧,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了宛畦?” 一聲冷哼從身側(cè)響起瘸洛,我...
    開封第一講書人閱讀 40,023評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎次和,沒想到半個(gè)月后反肋,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,555評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡踏施,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,626評(píng)論 3 342
  • 正文 我和宋清朗相戀三年囚玫,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了喧锦。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,769評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡抓督,死狀恐怖燃少,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情铃在,我是刑警寧澤阵具,帶...
    沈念sama閱讀 36,439評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站定铜,受9級(jí)特大地震影響阳液,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜揣炕,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,115評(píng)論 3 335
  • 文/蒙蒙 一帘皿、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧畸陡,春花似錦鹰溜、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,601評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至牲览,卻和暖如春墓陈,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背第献。 一陣腳步聲響...
    開封第一講書人閱讀 33,702評(píng)論 1 274
  • 我被黑心中介騙來泰國(guó)打工贡必, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人庸毫。 一個(gè)月前我還...
    沈念sama閱讀 49,191評(píng)論 3 378
  • 正文 我出身青樓仔拟,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親岔绸。 傳聞我的和親對(duì)象是個(gè)殘疾皇子理逊,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,781評(píng)論 2 361