Docker部署Nginx反向代理的坑與解決方案實(shí)戰(zhàn)記錄
前言
大家購(gòu)買域名的第一件事肯定是想讓自己網(wǎng)站的訪問(wèn)地址變得好看一點(diǎn),我的想法也的確如此,我就會(huì)用Nginx的反向代理來(lái)部署我的域名信息
不過(guò)我在Linux宿主機(jī)上部署沒(méi)那么多問(wèn)題,在Docker上部署Nginx的時(shí)候需要考慮環(huán)境隔離、端口映射等因素,這里還是有比較多的坑,所以今天就給大家分享一下在Docker上部署Nginx實(shí)現(xiàn)反向代理的過(guò)程
一、前期準(zhǔn)備
1、購(gòu)買域名:可以去阿里云、騰訊云等各大廠商購(gòu)買對(duì)應(yīng)的域名,這里大家自行去購(gòu)買即可
2、域名備案:購(gòu)買好域名之后要進(jìn)行備案,但是備案有個(gè)前提條件,比如你在阿里云購(gòu)買的域名,你需要在阿里云有一臺(tái)大于一個(gè)月有效時(shí)間的云服務(wù)器,各大廠商也有對(duì)應(yīng)的學(xué)生優(yōu)惠,大家也可自行選擇(這里估計(jì)得要一個(gè)星期)
3、域名解析:域名備案完成后你就可以對(duì)其進(jìn)行解析,比如解析成www.abc.com這種前綴不同的,記錄類型選擇A,記錄值填對(duì)應(yīng)的服務(wù)器IP即可
4、SSL證書申請(qǐng):域名解析完成后就去申請(qǐng)對(duì)應(yīng)的SSL證書,這個(gè)證書信息在Nginx實(shí)現(xiàn)反向代理需要用到的,一般幾分鐘就能簽發(fā)成功,簽發(fā)成功后點(diǎn)擊下載,服務(wù)類型選擇Nginx的即可
5、上傳證書:在服務(wù)器中新建一個(gè)cert的文件夾,然后將剛才下載好的證書信息上傳到該文件夾下
前期準(zhǔn)備完成!
二、準(zhǔn)備后端服務(wù)
我們需要啟動(dòng)一個(gè)后端的服務(wù)用來(lái)驗(yàn)證結(jié)果,我這里就準(zhǔn)備了一個(gè)簡(jiǎn)單的demo來(lái)測(cè)試,實(shí)際的可以根據(jù)自己的來(lái)

在本地我們可以通過(guò)java -jar xxx.jar命令運(yùn)行jar來(lái)查看效果

能夠看到運(yùn)行之后沒(méi)啥問(wèn)題,然后將jar包上傳到服務(wù)器上,如何運(yùn)行這里就不演示了,需要在服務(wù)器上啟動(dòng)一個(gè)后端的服務(wù),后面配置的時(shí)候會(huì)用到
三、實(shí)戰(zhàn)部署
1、安裝Docker
由于要使用 Docker 進(jìn)行 Nginx 的部署,首先需要在系統(tǒng)上安裝 Docker。本文以 CentOS 7.9 操作系統(tǒng)為例,可按照以下方式進(jìn)行安裝。
2、啟動(dòng)臨時(shí)容器
首先需要啟動(dòng)一個(gè)臨時(shí)的Nginx容器,將容器中的nginx.conf等配置文件拷貝到宿主機(jī)中,方便我們?cè)诤竺鎸?duì)數(shù)據(jù)掛載進(jìn)行操作
# 1、拉取Nginx最新鏡像
docker pull nginx
# 2、啟動(dòng)Nginx容器
docker run -d --name nginx -p 80:80 nginx
# 3、拷貝文件
docker cp nginx:/etc/nginx/nginx.conf /project/nginx/conf
docker cp nginx:/etc/nginx/conf.d/default.conf /project/nginx/conf.d
# 4、刪除Nginx臨時(shí)容器
docker rm -f nginx
# 5、賦予宿主機(jī)對(duì)配置文件的操作權(quán)限
chmod 777 /youpath/nginx/{html,logs,conf.d/default.conf,conf/nginx.conf}
# 6、將ssl證書信息拷貝到容器內(nèi)(這一步放到啟動(dòng)正式容器后做)
docker cp /youpath/nginx/cert nginx:/etc/nginx/cert
3、啟動(dòng)正式容器
現(xiàn)在我們有了配置文件之后就可以進(jìn)行文件掛載啟動(dòng)容器了,用下面的命令啟動(dòng)一個(gè)Nginx容器
-d:表示容器后臺(tái)運(yùn)行-p:端口映射,前面的是宿主機(jī)的端口,后面的是容器內(nèi)的端口,表示容器內(nèi)的80端口映射到宿主機(jī)的80端口上--name:表示啟動(dòng)容器的名稱-v:表示數(shù)據(jù)卷掛載,:前面的是宿主機(jī)上的文件**(根據(jù)自己的來(lái))**,:后面的是容器內(nèi)的文件,這樣我們?cè)谒拗鳈C(jī)上修改文件的內(nèi)容時(shí),容器內(nèi)的文件也會(huì)發(fā)生響應(yīng)的變化
docker run -d -p 80:80 --name nginx \ -v /youpath/nginx/logs:/var/log/nginx \ -v /youpath/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \ -v /youpath/nginx/conf.d/default.conf:/etc/nginx/conf.d/default.conf \ nginx
啟動(dòng)成功后我們可以用docker ps命令可以查看到運(yùn)行的Nginx容器了,并且/youpath/nginx下面也有對(duì)應(yīng)的文件
我們可以在瀏覽器用服務(wù)器ip來(lái)查看效果,默認(rèn)會(huì)訪問(wèn)/usr/share/html下面的靜態(tài)文件

404是因?yàn)?usr/share/html下面沒(méi)有文件
4、 編輯nginx.conf文件
在
/youpath/nginx/conf文件夾下,編輯 nginx.conf 文件,在文件的http下添加以下配置:
server {
listen 80;
server_name www.abc.test;
location / {
proxy_pass: http:127.0.0.1:8080/;
};
}
上面那段配置的意思就是,將來(lái)自 www.abc.test 域名的 HTTP 請(qǐng)求轉(zhuǎn)發(fā)到本地(服務(wù)器)運(yùn)行在端口 8080 的應(yīng)用
配置完成之后我們用docker restart <nginx容器名或ID>重啟Nginx容器使配置生效。
訪問(wèn)不通的問(wèn)題及解決方法
重啟完成后我們?cè)跒g覽器中訪問(wèn)www.abc.test,可以發(fā)現(xiàn)訪問(wèn)不通
這是因?yàn)镈ocker啟動(dòng)的容器是環(huán)境隔離的,訪問(wèn)www.abc.test的時(shí)候不會(huì)轉(zhuǎn)發(fā)到服務(wù)器上的8080端口,而是會(huì)轉(zhuǎn)發(fā)到nginx容器的8080端口,但是后端服務(wù)是啟動(dòng)在服務(wù)器上的,所以就訪問(wèn)不通了
# 我們需要將127.0.0.1修改成服務(wù)器的ip地址,這樣就直接會(huì)去訪問(wèn)服務(wù)器上運(yùn)行的8080端口的服務(wù)了
server {
listen 80;
server_name www.abc.test;
location / {
proxy_pass: http:<服務(wù)器ip>:8080/;
};
}
修改完成后我們?cè)俅沃貑ginx容器,然后在瀏覽器上用剛剛的方式進(jìn)行訪問(wèn),可以看到訪問(wèn)成功了

5、修配置域名證書信息
1. 修改 nginx.conf 配置文件,添加 SSL 證書相關(guān)配置:
server {
listen 443 ssl;
server_name www.abc.test; #修改成自己的
ssl_certificate /etc/nginx/cert/www.abc.test_bundle.crt; #修改成自己的
ssl_certificate_key /etc/nginx/cert/www.abc.test.key; #修改成自己的
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
location / {
proxy_pass http://<服務(wù)器>:8080; #修改成自己的
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
修改完成后重啟Nginx容器,在瀏覽器用https://www.abc.test的形式去訪問(wèn)

可以看到訪問(wèn)不通,這是為啥呢,明明證書信息沒(méi)錯(cuò),域名和代理地址都寫對(duì)了,為啥就是訪問(wèn)不通呢
2. 訪問(wèn)不通的問(wèn)題及解決方法
修改完成后重啟 Nginx 容器,在瀏覽器中用https://www.abc.test的形式去訪問(wèn),可能會(huì)出現(xiàn)訪問(wèn)不通的情況??赡艿脑蛴幸韵聨c(diǎn):
1、域名未解析到云服務(wù)器的 IP:檢查域名解析記錄,確保域名已正確解析到云服務(wù)器 IP。
2、服務(wù)器防火墻未開啟 443 端口:使用systemctl status firewalld查看防火墻開啟狀態(tài),若未開啟 443 端口,需開啟后再嘗試。
3、安全組未開啟:安全組是一種虛擬防火墻,用于設(shè)置云服務(wù)器、負(fù)載均衡、云數(shù)據(jù)庫(kù)等實(shí)例的網(wǎng)絡(luò)訪問(wèn)控制。默認(rèn)情況下為關(guān)閉狀態(tài),需開啟服務(wù)器的安全組設(shè)置后再嘗試。
4、Nginx容器未映射443端口(本文作者遇到的情況):因?yàn)槲覀冊(cè)贜ginx上監(jiān)聽了443端口,客戶端訪問(wèn)域名的時(shí)候會(huì)先走到Nginx這里,然后通過(guò)方向代理到proxy_pass的地址,但由于我們沒(méi)有開啟443的端口,所以訪問(wèn)不了
如果是第四種原因的話就先刪除容器,然后用以下的命令重新運(yùn)行容器
docker run -d -p 80:80 -p 443:443 --name nginx \ -v /project/nginx/logs:/var/log/nginx \ -v /project/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \ -v /project/nginx/conf.d/default.conf:/etc/nginx/conf.d/default.conf \ nginx
重啟完成后,再次用 https 訪問(wèn),此時(shí)應(yīng)該可以訪問(wèn)成功。

四、總結(jié)
通過(guò)以上步驟,我們成功地在 Docker 上部署了 Nginx 實(shí)現(xiàn)反向代理,并解決了過(guò)程中遇到的各種問(wèn)題。在實(shí)際操作中,可能會(huì)遇到不同的情況,但只要按照上述方法進(jìn)行排查和解決,相信大家都能順利完成部署。希望本文能對(duì)大家在 Docker 上部署 Nginx 反向代理提供有益的參考。
附:常見報(bào)錯(cuò)及解決方法
1. 502 Bad Gateway
原因:Nginx無(wú)法連接到后端服務(wù),可能是后端服務(wù)未啟動(dòng)或網(wǎng)絡(luò)配置錯(cuò)誤。
解決方法:
確保后端服務(wù)正在運(yùn)行,并且可以通過(guò)指定的地址和端口訪問(wèn)。
檢查Nginx配置文件中的
proxy_pass是否正確。使用
docker logs查看Nginx容器的日志,確認(rèn)具體的錯(cuò)誤信息。
2. 404 Not Found
原因:請(qǐng)求的資源未找到,可能是路徑配置錯(cuò)誤或后端服務(wù)未正確返回內(nèi)容。
解決方法:
檢查
location塊的路徑是否與后端服務(wù)的路徑一致。確保后端服務(wù)返回的內(nèi)容路徑正確。可以嘗試直接訪問(wèn)后端服務(wù)的地址,確認(rèn)是否能正常返回內(nèi)容。
3. SSL證書問(wèn)題
原因:如果使用了SSL證書,但證書路徑或證書內(nèi)容不正確,可能會(huì)導(dǎo)致連接失敗。
解決方法:
確保SSL證書和密鑰文件的路徑正確,并且文件內(nèi)容無(wú)誤。
在Nginx配置文件中正確配置
ssl_certificate和ssl_certificate_key的路徑。
4. 權(quán)限問(wèn)題
原因:Nginx容器可能沒(méi)有足夠的權(quán)限訪問(wèn)掛載的配置文件或目錄。
解決方法:
確保掛載的目錄和文件的權(quán)限正確??梢允褂靡韵旅钫{(diào)整權(quán)限:
sudo chown -R 101:101 /path/to/your/conf.d sudo chown -R 101:101 /path/to/your/ssl
5. Docker網(wǎng)絡(luò)問(wèn)題
原因:如果后端服務(wù)和Nginx容器不在同一個(gè)網(wǎng)絡(luò)中,可能會(huì)導(dǎo)致連接失敗。
解決方法:
使用Docker Compose時(shí),確保所有服務(wù)都在同一個(gè)網(wǎng)絡(luò)中。例如:
yaml復(fù)制
version: '3'
services:
nginx:
image: custom-nginx-proxy
ports:
- "80:80"
networks:
- my-network
backend:
image: your-backend-image
networks:
- my-network
networks:
my-network:
driver: bridge到此這篇關(guān)于Docker部署Nginx反向代理的坑與解決方案的文章就介紹到這了,更多相關(guān)Docker部署Nginx反向代理內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
基于spring-boot和docker-java實(shí)現(xiàn)對(duì)docker容器的動(dòng)態(tài)管理和監(jiān)控功能[附完整源碼下載]
Docker 是一個(gè)開源的應(yīng)用容器引擎,和傳統(tǒng)的虛擬機(jī)技術(shù)相比,Docker 容器性能開銷極低,因此也廣受開發(fā)者喜愛。這篇文章主要介紹了基于spring-boot和docker-java實(shí)現(xiàn)對(duì)docker容器的動(dòng)態(tài)管理和監(jiān)控 ,需要的朋友可以參考下2019-06-06
WIN10系統(tǒng)和Docker內(nèi)部容器IP互通方式
這篇文章主要介紹了WIN10系統(tǒng)和Docker內(nèi)部容器IP互通方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-11-11
docker實(shí)現(xiàn)跨宿主機(jī)的容器之間網(wǎng)絡(luò)互聯(lián)
本文主要介紹了docker實(shí)現(xiàn)跨宿主機(jī)的容器之間網(wǎng)絡(luò)互聯(lián),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-01-01

