原文地址:Beginner`s Guide
參考文檔:Nginx原理
本文翻譯自上述地址(Nginx官網新手指引),我自己感覺到不能表達正確的地方使用了原文,可能還存在其他我沒有意識到的轉述錯誤,文章僅供參考。
入門手冊
這份手冊將給出關于 nginx 的一個基本指引,和一些基于這些指引可以完成的簡單應用。這份手冊將假設閱讀者現在已經安裝了 nginx。如果沒有,出門左轉。這份手冊將會描述 nginx 的啟動、停止、配置重載,解釋配置文件,同時怎么應用 nginx 作文件服務,怎么將nginx 配置成一個代理服務器,怎么通過 FastCGI Application 連接 nginx。
nginx 有一個主進程(master process)和若干個子進程(worker process)。主進程的作用是為了方便對配置文件進行管理,同時可以管理子進程。是子進程在真正的處理請求(nginx employs event-based model and os-dependent mechanisms to efficiently distribute requests among worker process,漏了翻譯這句),子進程的數量是在配置文件中定義的。
配置文件描述了 nginx 及其模塊的運行。一般情況下,配置文件叫做 nginx.conf,被放置在目錄 /usr/local/nginx/conf,/etc/nginx,或者 /usr/local/etc/nginx 下面。
執行、停止和重載配置
運行可執行的文件,就能開啟 nginx(to start nginx, run the executeable file)。一旦 nginx 被開啟,就可以通過調用 -s 參數來控制 nginx,像下面這個樣子
nginx -s signal
signal 可以為:
- stop —— 快速關閉
- quit —— 安全關閉
- reload —— 重載配置
- reopen —— 重載日志
比如,當一個子進程正在處理請求,而你想停止它,可以使用
nginx -s quit
該命令應該由開啟 nginx 的用戶下達。
只有當 nginx 收到重載的指令后(或者 nginx 被重啟),之前配置文件中的修改才會生效。重載配置,使用
nginx -s reload
一旦當主進程收到重載配置的指令,新配置文件中的語法合法性將會被檢查,新的配置也將被嘗試使用。如果成功,主進程將開啟新的子進程,并且給舊的子進程發送指令,關閉舊的子進程。如果新的配置失敗,主進程將會回滾,并且繼續使用舊的配置。舊的子進程會接收到指令,停止接收新的請求,在處理完當前請求后關閉。
在一些 unix 工具的幫助下,一些像 kill 這樣的指令也會被發送到 nginx。在這種情況下,指令通過進程 id 直接作用于 nginx 進程。默認情況下,nginx 的主進程 id 會被寫在 /usr/local/nginx/logs 或者 /var/run 目錄下的 nginx.pid 文件中。例如,假設主進程的 id 是 1628,使用 QUIT 命令可以進行安全的關閉
kill -s QUIT 1628
可以通過使用 ps 命令來查看正在運行的 nginx 進程,比如
ps -ax | grep nginx
獲取更多關于發送指令給 nginx 的信息,請查看 Controlling Nginx。
配置文件結構
nginx 由模塊組成,這些模塊通過配置文件中一些特定準則來進行控制。這些準則被劃分為單準則和準則塊。單準則由名字和參數組成,名字和參數之間通過空格進行區分,單準則以分號(;)結尾。準則塊和單準則具有相同的結構,但不同于分號,準則塊使用一堆花括號結尾({ })。如果一個準則塊內部包含了其他準則,這些準則被稱為 context(比:events,http,server 和 location)。
Directives placed in the configuration file outside of any contexts are considered to be in the main context...
以井號(#)開始的行是注釋。
文件服務(serving static content)
WEB服務器很重要的一個功能就是提供文件服務(圖片,靜態HTML頁面)。下面將提供一個實例,這個實例將會根據請求,從服務器的不同目錄提供文件。(/data/www,HTML目錄,/data/images,圖片目錄)。為了完成這個實例,將需要修改配置文件,并將一個包含兩個 location塊 的 server塊 放置到 http塊 中。
首先,創建 /data/www 目錄,將 index.html(隨便寫點東西) 放到里面,然后再創建 /data/images 目錄,并往目錄里面塞一些圖片。
接下來,打開配置文件。默認的配置文件已經包含了一些 server塊 的示例,大部分以注釋的形式呈現。現在去掉 server塊 的注釋,并添加如下一個 server塊:
http {
server {
? }
}
總的來說,配置文件中可以包含很多 server塊,這些 server塊 通過監聽端口和服務名(server name)進行區分。一旦 nginx 決定了使用哪個 server 處理請求,nginx 將會拿到請求頭中的 URI 與server塊 中的 location準則塊 進行參數比較。
在上面的 server塊 中添加下列 location塊。
location / {
? root /data/www;
}
這個 location塊 指定了當請求中的 URI 以 “/” 為前綴的時候的 nginx 處理規則。如果請求匹配了規則,URI 將會添加到 root規則 中聲明的路徑,也就是說會從/data/www
路徑獲取請求文件。如果 location塊 中有多個地方可以匹配請求的 URI,nginx 將選擇最長的那個。上面的 location塊 提供了最短的前綴,如果其他的 location塊 對URI的匹配都失敗了,這個最短的將會被使用。
接下來,添加第二個 location塊:
location /images/ {
? root /data/images;
}
這個規則將匹配以 /images/ 開始的請求(“/” 規則也可以匹配同樣請求,但 nginx 將選取最長的)。
最終的 server塊 將是下面這個樣子:
server {
? lcation / {
? root /data/www;
? }
? location /images/ {
? root /data/images;
? }
}
這就是一個在地址 http://localhost 監聽標準端口 80,可以生效的一個 server 配置。作為對以 /images/ 開頭請求 URI 的回應,服務器將會發送 /data/images 目錄的文件。比如,作為對 http://localhost/images/example.png 的回應,nginx 將會發送 /data/images/example.png 文件,如果不存在上述文件,nginx 將會發送一個 404。不以 /images/ 開頭的請求將會去匹配 /data/www 目錄。比如,作為對 http://localhost/some/exmaple.html 的回應,nginx 將發送 /data/www/some/example.html 文件。
想要讓新的配置生效,如果沒有開啟 nginx,那就開啟 nginx,或者再開啟了 nginx 的情況下使用 nginx -s reload
。
當結果并沒有像期待的那樣時,你可以去 /usr/local/nginx/logs 或者 /var/log/nginx 目錄中的 access.log 和 error.log 文件尋找原因。
簡單代理服務(setting up a simple proxy server)
ngixn 的一個廣泛用途是作為一個代理服務器,這意味著 nginx 作為一個獲取請求,轉發給被代理的服務器,從被代理的服務器獲取內容,然后轉發給客戶端的代理服務器。
接下來將配置一個基本的代理服務器,這個代理服務器將會從本地目錄獲取請求中的圖片,并將其他請求轉發給被代理的服務器。在這個例子中,兩個服務器都將是 nginx 服務器(both servers will be defined on a single nginx instance)。
首先,在被代理的服務器的配置中添加一個 server塊,內容如下:
server {
? listen 8080;
? root /data/up1;
? location / {
? }
}
這是一個監聽了 8080 端口的簡單服務器(如果標準 80 端口沒有被使用的話,這里是不用進行特別指定的),這個服務器將會去本地文件系統中的 /data/up1 目錄處理所有請求。創建 /data/up1 目錄,并放置 index.html。請注意 root 規則被放置到了 server 中。這種 root 規則將會在下面情況被使用,如果被匹配的 location塊 沒有自己的 root 規則。
接下來,使用之前的配置,并稍作修改就能使之成為一個代理服務器配置。在第一個 location塊 中,將被代理服務器的協議、名稱和端口號作為參數寫到 proxy_pass規則(這個例子中被代理的服務器時 http://localhost:8080):
server {
? location / {
? proxy_pass http://localhost:8080;
? }
? location /images/ {
? root /data/images;
? }
}
我們將修改當前從 /data/images/ 目錄匹配 /images/ 前綴第二個 location塊,使之可以匹配常見圖片后綴,像下面這樣:
location ~ \.(gif|jpg|png)$ {
? root /data/images;
}
這是一個用來匹配以 .gif,.jpg,.png 結尾的 URI 的常用表達。一個常用的表達應該使用 ~ 開頭。被匹配的請求將會到 /data/images 目錄。
當 nginx 選擇一個 location塊 來處理請求時,首先會檢查可以匹配請求 URI 的 location規則,記住最長的那個 location,然后才去匹配正則表達式的。如果有一個正則表達式匹配成功,nginx 將會選取這個 location,或者選取之前記住的那個。
最終的代理配置將會像下面這個樣子:
server{
? location / {
? proxy_pass http://localhost:8080/;
? }
? location ~ \.(gif|jpg|png)$ {
? root /data/images;
? }
}
這個服務器將匹配以 .gif,.jpg,.png 結尾的請求,并將其 map 到 /data/images 目錄(通過在 root規則 中添加參數),同時將其他所有請求轉發到上面配置中被代理的服務器。
關于代理服務器配置,有以下更多規則可供參考。
FastCGI 代理配置
ngixn 可以用來為很多建立在不同框架和語言(比如PHP)的 FastCGI 應用提供 route requests。(nginx can be used to route requests to FastCGI servers which run applications built with various frameworks and programming laguages such as PHP)。
nginx 作為一個 FastCGI 服務器時最基本的配置包括 fastcgi_pass規則。fastcgi_param規則 可以為 FastCGI 服務器配置參數。假設可以通過 localhost:900 訪問 FastCGI 服務。使用之前的段落作為一個基本的代理配置,使用 fastcgi_pass 規則替代 proxy_pass規則,并且將參數更改為 localhost:9000。在PHP中,參數 SCRITP_FILENAME 用來決定腳本名稱,QUERY_STRING 參數用來通過請求參數。最后的配置如下:
server {
? location / {
? fastcgi_pass localhost:9000;
? fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
? fastcgi_param QUERY_STRING $query_string
? }
? ? location ~ \.(gif|jpg|png)$ {
? root /data/images;
? }
}
This will set up a server that will route all requests except for requests for static images to the proxied server operating on localhost:9000 througn the FastCGI protocol.