ngnix配置

致敬原文作者岖免,原文地址:https://www.nginx.cn/115.html

一、ngnix配置參數(shù)詳解

#運(yùn)行用戶
user nobody;
#啟動(dòng)進(jìn)程,通常設(shè)置成和cpu的數(shù)量相等
worker_processes  1;
 
#全局錯(cuò)誤日志及PID文件
#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;
 
#pid        logs/nginx.pid;
 
#工作模式及連接數(shù)上限
events {
    #epoll是多路復(fù)用IO(I/O Multiplexing)中的一種方式,
    #僅用于linux2.6以上內(nèi)核,可以大大提高nginx的性能
    use   epoll; 
 
    #單個(gè)后臺(tái)worker process進(jìn)程的最大并發(fā)鏈接數(shù)    
    worker_connections  1024;
 
    # 并發(fā)總數(shù)是 worker_processes 和 worker_connections 的乘積
    # 即 max_clients = worker_processes * worker_connections
    # 在設(shè)置了反向代理的情況下绢淀,max_clients = worker_processes * worker_connections / 4  為什么
    # 為什么上面反向代理要除以4慌申,應(yīng)該說(shuō)是一個(gè)經(jīng)驗(yàn)值
    # 根據(jù)以上條件访圃,正常情況下的Nginx Server可以應(yīng)付的最大連接數(shù)為:4 * 8000 = 32000
    # worker_connections 值的設(shè)置跟物理內(nèi)存大小有關(guān)
    # 因?yàn)椴l(fā)受IO約束,max_clients的值須小于系統(tǒng)可以打開(kāi)的最大文件數(shù)
    # 而系統(tǒng)可以打開(kāi)的最大文件數(shù)和內(nèi)存大小成正比告私,一般1GB內(nèi)存的機(jī)器上可以打開(kāi)的文件數(shù)大約是10萬(wàn)左右
    # 我們來(lái)看看360M內(nèi)存的VPS可以打開(kāi)的文件句柄數(shù)是多少:
    # $ cat /proc/sys/fs/file-max
    # 輸出 34336
    # 32000 < 34336,即并發(fā)連接總數(shù)小于系統(tǒng)可以打開(kāi)的文件句柄總數(shù),這樣就在操作系統(tǒng)可以承受的范圍之內(nèi)
    # 所以柒爵,worker_connections 的值需根據(jù) worker_processes 進(jìn)程數(shù)目和系統(tǒng)可以打開(kāi)的最大文件總數(shù)進(jìn)行適當(dāng)?shù)剡M(jìn)行設(shè)置
    # 使得并發(fā)總數(shù)小于操作系統(tǒng)可以打開(kāi)的最大文件數(shù)目
    # 其實(shí)質(zhì)也就是根據(jù)主機(jī)的物理CPU和內(nèi)存進(jìn)行配置
    # 當(dāng)然批糟,理論上的并發(fā)總數(shù)可能會(huì)和實(shí)際有所偏差,因?yàn)橹鳈C(jī)還有其他的工作進(jìn)程需要消耗系統(tǒng)資源蜀撑。
    # ulimit -SHn 65535
}

http {
    #設(shè)定mime類型,類型由mime.type文件定義
    include    mime.types;
    default_type  application/octet-stream;
    #設(shè)定日志格式
    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  logs/access.log  main;
 
    #sendfile 指令指定 nginx 是否調(diào)用 sendfile 函數(shù)(zero copy 方式)來(lái)輸出文件挤巡,
    #對(duì)于普通應(yīng)用,必須設(shè)為 on,
    #如果用來(lái)進(jìn)行下載等應(yīng)用磁盤(pán)IO重負(fù)載應(yīng)用酷麦,可設(shè)置為 off矿卑,
    #以平衡磁盤(pán)與網(wǎng)絡(luò)I/O處理速度,降低系統(tǒng)的uptime.
    sendfile     on;
    #tcp_nopush     on;
 
    #連接超時(shí)時(shí)間
    #keepalive_timeout  0;
    keepalive_timeout  65;
    tcp_nodelay     on;
 
    #開(kāi)啟gzip壓縮
    gzip  on;
    gzip_disable "MSIE [1-6].";
 
    #設(shè)定請(qǐng)求緩沖
    client_header_buffer_size    128k;
    large_client_header_buffers  4 128k;
 ## 設(shè)置本地后端服務(wù)代理贴铜,若想設(shè)置為線上代理粪摘,換訪問(wèn)地址即可
     upstream useHD {      
      server 127.0.0.1:9201;
    }
    #設(shè)定虛擬主機(jī)配置
    server {
        #偵聽(tīng)80端口
        listen    9200;
        #定義使用 127.0.0.1訪問(wèn)
        server_name  127.0.0.1;
 
        #定義服務(wù)器的默認(rèn)網(wǎng)站根目錄位置
        root html;
 
        #設(shè)定本虛擬主機(jī)的訪問(wèn)日志
        access_log  logs/nginx.access.log  main;
 
        #默認(rèn)請(qǐng)求
        location / {
            
            #定義首頁(yè)索引文件的名稱
            index index.php index.html index.htm;   
 
        }
 
        # 定義錯(cuò)誤提示頁(yè)面
        error_page   500 502 503 504 /50x.html;
        location = /50x.html {
        }
 
        #靜態(tài)文件,nginx自己處理
        location ~ ^/(images|javascript|js|css|flash|media|static)/ {
            
            #過(guò)期30天绍坝,靜態(tài)文件不怎么更新徘意,過(guò)期可以設(shè)大一點(diǎn),
            #如果頻繁更新轩褐,則可以設(shè)置得小一點(diǎn)椎咧。
            expires 30d;
        }
## 表示路徑為:use文件夾下 的A、B把介、C勤讽,實(shí)際查找的是/Users/xxx/Documents/USE/folder下的文件
    location ~ ^/use/(A|B|C) {
         root    /Users/xxx/Documents/USE/folder; 
                expires      30d;
        }
##如果要代理到use下的A文件下的vue文件里可使用:
        location ~ ^/use/(A) {
                root    /Users/xxx/Documents/USE/folder;
                try_files $uri $uri/ /index.html $1/vue/index.html last;
                expires      30d;
        }
        #PHP 腳本請(qǐng)求全部轉(zhuǎn)發(fā)到 FastCGI處理. 使用FastCGI默認(rèn)配置.
        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;
        }
      ## 配置后端服務(wù)器
       location ~ {
                proxy_pass   http://useHD;
                proxy_set_header Host $host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
        #禁止訪問(wèn) .htxxx 文件
            location ~ /.ht {
            deny all;
        }
 
    }
}

二、nginx命令行參數(shù)

不像許多其他軟件系統(tǒng)拗踢,Nginx 僅有幾個(gè)命令行參數(shù)脚牍,完全通過(guò)配置文件來(lái)配置

-c </path/to/config> 為 Nginx 指定一個(gè)配置文件,來(lái)代替缺省的巢墅。

-t 不運(yùn)行诸狭,而僅僅測(cè)試配置文件券膀。nginx 將檢查配置文件的語(yǔ)法的正確性,并嘗試打開(kāi)配置文件中所引用到的文件驯遇。

-v 顯示 nginx 的版本芹彬。

-V 顯示 nginx 的版本,編譯器版本和配置參數(shù)叉庐。

三舒帮、 nginx控制信號(hào)

可以使用信號(hào)系統(tǒng)來(lái)控制主進(jìn)程。默認(rèn)陡叠,nginx 將其主進(jìn)程的 pid 寫(xiě)入到 /usr/local/nginx/nginx.pid 文件中玩郊。通過(guò)傳遞參數(shù)給 ./configure 或使用 pid 指令,來(lái)改變?cè)撐募奈恢谩?/p>

主進(jìn)程可以處理以下的信號(hào):

| TERM, INT | 快速關(guān)閉 |
| QUIT | 從容關(guān)閉 |
| HUP | 重載配置
用新的配置開(kāi)始新的工作進(jìn)程
從容關(guān)閉舊的工作進(jìn)程 |
| USR1 | 重新打開(kāi)日志文件 |
| USR2 | 平滑升級(jí)可執(zhí)行程序枉阵。 |
| WINCH | 從容關(guān)閉工作進(jìn)程 |

盡管你不必自己操作工作進(jìn)程瓦宜,但是,它們也支持一些信號(hào):

| TERM, INT | 快速關(guān)閉 |
| QUIT | 從容關(guān)閉 |
| USR1 | 重新打開(kāi)日志文件 |

