天天看點

NGINX 簡明教程

nginx 是一款來自俄羅斯的http 和反向代理(reverse proxy)伺服器、郵件伺服器,以及通用的 tcp/udp 代理伺服器,以其高性能被業界廣泛采用。本文通過最簡潔的方式,将 nginx 核心應用做下介紹。

nginx是一個免費的、開源的、高性能的 http 伺服器和反向代理,以及一個 imap/pop3 代理伺服器。 nginx以其高性能、穩定性、豐富的功能集、簡單的配置和低資源消耗而聞名。

nginx 啟動後,有一個主程序(master process)和一個或多個工作程序(worker process),主程序的作用主要是讀入和檢查nginx的配置資訊,以及維護工作程序;工作程序才是真正處理用戶端請求的程序。具體要啟動多少個工作程序,可以在 nginx 的配置檔案<code>nginx.conf</code>中通過<code>worker_processes</code>指令指定。

可以通過以下這些指令來控制 nginx:

其中:

<code>nginx -s stop</code>: 強制停止nginx,不管工作程序目前是否正在處理使用者請求,都會立即退出。

<code>nginx -s quit</code>:“優雅地”退出nginx,執行這個指令後,工作程序會将目前正在處理的請求處理完畢後,再退出。

<code>nginx -s reload</code>:重載配置資訊。當nginx的配置檔案改變之後,同過執行這個指令,使更改的配置資訊生效,而無需重新啟動nginx.

<code>nginx -s reopen</code>:重新打開日志檔案。

伺服器名稱是用<code>server_name</code>指令來定義的,并且它決定了哪一個<code>server</code>塊将用來處理給定的請求。可以使用精确名稱、通配符、正規表達式來定義伺服器名稱。

當尋找一個虛拟伺服器的名字,如果指定的名稱比對多個變體,例如,通配符和正規表達式都比對,将會按照以下的順序選擇第一個比對的變體:

精确名稱

以星号()開頭的最長的通配符,例如“.example.org”

以星号()結尾的最長的通配符,例如“mail.”

第一個比對的正規表達式(根據在配置檔案中出現的順序)

修改 <code>conf/nginx.conf</code> 檔案,必須在配置檔案 server 塊中的監聽指令 listen 後啟用 ssl 參數,并且指定伺服器證書 <code>ssl_certificate</code> 和私鑰 <code>ssl_certificate_key</code> 的位置:

伺服器證書是一個公共實體,它被發送給連接配接到伺服器的每一個客戶機。私鑰是一個安全實體,應該存儲在具有受限通路的檔案中,但它必須可被nginx主程序讀取。私鑰也可以存儲在與伺服器證書相同的檔案中:

在這種情況下,這個證書檔案的通路權限也應受到限制。雖然證書和密鑰存儲在一個檔案中,但隻有證書被發送到用戶端。

指令 <code>ssl_protocols</code> 和 <code>ssl_ciphers</code> 可用于限制僅包括強版本和密碼的 ssl/tls 連接配接。 預設情況下,nginx 使 用<code>ssl_protocols tlsv1 tlsv1.1 tlsv1.2</code>版本和<code>ssl_ciphers high:!anull:!md5</code>密碼,是以通常不需要顯式地配置它們。需要注意的是,這些指令的預設值在不同的版本裡面已經變更好幾次了。

跨多個應用程式執行個體的負載均衡是優化資源使用率,最大限度地提高吞吐量,降低延遲,并確定容錯配置一個常用的技術。

nginx 支援如下負載均衡的機制(或方法):

如果沒有指定負載均衡的方法,那麼 nginx 預設采用的是輪詢的方式。最簡單的負載均衡配置如下:

3個同樣執行個體的應用(srv1-srv3)是采用輪詢方式。所有請求被代理到一組服務<code>myapp1</code>,同時,nginx 運用 http 負載均衡來分發請求。

反向代理被應用在 nginx 内,包括負載均衡針對 http、https、fastcgi、uwsgi、scgi 以及 memcached。

在為 fastcgi、uwsgi、scgi 或 memcached 設定負載均衡時,分别使用 fastcgi_pass、uwsgi_pass、scgi_pass 和 memcached_pass 指令。

在一些請求需要更長時間才能完成的情況下,最少連接配接可以更公正地控制應用程式執行個體的負載。

使用最少連接配接的負載平衡,nginx 将不會加重一個有過多請求的應用服務負擔,而是将它分發新的請求給最不繁忙的伺服器。

在 nginx 中需要通過設定<code>least_conn</code>來激活最少連接配接的負載均衡政策配置:

注意,采用輪詢或者最少連接配接的負載均衡政策,每個用戶端的後續請求可能被配置設定帶不同的伺服器,不能保證同一個用戶端總是指向同一個服務。如果需要告訴用戶端配置設定到一個特定的應用服務,換句話,就是保持用戶端的會話粘性(sticky)或者會話持久性(persitent),即總是嘗試選着同一個特定的伺服器,ip 哈希 負載均衡機制可以被使用。

