本文翻譯自nginx官方網站:http://nginx.org/en/docs/beginners_guide.html#controlhtml
該指南會對nginx作一個簡要的介紹,同時描述一些使用nginx完成的簡單任務。該指南假設讀者的機器上已經安裝好了nginx。若是沒有安裝好,請轉移到Installing nginx頁面完成安裝。該指南描述瞭如何啓動和中止nginx,如何從新載入nginx的配置,解釋了配置文件的構成以及如何使用nginx來分發靜態資源、如何配置nginx來做爲一個代理服務器、以及如何使用FastCGI來鏈接到nginx。nginx
nginx有一個主進程和幾個工做者進程。主進程的主要工做是讀取和評估配置文件中的值,同時維護工做者進程。工做者進程處理實際的請求。nginx使用基於事件的模型和依賴於操做系統的機制來有效地在工做進程之間分發請求。工做進程的數量在配置文件中定義,能夠針對給定的配置進行固定,也能夠根據可用CPU內核的數量自動調整(參見worker_processes)。git
nginx及其模塊的工做方式在配置文件中肯定。默認狀況下,配置文件名爲nginx.conf,並放置在/usr/local/nginx/conf、/etc/nginx或/usr/local/etc/nginx.目錄中。web
要啓動nginx,運行nginx的可執行文件。一旦nginx啓動後,就能夠經過調用 -s的命令行參數來配置它。使用一下語法:正則表達式
nginx -s signal
signal能夠是一下列出的一個:數組
stop
—快速關閉quit
— 優雅的關閉reload
— 從新載入配置文件reopen
—從新打開日誌文件例如,要中止nginx進程,等待worker進程完成服務當前請求,能夠執行如下命令:服務器
nginx -s quit
註釋:這個命令應該在啓動nginx的同一用戶下執行。併發
在將從新加載配置的命令發送到nginx或從新啓動配置以前,不會應用配置文件中所作的更改。要從新加載配置,請執行:ide
nginx -s reload
一旦主進程接收到從新載入配置文件的信號,它首先檢查配置文件中的語法是否有效,而後嘗試應用配置文件中提供的配置。若是成功,那麼他會建立新的工做者進程,併發送消息到舊的工做者進程中來通知舊的工做者進程關閉。不然,主線程回滾配置並使用舊的配置。同時舊的工做者進程接收到關閉請求,中止接收鏈接並處理當前請求知道完成當前請求後,舊的工做者進行會關閉並退出。工具
在一些工具/命令的幫助下也能夠想nginx發送信號,好比kill。在本例中,一個信號被直接發送到具備給定進程ID的進程。默認狀況下,nginx主進程的進程ID被寫入nginx.pid,它位於/usr/local/nginx/logs或/var/run目錄中。例如,若是主進程ID是1628,要發送退出信號致使nginx優雅地關閉(quit命令),執行:
kill -s QUIT 1628
要得到全部運行nginx進程的列表,可使用ps工具,例如:
ps -ax | grep nginx
關於發送信號到nginx的更多信息,請參閱:Controlling nginx.
nginx是由模塊組成的,而模塊有配置文件中的指令控制。指令分爲簡單指令和塊指令。一個簡單的指令由名稱和參數組成,它們由空格分隔,並以分號(;)結束。塊指令具備與簡單指令相同的結構,但它的結尾不是分號,而是一組由大括號({和})包圍的附加指令。若是一個塊指令能夠在大括號中包含其餘指令,那麼它被稱爲上下文(例如:events, http, server, and location)
放在任何上下文以外的配置文件中的指令被認爲是在主上下文中。events和http指令駐留在主上下文中,server駐留在http中,location駐留在server中。
在#
號後面的會被看成註釋。
個重要的web服務器任務是提供文件(例如圖像或靜態HTML頁面)。接下來你將實現一個示例,根據請求,文件將從不一樣的本地目錄提供:/data/www(可能包含HTML文件)和/data/images(包含圖像)。這將須要編輯配置文件,並在帶有兩個location塊的http塊中設置server塊。
首先,建立一個 /data/www目錄並在裏面放一個包含任意內容的index.html文件,而後建立一個/data/images目錄並在裏面放置一些圖片。
接下來,打開配置文件。默認配置文件已經包含了server塊的幾個例子,大部分都被註釋掉了。如今註釋掉全部這樣的塊,並開始一個新的server塊:
http {
server {
}
}
一般,配置文件可能包含幾個server塊,這些服務器塊由它們偵聽的端口和服務器名稱來區分(參見這裏: distinguished )。一旦nginx決定哪一個server處理請求,它就根據server塊中定義的location指令的參數測試請求頭中指定的URI。
將如下location塊添加到server塊:
location / { root /data/www; }
此location塊制定了「/」前綴與來自請求的URI進行比較。爲了匹配請求,URI將被添加到根指令中指定的路徑,即/data/www,以造成本地文件系統上被請求文件的路徑。若是有多個匹配的location塊,nginx選擇前綴最長的一個。上面的location塊提供了長度爲1的最短前綴,所以,只有當全部其餘location塊都不能提供匹配時,纔會使用這個塊。
下一步,添加另外一個location塊:
location /images/ { root /data; }
它將匹配以/images/開頭的請求(location /也匹配此類請求,但前綴更短)。
配置文件中的server塊最終看起來像是這個樣子:
server { location / { root /data/www; } location /images/ { root /data; } }
上面這個配置完成後,對於像http://localhost這樣的請求就能相應了。它默認監聽80端口。若是是以「/images/」開頭的請求,他會從/data/images這個本地文件夾中提供響應。舉個例子:爲了響應http://localhost/images/example.png這個請求,nginx會從/data/images/example.png提供響應。若是文件不存在,nginx會返回一個404的錯誤。沒有以/images/這個路徑開頭的請求會被映射到/data/www這個本地路徑上。舉個例子,若是請求是http://localhost/some/example.html,那麼nginx會發送/data/www/index.html這個文件過去。
爲了應用新的配置,須要給nginx的主進程發送reload信號,執行下面的代碼:
nginx -s reload
註釋:若是發生了其餘沒有預料到的狀況下,你能夠查看access.log和error.log來找出緣由,這兩個文件一般在/usr/local/nginx/logs目錄或/var/log/nginx目錄下。
nginx的一個常見用途是將其設置爲代理服務器,這意味着服務器接收請求,將請求傳遞給代理服務器,從代理服務器檢索響應,並將響應發送給客戶機。
咱們將配置一個基本代理服務器,它使用本地目錄中的文件來處理圖像請求,並將全部其餘請求發送到代理服務器。在本例中,這兩個服務器將在一個nginx實例上定義。
首先,經過在nginx的配置文件中添加一個包含如下內容的服務器塊來定義代理服務器:
server { listen 8080; root /data/up1; location / { } }
這將是一個簡單的server塊,它監聽端口8080(以前,因爲使用了標準端口80,默認,因此沒有指定listen指令),並將全部請求映射到本地文件系統上的/data/up1目錄。建立此目錄並將index.html文件放入其中。注意,根指令(root /data/up1)放在server上下文中。當爲服務請求而選擇的location塊不包含本身的根指令時,將使用這種根指令。
接下來,使用上一節中的服務器配置並修改它,使其成爲代理服務器配置。在第一個location塊中,將proxy_pass指令與參數中指定的協議、代理服務器的名稱和端口放在一塊兒(在咱們的例子中,是http://localhost:8080):
server { location / { proxy_pass http://localhost:8080; } location /images/ { root /data; } }
咱們將修改第二個location塊(仍是上一節中的配置中),它當前將帶有/images/前綴的請求映射到/data/images目錄下的文件,使其匹配具備典型文件擴展名的圖像請求。修改後的位置塊以下:
location ~ \.(gif|jpg|png)$ { root /data/images; }
這個參數是一個正則表達式,他匹配全部以.git,.jpg,.png結尾的url,正則表達式的前面應該加上~。相應的請求將映射到/data/images目錄。
當nginx選擇一個location塊來服務一個請求時,它首先檢查指定前綴的位置指令,記住(匹配的)前綴最長的位置,而後檢查正則表達式。若是與正則表達式匹配,nginx將選擇此位置,不然,它將選擇以前記住的位置。
代理服務的最終配置以下:
server { location / { proxy_pass http://localhost:8080/; } location ~ \.(gif|jpg|png)$ { root /data/images; } }
這個server塊將會過濾.gif
, .jpg
, 或者.png結尾的請求,
並將他們映射到/data/images的本地路徑下(經過將uri添加到root指令表示的本地路徑以後),並將全部其餘請求傳遞到上面配置的代理服務器。
要應用這個配置,和以往同樣須要發送reload請求到nginx的主進程中,這裏還有不少其餘關於代理連接的一些知識: more。