Nginx開始嚮導
Nginx擁有一個主(master)進程和幾個工作(worker)進程,主進程主要用於讀取與評估配置,維護工作進程。工作進程則負責請求的實際操作。Nginx採用事件驅動模型和平臺無關機制以有效的在工作進程間分發請求。工作進程的數目在其配置中指定,可以是固定的配置數目也可以自動匹配爲可用CPU的個數。
Nginx和它的模塊的工作方式由其配置文件決定,默認情況下,其配置文件爲nginx.conf,位於/usr/local/nginx/conf、/etc/nginx或者/usr/local/etc/nginx目錄下。
啓動停止與重新加載配置
要啓動nginx,需要運行其可執行文件。一旦nginx已被啓動,可以通過-s參數對其進行控制,使用如下語法:
nginx -s signal
其中signal可以是如下任一種:
- stop:快速關閉
- quit:優雅關閉
- reload:重新加載配置文件
- reopen:重新打開日誌文件
比如如果想要等待工作進程完成當前服務後關閉Nginx,可執行如下命令:
nginx -s quit
比如如果修改了配置文件,想要生效就要重啓Nginx或者重新加載配置,重新加載配置的命令如下:
nginx -s reload
一量master主進程接收到重新加載配置的信號,它會檢查新配置文件的語法下確性和試圖應用新的配置,如果成功,主進程就會開始創建新的工作進程並且向老的工作進程發送關閉命令,否則,主進程將會回滾到老的配置繼續運行。而老的工作進程在接收到一個關閉命令後,停止接收新的連接,繼續爲當前請求提供服務,直到完事後退出。
也可以通過Unix工具向Nginx進程發送信號,比如kill命令。這種情況下是通過進程ID發送到進程的。默認情況下,Nginx主進程的進程ID被寫入/usr/local/nginx/logs或者/var/run/目錄下的nginx.pid文件中。例如,如果Nginx主進程的進程ID爲1628,那麼要將QUIT信號發送給Nginx主進程,可執行如下命令:
kill -s QUIT 1628
要查看所有的Nginx進程列表,可執行如下命令:
ps -ax | grep nginx
配置文件結構
Nginx由配置配置文件中指定的指令控制的模塊組成,其指令可分爲簡單指令和塊指令。一個簡單指令由名字和參數組成,以空格分隔,以分號結束。一個塊指令同簡單指令擁有同樣的結構,但是並不是以分號結尾,而是以花括號包括的其他指令集結尾。如果一個塊指令在其花括號中包含其他指令,被稱作上下文(context),比如events,http,server和location.
配置文件中放在所有上下文(context)之外的指令被認爲是放置在main上下文中(context)。events和http指令屬於main上下文,server指令屬於http上下文,location屬於server上下文。
配置文件中以#開始的爲註釋。
提供靜態內容服務
一個web服務重要的任務就是向外提供文件,比如圖片和靜態HTML頁面,你可以通過配置Nginx實現比不同本地目錄向外提供文件服務(編輯配置文件配置一個server塊,在server內http塊和location塊)。
比如/data/www目錄下放置一個叫index.html的HTML文件,/data/image目錄下放置一些圖片,首先打開配置文件編輯一個server塊如下:
http {
server {
}
}
通常情況下,配置文件中會包含多個以它們監聽的端口號或者它們的服務名稱區別的server塊。一旦Nginx決定哪個server操作請求,它會拿請求頭中的URI與定義在server塊中的location指令的參數匹配,如下是在server塊中添加location塊:
http {
server {
location / {
root /data/www;
}
}
}
上面location塊指定以/匹配請求的URI(匹配所有的請求),如果請求能夠匹配,則追加到root指令後面的路徑的後面。
如果請求URI能夠同時匹配location塊,Nginx選擇最多匹配那一個,即匹配最長那個。
然後在server塊中添加第二個location塊如下:
http {
server {
location / {
root /data/www;
}
location /images/ {
root /data;
}
}
}
這已經就是一個簡單的監聽默認端口80的簡單服務配置了,且可通過http://localhost/訪問,對於以/images/開頭的URI請求,服務器將會從/data/images/目錄下返回相應的文件,比如http://localhost/images/example.png,Nginx後返回/data/iamges/example.png文件。如果此文件不存在,則顯示404錯誤。同樣的,不以/images/開頭的URI請求,將會被映射到/data/www目錄,比如,http://localhost/som/exmaple.html,Nginx將發送/data/www/some/example.html文件。
當然需要使此新的配置生效則要得啓或者如下命令:
nginx -s reload
注:如果一些配置沒能如期待中那樣工作,可查看/usr/local/nginx/logs或者/var/log/nginx目錄下的access.log和error.log文件以查找原因。
配置一個簡單代理服務
Nginx的另一大使用場景即作爲代理服務使用,即接收請求,然後將請求轉發給被代理的服務器並從被代理的服務器取回響應,最後將取回的響應發送給客戶端。
下面我們將配置一個基本的代理服務,對於圖片文件的請求由本地目錄提供,所有其他的請求轉發給被代理的服務器。在此示例中,將會在一個Nginx實例中定義兩個server塊。
如下是第一個server塊:
server{
listen 8080;
root /data/up1;
location / {
}
}
這即是一個簡單的監聽8080端口的服務配置,如果不指令listen指令表示監聽80端口。其匹配所有的請求到本地文件系統的/data/up1目錄下,創建此目錄並在其中創建一個叫做index.html的文件。注意,此處root指令屬於server上下文中,這種root指令在被選擇用於向請求提供服務的location指令沒有自己的root指令時使用。
然後,修改如上配置使其成爲代理服務的server配置如下:
server {
location / {
proxy_pass http://localhost:8080;
}
location /images/ {
root /data;
}
}
proxy_pass指令用於指定被代理服務的協議、主機名稱、和端口號。
如果修改第二個location如下:
location ~ \.(gif|jpg|png)$ {
root /data/images;
}
則表示匹配所有URI以.gif或者.jpg或者.png結尾的請求。此時location參數爲一正則表達式,~即表示其參數爲正則表達式。
當Nginx選擇提供服務的location時,首先檢查location指定的前綴,然後才檢查正則表達式。如果存在正則表達式匹配的location,Nginx就會選擇這個location,如果不存在,則Nginx則選擇其最早檢測那個正則表達式所在的location。
一般Nginx的代理服務配置如下般模樣:
server {
location / {
proxy_pass http://localhost:8080/;
}
location ~ \.(gif|jpg|png)$ {
root /data/images;
}
}
同樣要注意要應用新的配置,需重啓服務或者重新加載配置文件。
配置FastCGI代理
Nginx同樣可用於FastCGI服務的代理。FastCGI爲可運行多種框架或者語言的服務器。
如果Nginx作爲FastCGI服務器的代理服務,最基本的配置要包含fastcgi_pass指令,以替代proxy_pass指令,同時fastcgi_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/iamges;
}
}