上次分享了怎么用docker創(chuàng)建nginx服務(wù) 說到nginx 我們往往都會用到nginx的兩個重要功能钧大,反向代理和負載均衡激才,今天我來和大家分享一下Nginx的反向代理和負載均衡
什么是反向代理劣挫?
說到反向代理东帅,大家一般都會提一下:正向代理,正向代理就是代理帐我,比如我們寫爬蟲的時候IP被封拦键、Google的時候404,這個時候我們都會用到代理芬为,你可以把代理理解成一個跳板媚朦,我們的電腦不能訪問Google,那我們就去訪問能訪問Google的服務(wù)器日戈,一般我都是在這兩種情況下使用代理浙炼,可能有更高深的用法,具體我也沒用過半火。 說完代理季俩,就來說一下我們今天的主角--反向代理
定義
反向代理(Reverse Proxy)方式是指以代理服務(wù)器來接受internet上的連接請求酌住,然后將請求轉(zhuǎn)發(fā)給內(nèi)部網(wǎng)絡(luò)上的服務(wù)器,并將從服務(wù)器上得到的結(jié)果返回給internet上請求連接的客戶端消痛,此時代理服務(wù)器對外就表現(xiàn)為一個反向代理服務(wù)器
功能
對客戶端隱藏服務(wù)器的IP地址 通過緩存靜態(tài)資源秩伞,加速Web請求 更安全,因為任何來自Internet的請求都必須先經(jīng)過代理服務(wù)器展氓,可以在這里做防護(例如ip過濾)
實現(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)容時脸爱,大多人可能還是不明白 簡單點說就是你有A、B兩臺服務(wù)器空入,這兩臺服務(wù)器上都放著你的代碼歪赢,當(dāng)用戶訪問你的內(nèi)容時导梆,會訪問A服務(wù)器,A服務(wù)器再去請求B內(nèi)容返回給用戶递鹉,用戶不知道請求的是B躏结,這樣就是實現(xiàn)了反向代理
下面我們通過以下簡單的幾步演示一下反向代理
通過上一篇的Docker創(chuàng)建Nginx服務(wù)媳拴,我們可以快速創(chuàng)建3個nginx服務(wù)兆览,來模擬3臺服務(wù)器
- 首先創(chuàng)建一個nginx的配置文件
#創(chuàng)建 nginx配置文件
touch nginx.conf
# 創(chuàng)建a、b子巾、c三個文件夾存放項目
mkdir a b c
- 編寫Nginx配置文件
# Nginx的配置文件,這里主要作用是為了指定端口和項目路徑
events {
#每個工作進程的并發(fā)連接數(shù)
worker_connections 1024;
}
http {
server {
#監(jiān)聽端口
listen 80;
#綁定域名
server_name localhost;
#項目路徑
root /nginx/share/nginx/html;
}
}
- 啟動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端口映射到宿主機的8080端口
-v $PWD/a.conf:/etc/nginx/nginx.conf
將宿主機中當(dāng)前目錄下的a.conf掛載到容器的/etc/nginx/nginx.conf
-v $PWD:/a 將主機中當(dāng)前目錄a掛載到容器的/usr/share/nginx/html
--name 容器的名稱
-d 后臺運行容器线梗,并返回容器ID
- 判斷Nginx是否啟動成功
docker ps -a 查看容器是否成功啟動
或者
curl 127.0.0.1
curl 127.0.0.1:8081
curl 127.0.0.1:8082
- 修改配置文件
events {
#每個工作進程的并發(fā)連接數(shù)
worker_connections 1024;
}
http {
server {
#監(jiān)聽端口
listen 80;
#綁定域名
server_name localhost;
#項目路徑
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
}
}
}
這個時候就我們就已經(jīng)實現(xià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
今天的另外一個主角是負載均衡
什么是負載均衡 很多新手在聽說負載均衡的時候蜻牢,都會感覺是很高深莫測偏陪,其實實現(xiàn)起來也不難竹挡, 下面我們修改配置實現(xiàn)一個簡單的負載均衡
首先來了解一下負載均衡
定義
用來在多個計算機立膛、網(wǎng)絡(luò)連接宝泵、CPU儿奶、磁盤驅(qū)動器或其他資源中分配負載鳄抒,以達到最優(yōu)化資源使用、最大化吞吐率瓤鼻、最小化響應(yīng)時間茬祷、同時避免過載的目的并蝗。 使用帶有負載平衡的多個服務(wù)器組件,取代單一的組件沃粗,可以通過冗余提高可靠性
功能
將流量分配給多個應(yīng)用程序服務(wù)器最盅,提高Web應(yīng)用程序的可伸縮性和可靠性
實現(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;
}
}
}
對于上面的很官方定義檩禾,我再用大白話解釋一下盼产, 將用戶的請求分配到壓力小的服務(wù)器上勺馆,從而減輕服務(wù)器壓力
下面我們通過簡單的Demo演示一下負載均衡
修改剛才的配置文件nginx.conf
events {
#每個工作進程的并發(fā)連接數(shù)
worker_connections 1024;
}
http {
#定義負載均衡設(shè)備的 Ip及設(shè)備狀態(tài)
upstream myServer {
server 127.0.0.1:8081;
server 127.0.0.1:8082;
}
server {
#監(jiān)聽端口
listen 80;
#綁定域名
server_name localhost;
#項目路徑
root /nginx/share/nginx/html;
location / {
proxy_pass http://myServer;
}
}
}
打開瀏覽器輸入http://127.0.0.1 我們刷新瀏覽器,就輸出this is b或者this is a
到這里反向代理和負載均衡的基本配置就分享完了搓译。
但是機智的你可能會發(fā)提出一些疑問些己,通過負載均衡嘿般,用戶訪問到B服務(wù)器時,下次刷新又去訪問C服務(wù)器逼庞,能不能還繼續(xù)訪問A服務(wù)器赛糟。當(dāng)然Nginx提供了方法 具體配置內(nèi)容如下
upstream myServer {
#weight 指定輪詢幾率砸逊,如果現(xiàn)在有5個請求,
#有4個會請求到B服務(wù)器上穆咐,1個請求到C服務(wù)器上对湃,
#一般我們會把服務(wù)器配置比較高的權(quán)重加大
server b.com weight=4;
server c.com;
#通過客戶端的IP地址拍柒,確定下一個請求應(yīng)該選擇哪個服務(wù)器
ip_hash;
}
本次主要分享了Nginx的反向代理和負載均衡拆讯,當(dāng)然种呐,分享的內(nèi)容還是比較基礎(chǔ),Nginx雖然體積不大爽室,但是功能很全面阔墩,更多模塊和配置文件可以去查看官方文檔
注意事項
- 如果 nginx沒有開啟熱更新啸箫,修改配置文件一定要重啟
#docker 容器的重啟命令
docker restart id(容器ID)
#不是使用docker安裝的nginx
service nginx restart
- 反向代理中nginx的配置 proxy_pass
location /c {
#如果是綁定目錄,這里的rewrite一定要寫
rewrite ^/c(.*) /$1 break;
# docker容器中這里一定要填寫本機的ip地址蝉娜,不能填寫127.0.0.1
proxy_pass http://117.189.124.134:8082;
}
總結(jié):Nginx的反向代理蜀肘、負載均衡配置還是比較簡單的,主要用到proxy_pass和upstream西乖,避免上述幾個坑,應(yīng)該沒有什么問題获雕,本人對Nginx只是屬于入門階段薄腻,如有錯誤,歡迎指正