Nginx綜述:反向代理、負載均衡、動靜分離
處理靜態文件、反向代理、負載均衡、動靜分離
一、概述
Nginx是一個高性能的HTTP和反向代理服務器,特點是佔有內存少,併發能力強.
事實上nginx的併發能力確實在同類型的網頁服務器中表現較好,中國大陸使用nginx網站用戶有:百度、京東、新浪、網易、
騰訊、淘寶等。
1、反向代理:
Nginx不僅可以做反向代理,實現負載均衡。還能用作正向代理來進行上網等功能。
正向代理:
如果把局域網外的Internet想象成一個巨大的資源庫,則局域網中的客戶端要訪問Internet,
則需要通過代理服務器來訪問,這種代理服務就稱爲正向代理。
反向代理:
反向代理,其實客戶端對代理是無感知的,因爲客戶端不需要任何配置就可以訪問,我們只需要將請求發送到反向代理服務器,由反向代理服務器去選擇目標服務器獲取數據後,在返回給客戶端,此時反向代理服務器和目標服務器對外就是一個服務器,暴露的是代理服務器地址,隱藏了真實服務器IP地址。
2、負載均衡:
我們已經明確了所謂代理服務器的概念,那麼接下來,Nginx 扮演了反向代理服務器的角色,它是依據什麼樣的規則進行請求分發的呢?不用的項目應用場景,分發的規則是否可以控制呢?
這裏提到的客戶端發送的、Nginx 反向代理服務器接收到的請求數量,就是我們說的負載量。請求數量按照一定的規則進行分發,到不同的服務器處理的規則,就是一種均衡規則。
所以將服務器接收到的請求按照規則分發的過程,稱爲負載均衡。
負載均衡在實際項目操作過程中,有硬件負載均衡和軟件負載均衡兩種,硬件負載均衡也稱爲硬負載,如 F5 負載均衡,相對造價昂貴成本較高。
但是數據的穩定性安全性等等有非常好的保障,如中國移動中國聯通這樣的公司纔會選擇硬負載進行操作。
更多的公司考慮到成本原因,會選擇使用軟件負載均衡,軟件負載均衡是利用現有的技術結合主機硬件實現的一種消息隊列分發機制。
3、動靜分離:
爲了加快網站的解析速度,可以把動態頁面和靜態頁面由不同的服務器來解析,加快解析速度。降低原來單個服務器的壓力。
二、安裝
1、下載
wget http://nginx.org/download/nginx-1.18.0.tar.gz
2、解壓
tar -zxvf nginx-1.18.0.tar.gz
3、編譯、安裝 [默認安裝位置在/usr/local]
cd nginx-1.18.0
./configure
make && make install
注意:
若在./configure過程當中出錯:
./configure: error: the HTTP rewrite module requires the PCRE library.
安裝pcre-devel與openssl-devel解決問題
yum -y install pcre-devel openssl openssl-devel
常用命令:
##1、啓動
./nginx
##2、關閉 :
##強制停止Nginx服務
./nginx -s stop
##優雅地停止Nginx服務(即處理完所有請求後再停止服務)
./nginx -s quit
##3、重啓 :
##強制重啓Nginx服務
./nginx -s reopen
##重新加載Nginx配置文件,然後以優雅的方式重啓Nginx
./nginx -s reload
##4、查看版本
./nginx -v
##5、測試配置文件是否有語法錯誤
./nginx -t
三、配置文件
Nginx配置文件由三部分組成:
1、全局塊
從配置文件開始到events塊之間的內容,主要會設置一些影響nginx服務器整體運行的配置指令,主要爲括配
置運行Nginx服務器的用戶(組)、允許生成的worker process數、進程PID存放路徑、日誌存放路徑和類型以
及配置文件的引入等。
如:worker_processes 1;
這是Nginx服務器併發處理服務的關鍵配置. worker processes值越大,可以支持的併發處理量也越多但是
會受到硬件、軟件等設備的制約。
2、events塊
events塊涉及的指令主要影響Nginx服務器與用戶的網絡連接。
常用的設置包括是否開啓對多work_process下的網絡連接進行序列化,是否允許同時接收多個網絡連接,選取哪種事件驅動
模型來處理連接請求.每個word_process可以同時支持的最大連接數等。
如:worker_connections 1024
上述例子就表示每個work_process支持的最大連接數爲1024.
這部分的配置對Nginx的性能影響較大,在實際中應該靈活配置。
3、HTTP塊
HTTP塊又包含 HTTP全局塊 和 server塊
3.1、HTTP全局塊
HTTP全局塊配置的指令包括文件引入、MIME-TYPE 定義、日誌白定義、連接超時時間、單鏈接請求數上限等。
3.2、server塊
這塊和虛擬主機有密切關係,虛擬主機從用戶角度看,和一臺獨立的硬件主機是完全一樣的,該技術的產生是爲了節省互聯網服
務器硬件成本。中每個http塊可以包括多個server 塊,而每個server 塊就相當於一個虛擬主機。而每個server塊也分爲
全局server 塊,以及可以同時包含多個locaton塊。
1、全局server塊
最常見的配置是本虛擬機主機的監聽配置和本虛擬主機的名稱或IP配置,。
2、location塊
一個server塊可以配置多個location塊。
這塊的主要作用是基於Nginx 服務器接收到的請求字符串(例如server_name/uri-string) , 對虛擬主機名稱(也可以
是IP別名)之外的字符串(例如前面的/uri-string )進行匹配,對特定的請求進行處理。地址定向、數據緩存和應答控制等
功能,還有許多第三方模塊的配也在這裏進行
四、反向代理
4.1、案例一
目標:
訪問:http://http://47.93.197.220:80/即可訪問tomcat
80爲nginx默認端口、8080爲tomcat端口
1、在tomcat8080的webapps目錄下創建lee目錄和a.html
內容爲:<h1>lee 8080</h1>
2、修改nginx配置文件nginx.conf
server {
listen 80; ##監聽端口
server_name 47.93.197.220;
#charset koi8-r;
#access_log logs/host.access.log main;
location / { ##匹配規則爲'/'任何訪問
proxy_pass http://localhost:8080/; ##跳轉8080
root html;
index index.html index.htm;
}
}
3、重啓nginx
./nginx -s reload
4、訪問:http://http://47.93.197.220:80/
4.2、案例二
目標:
訪問:http://47.93.197.220:9001/ren/b.html 即可顯示 lee 8080
訪問:http://47.93.197.220:9001/lee/a.html 即可顯示 ren 8081
80爲nginx默認端口
1、在tomcat8080的webapps目錄下創建lee目錄和a.html
內容爲:<h1>lee 8080</h1>
2、在tomcat8081的webapps目錄下創建ren目錄和b.html
內容爲:<h1>ren 8081</h1>
3、修改tomcat8081的server.xml對應的端口
4、修改nginx配置文件nginx.conf
server {
listen 9001;
server_name 47.93.197.220;
location ~/lee/ {
proxy_pass http://localhost:8080;
}
location ~/ren/ {
proxy_pass http://localhost:8081;
}
}
5、重啓nginx
./nginx -s reload
6、測試
訪問:http://47.93.197.220:9001/ren/b.html 顯示 lee 8080
訪問:http://47.93.197.220:9001/lee/a.html 顯示 ren 8081
4.3、注意:
1. = :用於不含正則表達式的uri前,要求請求字符串與uri 嚴格匹配,如果匹配成功,就停止繼續向下搜索並立即處理該請求。
2、~:用於表示uri 包含正則表達式,並且區分大小寫。
3、~*:用於表示uri包含正則表達式,並且不區分大小寫。
4、^~:用於不含正則表達式的 uri前,要求Nginx服務器找到標識uri 和請求字符串匹配度最高的location 後,立即使
用此location 處理請求,而不再使用location塊中的正則uri 和請求字符串做匹配。
注意:如果uri包含正則表達式,則必須要有~或者 ~* 標識。
五、負載均衡
5.1、案例
目標:
訪問:http://47.93.197.220:9002/edu/a.html
按配置規則顯示8081 edu html 和 8080 edu html
1、在tomcat8080 webapps目錄下創建edu目錄,並在edu目錄下創建a.html
內容:8080 edu html
2、在tomcat8081 webapps目錄下創建edu目錄,並在edu目錄下創建a.html
內容:8081 edu html
3、配置nginx配置文件 conf/nginx.conf
upstream myserver{
server 127.0.0.1:8080 weight=1;
server 127.0.0.1:8081 weight=2;
}
server {
listen 9002;
server_name 47.93.197.220;
location / {
proxy_pass http://myserver;
}
}
4、訪問:http://47.93.197.220:9002/edu/a.html
結果 8081 edu html 出現兩次 8080 edu html 會出現一次
5.2、注意:
A、內置負載策略:
內置實現了三種負載策略:輪循、權重、 最少連接、 IPHash
1、輪詢
根據請求次數,將每個請求均勻分配到每臺服務器
http{
upstream myserver {
server 192.168.1.107:8080;
server 192.168.0.110:8080;
}
server {
listen 80;
location / {
proxy_pass http://myserver;
}
}
}
①、proxy_pass http://myserver:表示將所有請求轉發到myserver服務器組中配置的某一臺服務器上。
②、upstream模塊:配置反向代理服務器組,Nginx會根據配置,將請求分發給組裏的某一臺服務器。
myserver是服務器組的名稱。
2、權重weight
weight:權重、按權重分分配請求,默認爲1
upstream myserver {
server 192.168.0.100:8080 weight=2; # 2/6次
server 192.168.0.101:8080 weight=3; # 3/6次
server 192.168.0.102:8080 weight=1; # 1/6次
}
上例配置,表示6次請求中,100分配2次,101分配3次,102分配1次
3、最少連接
將請求分配給連接數最少的服務器。Nginx會統計哪些服務器的連接數最少。
upstream myserver {
least_conn;
server 192.168.0.100:8080;
server 192.168.0.101:8080;
server 192.168.0.102:8080;
}
4、IP Hash
綁定處理請求的服務器。
第一次請求時,根據該客戶端的IP算出一個HASH值,將請求分配到集羣中的某一臺服務器上。
後面該客戶端的所有請求,都將通過HASH算法,找到之前處理這臺客戶端請求的服務器,然後將請求交給它來處理。
解決了每次訪問的session問題。
upstream myserver {
ip_hash;
server 192.168.0.100:8080;
server 192.168.0.101:8080;
server 192.168.0.102:8080;
}
5、其他配置參數:
①、max_fails
默認爲1。某臺Server允許請求失敗的次數,超過最大次數後,在fail_timeout時間內,新的請求將不會分配給這臺機
器。
如果設置爲0,Nginx會將這臺Server置爲永久無效狀態,然後將請求發給定義了proxy_next_upstream,
fastcgi_next_upstream, uwsgi_next_upstream, scgi_next_upstream,
and memcached_next_upstream指令來處理這次錯誤的請求。
②、fail_timeout
默認爲10秒。某臺Server達到max_fails次失敗請求後,在fail_timeout期間內,nginx會認爲這臺Server暫時不可
用,不會將請求分配給它
upstream myserver {
server 192.168.0.100:8080 weight=2 max_fails=3 fail_timeout=15;
server 192.168.0.101:8080 weight=3;
server 192.168.0.102:8080 weight=1;
}
192.168.0.100這臺機器,如果有3次請求失敗,nginx在15秒內,不會將新的請求分配給它。
③、backup
備份機,所有服務器掛了之後纔會生效
upstream myserver {
server 192.168.0.100:8080 weight=1;
server 192.168.0.101:8080 weight=2;
server 192.168.0.102:8080 backup;
}
在100和101都掛了之前,102爲不可用狀態,不會將請求分配給它。只有當100和101都掛了,102纔會被啓用。
④、down
標識某一臺server不可用。
upstream myserver {
server 192.168.0.100:8080 weight=2;
server 192.168.0.101:8080 down;
server 192.168.0.102:8080 backup;
}
表示101這臺Server爲無效狀態,不會將請求分配給它。
⑤、max_conns
限制分配給某臺Server處理的最大連接數量,超過這個數量,將不會分配新的連接給它。默認爲0,表示不限制。
注意:1.5.9之後的版本纔有這個配置
upstream myserver {
server 192.168.0.100:8080 max_conns=1000;
}
表示最多給100這臺Server分配1000個請求,如果這臺Server正在處理1000個請求,nginx將不會分配新的請求給到它。
假如有一個請求處理完了,還剩下999個請求在處理,這時nginx也會將新的請求分配給它。
⑥、resolve
將server指令配置的域名,指定域名解析服務器。需要在http模塊下配置resolver指令,指定域名解析服務
http {
resolver 192.168.0.101;
upstream myserver {
server example.com resolve;
}
}
表示example.com域名,由192.168.0.101服務器來負責解析。
B、第三方負載策略
1、fair
由於fair模塊是第三方提供的,所以在編譯nginx源碼的時候,需要將fair添加到nginx模塊中。
①、下載fair
https://github.com/xyang0917/nginx-upstream-fair
wget https://github.com/xyang0917/nginx-upstream-fair/archive/nginx-upstream-fair-master.zip
②、解壓
unzip nginx-upstream-fair-master.zip
③、模塊安裝
【未安裝Nginx】
配置:
./configure --prefix=/usr/local/nginx
--sbin-path=/usr/local/nginx/nginx
--conf-path=/usr/local/nginx/nginx.conf
--pid-path=/usr/local/nginx/nginx.pid
--add-module=/opt/nginx-upstream-fair-master
編譯安裝:
make && make intstall
【已安裝Nginx】
配置:
./configure --prefix=/usr/local/nginx
--sbin-path=/usr/local/nginx/nginx
--conf-path=/usr/local/nginx/nginx.conf
--pid-path=/usr/local/nginx/nginx.pid
--add-module=/opt/nginx-upstream-fair-master
編譯:
make
拷貝:
將新編譯的nginx可執行程序拷貝到/opt/nginx/sbin/目錄下,覆蓋之前安裝的nginx編譯後的nginx執行程序,放在nginx源碼的objs目錄下
#先停止nginx服務
cp /opt/nginx-1.18.0/nginx /usr/local/nginx/sbin/ # 覆蓋舊的nginx
upstream myserver {
fair;
server 192.168.0.100:8080;
server 192.168.0.101:8080;
server 192.168.0.102:8080;
}
2、url_hash
按請求url的hash結果來分配請求,使每個url定向到同一個後端服務器,服務器做緩存時比較有效。
1.7.2版本以後,url_hash模塊已經集成到了nginx源碼當中,不需要單獨安裝。
之前的版本仍需要單獨安裝。
下載地址:
https://github.com/evanmiller/nginx_upstream_hash
安裝步驟同fair
upstream myserver {
server 192.168.0.100:8080;
server 192.168.0.101:8080;
server 192.168.0.102:8080;
hash $request_uri;
}
六、動靜分離
6.1、案例
目標:
通過nginx直接訪問linux目錄下的某文件 【注:不使用tomcat】
1、在/目錄下創建 data 文件夾,在data文件夾下創建 html和images文件夾,分別在其下創建a.html和a.jpg
2、Nginx配置文件如下:
server {
listen 9003;
server_name 47.93.197.220;
location /images/{
root /data/;
index index.html index.htm;
expires 1d;
}
location /html/ {
root /data/;
autoindex on;
}
}
3、重啓nginx
./nginx -s reload
4、訪問:
http://47.93.197.220:9003/html/
和
http://47.93.197.220:9003/html/a.html
和
http://47.93.197.220:9003/images/a.jpg
6.2、注意
①、autoindex on; 顯示文件下下的文件列表
②、expires;
expires來讓客戶端緩存不常改變的數據
expires 30s; ##表示把數據緩存30秒
expires 30m; ##表示把數據緩存30分
expires 10h; ##表示把數據緩存10小時
expires 1d; ##表示把數據緩存1天
location /images/{
root /data/;
index index.html index.htm;
expires 1d;
}
location /html/ {
root /data/;
autoindex on;
}