1. Nginx 是什麼
nginx [engine x]是一個HTTP和反向代理伺服器,一個郵件代理伺服器和一個通用的TCP / UDP代理伺服器,最初由Igor Sysoev編寫。很長一段時間以來,它一直在許多負載很重的俄羅斯網站上執行,包括 Yandex, Mail.Ru, VK和 Rambler。據Netcraft稱,nginx 在2019年6月服務或代理了 26.34%最繁忙的網站.
2. Nginx的功能
基本的HTTP伺服器功能、其他HTTP伺服器功能、郵件代理伺服器功能
2.1 基本的HTTP伺服器功能
- 提供靜態和 索引 檔案, 自動索引 ; 開啟檔案描述符快取(暫時理解動靜分離) ;
- 通過快取加速反向代理 ; 負載均衡和容錯 ;
- 通過快取FastCGI, uwsgi, SCGI和 memcached 伺服器加速支援 ;
- 模組化架構。過濾器包括 gzipping,位元組範圍,分塊響應, XSLT, SSI和影象變換過濾器。如果由代理或FastCGI / uwsgi / SCGI伺服器處理,則可以並行處理單個頁面中的多個SSI包含;
- SSL和TLS SNI支援 ;
- 支援HTTP 2.0, 具有加權和基於依賴性的優先順序。
2.2 其他的HTTP伺服器功能
- 基於名稱和基於IP的 負載均衡 ;
- 保持連線 和流水線連線支援;
- 訪問日誌格式, 緩衝日誌寫入, 快速日誌輪換和 syslog日誌記錄 ;
- 3xx-5xx錯誤程式碼 重定向 ;
- 重寫模組: 使用正規表示式更改URI ;
- 根據 客戶端地址執行不同的功能 ;
- 基於客戶端IP地址, 密碼(HTTP基本身份驗證)和 子請求結果的訪問控制 ;
- 驗證 HTTP referer ;
- 該PUT,DELETE,MKCOL,複製和移動方法;
- FLV 和 MP4 流媒體;
- 響應速度限制 ;
- 限制 來自一個地址的同時連線 或 請求的數量 ;
- 基於IP的地理定位 ;
A / B測試 ;
請求映象 ;
嵌入式Perl ;
njs指令碼語言。
2.3 郵件代理伺服器功能
- 使用者 使用外部HTTP 身份驗證 伺服器重定向到 IMAP 或 POP3伺服器;
- 使用外部HTTP 身份驗證 伺服器進行使用者身份 驗證,並將連線重定向到內部 SMTP伺服器;
- 認證方式:
- POP3:USER / PASS,APOP,AUTH LOGIN / PLAIN / CRAM-MD5;
- IMAP:登入,AUTH LOGIN / PLAIN / CRAM-MD5;
- SMTP:AUTH LOGIN / PLAIN / CRAM-MD5;
- SSL支援;
- STARTTLS和STLS支援。
2.4 TCP / UDP代理伺服器功能
- TCP和UDP的通用代理 ;
- SSL和TLS SNI支援TCP;
- 負載均衡和容錯 ;
- 基於客戶端地址的訪問控制 ;
- 根據客戶端地址執行不同的功能 ;
- 限制 來自一個地址的同時連線數 ;
- 訪問日誌格式, 緩衝日誌寫入, 快速日誌輪換和 syslog日誌記錄 ;
- 基於IP的地理定位 ;
- A / B測試 ;
- njs指令碼語言。
3. 下載Nginx
我這裡下載的是Windows版本.
解壓開啟如下:
4. 使用Nginx
在Nginx目錄的搜尋欄,敲入cmd
輸入命令start nginx即可啟動Nginx
在瀏覽器訪問 localhost:
其他的一些常用命令:
nginx -s stop 快速關閉
nginx -s quit 優雅關閉
nginx -s reload 重新載入配置檔案
nginx -s reopen 重新開啟日誌檔案
4.1 Nginx的配置檔案
nginx的配置檔案在/conf/nginx.conf,nginx由模組組成,這些模組由配置檔案中指定的指令控制。指令分為簡單指令和塊指令
一個簡單的指令由名稱和引數組成,用空格分隔,以分號(;)結尾。
塊指令與簡單指令具有相同的結構,但它不是以分號結尾,而是以大括號{}包圍的一組附加指令結束。如果塊指令在大括號內可以有其他指令,則稱為上下文(示例: events, http, server和 location)。
"#" 表示註解
4.2 使用nginx訪問靜態資源的例子
在/conf/ 目錄下,將原來的nginx.conf檔案改名為nginx.conf1,並且建立一個空白的nginx.conf檔案
修改nginx.conf檔案
##工作執行緒, 建議和cpu數量相同
worker_processes 4;
#工作模式與連線數上限
events {
#單個程式最大連線數(最大連線數=連線數*程式數)
worker_connections 1024;
}
#設定http伺服器
http {
#虛擬主機的配置
server {
#對 "/" 啟用反向代理
location / {
# 制定靜態資源的位置
root D://web_resources//static//;
}
location /images/ {
root D://web_resources//static//;
}
}
}
本地圖片的路徑 : D:\web_resources\static\images\1.png
本地頁面的路徑: D:\web_resources\static\index.html
也就是所 root的路徑+ location後面的路徑 = 實際檔案存放的資料夾路徑
訪問測試:
成功了有沒有.
4.3 nginx設定代理伺服器
nginx的一個常見用途是將其設定為代理伺服器,這意味著伺服器接收請求,將它們傳遞給代理伺服器,從中檢索響應,然後將它們傳送給客戶端。
接下來做一個簡單的動靜分離的例子, 靜態資源訪問指向本地目錄,動態資源代理本地的一個8080埠的web服務.
修改nginx.conf檔案
http {
server {
location / {
# 代理的地址
proxy_pass http://localhost:8080;
}
# 該引數是一個正規表示式匹配以gif,.jpg或.png結尾的URL
#相應的請求將對映到該D://web_resources//static//; 目錄。
location ~ \.(gif|jpg|png|html)$ {
root D://web_resources//static//;
}
}
}
訪問8080埠的服務:
確實被轉發過去了.
訪問靜態資源:
5. Nginx負載均衡
除了動靜分離,Nginx的負載均衡也是常用的一個功能.
nginx支援以下負載平衡機制(或方法):
- 迴圈 - 對應用程式伺服器的請求以迴圈方式分發,
- 最少連線 - 下一個請求被分配給活動連線數最少的伺服器,
- ip-hash - 雜湊函式用於確定應為下一個請求選擇哪個伺服器(基於客戶端的IP地址)。
5.1 Nginx預設負載均衡
如果未特別配置負載平衡方法,則預設為迴圈。
修改nginx.conf檔案
http {
#負載均衡
upstream myapp1 {
server localhost:8080;
server localhost:8081;
server localhost:8082;
}
server {
# nginx監聽的埠
listen 80;
location / {
proxy_pass http://myapp1;
}
}
}
多次請求頁面,請求均勻的負載在每個服務上:
輸出語句的數量相同.
5.2 最小連線負載平衡
另一個負載平衡規則是最少連線的。在某些請求需要更長時間才能完成的情況下,最小連線允許更公平地控制應用程式例項上的負載。
使用最少連線的負載平衡,nginx將嘗試不會使繁忙的應用程式伺服器超載請求過多,而是將新請求分發給不太繁忙的伺服器。
當 least_conn指令用作伺服器組配置的一部分時,將啟用nginx中的最小連線負載平衡
#負載均衡
upstream myapp1 {
# 最少連線負載均衡指令
least_conn;
server localhost:8080;
server localhost:8081;
server localhost:8082;
}
5.3 ip地址繫結
請注意,通過迴圈或最少連線的負載平衡,每個後續客戶端的請求可能會分發到不同的伺服器。無法保證同一客戶端始終指向同一伺服器。
如果需要將客戶端繫結到特定的應用程式伺服器 - 換句話說,就始終嘗試選擇特定伺服器而言,使客戶端的會話“粘滯”或“持久” - ip-hash負載平衡機制可以是用過的。
使用ip-hash,客戶端的IP地址將用作雜湊金鑰,以確定應為客戶端的請求選擇伺服器組中的哪個伺服器。此方法可確保來自同一客戶端的請求始終定向到同一伺服器,但此伺服器不可用時除外。
配置方式和上面類似, 新增指令ip_hash:
#負載均衡
upstream myapp1 {
# 最少連線負載均衡指令
ip_hash;
server localhost:8080;
server localhost:8081;
server localhost:8082;
}
5.4 加權負載平衡
在上面的示例中,未配置伺服器權重,這意味著所有指定的伺服器都被視為對特定負載平衡方法具有同等資格。
當 為伺服器指定權重引數時, 權重被計入負載平衡決策的一部分。
修改配置檔案:
upstream myapp1 {
#upstream的負載均衡,weight是權重,可以根據機器配置定義權重。weigth參數列示權值,權值越高被分配到的機率越大。
server localhost:8080 weight = 3;
server localhost:8081;
server localhost:8082;
}
使用此配置,每5個新請求將分佈在應用程式例項中,如下所示:3個請求將定向到8080埠,一個請求將轉到8081埠,另一個請求轉到8082埠。
6. 健康檢查
兩個引數max_fails和fail_timeout,用於判斷後端節點狀態.
在fail_timeout的時間範圍內連線伺服器通訊失敗的次數如果超過max_fail,那麼伺服器被判定為不可用.並且再次等待一個fail_timeout的時間,再去重新嘗試請求.
fail_timeout的預設值為30s,,max_fails的預設值為1.
配置方式:
#負載均衡
upstream myapp1 {
server localhost:8080 weight=3 max_fails=10 fail_timeout=30;
server localhost:8081;
server localhost:8082;
}