你需要知道的Nginx配置二三事

你需要知道的Nginx配置二三事

Nginx是俄羅斯人Igor Sysoev基於C語言編寫的十分輕量級的HTTP服務器,它主要有以下特點:

  • 它是一個高性能的HTTP和反向代理服務器,同時也是一個IMAP/POP3/SMTP 代理服務器;

  • Nginx使用異步事件驅動的方法來處理請求,Nginx的模塊化事件驅動架構可以在高負載下提供更可預測的性能;

  • 作為Web服務器,Nginx處理靜態文件、索引文件,自動索引的效率非常高

  • 作為反向代理服務器,Nginx可以實現反向代理加速,提高網站運行速度

  • 作為負載均衡服務器,Nginx既可以在內部直接支持Rails和PHP,也可以支持HTTP代理服務器對外進行服務,同時還支持簡單的容錯和利用算法進行負載均衡

  • Nginx是專門為性能優化而開發的,非常注重效率,Nginx在官方測試的結果中,能夠支持五萬個並行連接,而在實際的運作中,可以支持二萬至四萬個並行鏈接

  • 在高可用性方面,Nginx支持熱部署,啟動速度特別迅速,因此可以在不間斷服務的情況下,對軟件版本或者配置進行升級

nginx如何配置?

Nginx的配置文件默認存放路徑是etc/nginx/nginx.conf,可以在Nginx啟動時添加參數–conf-path=PATH來更改nginx.conf文件的存放路徑。nginx.conf中的配置信息主要包含以下五個部分:

  • main(全局設置):主要是包括Nginx工作進程,日誌的配置以及server,location中一些共用的配置

  • events(連接設置):主要包括Nginx連接信息的配置

  • server(主機設置):主要是包括主機名稱,Ip,路徑解析,http請求頭設置,反向代理等配置

  • upstream(上游服務器設置):主要為反向代理服務器信息、負載均衡等相關配置

  • location(URL匹配):特定URL的匹配設置

以上每部分包含若干個條指令,他們之間的關係是:server繼承main,location繼承server,main部分設置的指令將影響其它所有部分的設置,server部分的設置將影響到location部分的設置。upstream既不會繼承指令也不會被繼承,它有自己的特殊指令,不需要在其他地方的應用。

nginx中location部分url如何匹配?

location主要是匹配url中除去server_name(主機名)後的部分,其中關於url的匹配規則有以下幾種:

  • 精確匹配:以“=”開頭表示精確匹配

  • 開頭匹配:^~ 表示uri以某個常規字符串開頭,不是正則匹配

  • 區分大小寫的正則匹配:~開頭表示區分大小寫的正則匹配

  • 不區分大小寫的正則匹配:~* 開頭表示不區分大小寫的正則匹配

  • 通用匹配:匹配url的前面部分

對於上述五類匹配,它們之間的匹配順序和優先級關係如下:

  • 不同類型之間匹配和location的順序無關,只和優先級有關,各種匹配規則的優先級關係是: [精確匹配] > [開頭匹配] > [正則匹配] > [通用匹配];

  • 除了通用匹配,開頭匹配以外,相同類型的匹配優先級只和順序有關,排在前面的優先匹配;

  • 通用匹配和開頭匹配的優先級與通用匹配的最長字符串有關,通用字符串越長,匹配優先級越高;

下面是我設置的幾個location,並測試和驗證以上匹配規則:

  1. server {

  2. listen 80 default_server;

  3. server_name dev.zdp.com;

  4. # 通用匹配 [匹配規則0]

  5. location /

  6. {

  7. return 302 https://dashboard.youdata.com;

  8. }

  9. # 通用匹配 [匹配規則1]

  10. location /hello

  11. {

  12. return 302 https://dashboard.youdata.com;

  13. }

  14. # 通用匹配 [匹配規則2]

  15. location /hello/no

  16. {

  17. return 302 https://dev.youdata.com;

  18. }

  19. # 不區分大小寫的正則匹配 [匹配規則3]

  20. location ~* /hello/y[a-e][a-z][1-9]

  21. {

  22. return 302 https://test.youdata.com;

  23. }

  24. # 區分大小寫的正則匹配 [匹配規則4]

  25. location ~ /hello/y[A-E][E-Z][1-9]

  26. {

  27. return 302 https://pre.youdata.com;

  28. }

  29. # 區分大小寫的正則匹配 [匹配規則5]

  30. location ~ /hello/y[a-e][e-z]

  31. {

  32. return 302 https://pre163.youdata.com;

  33. }

  34. # 開頭匹配 [匹配規則6]

  35. location ^~ /hello/yes

  36. {

  37. return 302 https://youdata.netease.com;

  38. }

  39. # 開頭匹配 [匹配規則7]

  40. location ^~ /hello/yesno

  41. {

  42. return 302 https://youdata.163.com;

  43. }

  44. # 精確匹配 [匹配規則8]

  45. location = /hello

  46. {

  47. return 302 https://www.baidu.com;

  48. }

  49. }