四岭妖、 nginx 啟動(dòng)临庇、停止、重啟命令

1昵慌、nginx啟動(dòng)

sudo /usr/local/nginx/nginx (nginx二進(jìn)制文件絕對(duì)路徑假夺,可以根據(jù)自己安裝路徑實(shí)際決定)

2、nginx從容停止命令斋攀,等所有請(qǐng)求結(jié)束后關(guān)閉服務(wù)

ps -ef |grep nginx

kill -QUIT nginx主進(jìn)程號(hào)

3已卷、nginx 快速停止命令,立刻關(guān)閉nginx進(jìn)程

ps -ef |grep nginx

kill -TERM nginx主進(jìn)程號(hào)

4淳蔼、如果以上命令不管用侧蘸,可以強(qiáng)制停止

kill -9 nginx主進(jìn)程號(hào)

如果嫌麻煩可以不用查看進(jìn)程號(hào),直接使用命令進(jìn)行操作
其中/usr/local/nginx/nginx.pid 為nginx.conf中pid命令設(shè)置的參數(shù)鹉梨,用來(lái)存放nginx主進(jìn)程號(hào)的文件
kill -信號(hào)類型(HUP|TERM|QUIT) cat /usr/local/nginx/nginx.pid
例如
kill -QUIT cat /usr/local/nginx/nginx.pid

5讳癌、nginx重啟命令

nginx重啟可以分成幾種類型

(1)簡(jiǎn)單型,先關(guān)閉進(jìn)程存皂,修改你的配置后晌坤,重啟進(jìn)程。
kill -QUIT cat /usr/local/nginx/nginx.pid
sudo /usr/local/nginx/nginx

兩個(gè)虛擬主機(jī)(純靜態(tài)-html 支持) - Two Virtual Hosts, Serving Static Files

http {
    server {
        listen          80;
        server_name     www.domain1.com;
        access_log      logs/domain1.access.log main;
        location / {
            index index.html;
            root  /var/www/domain1.com/htdocs;
        }
    }
    server {
        listen          80;
        server_name     www.domain2.com;
        access_log      logs/domain2.access.log main;
        location / {
            index index.html;
            root  /var/www/domain2.com/htdocs;
        }
    }
}
http {
    server {
        listen          80;
        server_name     www.domain1.com;
        access_log      logs/domain1.access.log main;
        location / {
            index index.html;
            root  /var/www/domain1.com/htdocs;
        }
    }
    server {
        listen          80;
        server_name     www.domain2.com;
        access_log      logs/domain2.access.log main;
        location / {
            index index.html;
            root  /var/www/domain2.com/htdocs;
        }
    }
}

虛擬主機(jī)標(biāo)準(zhǔn)配置(簡(jiǎn)化) - A Default Catchall Virtual Host

http {
    server {
        listen          80 default;
        server_name     _ *;
        access_log      logs/default.access.log main;
        location / {
            index index.html;
            root  /var/www/default/htdocs;
        }
    }
}
http {
    server {
        listen          80 default;
        server_name     _ *;
        access_log      logs/default.access.log main;
        location / {
            index index.html;
            root  /var/www/default/htdocs;
        }
    }
}

在父文件夾中建立子文件夾以指向子域名 - Wildcard Subdomains in a Parent Folder
這是一個(gè)添加子域名(或是當(dāng)DNS已指向服務(wù)器時(shí)添加一個(gè)新域名)的簡(jiǎn)單方法旦袋。需要注意的是骤菠,我已經(jīng)將FCGI配置進(jìn)該文件了。如果你只想使服務(wù)器為靜態(tài)文件服務(wù)疤孕,可以直接將FCGI配置信息注釋掉商乎,然后將默認(rèn)主頁(yè)文件變成index.html。

這個(gè)簡(jiǎn)單的方法比起為每一個(gè)域名建立一個(gè) vhost.conf 配置文件來(lái)講祭阀,只需要在現(xiàn)有的配置文件中增加如下內(nèi)容:

server {
        # Replace this port with the right one for your requirements
        # 根據(jù)你的需求改變此端口
        listen       80;  #could also be 1.2.3.4:80 也可以是1.2.3.4:80的形式
        # Multiple hostnames seperated by spaces.  Replace these as well.
        # 多個(gè)主機(jī)名可以用空格隔開(kāi)鹉戚,當(dāng)然這個(gè)信息也是需要按照你的需求而改變的爬泥。
        server_name  star.yourdomain.com *.yourdomain.com www.*.yourdomain.com;
        #Alternately: _ *
        #或者可以使用:_ * (具體內(nèi)容參見(jiàn)本維基其他頁(yè)面)
        root /PATH/TO/WEBROOT/$host;
        error_page  404              http://yourdomain.com/errors/404.html;
        access_log  logs/star.yourdomain.com.access.log;
        location / {
            root   /PATH/TO/WEBROOT/$host/;
            index  index.php;
        }
        # serve static files directly
        # 直接支持靜態(tài)文件 (愛(ài)月說(shuō):???從配置上看來(lái)不是直接支持啊~有問(wèn)題有問(wèn)題~)
        location ~* ^.+.(jpg|jpeg|gif|css|png|js|ico|html)$ {
            access_log        off;
            expires           30d;
        }
        location ~ .php$ {
          # By all means use a different server for the fcgi processes if you need to
          # 如果需要,你可以為不同的FCGI進(jìn)程設(shè)置不同的服務(wù)信息
          fastcgi_pass   127.0.0.1:YOURFCGIPORTHERE;
          fastcgi_index  index.php;
          fastcgi_param  SCRIPT_FILENAME  /PATH/TO/WEBROOT/$host/$fastcgi_script_name;
          fastcgi_param  QUERY_STRING     $query_string;
          fastcgi_param  REQUEST_METHOD   $request_method;
          fastcgi_param  CONTENT_TYPE     $content_type;
          fastcgi_param  CONTENT_LENGTH   $content_length;
          fastcgi_intercept_errors on;
        }
        location ~ /.ht {
            deny  all;
        }
     }

(2)mac本可能需要如下命令
brew services restart nginx

五崩瓤、 nginx location

1、location格式

location有兩種格式:

  • 匹配uri類型踩官,有四種參數(shù)可選却桶,當(dāng)然也可以不帶參數(shù)。
  • 命名location蔗牡,用@來(lái)標(biāo)識(shí)颖系,類似于定義goto語(yǔ)句塊。

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

2辩越、location匹配參數(shù)解釋

  • location后沒(méi)有參數(shù)直接跟著URI嘁扼,表示前綴匹配,代表跟請(qǐng)求中的URI從頭開(kāi)始匹配黔攒。
  • ~ | 執(zhí)行一個(gè)正則匹配趁啸,區(qū)分大小寫(xiě)。
  • ~* | 執(zhí)行一個(gè)正則匹配督惰,不區(qū)分大小寫(xiě)不傅。
  • ^~ | 普通字符匹配,多用來(lái)匹配目錄赏胚。
  • = | 執(zhí)行普通字符精確匹配访娶。
  • "@" 定義一個(gè)命名的 location,@定義的locaiton名字一般用在內(nèi)部定向觉阅,例如error_page, try_files命令中崖疤。它的功能類似于編程中的goto。

(1)location匹配命令

  • ~ #波浪線表示執(zhí)行一個(gè)正則匹配典勇,區(qū)分大小寫(xiě)
  • ~* #表示執(zhí)行一個(gè)正則匹配劫哼,不區(qū)分大小寫(xiě)
  • ^~ #^~表示普通字符匹配,如果該選項(xiàng)匹配割笙,只匹配該選項(xiàng)沦偎,不匹配別的選項(xiàng),一般用來(lái)匹配目錄
  • = #進(jìn)行普通字符精確匹配
  • @ #"@" 定義一個(gè)命名的 location咳蔚,使用在內(nèi)部定向時(shí)豪嚎,例如 error_page, try_files

(2)location 匹配的優(yōu)先級(jí)(與location在配置文件中的順序無(wú)關(guān))

  • = 精確匹配會(huì)第一個(gè)被處理。如果發(fā)現(xiàn)精確匹配谈火,nginx停止搜索其他匹配侈询。
  • 普通字符匹配,正則表達(dá)式規(guī)則和長(zhǎng)的塊規(guī)則將被優(yōu)先和查詢匹配糯耍,也就是說(shuō)如果該項(xiàng)匹配還需去看有沒(méi)有正則表達(dá)式匹配和更長(zhǎng)的匹配扔字。
  • ^~ 則只匹配該規(guī)則囊嘉,nginx停止搜索其他匹配,否則nginx會(huì)繼續(xù)處理其他location指令革为。
  • 最后匹配里帶有"~" 和 "~*"的指令扭粱,如果找到相應(yīng)的匹配,則nginx停止搜索其他匹配震檩;當(dāng)沒(méi)有正則表達(dá)式或者沒(méi)有正則表達(dá)式被匹配的情況下琢蛤,那么匹配程度最高的逐字匹配指令會(huì)被使用。

