上次分享了怎么用docker創(chuàng)建nginx服務(wù) 說(shuō)到nginx 我們往往都會(huì)用到nginx的兩個(gè)重要功能,反向代理和負(fù)載均衡,今天我來(lái)和大家分享一下Nginx的反向代理和負(fù)載均衡
什么是反向代理?
說(shuō)到反向代理,大家一般都會(huì)提一下:正向代理,正向代理就是代理,比如我們寫(xiě)爬蟲(chóng)的時(shí)候IP被封、Google的時(shí)候404,這個(gè)時(shí)候我們都會(huì)用到代理,你可以把代理理解成一個(gè)跳板,我們的電腦不能訪問(wèn)Google,那我們就去訪問(wèn)能訪問(wèn)Google的服務(wù)器,一般我都是在這兩種情況下使用代理,可能有更高深的用法,具體我也沒(méi)用過(guò)。 說(shuō)完代理,就來(lái)說(shuō)一下我們今天的主角--反向代理
定義
反向代理(Reverse Proxy)方式是指以代理服務(wù)器來(lái)接受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ù)器
功能
對(duì)客戶端隱藏服務(wù)器的IP地址 通過(guò)緩存靜態(tài)資源,加速Web請(qǐng)求 更安全,因?yàn)槿魏蝸?lái)自Internet的請(qǐng)求都必須先經(jīng)過(guò)代理服務(wù)器,可以在這里做防護(hù)(例如ip過(guò)濾)
實(shí)現(xiàn)方法:
location / {
proxy_pass_header Server;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Scheme $scheme;
proxy_pass http://abc.com;
}
第一次看到上面這些內(nèi)容時(shí),大多人可能還是不明白 簡(jiǎn)單點(diǎn)說(shuō)就是你有A、B兩臺(tái)服務(wù)器,這兩臺(tái)服務(wù)器上都放著你的代碼,當(dāng)用戶訪問(wèn)你的內(nèi)容時(shí),會(huì)訪問(wèn)A服務(wù)器,A服務(wù)器再去請(qǐng)求B內(nèi)容返回給用戶,用戶不知道請(qǐng)求的是B,這樣就是實(shí)現(xiàn)了反向代理
下面我們通過(guò)以下簡(jiǎn)單的幾步演示一下反向代理
通過(guò)上一篇的Docker創(chuàng)建Nginx服務(wù),我們可以快速創(chuàng)建3個(gè)nginx服務(wù),來(lái)模擬3臺(tái)服務(wù)器
- 首先創(chuàng)建一個(gè)nginx的配置文件
#創(chuàng)建 nginx配置文件
touch nginx.conf
# 創(chuàng)建a、b、c三個(gè)文件夾存放項(xiàng)目
mkdir a b c
- 編寫(xiě)Nginx配置文件
# Nginx的配置文件,這里主要作用是為了指定端口和項(xiàng)目路徑
events {
#每個(gè)工作進(jìn)程的并發(fā)連接數(shù)
worker_connections 1024;
}
http {
server {
#監(jiān)聽(tīng)端口
listen 80;
#綁定域名
server_name localhost;
#項(xiàng)目路徑
root /nginx/share/nginx/html;
}
}
- 啟動(dòng)Nignx服務(wù)
#創(chuàng)建a容器
docker run -p 80:80 -v $PWD/nginx/nginx.conf:/etc/nginx/nginx.conf
-v $PWD/html/a:/usr/share/nginx/html --name a-server -d nginx
#創(chuàng)建b容器
docker run -p 80:8081 -v $PWD/html/b:/usr/share/nginx/html
--name b-server -d nginx
#創(chuàng)建c容器
docker run -p 80:8082 -v $PWD/html/c:/usr/share/nginx/html
--name c-server -d nginx
#參數(shù)解釋
-p 8080:80 將容器的80端口映射到宿主機(jī)的8080端口
-v $PWD/a.conf:/etc/nginx/nginx.conf
將宿主機(jī)中當(dāng)前目錄下的a.conf掛載到容器的/etc/nginx/nginx.conf
-v $PWD:/a 將主機(jī)中當(dāng)前目錄a掛載到容器的/usr/share/nginx/html
--name 容器的名稱
-d 后臺(tái)運(yùn)行容器,并返回容器ID
- 判斷Nginx是否啟動(dòng)成功
docker ps -a 查看容器是否成功啟動(dòng)
或者
curl 127.0.0.1
curl 127.0.0.1:8081
curl 127.0.0.1:8082
- 修改配置文件
events {
#每個(gè)工作進(jìn)程的并發(fā)連接數(shù)
worker_connections 1024;
}
http {
server {
#監(jiān)聽(tīng)端口
listen 80;
#綁定域名
server_name localhost;
#項(xiàng)目路徑
root /nginx/share/nginx/html;
# 反向代理
location /b {
rewrite ^/b(.*) /$1 break;
proxy_pass http://127.0.0.1:8081
}
# 反向代理
location /c {
rewrite ^/c(.*) /$1 break;
proxy_pass http://127.0.0.1:8082
}
}
}
這個(gè)時(shí)候就我們就已經(jīng)實(shí)現(xiàn)了方向代理,可以在瀏覽器中訪問(wèn)
http://127.0.0.1 輸出this is a
http://127.0.0.1/b 輸出 this is b
http://127.0.0.1/c 輸出 this is c
今天的另外一個(gè)主角是負(fù)載均衡
什么是負(fù)載均衡 很多新手在聽(tīng)說(shuō)負(fù)載均衡的時(shí)候,都會(huì)感覺(jué)是很高深莫測(cè),其實(shí)實(shí)現(xiàn)起來(lái)也不難, 下面我們修改配置實(shí)現(xiàn)一個(gè)簡(jiǎn)單的負(fù)載均衡
首先來(lái)了解一下負(fù)載均衡
定義
用來(lái)在多個(gè)計(jì)算機(jī)、網(wǎng)絡(luò)連接、CPU、磁盤(pán)驅(qū)動(dòng)器或其他資源中分配負(fù)載,以達(dá)到最優(yōu)化資源使用、最大化吞吐率、最小化響應(yīng)時(shí)間、同時(shí)避免過(guò)載的目的。 使用帶有負(fù)載平衡的多個(gè)服務(wù)器組件,取代單一的組件,可以通過(guò)冗余提高可靠性
功能
將流量分配給多個(gè)應(yīng)用程序服務(wù)器,提高Web應(yīng)用程序的可伸縮性和可靠性
實(shí)現(xiàn)方法
http {
upstream myServer {
server 127.0.0.1:8081;
server 127.0.0.1:8082;
}
server {
listen 80;
location / {
proxy_pass http://myServer;
}
}
}
對(duì)于上面的很官方定義,我再用大白話解釋一下, 將用戶的請(qǐng)求分配到壓力小的服務(wù)器上,從而減輕服務(wù)器壓力
下面我們通過(guò)簡(jiǎn)單的Demo演示一下負(fù)載均衡
修改剛才的配置文件nginx.conf
events {
#每個(gè)工作進(jìn)程的并發(fā)連接數(shù)
worker_connections 1024;
}
http {
#定義負(fù)載均衡設(shè)備的 Ip及設(shè)備狀態(tài)
upstream myServer {
server 127.0.0.1:8081;
server 127.0.0.1:8082;
}
server {
#監(jiān)聽(tīng)端口
listen 80;
#綁定域名
server_name localhost;
#項(xiàng)目路徑
root /nginx/share/nginx/html;
location / {
proxy_pass http://myServer;
}
}
}
打開(kāi)瀏覽器輸入http://127.0.0.1 我們刷新瀏覽器,就輸出this is b或者this is a
到這里反向代理和負(fù)載均衡的基本配置就分享完了。
但是機(jī)智的你可能會(huì)發(fā)提出一些疑問(wèn),通過(guò)負(fù)載均衡,用戶訪問(wèn)到B服務(wù)器時(shí),下次刷新又去訪問(wèn)C服務(wù)器,能不能還繼續(xù)訪問(wèn)A服務(wù)器。當(dāng)然Nginx提供了方法 具體配置內(nèi)容如下
upstream myServer {
#weight 指定輪詢幾率,如果現(xiàn)在有5個(gè)請(qǐng)求,
#有4個(gè)會(huì)請(qǐng)求到B服務(wù)器上,1個(gè)請(qǐng)求到C服務(wù)器上,
#一般我們會(huì)把服務(wù)器配置比較高的權(quán)重加大
server b.com weight=4;
server c.com;
#通過(guò)客戶端的IP地址,確定下一個(gè)請(qǐng)求應(yīng)該選擇哪個(gè)服務(wù)器
ip_hash;
}
本次主要分享了Nginx的反向代理和負(fù)載均衡,當(dāng)然,分享的內(nèi)容還是比較基礎(chǔ),Nginx雖然體積不大,但是功能很全面,更多模塊和配置文件可以去查看官方文檔
注意事項(xiàng)
- 如果 nginx沒(méi)有開(kāi)啟熱更新,修改配置文件一定要重啟
#docker 容器的重啟命令
docker restart id(容器ID)
#不是使用docker安裝的nginx
service nginx restart
- 反向代理中nginx的配置 proxy_pass
location /c {
#如果是綁定目錄,這里的rewrite一定要寫(xiě)
rewrite ^/c(.*) /$1 break;
# docker容器中這里一定要填寫(xiě)本機(jī)的ip地址,不能填寫(xiě)127.0.0.1
proxy_pass http://117.189.124.134:8082;
}
總結(jié):Nginx的反向代理、負(fù)載均衡配置還是比較簡(jiǎn)單的,主要用到proxy_pass和upstream,避免上述幾個(gè)坑,應(yīng)該沒(méi)有什么問(wèn)題,本人對(duì)Nginx只是屬于入門(mén)階段,如有錯(cuò)誤,歡迎指正