常用的Nginx配置總結(jié)

Nginx是輕量級的Web服務(wù)器,也是一個高性能的HTTP和反向代理服務(wù)器。

1.nginx在應(yīng)用程序中的作用
  • 反向代理:將來自客戶端的請求轉(zhuǎn)發(fā)到后端的真實服務(wù)器,然后將響應(yīng)返回給客戶端。以隱藏服務(wù)器的真實IP地址,提高安全性。
  • 負(fù)載均衡:將來自客戶端的請求分發(fā)到多個后端服務(wù)器,提高系統(tǒng)的并發(fā)處理能力
  • gzip壓縮:壓縮數(shù)據(jù),提高網(wǎng)絡(luò)傳輸效率
  • 靜態(tài)資源服務(wù)器:提供對靜態(tài)文件(如HTML、圖片)的訪問服務(wù)。并可配置緩存,以減少對后端服務(wù)器的請求次數(shù)
  • SSL/TLS加密:對傳輸?shù)臄?shù)據(jù)進行加密,即HTTPS
2.默認(rèn)配置文件分析

nginx.conf 默認(rèn)配置文件

//配置工作進程數(shù),如果大于1,則以多進程的方式運行
worker_processes  1;
//配置影響Nginx服務(wù)器或與用戶的網(wǎng)絡(luò)連接
events {
    //單個工作進程可以同時打開的最大連接數(shù)
    //最大客戶端連接數(shù)由worker_processes和worker_connections決定
    worker_connections  1024;
}


//可以嵌套多個server
http 
{
    //包含其他文件到nginx.conf配置文件中,mime.types文件包含了各種文件類型
    include       mime.types;
    //設(shè)置默認(rèn)的文件類型,'application/octet-stream'是一種通用的二進制文件類型
    default_type  application/octet-stream;
    //啟用內(nèi)核級別的文件傳輸優(yōu)化
    sendfile        on;
    //長連接時間,超過時間Nginx會關(guān)閉該連接,包括HTTP和WebSocket
    keepalive_timeout  65;
    //配置虛擬主機的相關(guān)參數(shù)
    server
    { 
        //監(jiān)聽的端口
        listen       80;
        //監(jiān)聽的域名
        server_name  localhost;
        //配置請求的路由,以及各種頁面的處理情況
        location / {
            root   html;
            index  index.html index.htm;
        }
        //配置錯誤頁面
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
     }
}

根據(jù)nginx.conf 默認(rèn)配置文件可分為6個模塊:

  • 全局模塊:配置影響nginx全局的指令,比如運行nginx的用戶名,nginx進程pid存放路徑,日志存放路徑,配置文件引入,worker進程數(shù)等。
  • events模塊:配置影響nginx服務(wù)器或與用戶的網(wǎng)絡(luò)連接。比如每個進程的最大連接數(shù),選取哪種事件驅(qū)動模型(select/poll epoll或者是其他等等nginx支持的)來處理連接請求,是否允許同時接受多個網(wǎng)路連接,開啟多個網(wǎng)絡(luò)連接序列化等。
  • http模塊:可以嵌套多個server,配置代理,緩存,日志格式定義等絕大多數(shù)功能和第三方模塊的配置。如文件引入,mime-type定義,日志自定義,是否使用sendfile傳輸文件,連接超時時間,單連接請求數(shù)等。
  • server模塊:配置虛擬主機的相關(guān)參數(shù)比如域名端口等等,一個http中可以有多個server。
  • location模塊:配置url路由規(guī)則。
  • upstream模塊:配置上游服務(wù)器的地址以及負(fù)載均衡策略和重試策略等等。
3. location 路由匹配規(guī)則

location [ = | ~ | ~* | ^~ ] uri { ... }

  • 通用匹配:使用一個 / 表示,可以匹配所有請求。相當(dāng)于 switch 中的 default。

location / {
    root   dist;
    index  index.html index.htm;
  }
  • 無修飾符的前綴匹配:匹配前綴是配置的的url

location /prefix_match {
   
    alias  dist;  //前綴匹配使用alias來尋找資源
    index  index.html index.htm;
}

匹配結(jié)果


curl http://www.locatest.com/prefixmatch     ? 301
curl http://www.locatest.com/prefixmatch?    ? 301
curl http://www.locatest.com/PREFIXMATCH     ? 404
curl http://www.locatest.com/prefixmatch/    ? 200
curl http://www.locatest.com/prefixmatchmmm  ? 404
curl http://www.locatest.com/prefixmatch/mmm ? 404
curl http://www.locatest.com/aaa/prefixmatch/? 404
//域名/prefixmatch,域名/prefixmatch? 和域名/prefixmatch/ 這三個url能夠匹配上無修飾符的前綴匹配。
  • ^~ 有修飾符的前綴匹配

location ^~ /exactprefixmatch{    
[ configuration ] 
}

匹配結(jié)果


curl http://www.locatest.com/exactprefixmatch     ? 200
curl http://www.locatest.com/exactprefixmatch/    ? 200
curl http://www.locatest.com/exactprefixmatch?    ? 200
curl http://www.locatest.com/exactprefixmatchmmm  ? 200
curl http://www.locatest.com/exactprefixmatch/mmm ? 200
curl http://www.locatest.com/aaa/exactprefixmatch ? 404
curl http://www.locatest.com/EXACTPREFIXMATCH     ? 404
//域名/exactprefixmatchmmm 和域名/exactprefixmatch/mmm 是可以匹配上的,而不帶修飾符的前綴匹配這兩個類型的url是匹配不上的直接返回了404 
  • = 精確匹配

location = /test {
    return 200 "hello";
  }
  
  # /test ok
  # /test/ not ok
  # /test2 not ok
  # /test/2 not ok
  • ~ 區(qū)分大小寫的正則匹配