(3)location 優(yōu)先級(jí)

  • =前綴的指令嚴(yán)格匹配這個(gè)查詢抛虏。如果找到博其,停止搜索。
location  =  /  {
  # 只匹配"/".
  [  configuration  A  ]
}
  • 所有剩下的常規(guī)字符串迂猴,最長(zhǎng)的匹配慕淡。如果這個(gè)匹配使用^?前綴,搜索停止沸毁。
location  /  {
  # 匹配任何請(qǐng)求峰髓,因?yàn)樗姓?qǐng)求都是以"/"開(kāi)始
  # 但是更長(zhǎng)字符匹配或者正則表達(dá)式匹配會(huì)優(yōu)先匹配
  [  configuration  B  ]
}
  • 正則表達(dá)式,在配置文件中定義的順序息尺。
location  ^~  /images/  {
  # 匹配任何以 /images/ 開(kāi)始的請(qǐng)求儿普,并停止匹配 其它location
  [  configuration  C  ]
}
  • 如果第3條規(guī)則產(chǎn)生匹配的話,結(jié)果被使用掷倔。否則眉孩,使用第2條規(guī)則的結(jié)果。
location  ~*  .(gif|jpg|jpeg)$  {
  # 匹配以 gif, jpg, or jpeg結(jié)尾的請(qǐng)求.
  # 但是所有 /images/ 目錄的請(qǐng)求將由 [Configuration C]處理.  
  [  configuration  D  ]
}

請(qǐng)求URI例子:

  • / 表示符合configuration A
  • /documents/document.html 表示符合configuration B
  • /images/1.gif 表示符合configuration C
  • /documents/1.jpg 表示符合 configuration D

@location 例子
error_page 404 = @fetch;

location @fetch(
proxy_pass http://fetch;
)

(4)一文徹底讀懂nginx中的location指令
location指令是nginx中最關(guān)鍵的指令之一勒葱,location指令的功能是用來(lái)匹配不同的url請(qǐng)求浪汪,進(jìn)而對(duì)請(qǐng)求做不同的處理和響應(yīng),這其中較難理解的是多個(gè)location的匹配順序凛虽,本文會(huì)作為重點(diǎn)來(lái)解釋和說(shuō)明死遭。

開(kāi)始之前先明確一些約定,我們輸入的網(wǎng)址叫做請(qǐng)求URI凯旋,nginx用請(qǐng)求URI與location中配置的URI做匹配呀潭。

3、location匹配順序

nginx有兩層指令來(lái)匹配請(qǐng)求URI至非。第一個(gè)層次是server指令钠署,它通過(guò)域名、ip和端口來(lái)做第一層級(jí)匹配荒椭,當(dāng)找到匹配的server后就進(jìn)入此server的location匹配谐鼎。location的匹配并不完全按照它們?cè)谂渲梦募谐霈F(xiàn)的順序來(lái)匹配,請(qǐng)求URI會(huì)按如下規(guī)則跟server里配置的location匹配趣惠。

(1)尋找有沒(méi)有“=”等號(hào)參數(shù)完全匹配的location狸棍,如果有完全匹配的等號(hào)location則停止匹配身害,執(zhí)行該location中的指令,不去匹配其它類型的location草戈。
(2)匹配所有非正則表達(dá)式URI的location(包括空塌鸯,=,^~三種參數(shù))唐片。找到請(qǐng)求URI和location URI按前綴匹配最長(zhǎng)的location丙猬,如果這個(gè)最長(zhǎng)的location的參數(shù)是^~,則停止匹配牵触,執(zhí)行該location中的指令,否則暫存該location咐低。
(3)匹配正則表達(dá)式URI的location(包括揽思,*兩種參數(shù)),按location在配置文件中出現(xiàn)的順序匹配见擦,如果找到第一個(gè)匹配的locaiton則停止匹配钉汗,執(zhí)行該location。
(4)匹配完所有正則表達(dá)式都沒(méi)有匹配的location鲤屡,則執(zhí)行第二步中暫存的最長(zhǎng)前綴匹配location损痰。

簡(jiǎn)單來(lái)說(shuō)按這個(gè)規(guī)則:
= > ~^> ~ = ~* >最長(zhǎng)前綴匹配 > /

4、 匹配問(wèn)號(hào)后的參數(shù)

請(qǐng)求URI中問(wèn)號(hào)后面的參數(shù)是不能在location中匹配到的酒来,這些參數(shù)存儲(chǔ)在$query_string變量中卢未,可以用if來(lái)判斷。

例如堰汉,對(duì)于參數(shù)中帶有單引號(hào)'進(jìn)行匹配然后重定向到錯(cuò)誤頁(yè)面辽社。
/plus/list.php?tid=19&mid=1124

5、location URI結(jié)尾帶不帶/

  • 對(duì)于請(qǐng)求URI結(jié)尾是否帶有/翘鸭,一般的處理邏輯是帶/表示訪問(wèn)目錄滴铅,不帶/表示訪問(wèn)文件,如果文件不存在也會(huì)去匹配目錄就乓。例如訪問(wèn)http://www.nginx.cn/images/http://www.nginx.cn/images汉匙,前面的請(qǐng)求會(huì)匹配目錄,后面的請(qǐng)求會(huì)先匹配文件生蚁,文件不存再匹配目錄
  • 對(duì)于locatioin中的URI來(lái)說(shuō)噩翠,如果URI的結(jié)尾帶有/,并且location要執(zhí)行的命令式是proxy_pass邦投、fastcgi_pass绎秒、uwsgi_pass、scgi_pass尼摹、memcached_pass见芹、grpc_pass之一剂娄。例如:
location  `**/images/**` {
  proxy_pass http://www.redis.com.cn
}

對(duì)于這種情況,nginx會(huì)做特殊處理玄呛,不管images命名的文件或目錄存在不在阅懦,如果你訪問(wèn)http://www.nginx.cn/images會(huì)被重定向到http://www.nginx.cn/images/

所以如果你想這兩種請(qǐng)求對(duì)應(yīng)不同的處理徘铝,就要明確增加不帶/結(jié)尾的location配置耳胎。

location  `**/images**` {
  proxy_pass http://www.rabbitmq.cn
}
location  `**/images/**` {
  proxy_pass http://www.redis.com.cn
}

命名location

帶有"@"的location是用來(lái)定義一個(gè)命名的location,這種location不參與請(qǐng)求匹配惕它,一般用在內(nèi)部定向怕午。例如用在error_page, try_files命令中。它的功能類似于編程中的goto淹魄。

location  `**/images**` {
  try_files $uri $uri/ @name;
}
location  `**@name**` {
  ...
}

例子

location  = / {
  # 只匹配請(qǐng)求 "/"
  [ configuration A ] 
}
location  / {
  # 匹配任何請(qǐng)求郁惜,因?yàn)樗姓?qǐng)求都是以"/"開(kāi)始
  # 但是更長(zhǎng)字符匹配或者正則表達(dá)式匹配會(huì)優(yōu)先匹配
  [ configuration B ] 
}
location /documents/ {
  # 匹配所有 /documents/ 開(kāi)頭的請(qǐng)求,在沒(méi)有正則表達(dá)
  # 式匹配時(shí)選擇該locaiton
  [ configuration C ]
}
location ^~ /images/ {
  # 匹配任何以 /images/ 開(kāi)始的請(qǐng)求甲锡,并停止匹配其它location
  [ configuration D ] 
}E
location ~* .(gif|jpg|jpeg)$ {
  # 匹配以 gif, jpg, or jpeg結(jié)尾的請(qǐng)求. 
  # 但是所有 /images/ 目錄的請(qǐng)求將由 [Configuration D]處理.   
  [ configuration E ] 
}

請(qǐng)求URI例子:

  1. / -> 匹配A
  2. /index.html -> 匹配B
  3. /documents/a.html -> 匹配C
  4. /images/1.gif -> 匹配D
  5. /documents/1.jpg -> 匹配E

六兆蕉、 nginx upstream 配置和作用

配置例子

