點選上方關注 前端技術江湖,一起學習,天天進步
這份指南是對nginx的基本介紹,描述了使用者借助nginx可以實作的一些簡單任務。隻支援運作在已經安裝了nginx的讀者機器上;如果沒有安裝,請參考Installing nginx 頁面。
這份指南描述了怎樣啟動和停止nginx以及重新加載配置,說明了配置檔案的結構以及如何啟動nginx以輸出靜态内容,怎樣設定代理伺服器 和怎樣連接配接FastCGI應用。
nginx有一個主程序和幾個工作程序。主程序的主要目的是為了讀取和評估配置并且維護工作程序。工作程序處理實際請求。nginx在工作程序中采用事件驅動模型和OS依賴機制有效配置設定請求。工作程序的數量取決于配置檔案中定義的固定值或者是通過有效的CPU核數自動判定數量。工作程序的數量在配置檔案中定義,可據給定的配置對工作程序的數量進行固定,也可以根據可用CPU核心的數量進行自動調整。(參看 worker_processes).
nginx及其各子產品的工作方式取決于配置檔案。預設情況下,配置檔案名為nginx.conf,并放置在/usr/local/nginx/conf、/etc/nginx或/usr/local/etc/nginx.目錄中。
啟動, 停止, 和重新加載配置檔案
啟動的時候直接運作nginx.exe或者nginx。如果nginx已經啟動,就可以直接使用參數-s 來進行調用執行,具體的使用文法如下:
nginx -s signal
signal 的位置可以是如下參數:
- stop —指令一經發出,直接停止
- quit — 等待所有的請求完成,再停止
- reload — 重新加載配置檔案nginx.conf
- reopen —重新打開日志檔案
例如,想要停止nginx程序,(等待目前所有的請求程序全部完成),可以使用如下指令:
nginx -s quit
注:此指令應在啟動nginx的同一使用者下執行。
reload或重新開機nginx,修改的配置檔案才會被應用。為了重新加載配置,執行如下指令:
nginx -s reload
一旦主程序收到reload的信号,它就會檢查新的配置檔案文法,并且嘗試應用這個新的配置檔案。如果執行成功,主程序會啟用一個新的工作程序,然後給原來工作程序發送一個信号,讓它原來的工作程序停止。如果執行失敗,主程序會復原到原來的配置檔案并繼續使用原來的配置檔案進行執行。原來的工作程序接收到停止指令之後,它會停止新的連接配接請求,但是目前已經建立的連接配接請求會等待其完成後終止。之後舊程序就會退出。
可以借助Unix工具(如kill實用程式)将信号發送到nginx程序。在這種情況下,信号直接發送到具有給定程序ID的程序。這個程序ID就是nginx的主程序标記,同時這個程序ID會被預設寫入到檔案夾/usr/local/nginx/logs或者/var/run下面。例如:如果主程序ID是1628,就發送指令QUIT來正常停止nginx,執行下面指令:
kill -s QUIT 1628
為了得到正在運作的ngixn程序清單,可以通過ps指令得到:
ps -ax | grep nginx
擷取更多nginx信号資訊,參考 Controlling nginx.
配置檔案結構
nginx由子產品組成,這些子產品由配置檔案中指定的指令控制。指令分為簡單指令和塊指令。一個簡單的指令由名稱和參數組成,這些名稱和參數由空格分隔,并以分号(;)結尾。塊指令具有與簡單指令相同的結構,但它的結尾不是分号,而是一組由大括号({、})包圍的附加指令。如果一個塊指令在大括号中包含其他指令,則這個塊指令又叫做上下文 (例如: events, http, server, 和location).
放在任何上下文之外的配置檔案中的指令被認為是在主上下文 中。event和http指令駐留在主上下文中,server駐留在http中,location駐留在server中。
一行中在#符号後面的是注釋
提供靜态資源内容
web伺服器最重要的任務是對外提供檔案,例如(圖檔或者靜态HTML網頁)。示例:不同的請求會響應到不同的檔案夾路徑: /data/www(包含靜态HTML檔案) /data/images (包含圖檔)。此過程需要編輯配置檔案,并在附有兩個location塊的http塊中設定server塊。參考:server指令 http指令 location 指令
首先,建立一個檔案夾/data/www 把有内容的index.html 檔案放到裡面。并且建立/data/images檔案夾,在裡面放一些圖檔。
第二步,打開配置檔案。預設的配置檔案已經包含了幾個server塊指令,但是被注釋了,現在把這些server塊指令放開注釋。
http {
server {
}
}
通常,配置檔案包含幾個server塊指令,這些塊指令通過不同的服務名字(server names)分發監聽(distinguished listen)在不同的端口。一旦nginx決定哪個伺服器處理請求,它就會根據server塊指令中定義的location指令的參數比對請求頭中指定的URI。
在server塊指令中添加location指令:
location / {
root /data/www;
}
這個location塊詳述了與URI請求相比對的“/”字首。如果比對到請求,這個 URI 會被轉到 root 指令的路徑。,也就是說,所有請求檔案都會直接請求到本地檔案系統的/data/www路徑。如果有多個比對的location塊,nginx會選擇最長字首的那個。上面提供的location塊是長度隻有1的最短字首,是以,其它所有的location塊都比對失敗的話,這個location塊指令才會被使用。
下一步,添加第二個location塊:
location /images/ {
root /data;
}
這個會比對以/images開頭的請求(/也會比對請求,隻不過這個字首更短)。
server塊指令配置結果如下:
server {
location / {
root /data/www;
}
location /images/ {
root /data;
}
}
一個正常的伺服器配置檔案監聽在80端口上,并且可以在本機上成功通路http://localhost/。以/images/開頭請求的URI位址,伺服器會從/data/images檔案夾下面傳回對應的檔案。例如,請求/data/images/example.png這個檔案,nginx伺服器會傳回http://localhost/images/example.png。如果伺服器沒有這個檔案會傳回404 錯誤。不是以/images/開頭的請求,就會被映射到/data/www 檔案夾。例如, 請求nginx/data/www/some/example.html,伺服器會響應http://localhost/some/example.html 這個檔案。
為了應用一個新的配置檔案,如果nginx還沒有啟動,就直接啟動nginx伺服器,如果已經啟動,直接使用下面指令發送到nginx的主程序中,如下: 如果nginx尚未啟動,則啟動nginx,或者向nginx的主程序發送重新加載信号,執行:
nginx -s reload
一些情況下(
***
),沒有達到預期的效果,你可以嘗試通過檢視access.log和 error.log (通常在/usr/local/nginx/logs或者/var/log/nginx) 日志檔案來找原因。
設定一個簡單的代理伺服器 使用最頻繁的是設定一個代理伺服器,也即接受請求,并把所有的請求轉到被代理的伺服器上,擷取到響應之後再發送到用戶端。
我們能配置一個基本的代理伺服器,它的 ***圖檔檔案請求和其它的全部請求都會被發送到代理伺服器上。本例中,兩個伺服器定義在一個nginx執行個體。
首先,通過在配置檔案中添加server塊指令的方式來定義一個代理伺服器。
server {
listen 8080;
root /data/up1;
location / {}
}
這個簡單的伺服器會監聽8080端口(之前, 由于使用了标準端口80,是以尚未指定listen指令)并且映射所有的請求到本地檔案系統的/data/up1檔案夾。建立這個檔案夾并放一個檔案index.html。需要注意的是 server上下文就是這個根指令的位置。例如 當選擇用于提供請求的location塊指令不包括根指令時,使用這樣的根指令(root /data/up1)。
接下來,使用上一節中的伺服器配置,并将其修改為代理伺服器配置。在第一個位置塊中,使用參數中指定的代理伺服器的協定、名稱和端口(在我們的示例中,它是[http://localhost:8080)放置proxy](http://localhost:8080)放置proxy_pass指令:
server {
location / {
proxy_pass http://localhost:8080;
}
location /images/ {
root /data;
}
}
我們修改第二個location指令塊,這個指令塊會把目前的/images字首請求映射到/data/images檔案夾中,為了比對更多的圖檔類型請求,location塊指令修改如下:
location ~ \.(gif|jpg|png)$ {
root /data/images;
}
使用正規表達式~來比對所有以 .gif, .jpg, 和.png結尾的URIs,響應的請求會被映射到/data/images檔案夾中。
nginx在比對location請求的時候,首先檢查location 指令的特殊字首,最長字首(),最後檢查正則。如果這個請求比對到正則,ngixn會選中這個location,否則,會跳過找到最前的一個()。
代理伺服器的配置結果看起來就是這樣子:
server {
location / {
proxy_pass http://localhost:8080/;
}
location ~ \.(gif|jpg|png)$ {
root /data/images;
}
}
這個伺服器将會過濾字尾為 .gif, .jpg, 或者 .png 的然後分發到/data/images檔案夾(通過在root中添加URI參數) ,并且其它的請求會被代理到上面的server配置()中http://localhost:8080/。
為了使用最新的配置,就像前面一樣,向nginx發送一個reload信号。
這裡有更多的 more 指令可以使用在代理連接配接配置中。
啟用 FastCGI 代理 nginx也能把請求路由到FastCGI服務上,它運作程式使用各種架構和程式設計語言(如PHP)。
使用FastCGI伺服器的最基本的nginx配置包括使用fastcgipass 指令而不是proxypass指令,以及fastcgiparam指令來設定傳遞給FastCGI伺服器的參數。假設FastCGI服務在localhost:9000可以通路,以上面一部分的配置為基礎,替換proxypass指令為fastcgipass,并且修改參數為 localhost:9000。在PHP中, SCRIPTFILENAME參數為定義的腳本名稱 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:9090代理伺服器上。
譯自:https://www.zcfy.cc/article/nginx-beginner-s-guide
The End
歡迎自薦投稿到《前端技術江湖》,如果你覺得這篇内容對你挺有啟發,記得點個 「在看」哦
點個『在看』支援下
