致敬原文作者岖免,原文地址: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例子:
- / -> 匹配A
- /index.html -> 匹配B
- /documents/a.html -> 匹配C
- /images/1.gif -> 匹配D
- /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)閉它。