Nginx 配置經常使用參數,看這一篇就夠了

最近在全面學習Nginx,看成筆記了,若有錯誤,歡迎指出或深刻交流。php

相關文章:css

主模塊

# 配置用戶或者組,默認爲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;
複製代碼

事件模塊

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;
}
複製代碼

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 
        }
    }
} 
複製代碼

部分參數詳細說明

server_name

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

若是都不匹配
一、優先選擇listen配置項後有default或default_server的 
二、找到匹配listen端口的第一個server塊
複製代碼

location

location
語法: location[=|~|~*|^~|@]/uri/{...}
配置塊: server location會嘗試根據用戶請求中的URI來匹配上面的/uri表達式,若是能夠匹配,就選擇 location{}塊中的配置來處理用戶請求。
複製代碼

location表達式類型html

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

優先級:node

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

(location =) > (location 完整路徑) > (location ^~ 路徑) > (location ~,~* 正則順序) > (location 部分起始路徑)nginx

rewrite

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

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


語法:rewrite regex replacement [flag]; 默認值:—
上下文:server, location, if
rewrite是實現URL重寫的關鍵指令,根據regex(正則表達式)部份內容,重定向到replacement,結尾是flag標記。 正則:perl兼容正則表達式語句進行規則匹配
替代內容:將正則匹配的內容替換成replacement
flag標記:rewrite支持的flag標記
複製代碼
if指令
語法:if(condition){...}
默認值:無
做用域:server,location
對給定的條件condition進行判斷。若是爲真,大括號內的rewrite指令將被執行。
if條件(conditon)能夠是以下任何內容:

一個變量名;false若是這個變量是空字符串或者以0開始的字符串;
使用= ,!= 比較的一個變量和字符串
是用~, ~*與正則表達式匹配的變量,若是這個正則表達式中包含},;則整個表達式須要用" 或' 包圍 使用-f ,!-f 檢查一個文件是否存在 使用-d, !-d 檢查一個目錄是否存在 使用-e ,!-e 檢查一個文件、目錄、符號連接是否存在 使用-x , !-x 檢查一個文件是否可執行 複製代碼
if實例
if ( $http_user_agent ~ "(MIDP)|(WAP)|(UP.Browser)|(Smartphone)|(Obigo)|(Mobile)|(AU.Browser)|(wxd.Mms)|(WxdB.Browser)|(CLDC)|(UP.Link)|(KM.Browser)|(UCWEB)|(SEMC-Browser)|(Mini)|(Symbian)|(Palm)|(Nokia)|(Panasonic)|(MOT-)|(SonyEricsson)|(NEC-)|(Alcatel)|(Ericsson)|(BENQ)|(BenQ)|(Amoisonic)|(Amoi-)|(Capitel)|(PHILIPS)|(SAMSUNG)|(Lenovo)|(Mitsu)|(Motorola)|(SHARP)|(WAPPER)|(LG-)|(LG/)|(EG900)|(CECT)|(Compal)|(kejian)|(Bird)|(BIRD)|(G900/V1.0)|(Arima)|(CTL)|(TDG)|(Daxian)|(DAXIAN)|(DBTEL)|(Eastcom)|(EASTCOM)|(PANTECH)|(Dopod)|(Haier)|(HAIER)|(KONKA)|(KEJIAN)|(LENOVO)|(Soutec)|(SOUTEC)|(SAGEM)|(SEC-)|(SED-)|(EMOL-)|(INNO55)|(ZTE)|(iPhone)|(Android)|(Windows CE)|(Wget)|(Java)|(curl)|(Opera)" ){
    rewrite ^.+ /mobile last; #跳轉到手機站
}


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

if ($slow) {
    limit_rate 10k;
}

if ($invalid_referer) {
    return 403;
}
複製代碼
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標籤中執行
複製代碼
permanent & redirect:
permanent: 永久性重定向。請求日誌中的狀態碼爲301
redirect:臨時重定向。請求日誌中的狀態碼爲302
複製代碼

從實現功能的角度上去看,permanent 和 redirect 是同樣的。不存在好壞。也不存在什麼性能上的問題。可是對seo會有影響,這裏要根據須要作出選擇 在 permanent 和 redirect 中提到了 狀態碼 301 和 302。git

記住:last 和 break 想對於的訪問日誌的請求狀態碼爲200web

當你打開一個網頁,同時打開debug 模式時,會發現301 和 302 時的行爲是這樣的。正則表達式

第一個請求301 或者 302 後,瀏覽器從新獲取了一個新的URL ,而後會對這個新的URL 從新進行訪問。因此當你配置的是permanent 和 redirect ,你對一個URL 的訪問請求,落到服務器上至少爲2次;而當你配置了last 或者是break 時,你最終的URL 肯定下來後,不會將這個URL返回給瀏覽器,而是將其扔給了fastcgi_pass或者是proxy_pass指令去處理。請求一個URL ,落到服務器上的次數就爲1次。apache

注意:配置last 在跨域的時候效果和redirect一致,都是返回302狀態碼,請求地址也發生改變api

應用

估算併發

nginx做爲http服務器的時候:

max_clients = worker_processes * worker_connections/2
複製代碼

nginx做爲反向代理服務器的時候:

max_clients = worker_processes * worker_connections/4  
複製代碼

限制每一個IP的併發鏈接數

demo:定義一個叫「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;
        }
    }
}
複製代碼

限流

demo:定義一個叫「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; 
        }
    }
}
複製代碼

白名單

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;
    
    ...
}
複製代碼

防盜鏈

http {
    ...

    server {
        ...
        
        location ~* \.(gif|jpg|png|swf|flv)$ {
            valid_referers none blocked *.13sai.com;
            if ($invalid_referer) {
                rewrite ^/ blog.13sai.com
            }
        }
    }
}
複製代碼
相關文章
相關標籤/搜索