nginx問題……初識 Nginx

Nginx 是一個免費的,開源的,高性能的HTTP服務器和反向代理,以及IMAP / POP3代理服務器。 Nginx

以其高性能,穩定性,豐富的功能,簡單的配置和低資源消耗而聞名。很多高知名度的網站都使用

Nginx,如:Netflix,GitHub,SoundCloud,MaxCDN 等。

 

Nginx 有一個主線程( master process)和幾個工作線程(worker process)。主線程的目的是加載驗證配置文件、維護工作線程。

工作線程處理實際的請求,Nginx 採用基於事件的模型和依賴操作系統的機制在工作線程之間高效地分發請求。工作線程的數量可配置,也可自動調整爲服務器CPU的數量。

Nginx 及其模塊的工作方式由配置文件確定。 默認情況下,配置文件名爲nginx.conf,放在/usr/local/nginx/conf、/etc/nginx或者/usr/local/etc/nginx文件夾中。

基本命令

Nginx 啓動之後,可以使用以下命令控制:

nginx -s

其中-s意思是向主進程發送信號,signal可以爲以下四個中的一個:

stop— 快速關閉

quit— 優雅關閉

reload— 重新加載配置文件

reopen— 重新打開日誌文件

當運行nginx -s quit時,Nginx 會等待工作進程處理完成當前請求,然後將其關閉。當你修改配置文件後,並不會立即生效,而是等待重啓或者收到nginx -s reload信號。

當 Nginx 收到nginx -s reload信號後,首先檢查配置文件的語法。語法正確後,主線程會開啓新的工作線程並向舊的工作線程發送關閉信號,如果語法不正確,則主線程回滾變化並繼續使用舊的配置。當工作進程收到主進程的關閉信號後,會在處理完當前請求之後退出。

配置文件

Nginx 配置的核心是定義要處理的URL以及如何響應這些URL請求,即定義一系列的虛擬服務器(Virtual Servers)控制對來自特定域名或者 IP 的請求的處理。

每一個虛擬服務器定義一系列的location控制處理特定的 URI 集合。每一個location定義了對映射到自己的請求的處理場景,可以返回一個文件或者代理此請求。

Nginx 由不同的模塊組成,這些模塊由配置文件中指定的指令控制。 指令分爲簡單指令塊指令

一個簡單指令包含指令名稱指令參數,以空格分隔,以分號(;)結尾。 塊指令與簡單指令類似,但是由大括號({和})包圍。 如果塊指令大括號中包含其他指令,則稱該指令爲上下文(如:events,http,server和location)。

配置文件中的放在上下文之外的指令默認放在主配置文件中(類似繼承主配置文件)。events和http放置在主配置文件中,server放置在http塊指令中,location放置在server塊指令中。

配置文件的註釋以#開始。

靜態內容

Web 服務器一個重要的功能是服務靜態文件(圖像或靜態HTML頁面)。例如,Nginx 可以很方便的讓服務器從/data/www獲取 html 文件,從/data/images獲取圖片來返回給客戶端,這隻需要在http塊指令中的server塊指令中設置兩個location塊指令。

首先,創建/data/www目錄,並放入index.html,創建/data/images目錄並在其中放置一些圖片。

接下來,打開配置文件。 創建一個server塊:

http { server {

}

}

通常,配置文件可以包括多個server塊,它們以端口服務器名稱來區分。當 Nginx 決定某一個server處理請求後,它將請求頭中的URI和server塊中的location塊進行對比。

加入location塊指令到server中:

將以下位置塊添加到服務器塊:

location / { root /data/www;

}

上面的location塊指定/前綴與請求中的URI對比。對於匹配的請求,URI將被添加到root指令中指定的路徑,即/data/www,以此形成本地文件系統的路徑,如訪問http://localhost/bog/welcome.html,對應服務器文件路徑爲/data/www/bog/welcome.html。 如果URI匹配多個location塊,Nginx 採用最長前綴匹配原則(類似計算機網絡裏面的IP匹配), 上面的location塊前綴長度爲 1,因此只有當所有其他location塊匹配時,才使用該塊。

接下來,添加第二個位置塊:

location /images/ { root /data;

}

它將匹配以/images/(/也匹配這樣的請求,但具有較短的前綴)開始的請求。

server塊的最終配置如下:

server { location / { root /data/www;

} location /images/ { root /data;

}

}

到目前爲止,這已經是一個可以正常運行的服務器,它監聽端口80,並且可以在本地計算機上訪問http://localhost/。 對於/images/開頭的請求,服務器將從/data/images目錄發送文件。 如,對於http://localhost/images/example.png請求,nginx 將響應/data/images/example.png文件。 如果不存在,nginx 將返回404。URI不以/images/開頭的請求將映射到/data/www目錄。 例如,對於http://localhost/some/example.html請求,nginx 將響應/data/www/some/example.html文件。

代理服務器

Nginx 的一個常見應用是將其設置爲代理服務器(Proxy Server),即接受客戶端的請求並將其轉發給代理服務器,再接受代理服務器發來的響應,將它們發送到客戶端。

比如我們可以用一個 Nginx 實例實現對圖片文件的請求使用本地文件系統,而其他請求轉發到代理服務器。

首先,向 Nginx 的配置文件中添加一個server塊來定義代理服務器:

server { listen 8080; root /data/up1; location / {

}

}

此服務器偵聽端口8080,並將所有請求映射到本地文件系統上的/data/up1目錄。 創建此目錄並將index.html放入其中。 注意,root指令放在server上下文中,這樣 當location塊中不含root指令時將使用所屬server的root指令。

接下來,使用上一節中的服務器配置,並將其修改爲代理服務器配置。 在第一個位置塊中,加上proxy_pass指令:

server { location / { # proxy_pass指令的參數爲:協議+主機名+端口號

proxy_pass http://localhost:8080;

} location /images/ { root /data;

}

}

修改第二個 匹配/images/前綴的location塊,使其與請求圖像文件的擴展名相匹配:

location ~ \.(gif|jpg|png)$ { root /data/images;

}

該參數是一個正則表達式,匹配以.gif,.jpg或.png結尾的所有URI。 正則表達式應該以~開頭。 相應的請求將映射到/data/images目錄。

當 Nginx 選擇一個location塊來處理請求時,它首先檢查指定location塊的前綴,記住具有最長前綴的location塊,然後檢查正則表達式。 如果與正則表達式匹配, Nginx 選擇此location塊,否則,選擇先前記住的location塊。

代理服務器的最終配置如下:

server { location / { proxy_pass http://localhost:8080/;

} location ~ \.(gif|jpg|png)$ { root /data/images;

}

}

此服務器將過濾以.gif,.jpg或.png結尾的請求,並將它們映射到/data/images目錄(通過向root指令的參數添加請求的URI),並將所有其他請求發送給上面配置的代理服務器。

這樣,圖片和其他請求就可以使用不同的服務器來處理。

FastCGI代理

Nginx 可用於將請求路由到 FastCGI 服務器。快速通用網關接口(Fast Common Gateway

Interface/FastCGI)是一種讓交互程序與Web服務器通信的協議。因此 Nginx 可以將請求路由到 FastCGI

運行的應用程序,如 PHP 程序。

使用 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;

}

}

這將設置一個服務器,將路由除靜態圖像以外的所有請求到運行在localhost:9000的 FastCGI 服務器。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章