Nginx 現(xiàn)在幾乎是眾多大型網(wǎng)站的必用技術(shù),大家應(yīng)該都知道 Nginx 被 F5 收購的大事件,章亦春也在專心維護(hù) OpenResty 項(xiàng)目構(gòu)建和諧家園,無論你選擇 Nginx 還是 OpenResty,都需要對(duì) Nginx 有一個(gè)比較全面的了解,日后才能做到事半功倍。本文以開發(fā)者必備的 Nginx 基礎(chǔ)知識(shí)為主,在參考文章中羅列了目前比較優(yōu)秀的 Nginx 和 OpenResty 參考教程,希望對(duì)大家有幫助。
Nginx 基礎(chǔ)知識(shí)
Nginx 是什么?
Nginx 是一個(gè) web 服務(wù)器,主要處理客戶端和服務(wù)器的請(qǐng)求分發(fā)。
特點(diǎn)和優(yōu)勢
- 高并發(fā)
- 熱部署
- 快
- 低功耗
- 熱部署
使用和擴(kuò)展
開源免費(fèi)的 Nginx 與商業(yè)版 Nginx Plus,與之對(duì)應(yīng)的是免費(fèi) OpenResty 與商業(yè)版 OpenResty
- 開源版 nginx.org
- 商業(yè)版 NGINX Plus
- 阿里巴巴 Tengine
- 開源版 OpenResty
- 商業(yè)版 OpenResty
陶輝《深入理解 Nginx》作者在極客時(shí)間上的講義 PDF 已經(jīng)介紹的非常詳細(xì)了,如果覺得課程不錯(cuò)可以選擇購買盡量少走彎路
極客時(shí)間:nginx 核心知識(shí) 100 講配置文件與代碼分享
nginx 正向代理與反向代理
為了便于理解,首先先來了解一下一些基礎(chǔ)知識(shí),nginx 是一個(gè)高性能的反向代理服務(wù)器那么什么是反向代理呢?
代理是在服務(wù)器和客戶端之間假設(shè)的一層服務(wù)器,代理將接收客戶端的請(qǐng)求并將它轉(zhuǎn)發(fā)給服務(wù)器,然后將服務(wù)端的響應(yīng)轉(zhuǎn)發(fā)給客戶端。
不管是正向代理還是反向代理,實(shí)現(xiàn)的都是上面的功能。
如果你對(duì) OSI 七層模型與 TCP/IP 四層模型不是很熟悉可以再回顧下

正向代理
正向代理(forward)意思是一個(gè)位于客戶端和原始服務(wù)器 (origin server) 之間的服務(wù)器,為了從原始服務(wù)器取得內(nèi)容,客戶端向代理發(fā)送一個(gè)請(qǐng)求并指定目標(biāo) (原始服務(wù)器),然后代理向原始服務(wù)器轉(zhuǎn)交請(qǐng)求并將獲得的內(nèi)容返回給客戶端。
正向代理是為我們服務(wù)的,即為客戶端服務(wù)的,客戶端可以根據(jù)正向代理訪問到它本身無法訪問到的服務(wù)器資源。
正向代理對(duì)我們是透明的,對(duì)服務(wù)端是非透明的,即服務(wù)端并不知道自己收到的是來自代理的訪問還是來自真實(shí)客戶端的訪問。
反向代理
反向代理(Reverse Proxy)方式是指以代理服務(wù)器來接受 internet 上的連接請(qǐng)求,然后將請(qǐng)求轉(zhuǎn)發(fā)給內(nèi)部網(wǎng)絡(luò)上的服務(wù)器,并將從服務(wù)器上得到的結(jié)果返回給 internet 上請(qǐng)求連接的客戶端,此時(shí)代理服務(wù)器對(duì)外就表現(xiàn)為一個(gè)反向代理服務(wù)器。
反向代理是為服務(wù)端服務(wù)的,反向代理可以幫助服務(wù)器接收來自客戶端的請(qǐng)求,幫助服務(wù)器做請(qǐng)求轉(zhuǎn)發(fā),負(fù)載均衡等。
反向代理對(duì)服務(wù)端是透明的,對(duì)我們是非透明的,即我們并不知道自己訪問的是代理服務(wù)器,而服務(wù)器知道反向代理在為他服務(wù)。
nginx 基本配置
安裝 nginx 時(shí)通常需要編譯自己需要的模塊,可以使用 rpmbuild 制作 Nginx 的 RPM 包
main # 全局配置 events { # nginx工作模式配置 } http { # http設(shè)置 .... server { # 服務(wù)器主機(jī)配置 .... location { # 路由配置 .... } location path { .... } location otherpath { .... } } server { .... location { .... } } upstream name { # 負(fù)載均衡配置 .... } }
如果想要生成 nginx 規(guī)范配置,可以參考 nginxconfig.io
下面是 nginx 一些配置中常用的內(nèi)置全局變量,你可以在配置的任何位置使用它們。

