編譯自:
http://nginx.org/en/docs/beginners_guide.htmlhtml
目錄:
nginx 啓動、中止、從新加載配置
nginx 配置文件的結構
nginx 提供靜態內容的服務
將 nginx 配置爲簡單的代理服務器
nginx 設置 FastCGI 代理,鏈接 FastCGI 應用nginx
本文會簡單介紹 nginx 並演示相關的簡單任務。首先你須要安裝好 nginx。web
nginx 擁有一個主進程和幾個 worker 進程。主進程的主要工做是讀取和處理配置,維護 worker 進程。worker 進程負責處理實際的用戶請求。nginx 採用 event-based 模型和 OS-dependent 機制對用戶請求進行高效的分發。worker 進程的數量在配置文件中定義,可在配置中修改,或者根據可用的 CPU 核心數進行自動調整。正則表達式
參考 http://nginx.org/en/docs/ngx_core_module.html#worker_processes
Syntax: worker_processes number | auto;
Default: worker_processes 1;
Context: main
Defines the number of worker processes.編程
worker 進程的最佳個數受許多因素影響,好比 CPU 核心數,磁盤驅動的個數,nginx 負載模式等。若是不肯定設爲多少合適,可設置爲 CPU 核心數。若是設置爲 auto,nginx 會嘗試自動檢測CPU核心數並設置爲 worker 進程數。(auto 參數從 1.3.8 和 1.2.5 版開始支持)後端
nginx 及其模塊的工做由配置文件定義,默認的配置文件爲 nginx.conf,該配置文件可能位於:
/usr/local/nginx/conf, /etc/nginx, or /usr/local/etc/nginx.瀏覽器
執行 nginx 命令啓動 nginx。啓動 nginx 以後,可以使用以下命令:
bash
nginx -s stop 快速關閉 nginx nginx -s quit 優雅的關閉 nginx nginx -s reload 從新加載配置 nginx -s reopen 從新打開日誌文件
優雅地關閉 nginx,這是說 nginx 主進程會等待 worker 進程完成當前用戶請求的處理。
執行:nginx -s quit (以啓動 nginx 時的用戶身份執行該命令)服務器
更改配置以後,必須執行從新加載配置的命令,或者從新啓動 nginx,以使得配置生效:併發
nginx -s reload
當主進程接收到 reload 信號,它會檢查配置文件的語法,而後嘗試應用該配置。若是成功,主進程啓動新的 worker 進程,併發送消息給原來的 worker 進程要求他們關閉。若是加載配置失敗,主進程會對改動進行回滾,繼續以原來的配置進行工做。當原來的 worker 進程接收到消息要他們關閉,他們會中止接收新的鏈接,並繼續處理當前的請求直到完成。完成以後,原來的 worker 進程將會退出。
給 nginx 發送信號,可藉助於 kill 命令。kill 命令使用進程 pid 發送信號。nginx 主進程的 pid 存儲在pid 文件中,默認爲 nginx.pid,位於 /usr/local/nginx/logs 或 /var/run 目錄下。
例如,若是 nginx 主進程 pid 爲 1628,使用 kill 命令發送 QUIT 信號給 nginx,使其優雅地關閉:
kill -s QUIT 1628
若是要獲取全部運行中的 nginx 進程的列表,使用 ps 命令:
ps -ax | grep nginx
關於發送信號給 nginx 的更多信息,請參考:http://nginx.org/en/docs/control.html
nginx 由許多模塊組成,這些模塊可在配置文件中進行配置。nginx 的配置指令分爲:簡單配置指令,區塊配置指令。
簡單配置指令由 「名稱」 和 「參數」 組成, 「名稱」 和 「參數」 以空格分隔,指令的最後以分號 「;」 爲結尾。
區塊配置指令和簡單配置指令擁有一樣的結構,區塊指令不以分號結尾。區塊指令使用花括號 「{}」 將一組設置包含於其中。若是在區塊指令的括號中包含其餘指令,這個區塊指令就被稱爲 「context」 (上下文)。例如 events,http,server,location 指令。
全部在 context 以外的指令,被認爲處於 main context 之中。
events 和 http 指令用於 main context 之中。
server 指令用於 http 之中。
location 指令用於 server 指令之中。
配置文件中以 # 起始的行爲註釋行。
web 服務器的重要任務之一是提供文件服務(好比 image 文件、靜態 HTML 頁面等)。
咱們將實現一個示例,根據請求的不一樣,nginx 經過不一樣的目錄提供文件給用戶。咱們經過
/data/www 目錄提供 HTML 文件,經過 /data/images 目錄提供 image 文件。
爲達到這個目標,須要在配置文件中設置 server 區塊,並在 server 區塊中設置兩個 location 區塊。server 區塊位於 http 區塊之中。首先,建立 /data/www 目錄,並在其中建立 index.html 文件,文件內容任意,好比:
echo "<h1>HTML File</h1>" > /data/www/index.html
而後建立 /data/images 目錄,放一些圖像文件到該目錄中。以後打開配置文件。默認的配置文件已經包含一些 server 區塊的示例,大多數被註釋了。
如今將全部 server 區塊註釋掉,而後建立一個新的 server 區塊:
http { server { } }
通常來講,配置文件可能包含幾個 server 區塊,它們擁有不一樣的監聽端口和 server name。
一旦 nginx 決定好使用哪個 server 處理用戶請求,nginx 測試請求首部的 URI 字段,
將它與 server 區塊中的 location 指令定義的參數進行對比。
在 server 區塊中添加以下 location 區塊:
location / { root /data/www; }
這個 location 區塊指定 「/」 前綴,並將它和請求首部中的 URI 進行比較。對於匹配的請求,
URI 將被添加到 root 指令所指定的路徑的末尾,這裏 root 指令定義的路徑是 /data/www,
這樣造成用戶所請求的文件的本地路徑。若是有多個 location 區塊與請求的 URI 匹配,nginx
選擇其中前綴最長的那個 location 區塊。
這裏的 location 提供了最短的前綴,長度爲 1,因此只有當全部其餘 location 區塊都匹配失敗,
纔會選擇這個 location 區塊。
下一步,添加第二個 location 區塊:
location /images/ { root /data; }
這個 location 區塊可以匹配 URI 以 /images/ 起始的請求 (location / 也能匹配這樣的請求,但它的
前綴比 /images/ 短,因此優先匹配 location /images/)
咱們的 server 區塊的配置是這樣的:
server { location / { root /data/www; } location /images/ { root /data; } }
這已是一個可工做的服務配置,nginx 監聽於 80 端口,可經過本地訪問 http://localhost/ 。
對於 URI 以 /images/ 起始的請求,nginx 會將 /data/images 目錄中的文件發送給客戶端。
例如,對於訪問請求:http://localhost/images/example.png,nginx 會發送 /data/images/example.png 文件。若是這個文件不存在,nginx 會發送 404 error 響應給客戶端。
對於 URI 不是以 /images/ 起始的請求,會被映射到 /data/www 目錄。
例如,對於訪問請求:http://localhost/some/example.html,nginx 會發送 /data/www/some/example.html 文件。
修改了配置文件以後,爲使新配置生效,可重啓 nginx ,或者使用 nginx 命令發送 reload 信號給 nginx 主進程:
nginx -s reload
Note:
當出現了錯誤,請查看 access.log 和 error.log 文件尋找可能的緣由。
這兩個文件的位置若是是 yum 安裝,在 /var/log/nginx 目錄下,若是是編譯安裝,
默認在 prefix/logs/ 目錄下。
nginx 常常被用來設置成一個代理服務器,這時 nginx 接收請求,而後將請求轉發給被代理的後端服務器,並從後端服務器取回響應報文,而後發送給客戶端。
咱們將配置一個基礎的代理服務器,服務器對於 image 文件的請求選擇從本地響應,對於其餘請求,服務器轉發給一個後端服務器。在這個示例中,這兩個服務器將被定義在同一個 nginx 實例之上。首先定義後端服務器,添加一個 server 區塊定義:
server { listen 8080; root /data/up1; location / { } }
這個服務器監聽在 8080 端口(在前一小節的配置中,咱們並無指定 listen 指令,nginx 默認使用 80 端口),並將全部請求映射到本地的 /data/up1 目錄中。建立 /data/up1 目錄,並在其中建立一個 index.html 文件。注意 root 指令被放置於 server context 中,這樣只有當一個沒有包含本身的 root 指令的 location 區塊被選中時,這個 server 區塊中的 root 指令纔會被使用。
[root@lamp1 nginx]# mkdir /data/up1 [root@lamp1 nginx]# echo "<h1>backend server</h1>" > /data/up1/index.html
下一步,沿用前一小節的配置,將其修改成一個代理服務器的配置。在第一個 locaiton 區塊中加入 proxy_pass 指令,指定後端服務器的:協議、主機名、端口(本例中,指定爲 http://localhost:8080):
server { location / { proxy_pass http://localhost:8080/; } location /images/ { root /data; } }
咱們將修改第二個 location 區塊,目前這個 location 區塊將 URI 以 /images/ 起始的請求映射到
/data/images 目錄。將其修改成可以匹配對於典型圖像文件的請求,這些圖像文件有典型的後綴名:
location ~ \.(gif|jpg|png)$ { root /data/images; }
在 「location ~ \.(gif|jpg|png)$」 語句中, ~ EXPRESSION 表示使用正則表達式匹配,
正則表達式爲:\.(gif|jpg|png)$。
這個正則表達式可以匹配全部以 .gif, .jpg, .png 結尾的 URI。匹配的請求將被映射到 /data/images 目錄中。
當 nginx 選擇以哪一個 location 區塊匹配請求時,nginx 首先檢查指定了 prefix 前綴的 location 指令,nginx 會記住被匹配的擁有最長 prefix 的 location 指令,而後開始檢查正則表達式。
若是有一個正則表達式被匹配了,nginx 會選擇這個正則表達式的 location,若是沒有正則表達式被匹配,它選擇以前記下的那個擁有最長前綴的 location。
最終咱們的配置文件是這樣的:
server { location / { proxy_pass http://localhost:8080/; } location ~ \.(gif|jpg|png)$ { root /data/images; } }
nginx 服務器會過濾以 .gif, .jpg, .png 爲結尾的 URI 的請求,將它們映射到 /data/images 目錄中(將 URI 添加到 root 指令的參數後面),並將其餘請求轉發給後端服務器。
使新的配置生效,執行 nginx -s reload。
在另外一個 Linux 虛擬機中測試訪問:
[root@vm1 nginx]# curl http://192.168.0.171 <h1>backend server</h1>
在瀏覽器中訪問:
http://192.168.0.171/p1035007771.jpg
關於配置代理鏈接,更深刻的探討可參考:
http://nginx.org/en/docs/http/ngx_http_proxy_module.html
nginx 可用於將請求路由到 FastCGI 服務器,在 FastCGI 服務器上運行着以各類框架和編程語言構建的應用,好比 PHP。
配置 nginx 與 FastCGI 服務器協同工做,最基礎的配置包括:使用 fastcgi_pass 指令替代 proxy_pass指令,並使用 fastcgi_param 指令設置傳遞給 FastCGI 服務器的參數。
假設 FastCGI 服務器可經過 localhost:9000 訪問,咱們之前面的配置爲基礎,首先將 proxy_pass 指令替換爲 fastcgi_pass 指令,指令參數修改成 localhost:9000。在 PHP 中,SCRIPT_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; } }
經過這個配置,對於靜態圖形文件的請求由本地服務響應,除此以外的請求將經過 FastCGI 協議 被路由到工做於 localhost:9000 的服務器上。