location ~ ^/test$ {
    [ configuration ] 
  }
  
  # /test ok
  # /Test not ok
  # /test/ not ok
  # /test2 not ok
  • ~ 區(qū)分大小寫的正則匹配

location ~* ^/test$ {     
[ configuration ] 
}


# /test ok
# /Test ok
# /test/ not ok
# /test2 not ok
  • 匹配優(yōu)先級
    • 精確匹配 =
    • 前綴匹配 ^~
    • 正則匹配 ~ 或~*
    • 通用匹配
  • root 與 alias 的區(qū)別
    • root 是直接拼接 root + location
        location /i/ {
           root /data/w3;
        }
       // 當(dāng)請求 /i/top.gif ,/data/w3/i/top.gif 會被返回。
      
    • ralias 是用 alias 替換 location
        location /i/ {
          alias /data/w3/images/;
        }
      
       // 當(dāng)請求 /i/top.gif ,/data/w3/images/top.gif 會被返回
      
  • server 和 location 中的 root
    server 和 location 中都可以使用 root,采取就近原則,如果 location 中能匹配到,就是用 location 中的 root 配置,忽略 server 中的 root,當(dāng) location 中匹配不到的時候,則使用 server 中的 root 配置
4.解決跨域

server {
    listen       8088;
    server_name  192.168.31.115;


    location / {
        proxy_pass http://192.168.31.115:8080/; //反向代理
    }


    location /laohuangli {
        proxy_pass http://v.juhe.cn/laohuangli;
    }
}
// 將頁面地址代理到8088端口,將接口地址也代理到8088端口
5.gzip壓縮

http{
    gzip on; # 是否開啟gzip
    gzip_min_length  1k;# 開始壓縮的最小長度(再小就不要壓縮了,意義不在)
    gzip_buffers     4 16k; # 緩沖(壓縮在內(nèi)存中緩沖幾塊? 每塊多大?)
    gzip_http_version 1.1;# 開始壓縮的http協(xié)議版本(可以不設(shè)置,目前幾乎全是1.1協(xié)議)
    gzip_comp_level 2;# 推薦6 壓縮級別(級別越高,壓的越小,越浪費CPU計算資源)
    gzip_types     text/plain application/javascript application/x-javascript text/javascript text/css application/xml;# 對哪些類型的文件用壓縮 如txt,xml,html ,css
    gzip_vary on; # 是否傳輸gzip壓縮標(biāo)志
    gzip_proxied   expired no-cache no-store private auth; #Nginx做為反向代理的時候啟用 例如如果header中包含”Expires”頭信息,啟用壓縮
   gzip_disable   "MSIE [1-6]\."; #正則匹配UA,配置禁用gzip條件。此處表示ie6及以下不啟用gzip(因為ie低版本不支持)
   gzip_static on; #開啟后會尋找以.gz結(jié)尾的文件,直接返回,不會占用cpu進行壓縮,如果找不到則不進行壓縮
}

//默認(rèn)是動態(tài)壓縮,即對每個請求是先壓縮后輸出。可配置gzip_static on;直接讀取生成好的gz文件(前端打包時生成gz文件)
6.將HTTP請求轉(zhuǎn)到HTTPS
  • 在服務(wù)器上監(jiān)聽80端口,使用重定向
server
    {
        listen 80;
        server_name 47.101.161.174;
        return 301 https://$host$request_uri; //永久性重定向
     }
7.使用HTTP2
  • 在監(jiān)聽443端口后加http2即可開啟
listen 443 ssl http2;
8.負(fù)載均衡
  • 將請求分配給空閑服務(wù)器處理(電話號碼同一個,但是不同客服接聽)
upstream firstdemo {
    server 192.168.31.123:8081;
    server 192.168.31.123:8082;
}

server {
    listen 8080;
    server_name localhost;
    location / {
        proxy_pass http://firstdemo;
    }
}

負(fù)載均衡:upstream name {},兩個server分別對應(yīng)著不同的服務(wù)器
proxy_pass http://firstdemo,代理到firstdemo里兩個服務(wù)器上
灰度系統(tǒng):可判斷cookie版本,走不同服務(wù)器

9.防盜鏈
location ~ .*\.(jpg|png|gif)$ { # 匹配防盜鏈資源的文件類型
    # 通過 valid_referers 定義合法的地址白名單 $invalid_referer 不合法的返回403  
    valid_referers none blocked 127.0.0.1;
    if ($invalid_referer) {
        return 403;
    }
}
10.請求限制

對于大流量惡意的訪問,會造成帶寬的浪費,給服務(wù)器增加壓力。往往對于同一 IP 的連接數(shù)以及并發(fā)數(shù)進行限制。

  • 關(guān)于請求限制主要有兩種類型:
    limit_conn_module 連接頻率限制
    limit_req_module 請求頻率限制

# $binary_remote_addr 遠程IP地址 zone 區(qū)域名稱 10m內(nèi)存區(qū)域大小
limit_conn_zone $binary_remote_addr zone=coon_zone:10m;
server {
    # conn_zone 設(shè)置對應(yīng)的共享內(nèi)存區(qū)域 1是限制的數(shù)量
 limit_conn conn_zone 1;
}

# $binary_remote_addr 遠程IP地址 zone 區(qū)域名稱 10m內(nèi)存區(qū)域大小 rate 為請求頻率 1s 一次
limit_req_zone $binary_remote_addr zone=req_zone:10m rate=1r/s;
server {
    location / {
        # 設(shè)置對應(yīng)的共享內(nèi)存區(qū)域 burst最大請求數(shù)閾值 nodelay不希望超過的請求被延遲
        limit_req zone=req_zone burst=5 nodelay;
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容