upstream{
    server backend1.example.com       weight=5;
    server backend2.example.com:8080;
    server unix:/tmp/backend3;
    server backup1.example.com:8080   backup;
    server backup2.example.com:8080   backup;
}
server {
    location / {
        proxy_pass http://**backend**;
    }
}

指令

定義一組服務(wù)器。 這些服務(wù)器可以監(jiān)聽(tīng)不同的端口缤沦。 而且虎韵,監(jiān)聽(tīng)在TCP和UNIX域套接字的服務(wù)器可以混用。
例:

upstream {
    server backend1.example.com weight=5;
    server 127.0.0.1:8080       max_fails=3 fail_timeout=30s;
    server unix:/tmp/backend3;
}

默認(rèn)情況下缸废,nginx按加權(quán)輪轉(zhuǎn)的方式將請(qǐng)求分發(fā)到各服務(wù)器包蓝。 在上面的例子中,每7個(gè)請(qǐng)求會(huì)通過(guò)以下方式分發(fā): 5個(gè)請(qǐng)求分到backend1.example.com企量, 一個(gè)請(qǐng)求分到第二個(gè)服務(wù)器养晋,一個(gè)請(qǐng)求分到第三個(gè)服務(wù)器。 與服務(wù)器通信的時(shí)候梁钾,如果出現(xiàn)錯(cuò)誤绳泉,請(qǐng)求會(huì)被傳給下一個(gè)服務(wù)器幸斥,直到所有可用的服務(wù)器都被嘗試過(guò)衫樊。 如果所有服務(wù)器都返回失敗,客戶端將會(huì)得到最后通信的那個(gè)服務(wù)器的(失斖匀狻)響應(yīng)結(jié)果拇勃。

定義服務(wù)器的地址address和其他參數(shù)parameters四苇。 地址可以是域名或者IP地址,端口是可選的方咆,或者是指定“unix:”前綴的UNIX域套接字的路徑月腋。如果沒(méi)有指定端口,就使用80端口。 如果一個(gè)域名解析到多個(gè)IP榆骚,本質(zhì)上是定義了多個(gè)server片拍。

你可以定義下面的參數(shù):weight=number設(shè)定服務(wù)器的權(quán)重,默認(rèn)是1妓肢。max_fails=number設(shè)定Nginx與服務(wù)器通信的嘗試失敗的次數(shù)捌省。在fail_timeout參數(shù)定義的時(shí)間段內(nèi),如果失敗的次數(shù)達(dá)到此值碉钠,Nginx就認(rèn)為服務(wù)器不可用纲缓。在下一個(gè)fail_timeout時(shí)間段,服務(wù)器不會(huì)再被嘗試喊废。 失敗的嘗試次數(shù)默認(rèn)是1祝高。設(shè)為0就會(huì)停止統(tǒng)計(jì)嘗試次數(shù),認(rèn)為服務(wù)器是一直可用的污筷。 你可以通過(guò)指令proxy_next_upstream工闺、 fastcgi_next_upstream和memcached_next_upstream來(lái)配置什么是失敗的嘗試。 默認(rèn)配置時(shí)颓屑,http_404狀態(tài)不被認(rèn)為是失敗的嘗試斤寂。fail_timeout=time設(shè)定

  • 統(tǒng)計(jì)失敗嘗試次數(shù)的時(shí)間段耿焊。在這段時(shí)間中揪惦,服務(wù)器失敗次數(shù)達(dá)到指定的嘗試次數(shù),服務(wù)器就被認(rèn)為不可用罗侯。
  • 服務(wù)器被認(rèn)為不可用的時(shí)間段器腋。

默認(rèn)情況下,該超時(shí)時(shí)間是10秒钩杰。backup標(biāo)記為備用服務(wù)器纫塌。當(dāng)主服務(wù)器不可用以后,請(qǐng)求會(huì)被傳給這些服務(wù)器讲弄。down標(biāo)記服務(wù)器永久不可用措左,可以跟ip_hash指令一起使用。

例:

upstream {
    server backend1.example.com     weight=5;
    server 127.0.0.1:8080           max_fails=3 fail_timeout=30s;
    server unix:/tmp/backend3;

    server backup1.example.com:8080 backup;
}

指定服務(wù)器組的負(fù)載均衡方法避除,請(qǐng)求基于客戶端的IP地址在服務(wù)器間進(jìn)行分發(fā)怎披。 IPv4地址的前三個(gè)字節(jié)或者IPv6的整個(gè)地址,會(huì)被用來(lái)作為一個(gè)散列key瓶摆。 這種方法可以確保從同一個(gè)客戶端過(guò)來(lái)的請(qǐng)求凉逛,會(huì)被傳給同一臺(tái)服務(wù)器。除了當(dāng)服務(wù)器被認(rèn)為不可用的時(shí)候群井,這些客戶端的請(qǐng)求會(huì)被傳給其他服務(wù)器状飞,而且很有可能也是同一臺(tái)服務(wù)器。

從1.3.2和1.2.2版本開(kāi)始支持IPv6地址。

如果其中一個(gè)服務(wù)器想暫時(shí)移除诬辈,應(yīng)該加上down參數(shù)酵使。這樣可以保留當(dāng)前客戶端IP地址散列分布。

例子:

upstream backend {
    ip_hash;

    server backend1.example.com;
    server backend2.example.com;
    server backend3.example.com **down**;
    server backend4.example.com;
}

從1.3.1和1.2.2版本開(kāi)始自晰,ip_hash的負(fù)載均衡方法才支持設(shè)置服務(wù)器權(quán)重值凝化。
這個(gè)指令出現(xiàn)在版本 1.1.4.
激活對(duì)上游服務(wù)器的連接進(jìn)行緩存。
connections參數(shù)設(shè)置每個(gè)worker進(jìn)程與后端服務(wù)器保持連接的最大數(shù)量酬荞。這些保持的連接會(huì)被放入緩存搓劫。 如果連接數(shù)大于這個(gè)值時(shí),最久未使用的連接會(huì)被關(guān)閉混巧。

需要注意的是枪向,keepalive指令不會(huì)限制Nginx進(jìn)程與上游服務(wù)器的連接總數(shù)。 新的連接總會(huì)按需被創(chuàng)建咧党。 connections參數(shù)應(yīng)該稍微設(shè)低一點(diǎn)秘蛔,以便上游服務(wù)器也能處理額外新進(jìn)來(lái)的連接。
配置memcached上游服務(wù)器連接keepalive的例子:

upstream {
    server 127.0.0.1:11211;
    server 10.0.0.2:11211;
    keepalive 32;
}
server {
    ...
    location /memcached/ {
        set $memcached_key $uri;
        memcached_pass memcached_backend;
    }
}

對(duì)于HTTP代理傍衡,proxy_http_version指令應(yīng)該設(shè)置為“1.1”深员,同時(shí)“Connection”頭的值也應(yīng)被清空。

upstream http_backend {
    server 127.0.0.1:8080;

    keepalive 16;
}

server {
    ...

    location /http/ {
        proxy_pass http://http_backend;
        proxy_http_version 1.1;
        proxy_set_header Connection "";
        ...
    }
}

另外一種選擇是蛙埂,HTTP/1.0協(xié)議的持久連接也可以通過(guò)發(fā)送“Connection: Keep-Alive”頭來(lái)實(shí)現(xiàn)倦畅。不過(guò)不建議這樣用。

對(duì)于FastCGI的服務(wù)器绣的,需要設(shè)置 fastcgi_keep_conn 指令來(lái)讓連接keepalive工作:

upstream fastcgi_backend {
    server 127.0.0.1:9000;
    keepalive 8;
}
server {
    ...
    location /fastcgi/ {
        fastcgi_pass fastcgi_backend;
        fastcgi_keep_conn on;
        ...
    }
}

當(dāng)使用的負(fù)載均衡方法不是默認(rèn)的輪轉(zhuǎn)法時(shí)叠赐,必須在keepalive 指令之前配置。

針對(duì)SCGI和uwsgi協(xié)議屡江,還沒(méi)有實(shí)現(xiàn)其keepalive連接的打算芭概。

這個(gè)指令出現(xiàn)在版本 1.3.1 和 1.2.2.

指定服務(wù)器組的負(fù)載均衡方法,根據(jù)其權(quán)重值惩嘉,將請(qǐng)求發(fā)送到活躍連接數(shù)最少的那臺(tái)服務(wù)器罢洲。 如果這樣的服務(wù)器有多臺(tái),那就采取有權(quán)重的輪轉(zhuǎn)法進(jìn)行嘗試文黎。

