Nginx:配置常用參數(詳解)

目錄

1、模塊簡介

1.1 主模塊

1.2 事件模塊

1.3 http部分

2、部分參數詳細說明

2.1 server_name

2.2 location

2.3 return

2.4 rewrite

2.5 if指令

2.6 last & break

2.7 permanent & redirect

3、應用

3.1 估算併發

3.2 限制每個IP的併發連接數

3.3 限流

3.4 白名單

3.5 防盜鏈


最近公司用到Nginx服務器,本着複習一遍,順便寫個筆記的想法,把常用參數配置總結一下:

1、模塊簡介

1.1 主模塊

# 配置用戶或者組,默認爲nobody nobody。
#user www www;  

 #Nginx開啓的worker進程數,建議爲CPU的核數
#worker_processes 2; 

#指定nginx進程運行文件存放地址
#pid /nginx/pid/nginx.pid;

#指定日誌路徑,級別。這個設置可以放入全局塊、http塊、server塊,級別以此爲:debug|info|notice|warn|error|crit|alert|emerg
error_log log/error.log debug; 

#可以在任意地方使用include指令實現配置文件的包含,類似於apache中的include方法,可減少主配置文件長度。
include vhosts/*.conf;

1.2 事件模塊

events {
    #設置網路連接序列化,防止驚羣現象發生,默認爲on
    accept_mutex on; 
    
    #默認: 500ms 如果一個進程沒有互斥鎖,它將延遲至少多長時間。默認情況下,延遲是500ms 。
    accept_mutex_delay 100ms; 
    
    #設置一個進程是否同時接受多個網絡連接,默認爲off
    multi_accept on;
    
    #事件驅動模型,select|poll|kqueue|epoll|resig|/dev/poll|eventport,不建議設置,nginx會自行選擇
    #use epoll;
    
    #最大連接數,默認爲512
    worker_connections  1024;
}

1.3 http部分

http {
    #文件擴展名與文件類型映射表
    include       mime.types;
    
    # 默認文件類型,默認爲text/plain
    default_type  application/octet-stream; 
    
    #取消服務日誌 
    #access_log off; 

    
    #允許sendfile方式傳輸文件,默認爲off,可以在http塊,server塊,location塊。
    sendfile on;   
    
    #每個進程每次調用傳輸數量不能大於設定的值,默認爲0,即不設上限。
    sendfile_max_chunk 100k;  
    
    #連接超時時間,默認爲75s,可以在http,server,location塊。
    keepalive_timeout 65;  
    
    #開啓gzip資源壓縮
    gzip  on; 
    

    # 負載均衡,詳細可看了一篇文章:https://learnku.com/articles/36737
    upstream blog {   
        server 192.167.20.19:8081;
        server 192.168.10.121:8080 weight=5;
    }

    
    #設定請求緩衝
    client_header_buffer_size    128k;
    large_client_header_buffers  4 128k;
    
    #上傳文件的大小限制  默認1m
    client_max_body_size 8m;

    server {
        #單連接請求上限次數。
        keepalive_requests 120;
        
        #監聽端口
        listen       80;   
        
        #監聽地址
        server_name  blog.13sai.com;  
        
        #設定日誌格式
        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主要區別在於nginx如何解釋location後面的uri,這會使兩者分別以不同的方式將請求映射到服務器文件上。
            #root的處理結果是:root路徑+location路徑
            #alias的處理結果是:使用alias路徑替換location路徑
            alias /www/static/;
            
            #過期30天,靜態文件不怎麼更新,過期可以設大一點,如果頻繁更新,則可以設置得小一點。
            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;  #請求轉向blog 定義的服務器列表 
        }
        
        #禁止訪問文件
        location ~ /.git {
            deny all;
            allow 127.0.0.1; #允許的ip 
        }
    }
} 

2、部分參數詳細說明

2.1 server_name

1.首先選擇所有字符串完全匹配的server_name,如 blog.13sai.com 。
2.其次選擇通配符在前面的server_name,如 *.13sai.com。
3.再次選擇通配符在後面的server_name,如www.13sai.* 。 
4.最後選擇使用正則表達式才匹配的server_name,如 ~^\.sai\.com$

如果都不匹配
1、優先選擇listen配置項後有default或default_server的 
2、找到匹配listen端口的第一個server塊

2.2 location

location
語法: location[=|~|~*|^~|@]/uri/{...}

配置塊: 
server location會嘗試根據用戶請求中的URI來匹配上面的/uri表達式,
如果可以匹配,就選擇 location{}塊中的配置來處理用戶請求。

location表達式類型:

~ 表示執行一個正則匹配,區分大小寫;
~* 表示執行一個正則匹配,不區分大小寫;
^~ 表示普通字符匹配。使用前綴匹配。如果匹配成功,則不再匹配其他location; 
= 進行普通字符精確匹配。也就是完全匹配;
@ 它定義一個命名的 location,使用在內部定向時,例如 error_page, try_files

優先級:

  • 等號類型(=)的優先級最高。一旦匹配成功,則不再查找其他匹配項;
  • 前綴普通匹配(^~)優先級次之。不支持正則表達式。使用前綴匹配,如果有多個location匹配的話,則使用表達式最長的那個;
  • 正則表達式類型(~ ~*)的優先級次之。一旦匹配成功,則不再查找其他匹配項;
  • 常規字符串匹配,如果有多個location匹配的話,則使用表達式最長的那個。

2.3 return

語法:return code [text] return code URL;
return URL;
配置塊:server,location,if
該指令用於結束規則的執行並返回狀態嗎給客戶端。
狀態碼包括:
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 結尾,返回狀態碼403 
location ~ .*\.(sh|bash)?$ {
    return 403;
}

2.4 rewrite

語法:rewrite regex replacement [flag]; 
默認值:—
配置塊:server, location, if
rewrite是實現URL重寫的關鍵指令,根據regex(正則表達式)部分內容,重定向到replacement,結尾是flag標記。 正則:perl兼容正則表達式語句進行規則匹配
替代內容:將正則匹配的內容替換成replacement
flag標記:rewrite支持的flag標記


執行順序:
1. 執行server塊的rewrite指令(這裏的塊指的是server關鍵字後{}包圍的區域,其它xx塊類似)
2. 執行location匹配
3. 執行選定的location中的rewrite指令
如果其中某步URI被重寫,則重新循環執行1-3,直到找到真實存在的文件

如果循環超過10次,則返回500 Internal Server Error錯誤

2.5 if指令

語法:if(condition){...}
默認值:無
配置塊:server,location
對給定的條件condition進行判斷。如果爲真,大括號內的rewrite指令將被執行。
if條件(conditon)可以是如下任何內容:

一個變量名;false如果這個變量是空字符串或者以0開始的字符串;
使用= ,!= 比較的一個變量和字符串
是用~, ~*與正則表達式匹配的變量,如果這個正則表達式中包含},;則整個表達式需要用" 或' 包圍
使用-f, !-f 檢查一個文件是否存在
使用-d, !-d 檢查一個目錄是否存在
使用-e, !-e 檢查一個文件、目錄、符號鏈接是否存在
使用-x, !-x 檢查一個文件是否可執行

實例:

if ($http_user_agent~*(mobile|nokia|iphone|ipad|android|samsung|htc|blackberry)) {
    rewrite ^.+ /mobile last; #跳轉到手機站
}


if ($request_method = POST) {
    return 405;
}

if ($slow) {
    limit_rate 10k;
}

if ($invalid_referer) {
    return 403;
}

2.6 last & break

1. last 和 break 當出現在location 之外時,兩者的作用是一致的沒有任何差異。
注意一點就是,他們會跳過所有的在他們之後的rewrite 模塊中的指令,去選擇自己匹配的location
2. last 和 break 當出現在location 內部時,兩者就存在了差異
-- last: 使用了last 指令,rewrite 後會跳出location 作用域,重新開始再走一次剛剛的行爲
-- break: 使用了break 指令,rewrite後不會跳出location 作用域。它的生命也在這個location中終結。

解釋通俗易懂:

last:重新將rewrite後的地址在server標籤中執行
break:將rewrite後的地址在當前location標籤中執行

2.7 permanent & redirect

permanent: 永久性重定向。請求日誌中的狀態碼爲301
redirect:臨時重定向。請求日誌中的狀態碼爲302

3、應用

3.1 估算併發

  • Nginx 作爲http服務器的時候:
max_clients = worker_processes * worker_connections/2
  • Nginx 作爲反向代理服務器的時候:
max_clients = worker_processes * worker_connections/4  

3.2 限制每個IP的併發連接數

定義一個叫“two”的記錄區,總容量爲 10M(超過大小將請求失敗,以變量 $binary_remote_addr 作爲會話的判斷基準(即一個地址一個會話)。 限制 /download/ 目錄下,一個會話只能進行一個連接。 簡單點,就是限制 /download/ 目錄下,一個IP只能發起一個連接,多過一個,一律503。如下:

http {
    ...
    limit_conn_zone $binary_remote_addr zone=two:10m;

    server {
        ...
        
        location /download {
            limit_conn   two  1;
        }
    }
}

3.3 限流

定義一個叫“one”的記錄區,佔用空間大小爲10m(超過大小將請求失敗),平均處理的請求頻率不能超過每秒一次,也可以設置分鐘速率。如下:

http {
    ...
    
    
    limit_req_zone  $binary_remote_addr  zone=one:10m  rate=1r/s;
    

    server {
        ...
        
        location / {
            #緩存區隊列burst=5個,nodelay表示不延期(超過的請求失敗),即每秒最多可處理rate+burst個,同時處理rate個。
            limit_req zone=one burst=5 nodelay; 
        }
    }
}

3.4 白名單

http{
    ...
    
    #判斷客戶端的ip地址是否在白名單列表當中,如果返回爲0,則在白名單列表當中,否則返回爲1
    geo $whiteIpList {
        default  1;
        118.24.109.254 0;
        47.98.147.0/24 1;
        #可以引入一些白名單配置
        include 'whiteIP.conf'
    }
    
    #如果不在白名單之內,返回客戶端的二進制的ip地址
    map $whiteIpList  $limit {
        default  "";
        1   $binary_remote_addr;
        0   "";
    }
    
    #如果返回的是空字符串那麼速率限制會失效
    limit_req_zone $limit zone=test:2m rate=1r/m;
    
    ...
}

3.5 防盜鏈

http {
    ...

    server {
        ...
        #valid_referers後面的referer列表進行匹配,如果匹配到了就invalid_referer字段值爲0 否則設置該值爲1
        location ~* \.(gif|jpg|png|swf|flv)$ {
            valid_referers none blocked *.13sai.com;
            if ($invalid_referer) {
                rewrite ^/ blog.13sai.com
            }
        }
    }
}

 

更多精彩,請關注我的"今日頭條號":Java雲筆記
隨時隨地,讓你擁有最新,最便捷的掌上雲服務

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章