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

正向代理
正向代理(forward)意思是一個(gè)位于客戶(hù)端和原始服務(wù)器 (origin server) 之間的服務(wù)器,為了從原始服務(wù)器取得內(nèi)容,客戶(hù)端向代理發(fā)送一個(gè)請(qǐng)求并指定目標(biāo) (原始服務(wù)器),然后代理向原始服務(wù)器轉(zhuǎn)交請(qǐng)求并將獲得的內(nèi)容返回給客戶(hù)端。
正向代理是為我們服務(wù)的,即為客戶(hù)端服務(wù)的,客戶(hù)端可以根據(jù)正向代理訪問(wèn)到它本身無(wú)法訪問(wèn)到的服務(wù)器資源。
正向代理對(duì)我們是透明的,對(duì)服務(wù)端是非透明的,即服務(wù)端并不知道自己收到的是來(lái)自代理的訪問(wèn)還是來(lái)自真實(shí)客戶(hù)端的訪問(wèn)。
反向代理
反向代理(Reverse Proxy)方式是指以代理服務(wù)器來(lái)接受 internet 上的連接請(qǐng)求,然后將請(qǐng)求轉(zhuǎn)發(fā)給內(nèi)部網(wǎng)絡(luò)上的服務(wù)器,并將從服務(wù)器上得到的結(jié)果返回給 internet 上請(qǐng)求連接的客戶(hù)端,此時(shí)代理服務(wù)器對(duì)外就表現(xiàn)為一個(gè)反向代理服務(wù)器。
反向代理是為服務(wù)端服務(wù)的,反向代理可以幫助服務(wù)器接收來(lái)自客戶(hù)端的請(qǐng)求,幫助服務(wù)器做請(qǐng)求轉(zhuǎn)發(fā),負(fù)載均衡等。
反向代理對(duì)服務(wù)端是透明的,對(duì)我們是非透明的,即我們并不知道自己訪問(wèn)的是代理服務(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)求中沒(méi)有 Host 行,則等于設(shè)置的服務(wù)器名 |
$request_method |
客戶(hù)端請(qǐng)求類(lèi)型,如 GET、POST
|
$remote_addr |
客戶(hù)端的 IP 地址 |
$args |
請(qǐng)求中的參數(shù) |
$content_length |
請(qǐng)求頭中的 Content-length 字段 |
$http_user_agent |
客戶(hù)端 agent 信息 |
$http_cookie |
客戶(hù)端 cookie 信息 |
$remote_addr |
客戶(hù)端的 IP 地址 |
$remote_port |
客戶(hù)端的端口 |
$server_protocol |
請(qǐng)求使用的協(xié)議,如 HTTP/1.0、HTTP/1.1\
|
$server_addr |
服務(wù)器地址 |
$server_name |
服務(wù)器名稱(chēng) |
$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ù)端列表,并沒(méi)有指定分配策略。
默認(rèn)情況下采用的是輪詢(xún)策略,將所有客戶(hù)端請(qǐng)求輪詢(xún)分配給服務(wù)端。這種策略是可以正常工作的,但是如果其中某一臺(tái)服務(wù)器壓力太大,出現(xiàn)延遲,會(huì)影響所有分配在這臺(tái)服務(wù)器下的用戶(hù)。
nginx常用命令
# 快速關(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
# 重新打開(kāi)日志文件
nginx -s reopen
# 為 Nginx 指定一個(gè)配置文件,來(lái)代替缺省的
nginx -c filename
# 不運(yùn)行,而僅僅測(cè)試配置文件。nginx 將檢查配置文件的語(yǔ)法的正確性,并嘗試打開(kāi)配置文件中所引用到的文件
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è)人推薦大家跟著官方文檔或者類(lèi)似極客時(shí)間的教程學(xué)習(xí),可以少走很多彎路
以下為極客時(shí)間專(zhuān)欄