嵌入的變量

ngx_http_upstream_module模塊支持以下嵌入變量:

$upstream_addr保存服務(wù)器的IP地址和端口或者是UNIX域套接字的路徑惹苗。 在請(qǐng)求處理過(guò)程中,如果有多臺(tái)服務(wù)器被嘗試了臊诊,它們的地址會(huì)被拼接起來(lái)鸽粉,以逗號(hào)隔開(kāi),比如: “192.168.1.1:80, 192.168.1.2:80, unix:/tmp/sock”抓艳。 如果在服務(wù)器之間通過(guò)“X-Accel-Redirect”頭或者error_page有內(nèi)部跳轉(zhuǎn)触机,那么這些服務(wù)器組之間會(huì)以冒號(hào)隔開(kāi),比如:“192.168.1.1:80, 192.168.1.2:80, unix:/tmp/sock : 192.168.10.1:80, 192.168.10.2:80”。$upstream_response_time以毫秒的精度保留服務(wù)器的響應(yīng)時(shí)間儡首,(輸出)單位是秒片任。 出現(xiàn)多個(gè)響應(yīng)時(shí),也是以逗號(hào)和冒號(hào)隔開(kāi)蔬胯。$upstream_status保存服務(wù)器的響應(yīng)代碼对供。 出現(xiàn)多個(gè)響應(yīng)時(shí),也是以逗號(hào)和冒號(hào)隔開(kāi)氛濒。$upstream_http_...保存服務(wù)器的響應(yīng)頭的值产场。比如“Server”響應(yīng)頭的值可以通過(guò)$upstream_http_server變量來(lái)獲取。 需要注意的是只有最后一個(gè)響應(yīng)的頭會(huì)被保留下來(lái)舞竿。

七京景、nginx rewrite 指令

nginx通過(guò)ngx_http_rewrite_module模塊支持url重寫(xiě)、支持if條件判斷骗奖,但不支持else确徙。

該模塊需要PCRE支持,應(yīng)在編譯nginx時(shí)指定PCRE源碼目錄

nginx rewrite指令執(zhí)行順序:

1.執(zhí)行server塊的rewrite指令(這里的塊指的是server關(guān)鍵字后{}包圍的區(qū)域执桌,其它xx塊類似)
2.執(zhí)行l(wèi)ocation匹配
3.執(zhí)行選定的location中的rewrite指令
如果其中某步URI被重寫(xiě)鄙皇,則重新循環(huán)執(zhí)行1-3,直到找到真實(shí)存在的文件

如果循環(huán)超過(guò)10次仰挣,則返回500 Internal Server Error錯(cuò)誤

break指令

語(yǔ)法:break;
默認(rèn)值:無(wú)
作用域:server,location,if

停止執(zhí)行當(dāng)前虛擬主機(jī)的后續(xù)rewrite指令集
break指令實(shí)例:

if  ($slow)  {

 limit_rate  10k;

 break;

}

if指令

語(yǔ)法:if(condition){...}
默認(rèn)值:無(wú)
作用域:server,location
對(duì)給定的條件condition進(jìn)行判斷伴逸。如果為真,大括號(hào)內(nèi)的rewrite指令將被執(zhí)行椎木。
if條件(conditon)可以是如下任何內(nèi)容:
  • 一個(gè)變量名违柏;false如果這個(gè)變量是空字符串或者以0開(kāi)始的字符串博烂;
  • 使用= ,!= 比較的一個(gè)變量和字符串
  • 是用~香椎, ~*與正則表達(dá)式匹配的變量,如果這個(gè)正則表達(dá)式中包含}禽篱,;則整個(gè)表達(dá)式需要用" 或' 包圍
  • 使用-f 畜伐,!-f 檢查一個(gè)文件是否存在
  • 使用-d, !-d 檢查一個(gè)目錄是否存在
  • 使用-e ,!-e 檢查一個(gè)文件躺率、目錄玛界、符號(hào)鏈接是否存在
  • 使用-x , !-x 檢查一個(gè)文件是否可執(zhí)行

if指令實(shí)例

if  ($http_user_agent  ~  MSIE)  {
 rewrite  ^(.*)$  /msie/$1  break;
}
if  ($http_cookie  ~*  "id=([^;]+)(?:;|$)")  {
 set  $id  $1;
}
if  ($request_method  =  POST)  {
 return  405;

}
if  ($slow)  {
 limit_rate  10k;
}
if  ($invalid_referer)  {
 return  403;
}

return指令

語(yǔ)法:return code;
return code URL;
return URL;
默認(rèn)值:無(wú)
作用域:server,location,if

停止處理并返回指定狀態(tài)碼(code)給客戶端悼吱。
非標(biāo)準(zhǔn)狀態(tài)碼444表示關(guān)閉連接且不給客戶端發(fā)響應(yīng)頭慎框。
從0.8.42版本起,return 支持響應(yīng)URL重定向(對(duì)于301后添,302笨枯,303,307),或者文本響應(yīng)(對(duì)于其他狀態(tài)碼).
對(duì)于文本或者URL重定向可以包含變量

rewrite指令

語(yǔ)法:rewrite regex replacement [flag];
默認(rèn)值:無(wú)
作用域:server,location,if
如果一個(gè)URI匹配指定的正則表達(dá)式regex馅精,URI就按照replacement重寫(xiě)严嗜。
rewrite按配置文件中出現(xiàn)的順序執(zhí)行。flags標(biāo)志可以停止繼續(xù)處理洲敢。
如果replacement以"http://"或"https://"開(kāi)始漫玄,將不再繼續(xù)處理,這個(gè)重定向?qū)⒎祷亟o客戶端压彭。
flag可以是如下參數(shù)
last 停止處理后續(xù)rewrite指令集睦优,然后對(duì)當(dāng)前重寫(xiě)的新URI在rewrite指令集上重新查找。
break 停止處理后續(xù)rewrite指令集壮不,并不在重新查找,但是當(dāng)前l(fā)ocation內(nèi)剩余非rewrite語(yǔ)句和location外的的非rewrite語(yǔ)句可以執(zhí)行刨秆。
redirect 如果replacement不是以http:// 或https://開(kāi)始,返回302臨時(shí)重定向
permant 返回301永久重定向
最終完整的重定向URL包括請(qǐng)求scheme(http://,https://等),請(qǐng)求的server_name_in_redirect和 port_in_redirec三部分 忆畅,說(shuō)白了也就是http協(xié)議 域名 端口三部分組成衡未。
rewrite實(shí)例

server  {
 ...
 rewrite  ^(/download/.*)/media/(.*)..*$  $1/mp3/$2.mp3  last;
 rewrite  ^(/download/.*)/audio/(.*)..*$  $1/mp3/$2.ra  last;
 return  403;
 ...
}

如果這些rewrite放到 “/download/” location如下所示, 那么應(yīng)使用break而不是last , 使用last將循環(huán)10次匹配,然后返回 500錯(cuò)誤:

location  /download/  {
 rewrite  ^(/download/.*)/media/(.*)..*$  $1/mp3/$2.mp3  break;
 rewrite  ^(/download/.*)/audio/(.*)..*$  $1/mp3/$2.ra  break;
 return  403;
}

對(duì)于重寫(xiě)后的URL(replacement)包含原請(qǐng)求的請(qǐng)求參數(shù)家凯,原URL的?后的內(nèi)容缓醋。如果不想帶原請(qǐng)求的參數(shù) ,可以在replacement后加一個(gè)問(wèn)號(hào)绊诲。如下送粱,我們加了一個(gè)自定義的參數(shù)user=$1,然后在結(jié)尾處放了一個(gè)問(wèn)號(hào)?,把原請(qǐng)的參數(shù)去掉。

rewrite  ^/users/(.*)$  /show?user=$1?  last;

如果正則表達(dá)regex式中包含 “}” 或 “;”, 那么整個(gè)表達(dá)式需要用雙引號(hào)或單引號(hào)包圍.

rewrite_log指令

語(yǔ)法:rewrite_log on|off;
默認(rèn)值:rewrite_log off;
作用域:http,server,location,if
開(kāi)啟或關(guān)閉以notice級(jí)別打印rewrite處理日志到error log文件掂之。

nginx打開(kāi)rewrite log例子

rewrite_log on;
error_log logs/xxx.error.log notice;

1.打開(kāi)rewrite on
2.把error log的級(jí)別調(diào)整到 notice

set指令

