天天看點

初識 Nginx

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

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

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

Nginx 有一個主線程( master process)和幾個工作線程(worker process)。主線程的目的是<b>加載</b>和<b>驗證</b>配置檔案、<b>維護</b>工作線程。

工作線程處理實際的請求,Nginx 采用<b>基于事件</b>的模型和<b>依賴作業系統</b>的機制在工作線程之間高效地分發請求。工作線程的數量可配置,也可自動調整為伺服器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請求,即定義一系列的<b>虛拟伺服器(Virtual Servers)</b>控制對來自特定域名或者 IP 的請求的處理。

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

Nginx 由不同的子產品組成,這些子產品由配置檔案中指定的指令控制。 指令分為<b>簡單指令</b>和<b>塊指令</b>。

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

配置檔案中的放在上下文之外的指令預設放在<b>主配置檔案</b>中(類似繼承主配置檔案)。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塊,它們以<b>端口</b>和<b>伺服器名稱</b>來區分。當 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 采用<b>最長字首比對原則</b>(類似計算機網絡裡面的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;

修改第二個 比對/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;

這将設定一個伺服器,将路由除靜态圖像以外的所有請求到運作在localhost:9000的 FastCGI 伺服器。

繼續閱讀