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

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

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