采用 ip 哈希的政策,用戶端的 ip 位址被用作一個哈希 key,決定哪個服務應該被選中來服務用戶端的請求。這種方式,確定了同一個用戶端來的請求将總是被指向同一個服務,除非這個服務不可用了。

配置ip 哈希負載均衡,隻需要通過設定<code>ip_hash</code>來激活:

可以通過使用伺服器的權重來影響 nginx 的負載均衡算法,在上述輪詢、最少請求、基于ip 哈希負載均衡配置中,伺服器的權重沒有配置,意味着所有伺服器的權重都是一樣的。特别是輪詢,它意味着或多或少平等的分發請求到伺服器(請求夠多,并且請求以均勻方式進行處理,并完成夠快)

當配置了一個 weight 變量到一個指定的服務後,權重被作為一個 nginx 的負載均衡的決定的一部分:

采用上面的配置,如果來了5個請求,3個到srv1,1個到srv2,1個到srv3。在最近的nginx版本中,同樣可以使用權重針對最少連接配接和ip 哈希的負載均衡政策。

反向代理在 nginx 中實作了被動的健康監測,如果響應從一個特定的伺服器失敗,攜帶着錯誤,nginx 将标記這個伺服器是失敗的,并将嘗試一段時間避免選擇這個伺服器作為後續請求的伺服器。

<code>fail_timeout</code> 和 <code>max_fails</code> 用于設定指定時間内,應該發生連續不成功的數目。預設<code>max_fail</code>等于1,如果設定成0,相當于關閉這個伺服器的健康監測。<code>fail_timeout</code>參數,定義多久伺服器被辨別失敗。過了伺服器<code>fail_timeout</code>失敗逾時間隔後,nginx 将開始探測存活的用戶端的請求,如果探測成功,服務被辨別成存活狀态。

壓縮響應通常會顯着減少傳輸資料的大小。 然而,由于壓縮在運作時發生,是以會增加處理開銷,這可能會對性能産生負面影響。

在向用戶端發送響應之前,nginx 會執行壓縮,但不會“重複壓縮”已經壓縮過的響應。

要啟用壓縮,在 gzip 指令上請使用<code>on</code>參數:

預設情況下,nginx 僅壓縮使用mime 類型 為 <code>text/html</code>的響應。要壓縮其他 mime 類型的響應,請包含<code>gzip_types</code>指令并列出相應的類型。

要指定要壓縮的響應的最小長度,請使用<code>gzip_min_length</code>指令。預設值為20位元組,下面示例調整為1000:

預設情況下,nginx 不會壓縮對代理請求的響應(來自代理伺服器的請求)。請求是否來自代理伺服器是由請求中<code>via</code>頭字段的是否存來确定的。要配置這些響應的壓縮,請使用<code>gzip_proxied</code>指令。該指令具有多個參數來指定 nginx 應壓縮哪種代理請求。例如,僅對不會在代理伺服器上緩存的請求進行壓縮響應,為此,<code>gzip_proxied</code>指令具有訓示 nginx 在響應中檢查<code>cache-control</code>頭字段的參數,如果值是 no-cache、no-store 或 private,則壓縮響應。另外,您必須包括 expired 的參數來檢查<code>expires</code>頭字段的值。這些參數在以下示例中與 auth 參數一起設定,該參數檢查<code>authorization</code>頭字段的存在(授權響應特定于最終使用者,并且通常不被緩存):

與大多數其他指令一樣,配置壓縮的指令可以包含在<code>http</code>上下文中,也可以包含在 <code>server</code> 或 <code>location</code> 塊中。

gzip 壓縮的整體配置可能如下所示。

某些用戶端不支援使用 gzip 編碼方法的響應。同時,可能需要存儲壓縮資料,或者即時壓縮響應并将它們存儲在緩存中。為了都能成功地服務于接受或者不接受壓縮資料的用戶端,針對後一種類型的用戶端時,nginx 可以在将資料發送時即時解壓縮資料。

要啟用運作時解壓縮,請使用<code>gunzip</code>指令。

<code>gunzip</code>指令可以在與<code>gzip</code>指令相同的上下文中指定:

要将檔案的壓縮版本發送到用戶端而不是正常檔案,請在适當的上下文中将<code>gzip_static</code>指令設定為 on。

在這種情況下,為了服務<code>/path/to/file</code>的請求,nginx 嘗試查找并發送檔案<code>/path/to/file.gz</code>。如果檔案不存在,或用戶端不支援 gzip,則 nginx 将發送未壓縮版本的檔案。

請注意,<code>gzip_static</code>指令不啟用即時壓縮。它隻是使用壓縮工具預先壓縮的檔案。要在運作時壓縮内容(而不僅僅是靜态内容),請使用<code>gzip</code>指令。

繼續閱讀