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

在本地我們可以通過java -jar xxx.jar命令運行jar來查看效果

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

404是因為/usr/share/html下面沒有文件
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/;
};
}
上面那段配置的意思就是,將來自 www.abc.test 域名的 HTTP 請求轉(zhuǎn)發(fā)到本地(服務器)運行在端口 8080 的應用
配置完成之后我們用docker restart <nginx容器名或ID>重啟Nginx容器使配置生效。
訪問不通的問題及解決方法
重啟完成后我們在瀏覽器中訪問www.abc.test,可以發(fā)現(xiàn)訪問不通
這是因為Docker啟動的容器是環(huán)境隔離的,訪問www.abc.test的時候不會轉(zhuǎn)發(fā)到服務器上的8080端口,而是會轉(zhuǎn)發(fā)到nginx容器的8080端口,但是后端服務是啟動在服務器上的,所以就訪問不通了
# 我們需要將127.0.0.1修改成服務器的ip地址,這樣就直接會去訪問服務器上運行的8080端口的服務了
server {
listen 80;
server_name www.abc.test;
location / {
proxy_pass: http:<服務器ip>:8080/;
};
}
修改完成后我們再次重啟Nginx容器,然后在瀏覽器上用剛剛的方式進行訪問,可以看到訪問成功了

5、修配置域名證書信息
1. 修改 nginx.conf 配置文件,添加 SSL 證書相關配置:
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://<服務器>: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的形式去訪問

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

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