語(yǔ)法:set variable value
默認(rèn)值:none
作用域:server,location,if
定義一個(gè)變量并賦值抗俄,值可以是文本,變量或者文本變量混合體世舰。

uninitialized_variable_warn指令

語(yǔ)法:uninitialized_variable_warn on | off;
默認(rèn)值:uninitialized_variable_warn on
作用域:http,server,location,if

控制是否輸出為初始化的變量到日志

八动雹、NginxChsVirtualHostExample

兩個(gè)虛擬主機(jī)(純靜態(tài)-html 支持) - Two Virtual Hosts, Serving Static Files

http  {
    server  {
        listen          80;
        server_name www.domain1.com;
        access_log      logs/domain1.access.log main;
        location  /  {
            index index.html;
            root  /var/www/domain1.com/htdocs;
        }
    }
    server  {
        listen          80;
        server_name www.domain2.com;
        access_log      logs/domain2.access.log main;
        location  /  {
            index index.html;
            root  /var/www/domain2.com/htdocs;
        }
    }
}

虛擬主機(jī)標(biāo)準(zhǔn)配置(簡(jiǎn)化) - A Default Catchall Virtual Host

http  {
    server  {
        listen          80  default;
        server_name _ *;
        access_log      logs/default.access.log main;
        location  /  {
            index index.html;
            root  /var/www/default/htdocs;
        }
    }
}

在父文件夾中建立子文件夾以指向子域名 - Wildcard Subdomains in a Parent Folder

這是一個(gè)添加子域名(或是當(dāng)DNS已指向服務(wù)器時(shí)添加一個(gè)新域名)的簡(jiǎn)單方法。需要注意的是跟压,我已經(jīng)將FCGI配置進(jìn)該文件了胰蝠。如果你只想使服務(wù)器為靜態(tài)文件服務(wù),可以直接將FCGI配置信息注釋掉震蒋,然后將默認(rèn)主頁(yè)文件變成index.html茸塞。

這個(gè)簡(jiǎn)單的方法比起為每一個(gè)域名建立一個(gè) vhost.conf 配置文件來(lái)講,只需要在現(xiàn)有的配置文件中增加如下內(nèi)容:

server  {
        # Replace this port with the right one for your requirements
        # 根據(jù)你的需求改變此端口
        listen 80;  #could also be 1.2.3.4:80 也可以是1.2.3.4:80的形式
        # Multiple hostnames seperated by spaces.  Replace these as well.
        # 多個(gè)主機(jī)名可以用空格隔開(kāi)查剖,當(dāng)然這個(gè)信息也是需要按照你的需求而改變的钾虐。
        server_name  star.yourdomain.com *.yourdomain.com www.*.yourdomain.com;
        #Alternately: _ *
        #或者可以使用:_ * (具體內(nèi)容參見(jiàn)本維基其他頁(yè)面)
        root  /PATH/TO/WEBROOT/$host;
        error_page  404              http://yourdomain.com/errors/404.html;
        access_log  logs/star.yourdomain.com.access.log;
        location  /  {
            root /PATH/TO/WEBROOT/$host/;
            index  index.php;
        }
        # serve static files directly
        # 直接支持靜態(tài)文件 (愛(ài)月說(shuō):???從配置上看來(lái)不是直接支持啊~有問(wèn)題有問(wèn)題~)
        location  ~*  ^.+.(jpg|jpeg|gif|css|png|js|ico|html)$  {
            access_log        off;
            expires 30d;
        }
        location  ~  .php$  {
          # By all means use a different server for the fcgi processes if you need to
          # 如果需要,你可以為不同的FCGI進(jìn)程設(shè)置不同的服務(wù)信息
          fastcgi_pass 127.0.0.1:YOURFCGIPORTHERE;
          fastcgi_index  index.php;
          fastcgi_param  SCRIPT_FILENAME  /PATH/TO/WEBROOT/$host/$fastcgi_script_name;
          fastcgi_param  QUERY_STRING $query_string;
          fastcgi_param  REQUEST_METHOD $request_method;
          fastcgi_param  CONTENT_TYPE $content_type;
          fastcgi_param  CONTENT_LENGTH $content_length;
          fastcgi_intercept_errors on;
        }
        location  ~  /.ht  {
            deny  all;
        }
 }

九笋庄、nginx反向代理配置

nginx作為web服務(wù)器一個(gè)重要的功能就是反向代理效扫。

nginx反向代理的指令不需要新增額外的模塊效览,默認(rèn)自帶proxy_pass指令,只需要修改配置文件就可以實(shí)現(xiàn)反向代理荡短。

1丐枉、什么是反向代理服務(wù)器

反向代理功能是nginx的三大主要功能之一(靜態(tài)web服務(wù)器、反向代理掘托、負(fù)載均衡)瘦锹。nginx一般同時(shí)做為靜態(tài)web服務(wù)器和反向代理服務(wù)器,做為web服務(wù)器訪問(wèn)靜態(tài)文件圖片闪盔、css弯院、js、html等文件泪掀,做為反向代理服務(wù)器把請(qǐng)求發(fā)給后端業(yè)務(wù)處理服務(wù)听绳,如果有多個(gè)后端處理節(jié)點(diǎn),會(huì)配置負(fù)載均衡功能异赫。

反向代理服務(wù)器是一種代理服務(wù)器椅挣,用于管理從外部網(wǎng)絡(luò)到內(nèi)部網(wǎng)絡(luò)的連接或任何特定請(qǐng)求。它保護(hù)塔拳、路由和管理從外部網(wǎng)絡(luò)到內(nèi)部網(wǎng)絡(luò)鼠证、Web服務(wù)器或?qū)S镁W(wǎng)絡(luò)的流量。

(1)外網(wǎng)客戶機(jī):我們平時(shí)打開(kāi)瀏覽器輸入網(wǎng)址訪問(wèn)www.nginx.cn的場(chǎng)景中靠抑,我們的筆記本就可以理解為一個(gè)外網(wǎng)客戶機(jī)量九。

(2)nginx反向代理服務(wù):瀏覽器輸入網(wǎng)址并回車后,會(huì)發(fā)起一個(gè)http請(qǐng)求給nginx(反向代理服務(wù)器)颂碧,這個(gè)請(qǐng)求如果是訪問(wèn)靜態(tài)文件荠列,那么nginx作為web服務(wù)器直接返回請(qǐng)求的內(nèi)容,如果是訪問(wèn)的后臺(tái)服務(wù)邏輯载城,那么nginx把請(qǐng)求轉(zhuǎn)發(fā)給后端的服務(wù)處理肌似。

(3)內(nèi)網(wǎng)web服務(wù):后端的服務(wù)可以是很多種類型,LNMP環(huán)境下的php-fpm進(jìn)程个曙,Java環(huán)境下的tomcat锈嫩、jetty等容器受楼,通過(guò)程序邏輯處理http請(qǐng)求垦搬,生成html頁(yè)面或者json串返回給客戶端。對(duì)于小型應(yīng)用艳汽,后端服務(wù)可以和nginx部署在同一臺(tái)機(jī)器上猴贰。

2、反向代理服務(wù)器的好處

nginx反向代理重要的作用是配合upstream實(shí)現(xiàn)負(fù)載均衡河狐。同時(shí)增加安全性米绕,客戶端不能直接訪問(wèn)后端服務(wù)瑟捣,多了一個(gè)中間的屏障。提升性能栅干,通過(guò)異步非阻塞的方式把請(qǐng)求傳給后端迈套,提升了并發(fā)處理能力。也可利用緩存碱鳞、壓縮響應(yīng)提高響應(yīng)速度桑李。

3、nginx如何配置反向代理

nginx反向代理不需要編譯額外的模塊窿给,默認(rèn)自帶proxy_pass和fastcgi_pass指令贵白,通過(guò)在location配置塊中增加指令就可以實(shí)現(xiàn)反向代理功能。

www.nginx.cn為例崩泡,這個(gè)網(wǎng)站用的wordpress程序禁荒,wordpress是php語(yǔ)言編寫(xiě),那么需要通過(guò)php運(yùn)行環(huán)境角撞,可以選擇apache的php擴(kuò)展或者php-fpm環(huán)境呛伴,主流的選擇是php-fpm,php-fpm設(shè)置為Unix socket模式或者ip:端口模式 谒所。

(1)Unix socket后端服務(wù)配置

server  {
    listen  80;
    server_name www.nginx.cn nginx.cn;
    location  /app  {
       fastcgi_pass  unix:/tmp/php-cgi.sock;
    }
}

(2)ip端口后端服務(wù)配置

