[TOC]
簡介
nginx [engine x] is an HTTP and reverse proxy server, a mail proxy server, and a generic TCP/UDP proxy server
Nginx 是一款開源的輕量級的 Web 服務(wù)器邓厕,可以接受響應(yīng) HTTP 請求详恼,可以作為 反向代理服務(wù)器赚哗,郵件代理服務(wù)器和通用 TCP/UDP 代理服務(wù)器。
Nginx 采用 epoll(Linux 2.6 內(nèi)核)贿讹、kqueue(FreeBSD)、evenport(Solaris 10)作為網(wǎng)絡(luò) I/O 模型赊堪,因此具備極高的性能哭廉。在高并發(fā)連接請求的場景下遵绰,Nginx 能夠支持高達 50000 個并發(fā)連接數(shù)的響應(yīng)椿访,而同時對 CPU成玫,內(nèi)存等系統(tǒng)資源的消耗卻非常低虽画,運行非常穩(wěn)定码撰,幾乎可以做到 7x24 小時不間斷運行脖岛。
Nginx 通常用在 反向代理柴梆、負載均衡 和 HTTP 緩存。其特點是高并發(fā)偿渡,高性能和低內(nèi)存溜宽。
特性
- 高并發(fā)适揉,高性能嫉嘀,高可靠和低內(nèi)存占用剪侮。
- 輕量級:功能模塊少(Nginx 僅保留 HTTP 需要的模塊红淡,其他模塊可以插件模式進行添加)在旱,代碼模塊化桶蝎。
- 采用 io多路復用機制,事件驅(qū)動胜茧,異步非阻塞處理請求呻顽。
- 單主多從(one Master廊遍,several Worker processes)模式喉前,Workder 進程以普通用戶身份運行。
- 支持熱部署搪搏。
...
應(yīng)用場景
- 靜態(tài)資源服務(wù)器
- 正向代理服務(wù)器
- 反向代理服務(wù)器(負載均衡)
- 郵件代理服務(wù)器
- 安全防御
...
幾個名詞釋義
-
正向代理(proxy):通常意義上的代理疯溺,指的就是正向代理恃疯。
其一般的流程為:個人客戶端通過將請求發(fā)送給到一個代理服務(wù)器(eg: Nginx)今妄,由代理服務(wù)器接收請求并真正去目的網(wǎng)站請求響應(yīng)盾鳞,最后將響應(yīng)回傳給到個人客戶端。
可以看到推励,正向代理的整個過程中验辞,網(wǎng)站是看不到真正請求響應(yīng)的客戶端的,因此族购,正向代理可以隱藏真實的客戶端撑碴。如下圖所示: -
反向代理(reverse proxy):與正向代理代理客戶端請求不同,反向代理代理的是服務(wù)器付魔。
其一般流程為:客戶端請求資源,反向代理服務(wù)器(eg:Nginx)接受到請求后懦鼠,從應(yīng)用服務(wù)器集群中選取一個響應(yīng)該請求。
可以看到,在反向代理的整個過程中珊肃,客戶端只需發(fā)送請求厉亏,而無需關(guān)心是哪一臺服務(wù)器進行響應(yīng)叶堆。因此,反向代理隱藏了具體進行請求響應(yīng)的服務(wù)器忘渔。如下圖所示:Nginx 作為反向代理服務(wù)器的典型場景就是使用 負載均衡 來應(yīng)對有高并發(fā)請求的網(wǎng)站。
Web 服務(wù)器(Web Server):也稱為 WWW(World Wide Web)服務(wù)器乖阵,其主要功能就是讓用戶可以通過瀏覽器進行訪問儒将,其關(guān)注的焦點在于 HTTP 協(xié)議層面的傳輸和訪問控制。嚴格意義上來講砰逻,Web 服務(wù)器只負責處理 HTTP 協(xié)議蝠咆,只能發(fā)送靜態(tài)頁面的內(nèi)容闸翅,而對于一些動態(tài)內(nèi)容請求,就需要通過 CGI占卧、FastCGI、ISAPI 等接口將請求透傳(transparently forwards)給到給到特定應(yīng)用服務(wù)器處理豁遭。常見的 Nginx叭喜,Apache,IIS 等都屬于 Web 服務(wù)器蓖谢。
-
應(yīng)用服務(wù)器(Application Server):是一個應(yīng)用執(zhí)行的容器捂蕴,所以其核心就是能夠運行一些應(yīng)用程序,本質(zhì)跟 HTTP 請求并沒有關(guān)系闪幽,只是孤立地運行一些自己的業(yè)務(wù)邏輯(所謂的動態(tài)內(nèi)容)。但是當前主流的 Web 應(yīng)用體系使用的是 B/S(Browser-Server)架構(gòu)级乍,因此大诸,應(yīng)用服務(wù)器通常也會集成 HTTP Server 功能,能夠接受和響應(yīng) HTTP 請求,但是不如專業(yè)的 Web 服務(wù)器功能那么強大沸手。常見的 Tomcat,Weblogic菲语,Jboss 等都屬于應(yīng)用服務(wù)器佩憾。
注:一般來說,開發(fā)階段直接使用應(yīng)用服務(wù)器進行調(diào)試即可(因為其提供了 HTTP Server 功能),而在項目部署階段婶恼,由于 Web 服務(wù)器性能更加優(yōu)秀眷篇,因此通常將 HTTP 請求的靜態(tài)資源直接交由其處理,而對于無法處理的請求,則通過反向代理等方式交由特定應(yīng)用服務(wù)器進行處理创肥。
動靜分離:就是將靜態(tài)資源的請求和動態(tài)資源的請求進行區(qū)分,對于靜態(tài)資源(比如:
*.html
/*.png
/*.jpg
...)的請求,Web 服務(wù)器直接進行響應(yīng),而對于動態(tài)資源的請求睦擂,Web 服務(wù)器透傳給到應(yīng)用服務(wù)器進行處理摆马,并轉(zhuǎn)發(fā)響應(yīng)給到客戶端惩淳。負載均衡(Load Balance):當網(wǎng)站的并發(fā)量很大時,可以通過水平擴展服務(wù)器(集群)來分配負載棉磨,HTTP 請求按照一定的策略分發(fā)給到集群中的各個服務(wù)器衙傀,以達到最優(yōu)化資源使用、最大化吞吐率、最小化響應(yīng)時間、同時避免過載的目的叔锐。
安裝
這里我們采用源碼安裝解取,具體步驟如下(注:本人的運行環(huán)境為:Windows Subsystem for Linux 2 - Ubuntu 18.04):
- 安裝編譯工具及一些庫文件:
$ sudo apt install make gcc gcc-c++ libtool
# 或者:Ubuntu 可直接使用以下命令安裝平臺編譯環(huán)境
$ sudo apt install build-essential
$ sudo apt install libtool
- 安裝 PCRE 庫振乏,讓 Nginx 支持 Rewrite 功能:
$ cd /usr/local/src
$ wget -c "https://ftp.pcre.org/pub/pcre/pcre-8.44.tar.gz"
$ tar -zxvf pcre-8.44.tar.gz
$ cd pcre-8.44
# 配置
$ ./configure
# 編譯
$ make
# 安裝
$ make install
注:安裝的是pcre
而不是pcre2
。
注:Rewrite 功能即能夠根據(jù)域名、URL 的不同,將 HTTP 請求轉(zhuǎn)發(fā)到不同的后端服務(wù)器群組中。
- 安裝 zlib 庫铁瞒,讓 Nginx 具備 gzip 壓縮功能:
$ cd /usr/local/src
$ wget -c http://zlib.net/zlib-1.2.11.tar.gz
$ tar -zxvf zlib-1.2.11.tar.gz
$ cd zlib-1.2.11
$ ./configure
$ make
$ make install
- 安裝 ssl芍碧,讓 Nginx 支持 https:
$ cd /usr/local/src
$ wget -c "https://www.openssl.org/source/openssl-1.1.1g.tar.gz"
$ tar -zxvf openssl-1.1.1g.tar.gz
$ cd openssl-1.1.1g
$ ./config
$ make
$ make install
注:安裝完openssl
后蔬浙,如果使用wget
等工具遇到錯誤:Unable to locally verify the issuer's authority
俱病,此時設(shè)置export SSL_CERT_DIR=/etc/ssl/certs
即可擎勘。
- 下載 Nginx 源碼噪漾,官網(wǎng)下載地址為:download诈胜。
$ cd /usr/local/src
$ wget -c https://nginx.org/download/nginx-1.18.0.tar.gz
$ tar -zxvf nginx-1.18.0.tar.gz
$ cd nginx-1.18.0
$ ./configure --sbin-path=/usr/local/nginx/nginx \
--conf-path=/usr/local/nginx/nginx.conf \
--pid-path=/usr/local/nginx/nginx.pid \
--with-http_gzip_static_module \
--with-http_stub_status_module \
--with-file-aio \
--with-http_realip_module \
--with-http_ssl_module \
--with-pcre=/usr/local/src/pcre-8.44 \
--with-zlib=/usr/local/src/zlib-1.2.11 \
--with-openssl=/usr/local/src/openssl-1.1.1g
$ make -j4
$ make install
其中:
--with-pcre=/usr/local/src/pcre-8.44
:表示 PCRE 庫源碼路徑。
--with-zlib=/usr/local/src/zlib-1.2.11
:表示 zlib 庫源碼路徑垦写。
--with-openssl=/usr/local/src/openssl-1.1.1g
:表示 openssl 庫源碼路徑晚伙。
更多配置選項午磁,請查看:configure
- 上述過程完成后,Nginx 就已經(jīng)成功安裝到
/usr/local/nginx
中,下面將其添加到系統(tǒng)環(huán)境變量中:
$ cd /usr/local/nginx
$ ln -rs nginx /usr/local/bin/
- 此時,就可以使用命令
sudo nginx
來啟動 Nginx,然后瀏覽器輸入:http://localhost
,就可以看到 Nginx 歡迎界面了:
Nginx 進程架構(gòu)/執(zhí)行模型
Nginx 進程的架構(gòu)組成是:一個主進程(master process)和多個工作進程(worker process)藻烤。主進程主要用于讀取和檢測配置文件,以及維護各個工作進程。Nginx 工作進程具備 CPU 親和性,每個工作進程都固定在一個 CPU 上執(zhí)行,減少了切換 CPU 的 cache miss,從而提供了性能保障,其主要責職就是對實際請求進行處理。
Nginx 的執(zhí)行模型為:當主進程接受到一個客戶端請求時郭蕉,會將該請求通知到所有的工作進程拐袜,此時所有工作進程競爭該請求甜攀,最終由某個工作進程負責處理該請求谁撼。工作進程如果發(fā)現(xiàn)該請求請求的是靜態(tài)資源的話箍鼓,則自己進行響應(yīng)之剧。如果發(fā)現(xiàn)該請求請求的是動態(tài)資源蟹肘,則會將請求轉(zhuǎn)發(fā)給相應(yīng)的應(yīng)用服務(wù)器舵盈,等待應(yīng)用服務(wù)器處理該請求后赴蝇,最后由該工作進程將結(jié)果轉(zhuǎn)發(fā)給到客戶端熄阻。
Nginx 依據(jù)事件驅(qū)動模型和操作系統(tǒng)平臺獨特性實現(xiàn)請求快速分發(fā)給到各工作進程钾军。工作進程的數(shù)量由配置文件定義決定哀九,同時可以由給定配置進行重置或者根據(jù) CPU 核數(shù)進行動態(tài)更改息裸。一般將工作進程數(shù)設(shè)置為服務(wù)器 CPU 核心數(shù)是最適宜的访圃,因為 Nginx 采用了 io多路復用 機制漠另,每個工作進程都是一個獨立的進程,并且每個進程只有一個主線程,對請求的處理都是通過異步非阻塞方式报咳,對 CPU 親和性很高岩臣,可以將 CPU 性能發(fā)揮到極致焙压。
Nginx 常用命令
nginx -s reload
:重新載入配置文件nginx -s reopen
:重啟 Nginxnginx -s stop
:停止 Nginxnginx -c file
:指定配置文件(不使用默認配置文件)nginx -t
:檢查配置文件 nginx.conf
更多命令行參數(shù)詳情,請參考:nginx -h
或 Command-line parameters
Nginx 模塊
Nginx 主要由兩部分內(nèi)容構(gòu)成:內(nèi)核 + 模塊(module)。
Nginx 是典型的微內(nèi)核設(shè)計,其內(nèi)核簡潔優(yōu)雅,且具備極高擴展性。內(nèi)核提供了 Web 服務(wù)的基本功能,如啟用網(wǎng)絡(luò)協(xié)議蜕径,創(chuàng)建運行環(huán)境帕识,接收和分配客戶端請求伪货,處理模塊之間的交互...
同時 Nginx 又采用模塊化的開發(fā)方式,Nginx 的各種功能和操作都交由對應(yīng)模塊進行實現(xiàn)。
官網(wǎng)上,主要介紹了 Nginx 4 大模塊:
Core functionality:核心功能模塊:ngx_core_module让网,主要介紹了 Nginx 核心模塊配置的一些指令泞辐,eg:
user
锯茄、pid
...ngx_http_module:HTTP 模塊,主要是對 HTTP 進行操作的各個功能模塊組合,其包含的子模塊如下圖所示:
- ngx_mail_module:MAIL 模塊步氏,郵件代理模塊,其包含的子模塊如下圖所示:
- ngx_stream_module:STREAM 模塊,是基于 tcp 協(xié)議的一些模塊写穴,其包含的子模塊如下圖所示:
注:各模塊的具體詳情及其配置語法,請參考:Modules reference
Nginx 的模塊默認編譯進 Nginx 中(可通過nginx -V
查看編譯的具體模塊),如果需要增加或刪除模塊艾少,需要重新編譯 Nginx误堡。
Nginx 模塊化的設(shè)計使得 Nginx 具備極佳的擴展性悉抵,越來越多的第三方模塊開發(fā)也使得 Nginx 的功能越來越強大审磁。
Nginx 基本配置
Nginx 及其各個模塊的工作方式都由配置文件進行控制瓤介。默認的配置文件可能存放于以下路徑:
/usr/local/nginx/conf/nginx.conf
/etc/nginx/nginx.conf
usr/local/etc/nginx/nginx.conf
實際上闻察,我們可以通過前面介紹的配置文件檢測命令nginx -t
钉嘹,該命令會打印出默認的配置文件路徑,如下圖所示:
可以看到利赋,本人機器上 Nginx 默認的配置文件路徑為:/usr/local/nginx/nginx.conf
(其實是源碼安裝的時候手動進行指定的)
知道 Nginx 的配置文件路徑后褪那,我們就可以對其進行配置。但在此之前,需先了解一下 Nginx 配置文件組織架構(gòu):
-
配置文件架構(gòu):Nginx 由多個模塊(module)組合而成熏矿,每個模塊的配置都由相應(yīng)的指令(directive)進行設(shè)置鲤竹。
在 Nginx 配置文件中,有兩種 指令 類型:-
簡單指令(simple directives):簡單指令由名稱和參數(shù)組成勇边,以空格進行區(qū)分奕坟,以分號
;
作為結(jié)束。其格式如下所示:name parameter; name parameter1 parameter2; name parameter1 parameter2 ...;
-
塊指令(block directives):塊指令也是由名稱和參數(shù)組成,只是相對與簡單指令以分號
;
進行結(jié)束最仑,塊指令以大括號作為結(jié)束,并且大括號內(nèi)可以添加一些額外指令。其格式如下所示:name { name1 parameter1; name2 { ... } ... } name parameter { name1 ...; name2 { ... } ... } name parameter1 parameter2 ... { name1 ...; name2 { ... } ... }
注:如果塊指令內(nèi)部有其他一些指令萤捆,則該塊指令稱之為 context(比如:events,http,server挽封,location...)
配置文件內(nèi)的獨立于任何 context 之外的指令被稱為 main context阔蛉,比如:events 和 http 指令就屬于 main context通铲,server 就屬于 http context部服,location 也屬于 http context昌讲。 -
了解完配置文件的指令格式后窄驹,我們就可以進行具體配置了:以下是一個基本的配置結(jié)構(gòu):
main # 全局配置(main context)
events { # 事件模塊配置
...
}
http { # http模塊設(shè)置
....
server { # 虛擬服務(wù)器
....
location { # 路由配置
....
}
location path {
....
}
location otherpath {
....
}
}
server {
....
location {
....
}
}
upstream name { # 負載均衡配置
....
}
}
下面配置幾個實用的例子,促進理解:
-
靜態(tài)資源服務(wù)器:將 Nginx 配置為一個能提供靜態(tài)資源下載的服務(wù)器徒像,具體配置如下:
- 假設(shè)靜態(tài)資源存放位置為:
/data/www
经备,現(xiàn)在我們創(chuàng)建該目錄,并且放入一個index.html
文件:
$ sudo mkdir -p /data/www $ echo '<h>Hello Nginx</h1>' | sudo tee /data/www/index.html
- 配置 Nginx 靜態(tài)資源目錄為:
/data/www
# nginx.conf http { # http 模塊配置 server { # 虛擬主機配置 location / { # 路由映射:/ root /data/www; # 靜態(tài)資源路徑 } } }
上述簡單幾行配置浸卦,其實就已經(jīng)完成了靜態(tài)服務(wù)器功能了炉抒,但是還未生效僚稿,我們還需通過
nginx -s reload
命令來讓 Nginx 重新加載配置文件。經(jīng)過以上步驟,此時瀏覽器訪問
http://localhost/index.html
结序,就可以看到index.html
顯示的內(nèi)容了。
注:當訪問出錯的時候经磅,可以查看下日志:
access.log
和error.log
,一個記錄了訪問日志,一個記錄了訪問出錯日志怜庸。這兩個日志的位置位于:/usr/local/nginx/logs
或/var/log/nginx
。注:上述示例是極簡配置趣钱,以下配置與上述極簡配置功能一致您旁,但配置內(nèi)容相對全面,更好理解。具體配置步驟如下:
- 首先創(chuàng)建一個普通用戶用于執(zhí)行 Nginx 進程厅目,假設(shè)該新用戶為:nginx墓塌,所屬組為:www,創(chuàng)建方式如下:
# 創(chuàng)建用戶 nginx催蝗,-d:指定用戶主目錄 -m:當用戶主目錄不存在時,創(chuàng)建主目錄 $ sudo useradd -d /home/nginx -m nginx # 也可直接使用 sudo useradd nginx # 創(chuàng)建組 www $ sudo groupadd www # 將用戶 nginx 添加進組 www迂苛,-a:append 到組(不刪除本身所屬組)-G {groupname} username $ sudo usermod -a -G www nginx # 查看用戶 nginx 信息 $ id nginx
- 配置文件配置如下內(nèi)容:
user nginx www; # 以 www 組的用戶 nginx 運行 worker_processes 1; # 工作進程數(shù) # 錯誤日志 # error_log logs/error.log; # error_log logs/error.log notice; # error_log logs/error.log info; # pid logs/nginx.pid; events { # 事件模塊 worker_connections 1024; # 工作進程連接數(shù) } http { # http 模塊配置 include mime.types; # include:表示導入配置文件 mime.types default_type application/octet-stream; # response 的默認 MIME 類型 sendfile on; # 啟動高效傳輸文件模式 keepalive_timeout 65; # 保持連接時間 # gzip on; server { # 虛擬主機配置 listen 80; # 監(jiān)聽的 http 端口號(默認為 80) server_name localhost; # 虛擬主機對應(yīng)的域名/ip location / { # 路由映射:/ root /data/www; # 靜態(tài)資源路徑 index index.html index.htm; # 訪問根目錄對應(yīng)的默認請求文件 } location /images/ { # 路由映射:/images/ root /data/; # 靜態(tài)資源路徑 } #error_page 404 /404.html; # redirect server error pages to the static page /50x.html error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } }
這里面我們主要來講一下
location
的配置選項爷恳,因為location
的配置可能咋看起來沒問題魂务,但實際運行卻一直無法訪問纯陨,因此這里需要著重介紹下:location
的作用是配置請求 URI量愧。Nginx 會從請求的 URI 中的path
路徑解析到其對應(yīng)的location
紊馏,然后從該location
指定的配置中獲取到請求資源的真實路徑...其格式如下:Syntax: location [ = | ~ | ~* | ^~ ] uri { ... } location @name { ... } Default: — Context: server, location
location 的路由映射是由:前綴 + 路由字符串 組合而成沛慢。從 location 的語法知道,其 前綴 字符有 4 種:
-
=
:表示精確匹配(原意匹配)她按。 -
~
:表示正則匹配區(qū)分大小寫衰琐。 -
~*
:表示正則匹配不區(qū)分大小寫斗搞。 -
^~
:表示普通字符串匹配(原意匹配) -
@
:定義一個命名 location狞山,用于內(nèi)部重定向(注:@
用于命名當前 location驳遵,不是前綴)来庭。
從上述描述可以看到厉萝,location 的前綴中蚪缀,只有
~
廉油、~*
會執(zhí)行正則匹配眨猎,這里我們將其稱之為 正則匹配汁果;
而=
赡译、^~
以及無任何前綴的都按原意進行匹配(不執(zhí)行正則匹配)成畦,我們將之稱其為 普通匹配跛梗。-
匹配規(guī)則:對于普通匹配,其遵循以下兩個規(guī)則:
URI 前綴匹配:只要請求 URI 前綴含有當前 location 指定的 URI,則匹配成功妇斤。
-
URI 最長匹配:請求 URI 優(yōu)先匹配指定了最長 URI 的 location。比如:
location = /images/ {...} # location A location /images/ {...} # location B location ^~ /images/volleyball/ {...} # location C
如果此時請求為:
http://localhost/images/
素挽,則匹配前綴為=
的 location旨袒,即 location A。
如果此時請求為:http://localhost/images/voleeyball/..
闸与,由于 location B 和 location C 同時滿足匹配請求 URI,但是 location C 指定的 URI 比 location B 更長廷臼,因此最終的匹配為 location C(優(yōu)先選擇最長匹配)。注:
=
執(zhí)行的是精確匹配,因此只能匹配對根目錄的請求。而^~
執(zhí)行的單純的原意匹配,會遵頊最長匹配規(guī)則墩蔓,因此后面可攜帶子路徑。
-
匹配順序:Nginx 會先進行普通匹配盒让,然后再執(zhí)行正則匹配彤路。具體過程如下:
- 先執(zhí)行精確匹配(
=
)裁蚁,如果找到管削,匹配完成塞弊,停止搜索咒精。 - 對帶前綴修飾符
^~
和未帶前綴修飾符的 location 進行匹配权旷,如果找到最長匹配,且最長匹配 location 帶有前綴^~
,則匹配完成,停止搜索。否則速址,記錄該匹配。 - 對前綴
~
和~*
的 location 進行匹配(以配置文件聲明的順序依次進行匹配)舶胀,找到第一個匹配時弥臼,則匹配完成,停止搜索。 - 如果第 3 步匹配失敗剪廉,則結(jié)果為第 2 步的匹配結(jié)果队贱。
注:上述過程中杨赤,第 1干茉,2 步為普通匹配跑筝,第 3 步為正則匹配。
舉個例子:
server { listen 80; server_name localhost; default_type text/html; # 響應(yīng)默認返回類型 location / { # location A return 200 A; } location = /images/ { # location B return 200 B; } location /images/volleyball/test { # location C return 200 C; } location /images/volleyball/test.html { # location D return 200 D; } location /images/volleyball/ { # location E return 200 E; } location ^~ /images/volleyball/te { # location F return 200 F; } location ~ /images/volleyball/te { # location G return 200 G; } }
以下分幾種情況進行請求:
curl localhost/images/
:精確匹配,結(jié)果為B
。-
curl localhost/images/xxx
:過程如下:- 精確匹配:
/images/
降盹,不滿足 - 帶前綴
^~
和普通未帶前綴的正則匹配:images/volleball/te
剑辫,/
产园,/images/volleyball/test
募寨,/images/volleyball/test.html
,/images/volleyball/
森缠,都沒有最長匹配(即都不包含請求全路徑/images/xxx
) - 對
~
/~*
進行匹配:/images/volleyball/te
拔鹰,不匹配 - 對未帶前綴的正則進行匹配,只有 location A 滿足贵涵,所以結(jié)果為
A
- 精確匹配:
-
curl localhost/images/volleyball/xxx
:過程如下:- 同上列肢,不匹配
- 同上,得到最長匹配為 location E宾茂,沒有帶前綴
^~
瓷马,則記錄 location E 即可 - 進行前綴
~
/~*
匹配,不滿足 - 由于第 3 步匹配不到跨晴,故結(jié)果為第 2 步的最長匹配:location E欧聘,所以結(jié)果為
E
-
curl localhost/images/volleyball/tes
:過程如下:- 同上,不匹配
- 同上端盆,得到的最長匹配為:location F怀骤,因為該最長匹配的 location 帶有前綴
^~
,因此結(jié)果為F
焕妙,搜索結(jié)束
-
curl localhost/images/volleyball/test
:過程如下:- 同上蒋伦,不匹配
- 同上,location C 為最長匹配焚鹊,未帶前綴
^~
痕届,保留記錄 - 進行前綴
~
/~*
匹配,location G 匹配,結(jié)果為G
-
curl localhost/images/volleyball/testxxx
:過程如下:- 同上研叫,不匹配
- 同上势决,location C 為最長匹配,未帶前綴
^~
蓝撇,保留記錄 - 進行前綴
~
/~*
匹配,location G 匹配陈莽,結(jié)果為G
-
curl localhost/images/volleyball/test.html
:- 同上渤昌,不匹配
- 同上,location D 為最長匹配走搁,未帶前綴
^~
独柑,保留記錄 - 進行前綴
~
/~*
匹配,location G 匹配私植,結(jié)果為G
- 先執(zhí)行精確匹配(
然后 location 內(nèi)部用于指定路由對應(yīng)的實際目錄有如下兩個指令:
-
root
:設(shè)置路由映射的根目錄忌栅,比如:
location /i/ { root /data/www; }
當我們請求
/i/1.jpg
的時候,對應(yīng)的資源的實際路徑就為:/data/www/i/1.jpg
曲稼,這里需要注意的一個點就是請求攜帶的資源路徑必須存在root
指定的目錄下索绪,比如當前這個例子的請求 URI 的path
為/i/1.jpg
,因此/data/www
內(nèi)就必須對應(yīng)有一個子目錄i
贫悄,其內(nèi)有一張圖片1.jpg
瑞驱,也即:/data/www/i/1.jpg
。也即:請求資源實際路徑 =root
+location
-
alias
:使用root
指定的資源目錄窄坦,請求路徑必須存在于root
指定的目錄中唤反,資源是相對于root
指定的路徑的。如果請求 URI 需要進行變動鸭津,則應(yīng)當使用alias
指令來將請求path
映射到一個絕對路徑彤侍,比如:
location /i/ { alias /data/www/images/; # alias 必須以 / 結(jié)尾,表示一個目錄 }
當我們請求
/i/1.jpg
時逆趋,實際對應(yīng)的資源路徑為:/data/www/images/1.jpg
盏阶,可以看到,不再是相對于root
目錄闻书,而是使用了絕對路徑般哼。簡單理解就是:請求資源路徑 =alias
路徑替換location
- 假設(shè)靜態(tài)資源存放位置為:
-
正向代理服務(wù)器:Nginx 中一個最常見的場景之一就是將其作為代理服務(wù)器,可以將客戶端的請求轉(zhuǎn)發(fā)到目標服務(wù)器惠窄,再將結(jié)果轉(zhuǎn)發(fā)給到客戶端蒸眠,讓客戶端不必直接訪問目標網(wǎng)站也能訪問網(wǎng)站內(nèi)容。其具體配置如下所示:
http { # http 模塊配置 ... server { # 代理服務(wù)器 resolver 114.114.114.114; # 指定DNS服務(wù)器IP地址 listen 80; server_name localhost; location / { proxy_pass $scheme://$host$request_uri; # 正向代理杆融,轉(zhuǎn)發(fā)到目標服務(wù)器 } } }
上述代碼中我們配置了一個 HTTP 代理服務(wù)器
http://localhost:80
楞卡,它會將客戶端請求轉(zhuǎn)發(fā)給到目標服務(wù)器,$scheme://$host$request_uri
就是目標服務(wù)器地址(網(wǎng)址),這里以$
開頭的字符串是 Nginx 內(nèi)置的變量蒋腮,可用于獲取請求的一些信息淘捡,更多變量內(nèi)容,請查看:Nginx 內(nèi)置變量池摧。
此時焦除,我們可以通過curl
指令指定代理代理服務(wù)器訪問目標網(wǎng)址:$ curl -I --proxy http://localhost:80 http://www.baidu.com # 請求成功后,可以看到響應(yīng)頭`Server: nginx/1.18.0`作彤,表示我們的確是通過 Nginx 代理進行訪問的
注:Nginx 默認不支持正向代理 HTTPS 請求膘魄,但是我們可以通過添加第三方模塊 ngx_http_proxy_connect_module 來使能 HTTPS 正向代理。
具體搭建步驟如下所示:- 下載擴展模塊:如下所示:
$ cd /usr/local/src $ git clone https://github.com/chobits/ngx_http_proxy_connect_module.git
- 安裝 pathch:如下所示:
$ sudo apt install patch
- 選擇補丁包:根據(jù)自己 Nginx 的版本選擇合適的補丁包竭讳,對應(yīng)版本請查詢:[select-patch]
$ patch -p1 < /usr/local/src/ngx_http_proxy_connect_module/patch/proxy_connect_rewrite_1018.patch
- 安裝擴展模塊到 Nginx:如下所示:
$ cd /usr/local/src/nginx-1.18.0 $ sudo ./configure --sbin-path=/usr/local/nginx/nginx \ --conf-path=/usr/local/nginx/nginx.conf \ --pid-path=/usr/local/nginx/nginx.pid \ --with-http_gzip_static_module \ --with-http_stub_status_module \ --with-file-aio \ --with-http_realip_module \ --with-http_ssl_module \ --with-pcre=/usr/local/src/pcre-8.44 \ --with-zlib=/usr/local/src/zlib-1.2.11 \ --with-openssl=/usr/local/src/openssl-1.1.1g \ --add-module=/usr/local/src/ngx_http_proxy_connect_module $ sudo make j4 $ sudo make install
以上创葡,就完成了第三方擴展模塊 ngx_http_proxy_connect_module 的安裝。
下面就可以配置 Nginx 支持 HTTPS 正向代理绢慢,如下所示:
server { resolver 114.114.114.114; # DNS 服務(wù)器可根據(jù)實際情況單獨配置 listen 80; server_name localhost; default_type text/html; underscores_in_headers on; proxy_connect; proxy_connect_allow all; proxy_connect_connect_timeout 10s; proxy_connect_read_timeout 10s; proxy_connect_send_timeout 10s; location / { proxy_pass $scheme://$host$request_uri; # 正向代理灿渴,轉(zhuǎn)發(fā)到目標服務(wù)器 } }
重新加載 Nginx 后,訪問 HTTPS 應(yīng)該就可以成功了胰舆,如下所示:
$ curl -X GET 'https://www.baidu.com' --proxy 'http://localhost:80' -i
關(guān)于 Nginx 無法直接支持 HTTPS 正向代理的具體原因骚露,可參考:使用 Nginx 搭建 HTTPS 正向代理服務(wù)
-
反向代理服務(wù)器:反向代理就是將客戶端請求轉(zhuǎn)發(fā)到后臺應(yīng)用服務(wù)器集群中的一個進行處理,其具體配置如下:
http { # http 模塊配置 ... server { # 目標服務(wù)器 listen 8080; root /data/realweb/; # 這里直接將 root 設(shè)置到 server 塊中缚窿,表示該 server 塊中所有 location 默認使用該 root荸百, # location 內(nèi)部配置了 root 會覆蓋此處的 root default_type text/html; # 響應(yīng)默認返回類型 location / { return 200 "chosen to handler requests in cluster"; } } server { # 反向代理服務(wù)器 listen 80; server_name localhost; location / { proxy_pass http://localhost:8080; # 反向代理配置,轉(zhuǎn)發(fā)到 8080 端口 proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } } }
其實反向代理的配置和正向代理的配置都是采用
proxy_pass
指令滨攻,兩者的配置形式上幾乎是一樣的够话,只是在概念上存在區(qū)別:正向代理知道要訪問的目標服務(wù)器地址,但是無法直接訪問光绕,因此通過代理進行訪問女嘲,而 Nginx 需要通過內(nèi)置變量提取出目標服務(wù)器地址,進行訪問诞帐;而反向代理可以直接訪問目標服務(wù)器欣尼,只是不知道具體進行請求處理的是哪一個應(yīng)用服務(wù)器,但對 Nginx 而言停蕉,就需要具體對集群服務(wù)器進行配置了愕鼓。 -
動靜分離:動靜分離 其實與 反向代理 在配置上異曲同工,只不過 動靜分離 把請求識別為對靜態(tài)資源和動態(tài)資源的請求慧起,對于靜態(tài)資源的請求宪肖,Nginx 會直接響應(yīng)這些請求锰霜,對于動態(tài)資源西雀,Nginx 會扮演代理角色车份,將請求轉(zhuǎn)發(fā)給到對應(yīng)的應(yīng)用服務(wù)器驻子。具體配置如下:
http { # http 模塊配置 ... server { # 目標服務(wù)器 listen 8080; server_name localhost; root /data/realweb/; # 這里直接將 root 設(shè)置到 server 塊中,表示該 server 塊中所有 location 默認使用該 root估灿, # location 內(nèi)部配置了 root 會覆蓋此處的 root default_type text/html; # 響應(yīng)默認返回類型 location / { return 200 "dynamic content"; } } server { # 代理服務(wù)器 listen 80; server_name localhost; location / { # 動態(tài)請求 proxy_pass http://localhost:8080; # 代理崇呵,轉(zhuǎn)發(fā)請求給到 http://localhost:8080 } location ~ \.(gif|jpg|png)$ { # 靜態(tài)資源請求 root /data/images/; # 圖片靜態(tài)資源目錄 } } }
這里
localhost:80
的服務(wù)器作為動靜分離服務(wù)器,對于靜態(tài)資源\.(gif|jpg|png)$
的請求馅袁,直接進行響應(yīng)域慷。對于其他請求,代理給到目標服務(wù)器localhost:8080
汗销。 -
負載均衡:當我們網(wǎng)站的并發(fā)量比較大的時候犹褒,這時候可能就需要搭建服務(wù)器集群,然后采用 負載均衡 分攤服務(wù)器集群壓力大溜。具體配置如下:
http { ... upstream localserver { # 集群服務(wù)器 # 默認采用輪詢機制 server 1xx.2x.1xx.2xx:9000; # 遠程服務(wù)器一 server 1xx.2x.1xx.2xx:9001; # 遠程服務(wù)器二 } server { # 網(wǎng)站 listen 8080; server_name localhost; location / { proxy_pass http://localserver; # 請求轉(zhuǎn)向集群 localserver } } }
這里我們采用
upstream
定義服務(wù)器集群,內(nèi)部我配置了兩個遠程服務(wù)器估脆,Nginx 默認采用的集群策略是輪詢機制钦奋,即第一次請求分發(fā)到第一臺服務(wù)器,第二次請求分發(fā)到第二臺服務(wù)器...以此類推疙赠。然后對我們的網(wǎng)站采用了proxy_pass
將請求反向代理到了upstream
定義的集群付材,現(xiàn)在,進行如下訪問:$ curl http://localhost:8080 # 9000 端口的服務(wù)器會響應(yīng) $ curl http://localhost:8080 # 9001 端口的服務(wù)器會響應(yīng)
注:負載均衡策略有很多種圃阳,比如 輪詢厌衔、權(quán)重、ip_hash捍岳、fair富寿、url_hash...這里就不進行展開了。
-
Nginx 支持 HTTPS 傳輸:Nginx 可以配置開啟 HTTPS 服務(wù)锣夹,具體配置如下:
server { #ssl參數(shù) listen 443 ssl; server_name example.com; #證書文件 ssl_certificate example.com.crt; #私鑰文件 ssl_certificate_key example.com.key; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers HIGH:!aNULL:!MD5; #... }
上述配置中页徐,私鑰文件
*.key
和證書文件*.crt
可以通過openssl
命令生產(chǎn),比如:# C:Country 银萍,單位所在國家变勇,為兩位數(shù)的國家縮寫,如: CN 就是中國 # ST 字段: State/Province 贴唇,單位所在州或省 # L 字段: Locality 搀绣,單位所在城市 / 或縣區(qū) # O 字段: Organization ,此網(wǎng)站的單位名稱; # OU 字段: Organization Unit戳气,下屬部門名稱;也常常用于顯示其他證書相關(guān)信息链患,如證書類型,證書產(chǎn)品名稱或身份驗證類型或驗證內(nèi)容等; # CN 字段: Common Name 瓶您,網(wǎng)站的域名; openssl req -new -newkey rsa:2048 -sha256 -nodes -out example_com.csr -keyout example_com.key -subj "/C=CN/ST=ShenZhen/L=ShenZhen/O=Example Inc./OU=Web Security/CN=example.com"
上述命令生產(chǎn)的證書文件
*.crt
還需要相關(guān) CA 機構(gòu)進行簽署锣险,成功后會得到一個新的證書文件蹄皱,然后才可以在 Nginx 中配置 HTTPS 服務(wù)。
網(wǎng)上有證書的免費申請方式芯肤,這里就不加贅述了巷折。
附錄
這是在網(wǎng)上看到的一份比較詳細的 Nginx 配置文件釋義:
#安全問題,建議用nobody,不要用root.
#user nobody;
#worker數(shù)和服務(wù)器的cpu數(shù)相等是最為適宜
worker_processes 4;
#work綁定cpu(4 work綁定4cpu) 這個配置項目前在我本機上有問題崖咨,先注釋掉
#worker_cpu_inffinity 0001 0010 0100 1000
#work綁定cpu (4 work綁定8cpu中的4個) 锻拘。
worker_cpu_inffinity 0000001 00000010 00000100 00001000
#全局錯誤日志定義類型,[debug | info | notice | warn | error | crit]
#error_log /data/nginx/logs/error.log;
#error_log /data/nginx/logs/error.log notice;
#日志文件存放路徑 access_log path [format [buffer=size | off]]
access_log /data/nginx/logs/lazyegg.com/web/access.log combinedio;
#進程pid文件
#pid logs/nginx.pid;
#指定進程可以打開的最大描述符:數(shù)目
#工作模式與連接數(shù)上限
##這個指令是指當一個nginx進程打開的最多文件描述符數(shù)目击蹲,理論值應(yīng)該是最多打開文件數(shù)(ulimit -n)與nginx進程數(shù)相除署拟,但是nginx分配請求并不是那么均勻,所以最好與ulimit -n 的值保持一致歌豺。
#這是因為nginx調(diào)度時分配請求到進程并不是那么的均衡推穷,所以假如填寫10240,總并發(fā)量達到3-4萬時就有進程可能超過10240了类咧,這時會返回502錯誤馒铃。
worker_rlimit_nofile 65535;
################################# events ###############################
events {
#參考事件模型,use [ kqueue | rtsig | epoll | /dev/poll | select | poll ]; epoll模型
use epoll
#單個進程最大連接數(shù)(最大連接數(shù)=連接數(shù)+進程數(shù))
worker_connections 1024;
#keepalive 超時時間
keepalive_timeout 60;
#客戶端請求頭部的緩沖區(qū)大小痕惋。
client_header_buffer_size 4k;
#這個將為打開文件指定緩存区宇,默認是沒有啟用的,max指定緩存數(shù)量值戳,建議和打開文件數(shù)一致议谷,inactive是指經(jīng)過多長時間文件沒被請求后刪除緩存。
open_file_cache max=65535 inactive=60s;
#這個是指多長時間檢查一次緩存的有效信息堕虹。
open_file_cache_valid 80s;
#open_file_cache指令中的inactive參數(shù)時間內(nèi)文件的最少使用次數(shù)卧晓,如果超過這個數(shù)字,文件描述符一直是在緩存中打開的赴捞,如上例禀崖,如果有一個文件在inactive時間內(nèi)一次沒被使用,它將被移除螟炫。
open_file_cache_min_uses 1;
#語法:open_file_cache_errors on | off 默認值:open_file_cache_errors off 使用字段:http, server, location 這個指令指定是否在搜索一個文件是記錄cache錯誤.
open_file_cache_errors on;
}
############################## http ##################################
#設(shè)定http服務(wù)器波附,利用它的反向代理功能提供負載均衡支持
http{
#文件擴展名與文件類型映射表
include mime.types;
#默認文件類型
default_type application/octet-stream;
#默認編碼
charset utf-8;
#服務(wù)器名字的hash表大小
server_names_hash_bucket_size 128;
#客戶端請求頭部的緩沖區(qū)大小。
client_header_buffer_size 32k;
#客戶請求頭緩沖大小昼钻。
large_client_header_buffers 4 64k;
#允許客戶端請求的最大單個文件字節(jié)數(shù)
client_max_body_size 8m;
#開啟高效文件傳輸模式掸屡,sendfile指令指定nginx是否調(diào)用sendfile函數(shù)來輸出文件,對于普通應(yīng)用設(shè)為 on然评,如果用來進行視頻下載等應(yīng)用磁盤IO重負載應(yīng)用仅财,可設(shè)置為off,以平衡磁盤與網(wǎng)絡(luò)I/O處理速度碗淌,降低系統(tǒng)的負載盏求。注意:如果圖片顯示不正常把這個改成off抖锥。
sendfile on;
#開啟目錄列表訪問,適合下載服務(wù)器碎罚,默認關(guān)閉磅废。
autoindex on;
#此選項允許或禁止使用socke的TCP_CORK的選項,此選項僅在使用sendfile的時候使用
tcp_nopush on;
tcp_nodelay on;
#長連接超時時間荆烈,單位是秒
keepalive_timeout 120;
#FastCGI相關(guān)參數(shù)是為了改善網(wǎng)站的性能:減少資源占用拯勉,提高訪問速度。下面參數(shù)看字面意思都能理解憔购。
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
fastcgi_buffer_size 64k;
fastcgi_buffers 4 64k;
fastcgi_busy_buffers_size 128k;
fastcgi_temp_file_write_size 128k;
#gzip模塊設(shè)置
gzip on; #開啟gzip壓縮輸出
gzip_min_length 1k; #最小壓縮文件大小
gzip_buffers 4 16k; #壓縮緩沖區(qū)
gzip_http_version 1.0; #壓縮版本(默認1.1宫峦,前端如果是squid2.5請使用1.0)
gzip_comp_level 2; #壓縮等級
gzip_types text/plain application/x-javascript text/css application/xml; #壓縮類型,默認就已經(jīng)包含textml玫鸟,所以下面就不用再寫了导绷,寫上去也不會有問題,但是會有一個warn屎飘。
gzip_vary on;
#開啟限制IP連接數(shù)的時候需要使用
#limit_zone crawler $binary_remote_addr 10m;
#負載均衡配置
upstream lazyegg.net {
#upstream的負載均衡妥曲,weight是權(quán)重,可以根據(jù)機器配置定義權(quán)重枚碗。weigth參數(shù)表示權(quán)值逾一,權(quán)值越高被分配到的幾率越大铸本。
server 192.168.80.121:80 weight=3;
server 192.168.80.122:80 weight=2;
server 192.168.80.123:80 weight=3;
#nginx的upstream目前支持4種方式的分配
#1肮雨、輪詢(默認)
#每個請求按時間順序逐一分配到不同的后端服務(wù)器,如果后端服務(wù)器down掉箱玷,能自動剔除怨规。
#2、weight
#指定輪詢幾率锡足,weight和訪問比率成正比波丰,用于后端服務(wù)器性能不均的情況。
#例如:
#upstream bakend {
# server 192.168.0.14 weight=10;
# server 192.168.0.15 weight=10;
#}
#2舶得、ip_hash
#每個請求按訪問ip的hash結(jié)果分配掰烟,這樣每個訪客固定訪問一個后端服務(wù)器,可以解決session的問題沐批。
#例如:
#upstream bakend {
# ip_hash;
# server 192.168.0.14:88;
# server 192.168.0.15:80;
#}
#3纫骑、fair(第三方)
#按后端服務(wù)器的響應(yīng)時間來分配請求,響應(yīng)時間短的優(yōu)先分配九孩。
#upstream backend {
# server server1;
# server server2;
# fair;
#}
#4先馆、url_hash(第三方)
#按訪問url的hash結(jié)果來分配請求,使每個url定向到同一個后端服務(wù)器躺彬,后端服務(wù)器為緩存時比較有效煤墙。
#例:在upstream中加入hash語句梅惯,server語句中不能寫入weight等其他的參數(shù),hash_method是使用的hash算法
#upstream backend {
# server squid1:3128;
# server squid2:3128;
# hash $request_uri;
# hash_method crc32;
#}
#tips:
#upstream bakend{#定義負載均衡設(shè)備的Ip及設(shè)備狀態(tài)}{
# ip_hash;
# server 127.0.0.1:9090 down;
# server 127.0.0.1:8080 weight=2;
# server 127.0.0.1:6060;
# server 127.0.0.1:7070 backup;
#}
#在需要使用負載均衡的server中增加 proxy_pass http://bakend/;
#每個設(shè)備的狀態(tài)設(shè)置為:
#1.down表示單前的server暫時不參與負載
#2.weight為weight越大仿野,負載的權(quán)重就越大铣减。
#3.max_fails:允許請求失敗的次數(shù)默認為1.當超過最大次數(shù)時,返回proxy_next_upstream模塊定義的錯誤
#4.fail_timeout:max_fails次失敗后设预,暫停的時間徙歼。
#5.backup:其它所有的非backup機器down或者忙的時候,請求backup機器鳖枕。所以這臺機器壓力會最輕魄梯。
#nginx支持同時設(shè)置多組的負載均衡,用來給不用的server來使用宾符。
#client_body_in_file_only設(shè)置為On 可以講client post過來的數(shù)據(jù)記錄到文件中用來做debug
#client_body_temp_path設(shè)置記錄文件的目錄 可以設(shè)置最多3層目錄
#location對URL進行匹配.可以進行重定向或者進行新的代理 負載均衡
}
#虛擬主機的配置
server {
#監(jiān)聽端口
listen 80;
#域名可以有多個酿秸,用空格隔開
server_name lazyegg.net;
#默認入口文件名稱
index index.html index.htm index.php;
root /data/www/lazyegg;
#對******進行負載均衡
location ~ .*.(php|php5)?$
{
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi.conf;
}
#圖片緩存時間設(shè)置
location ~ .*.(gif|jpg|jpeg|png|bmp|swf)$
{
expires 10d;
}
#JS和CSS緩存時間設(shè)置
location ~ .*.(js|css)?$
{
expires 1h;
}
#日志格式設(shè)定
#$remote_addr與$http_x_forwarded_for用以記錄客戶端的ip地址;
#$remote_user:用來記錄客戶端用戶名稱魏烫;
#$time_local:用來記錄訪問時間與時區(qū)辣苏;
#$request:用來記錄請求的url與http協(xié)議;
#$status:用來記錄請求狀態(tài)哄褒;成功是200稀蟋,
#$body_bytes_sent :記錄發(fā)送給客戶端文件主體內(nèi)容大小呐赡;
#$http_referer:用來記錄從那個頁面鏈接訪問過來的退客;
#$http_user_agent:記錄客戶瀏覽器的相關(guān)信息;
#通常web服務(wù)器放在反向代理的后面链嘀,這樣就不能獲取到客戶的IP地址了萌狂,通過$remote_add拿到的IP地址是反向代理服務(wù)器的iP地址。反向代理服務(wù)器在轉(zhuǎn)發(fā)請求的http頭信息中怀泊,可以增加x_forwarded_for信息茫藏,用以記錄原有客戶端的IP地址和原來客戶端的請求的服務(wù)器地址。
log_format access '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" $http_x_forwarded_for';
#定義本虛擬主機的訪問日志
access_log /usr/local/nginx/logs/host.access.log main;
access_log /usr/local/nginx/logs/host.access.404.log log404;
#對 "/connect-controller" 啟用反向代理
location /connect-controller {
proxy_pass http://127.0.0.1:88; #請注意此處端口號不能與虛擬主機監(jiān)聽的端口號一樣(也就是server監(jiān)聽的端口)
proxy_redirect off;
proxy_set_header X-Real-IP $remote_addr;
#后端的Web服務(wù)器可以通過X-Forwarded-For獲取用戶真實IP
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#以下是一些反向代理的配置霹琼,可選务傲。
proxy_set_header Host $host;
#允許客戶端請求的最大單文件字節(jié)數(shù)
client_max_body_size 10m;
#緩沖區(qū)代理緩沖用戶端請求的最大字節(jié)數(shù),
#如果把它設(shè)置為比較大的數(shù)值枣申,例如256k售葡,那么,無論使用firefox還是IE瀏覽器糯而,來提交任意小于256k的圖片天通,都很正常。如果注釋該指令熄驼,使用默認的client_body_buffer_size設(shè)置像寒,也就是操作系統(tǒng)頁面大小的兩倍烘豹,8k或者16k,問題就出現(xiàn)了诺祸。
#無論使用firefox4.0還是IE8.0携悯,提交一個比較大,200k左右的圖片筷笨,都返回500 Internal Server Error錯誤
client_body_buffer_size 128k;
#表示使nginx阻止HTTP應(yīng)答代碼為400或者更高的應(yīng)答憔鬼。
proxy_intercept_errors on;
#后端服務(wù)器連接的超時時間_發(fā)起握手等候響應(yīng)超時時間
#nginx跟后端服務(wù)器連接超時時間(代理連接超時)
proxy_connect_timeout 90;
#后端服務(wù)器數(shù)據(jù)回傳時間(代理發(fā)送超時)
#后端服務(wù)器數(shù)據(jù)回傳時間_就是在規(guī)定時間之內(nèi)后端服務(wù)器必須傳完所有的數(shù)據(jù)
proxy_send_timeout 90;
#連接成功后,后端服務(wù)器響應(yīng)時間(代理接收超時)
#連接成功后_等候后端服務(wù)器響應(yīng)時間_其實已經(jīng)進入后端的排隊之中等候處理(也可以說是后端服務(wù)器處理請求的時間)
proxy_read_timeout 90;
#設(shè)置代理服務(wù)器(nginx)保存用戶頭信息的緩沖區(qū)大小
#設(shè)置從被代理服務(wù)器讀取的第一部分應(yīng)答的緩沖區(qū)大小胃夏,通常情況下這部分應(yīng)答中包含一個小的應(yīng)答頭轴或,默認情況下這個值的大小為指令proxy_buffers中指定的一個緩沖區(qū)的大小,不過可以將其設(shè)置為更小
proxy_buffer_size 4k;
#proxy_buffers緩沖區(qū)仰禀,網(wǎng)頁平均在32k以下的設(shè)置
#設(shè)置用于讀取應(yīng)答(來自被代理服務(wù)器)的緩沖區(qū)數(shù)目和大小照雁,默認情況也為分頁大小,根據(jù)操作系統(tǒng)的不同可能是4k或者8k
proxy_buffers 4 32k;
#高負荷下緩沖大写鸲瘛(proxy_buffers*2)
proxy_busy_buffers_size 64k;
#設(shè)置在寫入proxy_temp_path時數(shù)據(jù)的大小饺蚊,預(yù)防一個工作進程在傳遞文件時阻塞太長
#設(shè)定緩存文件夾大小,大于這個值悬嗓,將從upstream服務(wù)器傳
proxy_temp_file_write_size 64k;
}
#本地動靜分離反向代理配置
#所有jsp的頁面均交由tomcat或resin處理
location ~ .(jsp|jspx|do)?$ {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://127.0.0.1:8080;
}
}
}