原文地址: How to Configure NGINXphp
Nginx是一個輕量的、高性能、專爲高併發設計的web服務器。css
Nginx一個鮮明的特色就是,可以高效的處理諸如HTML之類的媒體文件。Nginx採用異步事件驅動模型,以提供高負載下的可預測性能。html
動態內容通過Nginx透傳給CGI、FastCGI或者其餘的諸如Apache的web服務器,而後這些內容又返回給Nginx以分發給客戶端。本文將使你熟悉基本的Nginx參數配置和規定。前端
全部的Nginx配置文件都位於/etc/nginx
目錄下,基本的也是最主要的配置文件是/etc/nginx/nginx.conf
。node
Nginx的配置項也被稱之爲指令
。指令集合就是常說的塊
或者上下文
, 二者是相同的。nginx
以字符#
開頭的行是註釋行,不會被Nginx所解析。指令行必須以分號;
結尾,不然Nginx沒法正確的加載配置文件,並拋出錯誤。web
如下截取自安裝nginx時自帶的配置文件/etc/nginx/nginx.conf
。該文件開頭有四個指令: user
,worker_processes
,error_log
, pid
。它們沒有包含在任何指令塊內,所以咱們稱之爲存在於主指令塊
內。events
和http
指令塊是額外的指令配置塊,它們也存在於主指令塊
內。正則表達式
你能夠參考nginx官方配置文件來了解這些指令的含義,以及主指令塊內的其餘配置參數。bash
user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid
events {
...
}
http {
...
}
複製代碼
http
配置塊內包含着處理web通訊的指令,這些指令一般被成爲通用指令
,由於這些指令做用於全部nginx代理的站點服務。 能夠查閱nginx官方配置文件來了解http
配置塊內的全部指令服務器
http {
include /etc/nginx/mime.type;
default_type application/octet-stream;
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 /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
include /etc/nginx/conf.d/*.conf;
}
複製代碼
上面的http
配置塊包含了一個include
指令,它是用來告訴nginx站點的配置文件的位置
include /etc/nginx/conf.d/*.conf
。 用nginx代理的每一個站點都應該在目錄/etc/nginx/conf.d
下有本身的配置文件, 而且使用形如 example.com.conf
的統一的命名規範。 沒有被nginx代理的站點的配置文件應該被命名爲example.com.conf.disabled
。/etc/nginx/sites-enabled/*;
sites-enabled
文件夾下包含着站點配置文件的連接,這些文件存儲在/etc/nginx/sites-available/
文件下。 能夠經過移除連接的方式達到禁用站點代理的目的。/etc/nginx/conf.d/default.conf
或者etc/nginx/sites-enabled/default
路徑下找到默認的nginx配置例子不管是何種安裝源,每一個站點的配置文件都會包含一個server
配置塊,例如:
# /etc/nginx/conf.d/example.com.conf
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name example.com www.example.com;
root /var/www/example.com;
index index.html;
try_files $uri /index.html;
}
複製代碼
listen
指令告訴nginx應該監聽的http連接的主機名/IP/端口號。 default_server
參數意味着,哪些80端口上的、不符合其餘特定的監聽聲明的請求也會被該虛擬主機處理。第二個listen
指令是基於IPv6的,行爲與上一個IPv4一致.
server_name
指令,容許一個IP地址代理多個域名,nginx代理服務器會根據收到的請求頭來決定將請求轉發給哪一個域名。
你應該爲代理的每一個域名建立一個單獨的配置文件,下面是對應的一些例子:
example.com
和www.example.com
的請求# /etc/nginx/conf.d/example.com.conf
server_name example.com www.example.com;
複製代碼
server_name
指令的值也能夠是通配符*
, *.example.com
和.example.com
這兩個指令都是指示nginx處理來自二級域名example.com
下的全部請求server_name *.example.com;
server_name .example.com;
複製代碼
example
開頭的域名下的請求server_name example.*;
複製代碼
Nginx還容許server_name
的值是自定義的、無效的域名,它只管根據HTTP請求頭中的域名來響應請求,不會去關注該域名是不是有效的。
這種特性在局域網中是很是有用的,或者是你已經知道全部的可能發起請求的客戶端。好比,前端經常使用的,在hosts文件中配置的ip-域名對,nginx均可以監聽、處理。
Location
配置的是,Nginx如何響應請求的資源。該指令把請求抽象爲特定的文件或文件夾,就像server_name
指令指示Nginx如何處理代理域名下的請求同樣, 好比http://example.com/blog/
, 下面是一些例子:
location / { }
location /images/ { }
location /blog/ { }
location /planet/ { }
location /planet/blog/ { }
複製代碼
上述是路由字符串匹配,匹配的目標是,http請求中域名以後的全部路徑:
請求: Http://example.com/
響應: 假設已經配置了主機 server_name example.com
, location /
該指令將決定該請求的響應是什麼。
Nginx老是會用最精確的路由匹配來處理請求:
請求: 例若有這兩個請求http://example.com/planet/blog/
& http://example.com/planet/blog/about/
響應: 在上面的路由匹配中,最終會使用location /planet/blog/ { }
路由下的配置處理,即便location /planet/ { }
該路由也是匹配的,可是由於前者是更精確的,因此會使用前者而不是後者。
location ~ IndexPage\.php$ { }
location ~ ^/BlogPlanet(/|/index\.php)$ { }
複製代碼
當location
指令後面緊跟着一個波浪號~
, 表示該路由匹配是正則匹配,而且是區分大小寫的。 所以IndexPage.php
是可以符合上述的第一個例子的,可是indexpage.php
是不行的。在第二個例子中,正則表達式^/BlogPlanet(/|index\.php)$
會匹配,諸如/BlogPlanet/
和/BlogPlanet/index.php
這樣的請求,可是不會匹配到/BlogPlanet
, /blogplanet/
或者 /blogplanet/index.php
這樣的請求,由於大小寫不符合。
Nginx的正則匹配規則是遵循PCRE(Perl Compatible Regular Expression)的。
location ~* \.(pl|cgi|perl|prl)$ { }
location ~* \.(md|mdwn|txt|mkdn)$ { }
複製代碼
若是你想使匹配規則對大小寫不敏感,那麼在~
後面添加一個*
. 上述的例子是指定nginx如何處理以文件擴展名結尾的請求。 在第一個例子中,全部以.pl
, .PL
, .cgi
, .CGI
, .perl
, .Perl
, .prl
, 和.PrL
結尾的文件請求,都是知足匹配規則的.
location ^~ /images/IndexPage/ { }
location ^~ /blog/BlogPlanet/ { }
複製代碼
location
指令後面跟着 ^~
組合,意味着,若是匹配到特定的字符串,就直接中止尋找更精確的路由匹配項,直接使用當前的路由配置。除此以外,與字符串匹配規則同樣。若是一個請求符合該指令,那麼不論後面是否有更精確的匹配項,直接使用此處的配置規則。關於匹配的順序以及優先級,後文會有更詳細的介紹。
location = / { }
複製代碼
最後,若是你在location
後面添加了一個等號=
, 意味着這是一個精準的匹配,請求路徑必須嚴格等於路由項,纔會中止匹配查詢。舉個栗子:最後的例子會匹配到http://example.com/
, 而不會匹配http://example.com/index.html
, 使用精準匹配能夠輕微的提高響應速度,在某個請求須要頻繁的被調用的場景下是很是有用的。
該指令的處理順序以下:
^~
匹配項,nginx會中止匹配,直接處理。不然,會持續匹配搜索直到找到最合適的匹配項~
和~*
)是第三優先處理的,若是遇到符合條件的,中止搜索,處理請求確保代理域名下的每一個文件、文件夾至少可以匹配一個location
指令
注意:
不建議也不支持嵌套的location配置塊
location
也是一個塊指令,裏面能夠配置相關的指令
一旦Nginx匹配到了一個請求的最佳匹配路由,該請求的響應就會被相關location
內的指令處理。例如:
location / {
root html;
index index.html index.htm;
}
複製代碼
本例中,文件的根路徑會被定位在html/
目錄下,在默認的nginx配置文件中,例子中的完整文件路徑是/etc/nginx/html/
請求: http://example.com/blog/includes/style.css
響應: nginx會嘗試在/etc/nginx/html/blog/includes/style.css
路徑下尋找目標文件
注意:
若是須要的話,root
的值也可使用絕對路徑
index
指令是告訴nginx,若是沒有在目標路徑找到目標文件,那麼使用index指令的值表明的文件做爲返回值。 例如:
請求: http://example.com
響應: nginx沒有找到合適的匹配項,就會返回/etc/nginx/html/index.html
文件
若是index
指令的值有多個,nginx會按順序尋找文件,直到發現第一個存在的,以此做爲響應。若是在相關的文件夾下index.html
不存在,會尋找index.htm
, 若是依然不存在,就會返回404.
下面是一個稍微複雜的例子,展現了一個代理example.com
域名的服務上的一系列location
配置
location / {
root /srv/www/example.com/public_html;
index index.html index.htm;
}
location ~ \.pl$ {
gzip off;
include /etc/nginx/fastcgi_params;
fastcgi_pass unix:/var/run/fcgiwrap.socket;
fastcgi_index index.pl;
fastcgi_param SCRIPT_FILENAME /srv/www/example.com/public_html$fastcgi_script_name;
}
複製代碼
在這個例子中,全部獲取以.pl
爲擴展名的資源的請求,都會被第二個location塊處理, 在該指令塊裏定義了一個fastcgi
回調來處理全部的請求。其餘的請求則是由第一個指令塊處理。 資源的請求被分發在文件系統中的/srv/www/example.com/public_html/
路徑下,若是請求的目標文件不存在,nginx會尋找index.html
或index.htm
代替,若是這兩個文件也不存在,就會返回404.
咱們來分析一下下面的幾個例子:
請求: http://example.com
響應: 該請求會被第一個location匹配
/srv/www/example.com/public_html/index.html
路徑下的文件,有的話直接返回,沒有走第二步/srv/www/example.com/public_html/index.htm
路徑下的文件,有的話返回,沒有的話走第三步請求: http://example.com/blog/
響應: 該請求會被第一個location匹配,請求路徑裏面有指出資源路徑,所以拼接root路徑
/srv/www/example.com/public_html/blog/index.html
路徑下的文件,有的話直接返回,沒有走第二步/srv/www/example.com/public_html/blog/index.htm
路徑下的文件,有的話返回,沒有的話走第三步請求: http://example.com/tasks.pl
響應: 請求的資源是以.pl
結尾的,會被第二個location匹配,資源名稱是tasks.pl
,拼接上root路徑 nginx會尋找/srv/www/example.com/public_html/tasks.pl
路徑下的文件,而後用指定的FASTCGI回調處理該文件,而後把結果做爲響應返回
請求: http://example.com/username/roster.pl
響應: 請求的資源是以.pl
結尾的,會被第二個location匹配,資源名稱是roster.pl
,路徑是username
, 拼接上root路徑 nginx會尋找/srv/www/example.com/public_html/username/roster.pl
路徑下的文件,而後用指定的FASTCGI回調處理該文件,而後把結果做爲響應返回
location
指令是取請求uri
,與location指令後面緊跟的字符串
或正則表達式
作比較,選擇匹配度最高的location塊,用其中定義的指令處理請求。root
指令調整了資源的尋址路徑,nginx會按照root + uri
的路徑來尋找請求資源index
指令的值做爲默認返回值, 若是沒有的話返回404快狗打車前端團隊博文前端想要了解的Nginx