本文介紹如何將NGINX配置做爲Web服務器,幷包括如下部分:html
在高層次上,將NGINX配置做爲Web服務器有一些問題須要瞭解,定義它處理哪些URL以及如何處理這些URL上的資源的HTTP請求。 在較低層次上,配置定義了一組控制對特定域或IP地址的請求的處理的虛擬服務器。nginx
用於HTTP流量的每一個虛擬服務器定義了稱爲位置的特殊配置實例,它們控制特定URI集合的處理。 每一個位置定義了本身的映射到此位置的請求發生的狀況。 NGINX能夠徹底控制這個過程。 每一個位置均可以代理請求或返回一個文件。 此外,能夠修改URI,以便將請求重定向到另外一個位置或虛擬服務器。 此外,能夠返回特定的錯誤代碼,也能夠配置特定的頁面以對應於每一個錯誤代碼。正則表達式
NGINX配置文件必須至少包含一個服務器指令來定義虛擬服務器。 當NGINX處理請求時,它首先選擇提供請求的虛擬服務器。
虛擬服務器由http
上下文中的服務器指令定義,例如:後端
http { server { # Server configuration } }
能夠將多個server
指令添加到http
上下文中以定義多個虛擬服務器。server
配置塊一般包括一個listen
指令,用於指定服務器偵聽請求的IP地址和端口(或Unix域套接字和路徑)。IPv4和IPv6地址均被接受; 將方括號(。
下面的示例顯示了監聽IP地址127.0.0.1
和端口8080
的服務器的配置:瀏覽器
server { listen 127.0.0.1:8080; # The rest of server configuration }
若是省略端口,則使用標準端口。 一樣地,若是省略一個地址,服務器將偵聽全部地址。 若是沒有包含listen指令,則「標準」端口爲80/tcp
,「default」端口爲8000/tcp
,具體取決於超級用戶權限。服務器
若是有多個服務器與請求的IP地址和端口相匹配,則NGINX將根據服務器塊中的server_name
指令測試請求的主機頭域。 server_name
的參數能夠是完整(精確)名稱,通配符或正則表達式。 通配符是一個字符串,其開頭,結尾或二者都包含星號(*
); 星號匹配任何字符序列。 NGINX將Perl語法用於正則表達式; 在它們以前使用波浪號(〜
)。 此示例說明了一個確切的名稱。tcp
server { listen 80; server_name example.org www.example.org; ... }
若是匹配主機頭幾個名稱,則NGINX經過按如下順序搜索名稱並使用其找到的第一個匹配來選擇一個:測試
*.example.org
mail.*
若是主機頭字段與服務器名稱不匹配,則NGINX會將請求路由到請求到達端口的默認服務器。 默認服務器是nginx.conf
文件中列出的第一個服務器,除非您將listen_server
參數包含在listen
指令中以明確指定服務器爲默認值。fetch
server { listen 80 default_server; ... }
一個完整的Nginx虛擬機配置示例,這裏咱們演示配置兩個虛擬機,對應域名分別爲:vhost1.com
和 vhost2.com
,vhost1.com
網站的主目錄在/data/www/vhost1
,vhost2.com
網站的主目錄在/data/www/vhost2
:網站
server { listen 80; server_name vhost1.com www.vhost1.com; index index.html index.html; root /data/www/vhost1; access_log /var/log/vhost1.com.log; } server { listen 80; server_name vhost2.com www.vhost2.com; index index.html index.html; root /data/www/vhost2; access_log /var/log/vhost2.com.log; }
NGINX能夠根據請求URI向不一樣的代理髮送流量或提供不一樣的文件。 這些塊是使用放置在server
指令中的location
指令來定義的。
例如,您能夠定義三個location
塊,以指示虛擬服務器向一個代理服務器發送一些請求,將其餘請求發送到不一樣的代理服務器,並經過從本地文件系統傳遞文件來提供其他請求。
NGINX測試根據全部location
指令的參數請求URI,並應用匹配location
中定義的指令。 在每一個location
塊內,一般可能(除了一些例外)放置更多的location
指令以進一步細化特定組請求的處理。
注意:在本教程文章中,單詞
location
是指單個location
上下文。
location
指令有兩種類型的參數:前綴字符串(路徑名)和正則表達式。 對於要匹配前綴字符串的請求URI,必須之前綴字符串開頭。
具備pathname
參數的如下示例位置匹配以/some/path/
開頭的請求URI,例如/some/path/document.html
,它不匹配/my-site/some/path
,由於/some/path
不在該URI的開頭出現。
location /some/path/ { ... }
正則表達式以前是區分大小寫匹配的波形符號(~
),或者不區分大小寫匹配的波形符號(~*
)。 如下示例將包含字符串.html
或.html
的URI與任何位置相匹配。
location ~ \.html? { ... }
要找到最符合URI的位置,NGINX首先將URI與前綴字符串的位置進行比較。而後用正則表達式搜索位置。
除非使用^~
修飾符對正則表達式給予更高的優先級。在前綴字符串中,NGINX選擇最具體的字符串(也就是最長和最完整的字符串)。 下面給出了選擇處理請求的位置的確切邏輯:
=
(等號)修飾符定義了URI和前綴字符串徹底匹配。若是找到徹底匹配,則搜索中止。^~
(插入符號)修飾符預先添加最長匹配前綴字符串,則不會檢查正則表達式。=
修飾符的典型用例是/
(正斜槓)的請求。 若是請求/
是頻繁的,則指定=/
做爲location
指令的參數加速處理,由於搜索匹配在第一次比較以後中止。
location = / { ... }
location
上下文能夠包含定義如何解析請求的指令 - 提供靜態文件或將請求傳遞給代理的服務器。 在如下示例中,匹配第一個location
上下文的請求將從/data/images
目錄中提供文件,並將匹配第二個位置的請求傳遞給承載 www.example.com
域內容的代理服務器。
server { location /images/ { root /data; } location / { proxy_pass http://www.example.com; } }
root
指令指定要在其中搜索要提供的靜態文件的文件系統路徑。 與該位置相關聯的請求URI將附加到路徑,以獲取要提供的靜態文件的全名。 在上面的示例中,要響應/images/logo.png
的請求,NGINX提供服務器本地實際對應文件是:/data/images/logo.png
。
proxy_pass
指令將請求傳遞給使用配置的URL訪問代理服務器。而後將代理服務器的響應傳回客戶端。在上面的示例中,全部不以/images/
開頭的URI的請求都將被傳遞給代理的服務器(也就是:www.example.com
)。
可使用配置文件中的變量,使NGINX進程的請求根據定義的狀況而有所不一樣。 變量是在運行時計算的命名值,用做指令的參數。 一個變量由它的名字開頭的$
(美圓)符號表示。 變量根據NGINX的狀態定義信息,例如正在處理的請求的屬性。
有許多預約義的變量,如核心HTTP變量,您可使用set
,map
和geo
指令定義自定義變量。 大多數變量在運行時計算的,幷包含與特定請求相關的信息。 例如,$remote_addr
包含客戶端IP地址,$uri
保存當前的URI值。
一些網站URI須要當即返回具備特定錯誤或重定向代碼的響應,例如當頁面被暫時移動或永久移動時。 最簡單的方法是使用return
指令。 例如返回未找到的404
狀態碼:
location /wrong/url { return 404; }
返回的第一個參數是響應代碼。可選的第二個參數能夠是重定向的URL(代碼301
,302
,303
和307
)或在響應體中返回文本。 例如:
location /permanently/moved/url { return 301 http://www.example.com/moved/here; }
返回指令能夠包含在 location
和 server
上下文中。
能夠經過使用rewrite
指令在請求處理期間屢次修改請求URI,該指令具備一個可選參數和兩個必需參數。 第一個(必需)參數是請求URI必須匹配的正則表達式。 第二個參數是用於替換匹配URI的URI。 可選的第三個參數是能夠中止進一步重寫指令的處理或發送重定向(代碼301
或302
)的標誌。例如:
location /users/ { rewrite ^/users/(.*)$ /show?user=$1 break; }
如該示例所示,用戶經過匹配正則表達式捕獲第二個參數。
您能夠在location
和 server
上下文中包含多個rewrite
指令。 NGINX按照它們發生的順序逐個執行指令。 當選擇該上下文時,server
上下文中的rewrite
指令將被執行一次。
在NGINX處理一組rewrite
指令以後,它根據新的URI選擇一個location
上下文。 若是所選location
塊包含rewrite
指令,則依次執行它們。 若是URI與其中任何一個匹配,則在處理全部定義的rewrite
指令以後,將搜索新location
塊。
如下示例顯示了與返回指令相結合的rewrite
指令。
server { ... rewrite ^(/download/.*)/media/(.*)\..*$ $1/mp3/$2.mp3 last; rewrite ^(/download/.*)/audio/(.*)\..*$ $1/mp3/$2.ra last; return 403; ... }
此示例配置區分兩組URI。 諸如/download/some/media/file
之類的URI更改成/download/some/mp3/file.mp3
。因爲最後一個標誌,因此跳事後續指令(第二次rewrite
和return
指令),但NGINX繼續處理該請求,該請求如今具備不一樣的URI。相似地,諸如/download/some/audio/file
的URI被替換爲/download/some/mp3/file.ra
。 若是URI與rewrite
指令不匹配,則NGINX將403
錯誤代碼返回給客戶端。
有兩個中斷處理重寫指令的參數:
last
- 中止執行當前服務器或位置上下文中的重寫指令,可是NGINX會搜索與重寫的URI匹配的位置,而且應用新位置中的任何重寫指令(URI能夠再次更改,往下繼續匹配)。break
- 像break
指令同樣,在當前上下文中中止處理重寫指令,並取消搜索與新URI匹配的位置。新位置(location
)塊中的rewrite
指令不執行。有時您須要重寫或更改HTTP響應中的內容,將一個字符串替換爲另外一個字符串。 您可使用sub_filter
指令來定義要應用的重寫。 該指令支持變量和替代鏈,使更復雜的更改爲爲可能。
例如,您能夠更改引用除代理服務器以外的絕對連接:
location / { sub_filter /blog/ /blog-staging/; sub_filter_once off; }
另外一個示例將方法從http://
更改成http://
,並從請求頭域替換本地主機地址到主機名。 sub_filter_once
指令告訴NGINX在一個位置(location
)內連續應用sub_filter
僞指令:
location / { sub_filter 'href="http://127.0.0.1:8080/' 'href="http://$host/'; sub_filter 'img src="http://127.0.0.1:8080/' 'img src="http://$host/'; sub_filter_once on; }
請注意,若是發生另外一個sub_filter
匹配,則使用sub_filter
修改的響應部分將再也不被替換。
使用error_page
指令,您能夠配置NGINX返回自定義頁面以及錯誤代碼,替換響應中的其餘錯誤代碼,或將瀏覽器重定向到其餘URI。 在如下示例中,error_page
指令指定要返回404
頁面錯誤代碼的頁面(/404.html
)。
error_page 404 /404.html;
請注意,此僞指令並不當即返回該錯誤(返回指令執行該操做),而僅僅是指定發生時如何處理錯誤。 錯誤代碼能夠來自代理服務器,或者在NGINX處理期間發生(例如,當NGINX找不到客戶端請求的文件時,顯示404
對應的結果)。
在如下示例中,當NGINX找不到頁面時,它會將代碼301
替換爲代碼404
,並將客戶端重定向到http:/example.com/new/path.html
。 當客戶端仍嘗試訪問其舊URI的頁面時,此配置很是有用。 301
代碼通知瀏覽器頁面已經永久移動,而且須要在返回時自動替換舊地址。
location /old/path.html { error_page 404 =301 http:/example.com/new/path.html; }
如下配置是在未找到文件時將請求傳遞給後端的示例。 由於在error_page
指令的等號以後沒有指定狀態代碼,因此對客戶機的響應具備代理服務器返回的狀態代碼(不必定是404
)。
server { ... location /images/ { # Set the root directory to search for the file root /data/www; # Disable logging of errors related to file existence open_file_cache_errors off; # Make an internal redirect if the file is not found error_page 404 = /fetch$uri; } location /fetch/ { proxy_pass http://backend/; } }
當沒有找到文件時,error_page
指令指示NGINX進行內部重定向。 error_page
指令的最終參數中的$uri
變量保存當前請求的URI,該URI在重定向中被傳遞。
例如,若是沒有找到/images/some/file
,它將被替換爲/fetch/images/some/file
,而且新的搜索位置(location
)開始。最後請求最終在第二個location
上下文中,並被代理到http://backend/
。
若是沒有找到文件,則open_file_cache_errors指令可防止寫入錯誤消息。 由於丟失的文件可被正確地處理,但這不是必需的。