location用例測試:

  • “http://dev.zdp.com/hello” ——- 精確匹配優先,命中[匹配規則8]


  • http://dev.zdp.com/hello/yesnoOk” ——- 開頭匹配優先,開頭匹配同時滿足條件時,長優先,命中[匹配規則7]


  • http://dev.zdp.com/hello/yesOk” ——- 開頭匹配優先,命中[匹配規則6]


  • http://dev.zdp.com/hello/yaz” ——- 正則匹配,命中[匹配規則5]


  • http://dev.zdp.com/hello/yAZ3” ——- 正則匹配,按照location順序匹配,命中[匹配規則3]


  • http://dev.zdp.com/hello/no” ——- 通用匹配,按照匹配長度優先,命中[匹配規則2]


  • http://dev.zdp.com/hello/Ok” ——- 通用匹配,命中[匹配規則1]


  • http://dev.zdp.com/everyone” ——- 通用匹配,所有其它匹配不滿足時,命中[匹配規則0]

nginx中rewrite命令如何重寫url?

rewrite功能就是,使用nginx提供的全局變量或自己設置的變量,結合正則表達式和標誌位實現url重寫以及重定向。rewrite只能放在server{},location{}中,並且只能對域名後邊的除去傳遞的參數外的字符串起作用,例如:


http://dev.zdp.com/a/we/index.php?id=1&u=str => rewrite只能對/a/we/index.php部分重寫

  1. server {

  2. rewrite 規則 定向路徑 重寫flag;

  3. }

  4. location {

  5. rewrite 規則 定向路徑 重寫flag;

  6. }

rewrite的執行順序

執行server塊的rewrite指令;執行location匹配;執行選定的location中的rewrite指令,如果location中rewrite指令沒有break的flag,則會根據當前rewrite路徑重新匹配location;如果其中某步URI被重寫,則重新循環執行1-3,直到找到真實存在的文件,循環最多不會超過10次;

rewrite的flag標誌

last: 停止處理當前location中的ngxhttprewritemodule指令集(rewrite,return等),並開始重新搜索與更改後的URI相匹配的locationbreak : 停止處理當前location中的ngxhttprewritemodule指令集(rewrite,return等),不會重新搜索redirect : 返回302臨時重定向,地址欄會顯示跳轉後的地址permanent : 返回301永久重定向,地址欄會顯示跳轉後的地址default: 默認標誌,繼續會處理當前location中的ngxhttprewrite_module指令集(rewrite,return等),如果沒有return,會開始重新搜索與更改後的URI相匹配的location

nginx中if判斷如何使用?

只是上面的簡單重寫很多時候滿足不了需求,比如需要判斷當文件不存在時、當路徑包含xx時等條件,則需要用到if

Nginx中if語法為:if(condition){…},對給定的條件condition進行判斷。如果為真,大括號內命令將被執行

if判斷規則

  • 當表達式只是一個變量時,如果值為空或任何以0開頭的字符串都會當做false

  • 直接比較變量和內容時,使用=或!=

  • \~正則表達式匹配,\~*不區分大小寫的匹配,!~區分大小寫的正則表達式不匹配,滿足條件返回true

  • -f和!-f用來判斷是否存在文件

  • -d和!-d用來判斷是否存在目錄

  • -e和!-e用來判斷是否存在文件或目錄

  • -x和!-x用來判斷文件是否可執行

if使用舉例

if條件中一般會使用到一些變量,這些變量有些是用戶定義的,有些是系統本身存在的,關於變量相關內容請看下文[Nginx中如何使用變量?]

  1. server {

  2. if ($http_user_agent ~ MSIE) {

  3. rewrite ^(.*)$ /msie/$1 break;

  4. }

  5. # 如果UA包含"MSIE",rewrite請求到/msid/目錄下

  6. if ($http_cookie ~* "id=([^;]+)(?:;|$)") {

  7. set $id $1;

  8. }

  9. # 如果cookie匹配正則,設置變量$id等於正則引用部分

  10. if ($request_method = POST) {

  11. return 405;

  12. }

  13. # 如果提交方法為POST,則返回狀態405(Method not allowed)。return不能返回301,302

  14. if ($slow) {

  15. limit_rate 10k;

  16. }

  17. # 限速,$slow可以通過 set 指令設置

  18. if (!-f $request_filename){

  19. break;

  20. proxy_pass http://127.0.0.1;

  21. }

  22. # 如果請求的文件名不存在,則反向代理到localhost 。這裡的break也是停止rewrite檢查

  23. if ($args ~ post=140){

  24. rewrite ^ http://example.com/ permanent;

  25. }

  26. # 如果query string中包含"post=140",永久重定向到example.com

  27. location ~* \.(gif|jpg|png|swf|flv)$ {

  28. valid_referers none blocked www.jefflei.com www.leizhenfang.com;

  29. if ($invalid_referer) {

  30. return 404;

  31. }

  32. # 防盜鏈

  33. }

  34. }

nginx變量如何使用?

Nginx也可以使用變量,變量分為系統變量和自定義變量

變量特點

  • Nginx變量的創建只能發生在Nginx配置加載的時候,或者說Nginx啟動的時候;

  • Nginx變量的賦值操作則只會發生在請求實際處理的時候;

  • 每個請求都有所有變量的獨立副本,或者說都有各變量用來存放值的容器的獨立副本,它們之間的值彼此互不干擾;

自定義變量

自定義變量通過set命令初始化和賦值,變量名前需要加$符號作為區分

  1. # 設置變量$a = "helloworld";

  2. set $a hello world;

  3. # 設置變量$b = "helloworld, helloworld";

  4. set $b "$a, $a";

nginx中一些常用的命令

  • nginx -t 檢查配置是否可用

  • nginx -s reload 重啟nginx


分享到:


相關文章: