只需三步,使用Docker創(chuàng)建Nginx反向代理
在Web架構(gòu)中,敏捷性和可伸縮性是必不可少的,在管理服務(wù)的同時(shí)也需要保證最佳性能。
為了達(dá)到這一目標(biāo),可以使用反向代理。反向代理非常靈活,可簡化客戶端和服務(wù)器之間的交互和通信。
如圖所示,反向代理就像大樓里的接待員,該大樓有各個(gè)部門和區(qū)域。接待員成功地將客戶或訪客重定向到適當(dāng)?shù)牟块T。他們負(fù)責(zé)指引訪客,處理查詢,并確保各個(gè)部門之間的分發(fā)。
圖片
反向代理的用途包括:
- 用于可伸縮性的負(fù)載均衡。
- 終止SSL和TLS。
- 將子域映射到特定路徑。
本文將使用Nginx和Docker容器來設(shè)置反向代理。
第1步,創(chuàng)建應(yīng)用程序
下載完整代碼(https://github.com/DiptoChakrabarty/nginx-reverse-proxy)。
我們從構(gòu)建作為代理的應(yīng)用程序開始。
編寫Docker文件,在訪問此應(yīng)用程序的/端點(diǎn)時(shí)顯示一個(gè)簡單的HTML頁面。
FROM nginx:stable-alpine
COPY index.html /usr/share/nginx/html/index.html
index.html文件如下:
<h1>This is the main app</h1>
編寫一個(gè)簡單的Docker Compose文件,來運(yùn)行這個(gè)應(yīng)用程序。
version : '3.7'
services :
web:
build: .
ports:
- "8080:80"
通過運(yùn)行以下命令啟動Docker Compose:
docker-compose up
訪問localhost:8080,應(yīng)該能夠看到以下內(nèi)容。
圖片
以類似的方式創(chuàng)建兩個(gè)不同的應(yīng)用程序,使用兩個(gè)HTML文件和相同的Dockerfile。
This is html file for app1
<h1>This is APP 1</h1>
This is html file for app2
<h1>This is APP 2</h1>
修改Docker Compose文件以啟動這兩個(gè)容器:
version : '3.7'
services :
web:
build: .
ports:
- "8080:80"
restart: always
app1:
build: ./app1/
ports:
- "8085:80"
restart: always
app2:
build: ./app2
ports:
- "8010:80"
restart: always
訪問端口8085和8010時(shí),可以看到如下內(nèi)容:
圖片
第2步,編寫Nginx配置
編寫Nginx配置文件,以在訪問/app時(shí),在app1和app2之間進(jìn)行代理,而在/端點(diǎn)上只顯示主頁面。
Nginx配置如下所示:
worker_processes 1; ## Default: 1
worker_rlimit_nofile 8192;
http {
upstream cloud_server_com {
server app1:80;
server app2:80;
}
server {
listen 80;
location /app/ {
proxy_pass http://cloud_server_com/;
}
location / {
root /usr/share/nginx/html;
index index.html;
}
}
}
配置文件定義了組合在一起的服務(wù)器組。在這里,我們指定了在Docker Compose文件中定義的容器名稱及其端口號。
location幫助Nginx定義如何處理特定端點(diǎn)的請求。/app/將請求發(fā)送到cloud_server_com上游,而cloud_server_com就是兩個(gè)應(yīng)用程序的容器。
proxy_pass確定了請求將被重定向到哪里。
現(xiàn)在,Docker Compose文件需要能夠讀取此配置,因此需要修改Compose文件,如下所示:
version : '3.7'
services :
web:
build: .
ports:
- "8080:80"
volumes:
- ./config/nginx.conf:/etc/nginx/nginx.conf
restart: always
app1:
build: ./app1/
ports:
- "8085:80"
restart: always
app2:
build: ./app2
ports:
- "8010:80"
restart: always
第3步,運(yùn)行容器
運(yùn)行docker-compose up命令,然后在瀏覽器中查看反向代理的工作原理。
這是在/端點(diǎn)上運(yùn)行的主應(yīng)用程序:
圖片
但是,在訪問/app/端點(diǎn)時(shí),它返回兩個(gè)不同的服務(wù)器,代理逐個(gè)發(fā)送請求到app1和app2。