變量名 功能 $host 請(qǐng)求信息中的 Host,如果請(qǐng)求中沒有 Host 行,則等于設(shè)置的服務(wù)器名 $request_method 客戶端請(qǐng)求類型,如 GET、POST $remote_addr 客戶端的 IP 地址 $args 請(qǐng)求中的參數(shù) $content_length 請(qǐng)求頭中的 Content-length 字段 $http_user_agent 客戶端 agent 信息 $http_cookie 客戶端 cookie 信息 $remote_addr 客戶端的 IP 地址 $remote_port 客戶端的端口 $server_protocol 請(qǐng)求使用的協(xié)議,如 HTTP/1.0、HTTP/1.1 $server_addr 服務(wù)器地址 $server_name 服務(wù)器名稱 $server_port 服務(wù)器的端口號(hào)
nginx 負(fù)載均衡
Upstream 指定后端服務(wù)器地址列表,在 server 中攔截響應(yīng)請(qǐng)求,并將請(qǐng)求轉(zhuǎn)發(fā)到 Upstream 中配置的服務(wù)器列表。
upstream balanceServer { server 10.1.22.33:12345; server 10.1.22.34:12345; server 10.1.22.35:12345; } server { server_name fe.server.com; listen 80; location /api { proxy_pass http://balanceServer; } }
上面的配置只是指定了 nginx 需要轉(zhuǎn)發(fā)的服務(wù)端列表,并沒有指定分配策略。
默認(rèn)情況下采用的是輪詢策略,將所有客戶端請(qǐng)求輪詢分配給服務(wù)端。這種策略是可以正常工作的,但是如果其中某一臺(tái)服務(wù)器壓力太大,出現(xiàn)延遲,會(huì)影響所有分配在這臺(tái)服務(wù)器下的用戶。
nginx 常用命令
``` bash
# 快速關(guān)閉Nginx,可能不保存相關(guān)信息,并迅速終止web服務(wù)
nginx -s stop
# 平穩(wěn)關(guān)閉Nginx,保存相關(guān)信息,有安排的結(jié)束web服務(wù)
nginx -s quit
# 因改變了Nginx相關(guān)配置,需要重新加載配置而重載
nginx -s reload
# 重新打開日志文件
nginx -s reopen
# 為 Nginx 指定一個(gè)配置文件,來代替缺省的
nginx -c filename
# 不運(yùn)行,而僅僅測試配置文件。nginx 將檢查配置文件的語法的正確性,并嘗試打開配置文件中所引用到的文件
nginx -t
# 顯示 nginx 的版本
nginx -v
# 顯示 nginx 的版本,編譯器版本和配置參數(shù)
nginx -V
# 格式換顯示 nginx 配置參數(shù)
2>&1 nginx -V | xargs -n1
2>&1 nginx -V | xargs -n1 | grep lua
```
參考文章
以上內(nèi)容只是 nginx 的冰山一角,我個(gè)人推薦大家跟著官方文檔或者類似極客時(shí)間的教程學(xué)習(xí),可以少走很多彎路
nginx documentation
前端開發(fā)者必備的 nginx 知識(shí)
百萬并發(fā)下 Nginx 的優(yōu)化之道
agentzh 的 Nginx 教程
OpenResty 最佳實(shí)踐
以下為極客時(shí)間專欄
Nginx 核心知識(shí) 100 講
極客時(shí)間:nginx 核心知識(shí) 100 講配置文件與代碼分享
OpenResty 從入門到實(shí)戰(zhàn)