Nginx快速入門
本文主要介紹nginx的基本配置和操作,並介紹了一些可以完成的簡單任務。假設您已經學習過並已經安裝好了nginx服務器。 如果沒有,請參閱安裝nginx頁面(http://www.yiibai.com/nginx/nginx-install.html )。 本指南介紹如何啓動和停止nginx,並重新加載其配置,解釋配置文件的結構,並介紹如何設置nginx以提供靜態內容,如何配置nginx作爲代理服務器,以及如何將其連接到 一個FastCGI應用程序。
nginx有一個主進程和幾個工作進程。 主進程的主要目的是讀取和評估配置,並維護工作進程。 工作進程對請求進行實際處理。 nginx採用基於事件的模型和依賴於操作系統的機制來有效地在工作進程之間分配請求。 工作進程的數量可在配置文件中定義,並且可以針對給定的配置進行修改,或者自動調整到可用CPU內核的數量(請參閱worker_processes)。
在配置文件中確定nginx及其模塊的工作方式。 默認情況下,配置文件名爲nginx.conf
,並放在目錄:/usr/local/nginx/conf
, /etc/nginx
, 或 /usr/local/etc/nginx
中。
在前面安裝文章配置中,使用的安裝配置目錄是:/usr/local/nginx/conf
。所以可以在這個目錄下找到這個配置文件。
1. 啓動,停止和重新加載Nginx配置
要啓動nginx,請運行可執行文件。 當nginx啓動後,可以通過使用-s
參數調用可執行文件來控制它。 使用以下語法:
nginx -s signal
信號(signal
)的值可能是以下之一:
-
stop
- 快速關閉服務 -
quit
- 正常關閉服務 -
reload
- 重新加載配置文件 -
reopen
- 重新打開日誌文件
例如,要通過等待工作進程完成服務當前請求來停止nginx
進程,可以執行以下命令:
nginx -s quit
注:該命令應該在啓動nginx的同一用戶下執行。
在將重新配置命令的命令發送到nginx或重新啓動之前,配置文件中的更改將不會被應用。 要重新加載配置文件,請執行:
nginx -s reload
當主進程收到要重新加載配置的信號,它將檢查新配置文件的語法有效性,並嘗試應用其中提供的配置。 如果這是成功的,主進程將啓動新的工作進程,並向舊的工作進程發送消息,請求它們關閉。 否則,主進程回滾更改,並繼續使用舊配置。 老工作進程,接收關閉命令,停止接受新連接,並繼續維護當前請求,直到所有這些請求得到維護。 之後,舊的工作進程退出。
還可以藉助Unix工具(如kill utility)將信號發送到nginx進程。 在這種情況下,信號直接發送到具有給定進程ID的進程。 默認情況下,nginx主進程的進程ID寫入目錄/usr/local/nginx/logs
或/var/run
中的nginx.pid。 例如,如果主進程ID爲1628
,則發送QUIT信號導致nginx的正常關閉,請執行:
kill -s QUIT 1628
要獲取所有運行的nginx進程的列表,可以使用ps
命令,例如,以下列方式:
ps -ax | grep nginx
2. 配置文件的結構
nginx由配置文件中指定的指令控制的模塊組成。 指令分爲簡單指令和塊指令。 一個簡單的指令由空格分隔的名稱和參數組成,並以分號(;
)結尾。 塊指令具有與簡單指令相同的結構,但不是以分號結尾,而是以大括號({
和}
)包圍的一組附加指令結束。 如果塊指令可以在大括號內部有其他指令,則稱爲上下文(例如:events
,http
,server
和location
)。
配置文件中放置在任何上下文之外的僞指令都被認爲是主上下文。 events
和http
指令駐留在主上下文中,server
在http
中的,而location
在http
塊中。
#
號之後的一行的部分被視爲註釋。
3. 提供靜態內容服務(靜態網站)
一個重要的Web服務器任務是提供文件(如圖像或靜態HTML頁面)。這裏我們來學習如何實現一個示例,根據請求,文件將從不同的本地目錄提供:/data/www
(可能包含HTML文件)和/ data/images
(包含圖像)。這將需要編輯配置文件,並使用兩個位置塊在http塊內設置服務器塊。
首先,創建/data/www
目錄,並將一個包含任何文本內容的index.html
文件放入其中,並創建/data/images
目錄並在其中放置一些圖像。創建兩個目錄 -
[root@localhost ~]# mkdir -p /data/www
[root@localhost ~]# mkdir -p /data/images
[root@localhost ~]#
分別在上面創建的兩個目錄中放入兩個文件:/data/www/index.html
和 /data/images/logo.png
,/data/www/index.html
文件的內容就一行,如下 -
<h2> New Static WebSite Demo.</h2>
接下來,打開配置文件(/usr/local/nginx/conf/nginx.conf
)。 默認的配置文件已經包含了服務器塊的幾個示例,大部分是註釋掉的。 現在註釋掉所有這樣的塊,並啓動一個新的服務器塊:
http {
server {
}
}
通常,配置文件可以包括服務器監聽的端口和服務器名稱區分的幾個server
塊。當nginx決定哪個服務器處理請求後,它會根據服務器塊內部定義的location
指令的參數測試請求頭中指定的URI。
將以下location
塊添加到服務器(server
)塊:
http {
server {
location / {
root /data/www;
}
}
}
該location
塊指定與請求中的URI相比較的「/
」前綴。 對於匹配請求,URI將被添加到root
指令中指定的路徑(即/data/www
),以形成本地文件系統上所請求文件的路徑。 如果有幾個匹配的location
塊,nginx將選擇具有最長前綴來匹配location
塊。 上面的location
塊提供最短的前綴長度爲1
,因此只有當所有其他location
塊不能提供匹配時,纔會使用該塊。
接下來,添加第二個location
塊:
http {
server {
location / {
root /data/www;
}
location /images/ {
root /data;
}
}
}
它將是以/images/
(位置/
也匹配這樣的請求,但具有較短前綴,也就是「/images/
」比「/
」長)的請求來匹配。
server
塊的最終配置應如下所示:
server {
location / {
root /data/www;
}
location /images/ {
root /data;
}
}
這已經是一個在標準端口80
上偵聽並且可以在本地機器上訪問的服務器( http://localhost/
)的工作配置。 響應以/images/
開頭的URI的請求,服務器將從/data/images
目錄發送文件。 例如,響應http://localhost/images/logo.png
請求,nginx將發送服務上的/data/images/logo.png
文件。 如果文件不存在,nginx將發送一個指示404
錯誤的響應。 不以/images/
開頭的URI的請求將映射到/data/www
目錄。 例如,響應http://localhost/about/example.html
請求時,nginx將發送/data/www/about/example.html
文件。
要應用新配置,如果尚未啓動nginx或者通過執行以下命令將重載信號發送到nginx的主進程:
[root@localhost ~]# /usr/local/nginx/sbin/nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
[root@localhost ~]# /usr/local/nginx/sbin/nginx -s reload
如果錯誤或異常導致無法正常工作,可以嘗試查看目錄
/usr/local/nginx/logs
或/var/log/nginx
中的access.log
和error.log
文件中查找原因。
打開瀏覽器或使用CURL訪問Nginx服務器如下所示 -
完整的nginx.conf
文件配置內容如下:
#user nobody;
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
#access_log logs/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
## 新服務(靜態網站)
server {
location / {
root /data/www;
}
location /images/ {
root /data;
}
}
}
4. 設置簡單的代理服務器
nginx的一個常見用途是將其設置爲代理服務器,這意味着它可作爲一個接收請求的服務器,將其傳遞給代理服務器,從代理服務器中檢索響應,並將其發送給客戶端。
我們將配置一個基本的代理服務器,它爲來自本地目錄的文件提供圖像請求,並將所有其他請求發送到代理的服務器。 在此示例中,兩個服務器將在單個nginx
實例上定義。
首先,通過向nginx配置文件添加一個server
塊來定義代理服務器,其中包含以下內容:
server {
listen 8080;
root /data/up1;
location / {
}
}
這將是一個監聽端口8080
的簡單服務器(以前,由於使用了標準端口80
,所以沒有指定listen
指令),並將所有請求映射到本地文件系統上的/data/up1
目錄。 創建此目錄並將index.html
文件放入其中。 請注意,root
指令位於server
塊上下文中。 當選擇用於服務請求的location
塊不包含自己的root
指令時,將使用此root
指令。
在上面創建的目錄/data/up1
中放入一個文件:/data/www/demo.html
,文件的內容就一行,如下 -
<h2>About proxy_pass Page at port 8080</h2>
接下來,使用上一節中的服務器配置進行修改,使其成爲代理服務器配置。 在第一個位置塊中,將proxy_pass
指令與參數中指定的代理服務器的協議,名稱和端口(在本例中爲http://localhost:8080
):
server {
location / {
proxy_pass http://localhost:8080;
}
location /images/ {
root /data;
}
}
我們將修改當前使用/images/prefix
將請求映射到/data/images
目錄下的文件的第二個location
塊,使其與典型文件擴展名的圖像請求相匹配。 修改後的位置塊如下所示:
location ~ \.(gif|jpg|png)$ {
root /data/images;
}
該參數是一個正則表達式,匹配所有以.gif
,.jpg
或.png
結尾的URI。正則表達式之前應該是~
字符。 相應的請求將映射到/data/images
目錄。
當nginx選擇一個location
塊來提供請求時,它首先檢查指定前綴的location
指令,記住具有最長前綴的location
,然後檢查正則表達式。 如果與正則表達式匹配,nginx會選擇此location
,否則選擇之前記住的那一個。
代理服務器的最終配置將如下所示:
server {
location / {
proxy_pass http://localhost:8080/;
}
location ~ \.(gif|jpg|png)$ {
root /data/images;
}
}
此服務器將過濾以.gif
,.jpg
或.png
結尾的請求,並將它們映射到/data/images
目錄(通過向root
指令的參數添加URI),並將所有其他請求傳遞到上面配置的代理服務器。
要應用新配置,如果尚未啓動nginx或者通過執行以下命令將重載信號發送到nginx的主進程:
[root@localhost ~]# /usr/local/nginx/sbin/nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
[root@localhost ~]# /usr/local/nginx/sbin/nginx -s reload
首先測試上面配置的 8080
端口的服務,訪問服務的8080
端口,得到以下結果:
再次訪問 80
端口(這裏只是一個代理,它會把請求轉發給8080
的服務,由8080
端口這這個服務處理並返回結果到客戶端),得到以下結果 -
完整的配置nginx.conf
文件內容如下 -
#user nobody;
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
#access_log logs/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
## 新服務(服務處理)
server {
listen 8080;
root /data/up1;
location / {
}
}
## 代理配置,數據轉發
server {
location / {
proxy_pass http://localhost:8080/;
}
location ~ \.(gif|jpg|png)$ {
root /data/images;
}
}
}
5. 設置FastCGI代理
nginx可用於將請求路由到運行使用各種框架和PHP等編程語言構建的應用程序的FastCGI服務器。
使用FastCGI服務器的最基本nginx配置包括使用fastcgi_pass
指令(而不是proxy_pass
指令),以及fastcgi_param
指令來設置傳遞給FastCGI
服務器的參數。 假設FastCGI
服務器可以在localhost:9000
上訪問。 以上一節的代理配置爲基礎,用fastcgi_pass
指令替換proxy_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
上運行的代理服務器。
有關Nginx+PHP+FastCGI
服務器,我們將在單獨的一篇文章:LANM安裝和配置中講解,請從左側菜單中查看文章標題進入。