server  {
    listen  80;
    server_name www.nginx.cn nginx.cn;
    location  /app  {
      proxy_pass http://127.0.0.1:8080;
    }
}

4磷蜀、proxy_pass和fastcgi_pass區(qū)別

對(duì)于上面介紹的兩種情況下proxy_pass和fastcgi_pass可以互相替代使用,不過(guò)兩者還是有區(qū)別的百炬,從名字我們就可以看出來(lái)褐隆,fastcgi_pass是用來(lái)反向代理fastcgi協(xié)議,proxy_pass可以代理包括fastcgi協(xié)議在內(nèi)的其它協(xié)議剖踊。

例如鏡像一個(gè)網(wǎng)站庶弃,這種情況下就需要proxy_pass:

location  /{
  proxy_pass http://www.baidu.com;
}

十、nginx負(fù)載均衡配置

使用負(fù)載均衡的話,可以修改配置http節(jié)點(diǎn)如下:

1德澈、設(shè)定http服務(wù)器歇攻,利用它的反向代理功能提供負(fù)載均衡支持

http  {
    #設(shè)定mime類型,類型由mime.type文件定義
    include /etc/nginx/mime.types;
    default_type    application/octet-stream;
    #設(shè)定日志格式
    access_log        /var/log/nginx/access.log;
    #省略上文有的一些配置節(jié)點(diǎn)
    #。梆造。缴守。痛侍。碉纳。不见。递胧。橡庞。温鸽。肥哎。
    #設(shè)定負(fù)載均衡的服務(wù)器列表
    upstream  mysvr  {
        #weigth參數(shù)表示權(quán)值葫笼,權(quán)值越高被分配到的幾率越大
        server  192.168.8.1x:3128  weight=5;
        #本機(jī)上的Squid開(kāi)啟3128端口,不是必須要squid
        server  192.168.8.2x:80    weight=1;
        server  192.168.8.3x:80    weight=6;
    }
    upstream  mysvr2  {
        #weigth參數(shù)表示權(quán)值屹逛,權(quán)值越高被分配到的幾率越大
        server  192.168.8.x:80    weight=1;
        server  192.168.8.x:80    weight=6;
    }
    #第一個(gè)虛擬服務(wù)器
    server  {
        #偵聽(tīng)192.168.8.x的80端口
        listen 80;
        server_name    192.168.8.x;
        #對(duì)aspx后綴的進(jìn)行負(fù)載均衡請(qǐng)求
        location  ~  .*.aspx$  {
            #定義服務(wù)器的默認(rèn)網(wǎng)站根目錄位置
            root /root;
            #定義首頁(yè)索引文件的名稱
            index index.php index.html index.htm;
            #請(qǐng)求轉(zhuǎn)向mysvr 定義的服務(wù)器列表
            proxy_pass    http://mysvr ;
            #以下是一些反向代理的配置可刪除.
            proxy_redirect off;
            #后端的Web服務(wù)器可以通過(guò)X-Forwarded-For獲取用戶真實(shí)IP
            proxy_set_header Host  $host;
            proxy_set_header  X-Real-IP  $remote_addr;
            proxy_set_header  X-Forwarded-For  $proxy_add_x_forwarded_for;
            #允許客戶端請(qǐng)求的最大單文件字節(jié)數(shù)
            client_max_body_size  10m;
            #緩沖區(qū)代理緩沖用戶端請(qǐng)求的最大字節(jié)數(shù)础废,
            client_body_buffer_size  128k;
            #nginx跟后端服務(wù)器連接超時(shí)時(shí)間(代理連接超時(shí))
            proxy_connect_timeout  90;
            #連接成功后汛骂,后端服務(wù)器響應(yīng)時(shí)間(代理接收超時(shí))
            proxy_read_timeout  90;
            #設(shè)置代理服務(wù)器(nginx)保存用戶頭信息的緩沖區(qū)大小
            proxy_buffer_size  4k;
            #proxy_buffers緩沖區(qū),網(wǎng)頁(yè)平均在32k以下的話评腺,這樣設(shè)置
            proxy_buffers  4  32k;
            #高負(fù)荷下緩沖大辛辈t。╬roxy_buffers*2)
            proxy_busy_buffers_size  64k;
            #設(shè)定緩存文件夾大小,大于這個(gè)值蒿讥,將從upstream服務(wù)器傳
            proxy_temp_file_write_size  64k;    
        }
    }
}

十一图张、 nginx屏蔽ip

1.查找要屏蔽的ip
awk '{print $1}' nginx.access.log |sort |uniq -c|sort -n
nginx.access.log 為日志文件,
會(huì)到如下結(jié)果诈悍,前面是ip的訪問(wèn)次數(shù)祸轮,后面是ip,很明顯我們需要把訪問(wèn)次數(shù)多的ip并且不是蜘蛛的ip屏蔽掉侥钳,本例當(dāng)中我們屏蔽掉165.91.122.67
13610 202.112.113.192
95772 180.169.22.135
337418 219.220.141.2
558378 165.91.122.67
2.在nginx的安裝目錄下面,新建屏蔽ip文件适袜,命名為blockip.conf,以后新增加屏蔽ip只需編輯這個(gè)文件即可舷夺。 加入如下內(nèi)容
deny 165.91.122.67;
保存一下苦酱。

3.在nginx的配置文件nginx.conf中加入如下配置,可以放到http, server, location, limit_except語(yǔ)句塊给猾,需要注意相對(duì)路徑疫萤,本例當(dāng)中nginx.conf,blocksip.conf在同一個(gè)目錄中敢伸。
include blockip.conf;

4.重啟一下nginx的服務(wù):/usr/local/nginx/nginx -s reload 就可以生效了扯饶。

高級(jí)用法:

屏蔽ip的配置文件既可以屏蔽單個(gè)ip,也可以屏蔽ip段池颈,或者只允許某個(gè)ip或者某個(gè)ip段訪問(wèn)尾序。

屏蔽單個(gè)ip訪問(wèn)

deny IP;

允許單個(gè)ip訪問(wèn)

allow IP;

屏蔽所有ip訪問(wèn)

deny all;

允許所有ip訪問(wèn)

allow all;
deny  123.0.0.0/8

屏蔽IP段即從123.45.0.1到123.45.255.254訪問(wèn)的命令

deny 124.45.0.0/16

屏蔽IP段即從123.45.6.1到123.45.6.254訪問(wèn)的命令

deny 123.45.6.0/24

如果你想實(shí)現(xiàn)這樣的應(yīng)用,除了幾個(gè)IP外躯砰,其他全部拒絕每币,
那需要你在blockip.conf中這樣寫(xiě)

allow  1.1.1.1;
allow  1.1.1.2;
deny all;

單獨(dú)網(wǎng)站屏蔽IP的方法,把include blocksip.conf; 放到網(wǎng)址對(duì)應(yīng)的在server{}語(yǔ)句塊琢歇,所有網(wǎng)站屏蔽IP的方法兰怠,把include blocksip.conf; 放到http {}語(yǔ)句塊。

十二李茫、 nginx "403 Forbidden" 錯(cuò)誤

nginx 的 403 Forbidden errors 表示你在請(qǐng)求一個(gè)資源文件但是nginx不允許你查看揭保。
403 Forbidden 只是一個(gè)HTTP狀態(tài)碼,像404,200一樣不是技術(shù)上的錯(cuò)誤涌矢。
哪些場(chǎng)景需要返回403狀態(tài)碼的場(chǎng)景掖举?

1.網(wǎng)站禁止特定的用戶訪問(wèn)所有內(nèi)容,例:網(wǎng)站屏蔽某個(gè)ip訪問(wèn)娜庇。
2.訪問(wèn)禁止目錄瀏覽的目錄塔次,例:設(shè)置autoindex off后訪問(wèn)目錄。
3.用戶訪問(wèn)只能被內(nèi)網(wǎng)訪問(wèn)的文件名秀。

以上幾種常見(jiàn)的需要返回 403 Forbidden 的場(chǎng)景励负。

由于服務(wù)器端的錯(cuò)誤配置導(dǎo)致在不希望nginx返回403時(shí)返回403 Forbidden。

1.權(quán)限配置不正確
為了保證文件能正確執(zhí)行匕得,nginx既需要文件的讀權(quán)限,又需要文件所有父目錄的可執(zhí)行權(quán)限继榆。

例如,當(dāng)訪問(wèn)/usr/local/nginx/html/image.jpg時(shí)汁掠,nginx既需要image.jpg文件的可讀權(quán)限略吨,也需要/,/usr,/usr/local,/usr/local/nginx,/usr/local/nginx/html的可以執(zhí)行權(quán)限。

