Docker部署Nginx反向代理的坑與解決方案實戰(zhàn)記錄
前言
大家購買域名的第一件事肯定是想讓自己網(wǎng)站的訪問地址變得好看一點,我的想法也的確如此,我就會用Nginx的反向代理來部署我的域名信息
不過我在Linux宿主機(jī)上部署沒那么多問題,在Docker上部署Nginx的時候需要考慮環(huán)境隔離、端口映射等因素,這里還是有比較多的坑,所以今天就給大家分享一下在Docker上部署Nginx實現(xiàn)反向代理的過程
一、前期準(zhǔn)備
1、購買域名:可以去阿里云、騰訊云等各大廠商購買對應(yīng)的域名,這里大家自行去購買即可
2、域名備案:購買好域名之后要進(jìn)行備案,但是備案有個前提條件,比如你在阿里云購買的域名,你需要在阿里云有一臺大于一個月有效時間的云服務(wù)器,各大廠商也有對應(yīng)的學(xué)生優(yōu)惠,大家也可自行選擇(這里估計得要一個星期)
3、域名解析:域名備案完成后你就可以對其進(jìn)行解析,比如解析成www.abc.com
這種前綴不同的,記錄類型選擇A
,記錄值填對應(yīng)的服務(wù)器IP即可
4、SSL證書申請:域名解析完成后就去申請對應(yīng)的SSL證書,這個證書信息在Nginx實現(xiàn)反向代理需要用到的,一般幾分鐘就能簽發(fā)成功,簽發(fā)成功后點擊下載,服務(wù)類型選擇Nginx
的即可
5、上傳證書:在服務(wù)器中新建一個cert
的文件夾,然后將剛才下載好的證書信息上傳到該文件夾下
前期準(zhǔn)備完成!
二、準(zhǔn)備后端服務(wù)
我們需要啟動一個后端的服務(wù)用來驗證結(jié)果,我這里就準(zhǔn)備了一個簡單的demo來測試,實際的可以根據(jù)自己的來
在本地我們可以通過java -jar xxx.jar
命令運(yùn)行jar來查看效果
能夠看到運(yùn)行之后沒啥問題,然后將jar包上傳到服務(wù)器上,如何運(yùn)行這里就不演示了,需要在服務(wù)器上啟動一個后端的服務(wù),后面配置的時候會用到
三、實戰(zhàn)部署
1、安裝Docker
由于要使用 Docker 進(jìn)行 Nginx 的部署,首先需要在系統(tǒng)上安裝 Docker。本文以 CentOS 7.9
操作系統(tǒng)為例,可按照以下方式進(jìn)行安裝。
2、啟動臨時容器
首先需要啟動一個臨時的Nginx容器,將容器中的nginx.conf
等配置文件拷貝到宿主機(jī)中,方便我們在后面對數(shù)據(jù)掛載進(jìn)行操作
# 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、賦予宿主機(jī)對配置文件的操作權(quán)限 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)在我們有了配置文件之后就可以進(jìn)行文件掛載啟動容器了,用下面的命令啟動一個Nginx容器
-d
:表示容器后臺運(yùn)行-p
:端口映射,前面的是宿主機(jī)的端口,后面的是容器內(nèi)的端口,表示容器內(nèi)的80端口映射到宿主機(jī)的80端口上--name
:表示啟動容器的名稱-v
:表示數(shù)據(jù)卷掛載,:
前面的是宿主機(jī)上的文件**(根據(jù)自己的來)**,:
后面的是容器內(nèi)的文件,這樣我們在宿主機(jī)上修改文件的內(nèi)容時,容器內(nèi)的文件也會發(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
啟動成功后我們可以用docker ps
命令可以查看到運(yùn)行的Nginx容器了,并且/youpath/nginx
下面也有對應(yīng)的文件
我們可以在瀏覽器用服務(wù)器ip
來查看效果,默認(rèn)會訪問/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ā)到本地(服務(wù)器)運(yùn)行在端口 8080 的應(yīng)用
配置完成之后我們用docker restart <nginx容器名或ID>
重啟Nginx容器使配置生效。
訪問不通的問題及解決方法
重啟完成后我們在瀏覽器中訪問www.abc.test
,可以發(fā)現(xiàn)訪問不通
這是因為Docker啟動的容器是環(huán)境隔離的,訪問www.abc.test
的時候不會轉(zhuǎn)發(fā)到服務(wù)器上的8080端口,而是會轉(zhuǎn)發(fā)到nginx容器的8080端口,但是后端服務(wù)是啟動在服務(wù)器上的,所以就訪問不通了
# 我們需要將127.0.0.1修改成服務(wù)器的ip地址,這樣就直接會去訪問服務(wù)器上運(yùn)行的8080端口的服務(wù)了 server { listen 80; server_name www.abc.test; location / { proxy_pass: http:<服務(wù)器ip>:8080/; }; }
修改完成后我們再次重啟Nginx容器,然后在瀏覽器上用剛剛的方式進(jì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
的形式去訪問
可以看到訪問不通,這是為啥呢,明明證書信息沒錯,域名和代理地址都寫對了,為啥就是訪問不通呢
2. 訪問不通的問題及解決方法
修改完成后重啟 Nginx 容器,在瀏覽器中用https://www.abc.test
的形式去訪問,可能會出現(xiàn)訪問不通的情況??赡艿脑蛴幸韵聨c:
1、域名未解析到云服務(wù)器的 IP:檢查域名解析記錄,確保域名已正確解析到云服務(wù)器 IP。
2、服務(wù)器防火墻未開啟 443 端口:使用systemctl status firewalld
查看防火墻開啟狀態(tài),若未開啟 443 端口,需開啟后再嘗試。
3、安全組未開啟:安全組是一種虛擬防火墻,用于設(shè)置云服務(wù)器、負(fù)載均衡、云數(shù)據(jù)庫等實例的網(wǎng)絡(luò)訪問控制。默認(rèn)情況下為關(guān)閉狀態(tài),需開啟服務(wù)器的安全組設(shè)置后再嘗試。
4、Nginx容器未映射443端口(本文作者遇到的情況):因為我們在Nginx上監(jiān)聽了443端口,客戶端訪問域名的時候會先走到Nginx這里,然后通過方向代理到proxy_pass
的地址,但由于我們沒有開啟443的端口,所以訪問不了
如果是第四種原因的話就先刪除容器
,然后用以下的命令重新運(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 訪問,此時應(yīng)該可以訪問成功。
四、總結(jié)
通過以上步驟,我們成功地在 Docker 上部署了 Nginx 實現(xiàn)反向代理,并解決了過程中遇到的各種問題。在實際操作中,可能會遇到不同的情況,但只要按照上述方法進(jìn)行排查和解決,相信大家都能順利完成部署。希望本文能對大家在 Docker 上部署 Nginx 反向代理提供有益的參考。
附:常見報錯及解決方法
1. 502 Bad Gateway
原因:Nginx無法連接到后端服務(wù),可能是后端服務(wù)未啟動或網(wǎng)絡(luò)配置錯誤。
解決方法:
確保后端服務(wù)正在運(yùn)行,并且可以通過指定的地址和端口訪問。
檢查Nginx配置文件中的
proxy_pass
是否正確。使用
docker logs
查看Nginx容器的日志,確認(rèn)具體的錯誤信息。
2. 404 Not Found
原因:請求的資源未找到,可能是路徑配置錯誤或后端服務(wù)未正確返回內(nèi)容。
解決方法:
檢查
location
塊的路徑是否與后端服務(wù)的路徑一致。確保后端服務(wù)返回的內(nèi)容路徑正確??梢試L試直接訪問后端服務(wù)的地址,確認(rèn)是否能正常返回內(nèi)容。
3. SSL證書問題
原因:如果使用了SSL證書,但證書路徑或證書內(nèi)容不正確,可能會導(dǎo)致連接失敗。
解決方法:
確保SSL證書和密鑰文件的路徑正確,并且文件內(nèi)容無誤。
在Nginx配置文件中正確配置
ssl_certificate
和ssl_certificate_key
的路徑。
4. 權(quán)限問題
原因:Nginx容器可能沒有足夠的權(quá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ù)和Nginx容器不在同一個網(wǎng)絡(luò)中,可能會導(dǎo)致連接失敗。
解決方法:
使用Docker Compose時,確保所有服務(wù)都在同一個網(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)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
基于spring-boot和docker-java實現(xiàn)對docker容器的動態(tài)管理和監(jiān)控功能[附完整源碼下載]
Docker 是一個開源的應(yīng)用容器引擎,和傳統(tǒng)的虛擬機(jī)技術(shù)相比,Docker 容器性能開銷極低,因此也廣受開發(fā)者喜愛。這篇文章主要介紹了基于spring-boot和docker-java實現(xiàn)對docker容器的動態(tài)管理和監(jiān)控 ,需要的朋友可以參考下2019-06-06WIN10系統(tǒng)和Docker內(nèi)部容器IP互通方式
這篇文章主要介紹了WIN10系統(tǒng)和Docker內(nèi)部容器IP互通方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-11-11docker實現(xiàn)跨宿主機(jī)的容器之間網(wǎng)絡(luò)互聯(lián)
本文主要介紹了docker實現(xiàn)跨宿主機(jī)的容器之間網(wǎng)絡(luò)互聯(lián),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-01-01