Nginx API 學習之一:初學者指南
初學者指南
[nginx documentation][http://nginx.org/en/docs/]
目錄1. 啟動、停止和重啟配置
通過執行可執行檔案啟動 nginx,一旦 nginx 已經啟動,可以通過呼叫可執行的帶 -s 引數進行控制,使用下面語法:
nginx -s signal
signal 可以使以下中的一個:
- stop:快速停止
- quit:溫和停止
- reload:過載配置檔案
- reopen:重啟日誌檔案
例如,若是等待工作程序完成當前請求的服務,再停止 nginx 程序,執行下面命令:
nginx -s quit
此命令執行前提是,同一個使用者啟動的 nginx 程序
修改配置檔案,使其生效,需要傳送過載配置訊號到 nginx,或是重啟 nginx 程序。過載配置檔案,執行:
nginx -s reload
一旦主程序收到過載配置訊號,會執行檢查新配置檔案語法的有效性,嘗試運用新檔案中的配置。如果成功,主程序啟動新的工作程序,併發送關閉訊息給舊的工作程序。否則,主程序回滾繼續使用舊的配置工作。舊的工作程序,接收到關閉命令後,停止接受新連線,並繼續服務當前請求直至服務完成,之後,舊的工作程序退出。
nginx 程序也會接收Unix工具發出的類似 kill 的訊號。這種情況下,訊號直接傳送到指定程序ID的程序,nginx主程序的程序ID預設寫入 /usr/local/nginx/logs
kill -s QUIT 1628
使用 ps 命令檢視所有在執行 nginx 程序,例如下面方式:
ps -ax | grep nginx
關於nginx訊號傳送的更多資訊,請檢視Controlling nginx。
2. 配置檔案結構
nginx多個模組組成,這些模組由配置檔案中的具體指令控制。指令分為簡單指令和塊指令。一個簡單指令由名稱和引數組成,以空格區分並以英文分號(;)結尾。塊指令結構與簡單指令相同,但是不以英文分號結尾,塊指令由英文大括號包圍({和})。塊指令大括號內包含的其它指令,稱為內容(例如
配置檔案中的指令,無論哪個上下文外層都應該在對應的 main中,events 和 http 在 main 內,server 在 http 內,location 在 server 內。
# 開始的內容表示該行為註釋內容。
3. Serving靜態內容
web伺服器的一個重要任務是檔案服務(例如檔案或者靜態 HTML 網頁)。根據需求實現一個例子,檔案來源於本地不同目錄:/data/www(包含 HTML 檔案),/data/images(包含圖片檔案)。這將需要編輯配置檔案,在 http 塊內增加一個 server 塊,裡面包含2個 location 塊。
首先,建立目錄 /data/www,新增 index.html 檔案到該目錄,檔案中寫入一些內容。建立目錄 /data/images,存入一些圖片檔案。
其次,開啟配置檔案,配置檔案 server 塊中預設包含一些樣例,大部分是註釋掉的。現在註釋掉所有例子,重新開始編寫 server 塊。
http {
server {
}
}
通常來說,配置檔案中可能包括幾個 server 塊,通過監聽埠號和服務名稱來區分。一旦 Nginx 需要確定用哪一個 server 處理請求,通過匹配請求頭部資訊中 URI 資料與配置檔案 server 塊定義的 location 指令。
將下面的 location 塊新增到 server 塊:
location / {
root /data/www;
}
上面 location 塊指定 “/” 與請求中的 URI 進行比較。為了匹配請求資料,請求路徑中需要加入 root 指令中定義的 URI 資訊,即 /data/www ,來組成請求的檔案在本地檔案系統的目錄。如果有多個匹配的 location 塊,Nginx 選擇字首最長的一個,上面的 location 提供了字首最短的一個,相對對於字首長的一個,所以,僅當其它的 location 都不匹配的時候,才使用最短的這個。
再次,新增第二個 location 塊:
location /images/ {
root /data;
}
這個會匹配以 /images/ 開頭的請求(location / 也匹配這個請求,但是字首更短)。
最終的 server 塊如下所示:
server {
location / {
root /data/www;
}
location /images/ {
root /data;
}
}
這已經是一個伺服器有效的配置,監聽標準埠80,本地裝置通過 http://localhost/ 訪問。對於以 /images/ 開頭 URI 請求的響應,伺服器將傳送 /data/images 目錄的檔案。例如,對於 http://localhost/images/example.png 請求,Nginx會發送 /data/images/example.png 檔案,如果檔案不存在,Nginx傳送響應指令為404的錯誤。對於非以 /images/ 開頭的響應,Nginx 會匹配到 /data/www 目錄,例如,對於 http://localhost/some/example.html 請求,將傳送 /data/www/some/example.html 檔案。
使修改配置檔案生效,若是 Nginx 服務沒有啟動,則啟動服務,否則傳送 reload 訊號到 nginx 主程序,通過執行以下命令:
nginx -s reload
如果有些內容未達到期望效果,可以試著從日誌檔案 access.log 或 error.log 中查詢原因,檔案在目錄 /usr/local/nginx/logs 或 /var/log/nginx 中。
4. 建立一個簡單代理服務
nginx長作為一個代理伺服器使用,作為一個伺服器接收請求、轉至被代理的伺服器、從被代理伺服器返回響應併發送給客戶端。
我們來配置一個基本的代理伺服器,服務圖片請求,檔案來自本地目錄,其它請求傳送到一個代理伺服器。在這個例子中,伺服器和代理伺服器定義在一個 nginx 例項上。
首先,定義代理伺服器,通過在配置檔案中增加一個 server 塊,如下所示:
server {
listen 8080;
root /data/up1;
location / {
}
}
這是一個簡單的伺服器監聽8080埠(之前,自80端口占用之後,listen 指令還未被指定),並把所有請求匹配到 本地檔案系統的 /data/up1 目錄。建立這個目錄並放入 index.html 檔案。注意,root 指令放在 server 內,這個 root 指令在 請求匹配的location 塊中沒有 root 時使用。
其次,使用前面部分 server 配置,把它調整為一個代理伺服器。在一個 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;
}
引數是正則表示式來匹配所有以 .gif, .jpg 或 .png 結尾的URI,正則表示式以 ~ 開始。符合規則的請求將匹配到 /data/images 目錄。
nginx選擇 location 來匹配請求時,首先檢查 location 指令具體字首(記得是字首最長那一個),然後檢查正則表示式。如果正則表示式匹配,則選擇這個,否則,選擇最長字首那個。
代理伺服器最終配置如下所示:
server {
location / {
proxy_pass http://localhost:8080/;
}
location ~ \.(gif|jpg|png)$ {
root /data/images;
}
}
此伺服器將過濾以 .gif, .jpg, 或 .png 結尾的請求,並匹配請求到 /data/images 目錄(通過增加 URI 到 root 引數),將其它所有請求轉至上面配置的代理伺服器。
使新配置生效,傳送 reload 訊號給 nginx,見上文。
配置代理伺服器更多指令見more 。
5. 建立 FastCGI 代理
nginx可以用於把請求路徑轉至 FastCGI 伺服器,提供不同框架的應用的執行和不同語言的程式設計(如 PHP)。
FastCGI 伺服器最基本配置包括使用 fastcgi_pass 指令代替 proxy_pass,fastcgi_param 指令設定引數傳輸至
FastCGI 服務。假設可以通過 localhost:9000 訪問 FastCGI 伺服器。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 將除了靜態圖片之外的所有請求傳輸至代理伺服器。