解決辦法:設(shè)置所有父目錄為755權(quán)限考阱,設(shè)置文件為644權(quán)限可以避免權(quán)限不正確翠忠。

2.目錄索引設(shè)置錯(cuò)誤(index指令配置)

網(wǎng)站根目錄不包含index指令設(shè)置的文件。

例如乞榨,運(yùn)行PHP的網(wǎng)站秽之,通常像這樣配置index

index index.html index.htm index.php;

當(dāng)訪問(wèn)該網(wǎng)站的時(shí),nginx 會(huì)按照 index.html吃既,index.htm 考榨,index.php 的先后順序在根目錄中查找文件。如果這三個(gè)文件都不存在鹦倚,那么nginx就會(huì)返回403 Forbidden河质。

如果index中不定義 index.php ,nginx直接返回403 Forbidden而不會(huì)去檢查index.php是否存在震叙。

同樣對(duì)于如果運(yùn)行jsp, py時(shí)也需要添加index.jsp,index.py到目錄索引指令index中愤诱。

解決辦法:添加首頁(yè)文件到index指令,常見(jiàn)的是index.php捐友,index.jsp淫半,index.jsp或者自定義首頁(yè)文件。

十三匣砖、nginx 502 bad gateway timeout

一朋友的nginx服務(wù)器網(wǎng)站打開(kāi)不科吭,出現(xiàn)502 bad gateway timeout。
同一臺(tái)機(jī)機(jī)器上使用nginx做反向代理的服務(wù)可以正常訪問(wèn)猴鲫。
偶然df -ah看了一下發(fā)現(xiàn)磁盤(pán)已經(jīng)滿了对人。

把沒(méi)用的日志(du -ks *|sort -n 命令可以列出來(lái)文件間空使用情況并排序)清理一下,發(fā)現(xiàn)網(wǎng)站能正常訪問(wèn)了拂共。

做個(gè)記號(hào)牺弄,給遇到同樣問(wèn)題的做個(gè)分析思路。

nginx+php-fpm出現(xiàn)502 bad gateway錯(cuò)誤解決方法

502錯(cuò)誤是所有用nginx跑php的運(yùn)維人員不愿意看見(jiàn)的

nginx出現(xiàn)502有很多原因宜狐,但大部分原因可以歸結(jié)為資源數(shù)量不夠用,也就是說(shuō)后端php-fpm處理有問(wèn)題势告,nginx將正確的客戶端請(qǐng)求發(fā)給了后端的php-fpm進(jìn)程蛇捌,但是因?yàn)閜hp-fpm進(jìn)程的問(wèn)題導(dǎo)致不能正確解析php代碼,最終返回給了客戶端502錯(cuò)誤咱台。

服務(wù)器出現(xiàn)502的原因是連接超時(shí) 我們向服務(wù)器發(fā)送請(qǐng)求 由于服務(wù)器當(dāng)前鏈接太多络拌,導(dǎo)致服務(wù)器方面無(wú)法給于正常的響應(yīng),產(chǎn)生此類報(bào)錯(cuò)

因此如果你服務(wù)器并發(fā)量非常大,那只能先增加機(jī)器回溺,然后按以下方式優(yōu)化會(huì)取得更好效果;但如果你并發(fā)不大卻出現(xiàn)502春贸,一般都可以歸結(jié)為配置問(wèn)題,腳本超時(shí)問(wèn)題遗遵。

1.php-fpm進(jìn)程數(shù)不夠用

使用 netstat -napo |grep "php-fpm" | wc -l 查看一下當(dāng)前fastcgi進(jìn)程個(gè)數(shù)萍恕,如果個(gè)數(shù)接近c(diǎn)onf里配置的上限,就需要調(diào)高進(jìn)程數(shù)车要。

但也不能無(wú)休止調(diào)高允粤,可以根據(jù)服務(wù)器內(nèi)存情況,可以把php-fpm子進(jìn)程數(shù)調(diào)到100或以上屯蹦,在4G內(nèi)存的服務(wù)器上200就可以维哈。

2. 調(diào)高調(diào)高linux內(nèi)核打開(kāi)文件數(shù)量

可以使用這些命令(必須是root帳號(hào))

echo 'ulimit -HSn 65536' >> /etc/profile

echo 'ulimit -HSn 65536' >> /etc/rc.local

source /etc/profile

** 3.腳本執(zhí)行時(shí)間超時(shí)**

如果腳本因?yàn)槟撤N原因長(zhǎng)時(shí)間等待不返回 ,導(dǎo)致新來(lái)的請(qǐng)求不能得到處理登澜,可以適當(dāng)調(diào)小如下配置阔挠。

nginx.conf里面主要是如下

fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;

php-fpm.conf里如要是如下

request_terminate_timeout = 10s

4.緩存設(shè)置比較小

修改或增加配置到nginx.conf

proxy_buffer_size 64k;
proxy_buffers  512k;
proxy_busy_buffers_size 128k;

5. recv() failed (104: Connection reset by peer) while reading response header from upstream

可能的原因機(jī)房網(wǎng)絡(luò)丟包或者機(jī)房有硬件防火墻禁止訪問(wèn)該域名

但最重要的是程序里要設(shè)置好超時(shí),不要使用php-fpm的request_terminate_timeout脑蠕,

最好設(shè)成request_terminate_timeout=0;

因?yàn)檫@個(gè)參數(shù)會(huì)直接殺掉php進(jìn)程购撼,然后重啟php進(jìn)程,這樣前端nginx就會(huì)返回104: Connection reset by peer谴仙。這個(gè)過(guò)程是很慢迂求,總體感覺(jué)就是網(wǎng)站很卡。

說(shuō)一千道一萬(wàn)最重要的就是程序里控制好超時(shí)晃跺,gethostbyname揩局、curl、file_get_contents等函數(shù)的都要設(shè)置超時(shí)時(shí)間掀虎。

另一個(gè)就是多說(shuō)凌盯,這個(gè)東西是增加了網(wǎng)站的交互性,但是使用的多了反應(yīng)就慢了烹玉,如果你網(wǎng)站超時(shí)且使用了多說(shuō)是驰怎,可以關(guān)閉它。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末二打,一起剝皮案震驚了整個(gè)濱河市县忌,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖症杏,帶你破解...
    沈念sama閱讀 219,539評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件装获,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡鸳慈,警方通過(guò)查閱死者的電腦和手機(jī)饱溢,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評(píng)論 3 396
  • 文/潘曉璐 我一進(jìn)店門(mén)喧伞,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)走芋,“玉大人,你說(shuō)我怎么就攤上這事潘鲫∥坛眩” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,871評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵溉仑,是天一觀的道長(zhǎng)挖函。 經(jīng)常有香客問(wèn)我,道長(zhǎng)浊竟,這世上最難降的妖魔是什么怨喘? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,963評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮振定,結(jié)果婚禮上必怜,老公的妹妹穿的比我還像新娘。我一直安慰自己后频,他們只是感情好梳庆,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,984評(píng)論 6 393
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著卑惜,像睡著了一般膏执。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上露久,一...
    開(kāi)封第一講書(shū)人閱讀 51,763評(píng)論 1 307
  • 那天更米,我揣著相機(jī)與錄音,去河邊找鬼毫痕。 笑死征峦,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的镇草。 我是一名探鬼主播眶痰,決...
    沈念sama閱讀 40,468評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼梯啤!你這毒婦竟也來(lái)了竖伯?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎七婴,沒(méi)想到半個(gè)月后祟偷,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,850評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡打厘,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,002評(píng)論 3 338
  • 正文 我和宋清朗相戀三年修肠,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片户盯。...
    茶點(diǎn)故事閱讀 40,144評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡嵌施,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出莽鸭,到底是詐尸還是另有隱情吗伤,我是刑警寧澤,帶...
    沈念sama閱讀 35,823評(píng)論 5 346
  • 正文 年R本政府宣布硫眨,位于F島的核電站足淆,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏礁阁。R本人自食惡果不足惜巧号,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,483評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望姥闭。 院中可真熱鬧丹鸿,春花似錦、人聲如沸泣栈。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,026評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)南片。三九已至掺涛,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間疼进,已是汗流浹背薪缆。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,150評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留伞广,地道東北人拣帽。 一個(gè)月前我還...
    沈念sama閱讀 48,415評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像嚼锄,于是被迫代替她去往敵國(guó)和親减拭。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,092評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容