我不能完全確定如何在這種狀態下作業并且我喜歡如果可能的話不必以不同的方式重做所有事情。
我有一個運行 NGINX 服務器的數字海洋水滴以及一個 docker-compose,里面運行著一個客戶端、服務器和 db 影像。
我設想做的是通過 NGINX 保護和路由到服務器的流量,NGINX 將代理到從 compose 公開的客戶端應用程式。
so (internet) -> DNS(NGINX) -> Client -> Server -> DB
現在,當連接到 docker 中公開的 ip:port 時,這可以正常作業,因為我在 droplet 上使用 uwp 打開了它,它的 http 而不是 https。
我可以從 NGINX 代理到 ip:port,這很好,據我所知,它從互聯網到 nginx,再回到互聯網,再到客戶端應用程式,但它可以作業。
現在我保護并設定了一個 DNS 并通過 NGINX 路由它并收到“無效的主機頭”回應。
它是一個有角度的應用程式,所以我可以禁用主機頭檢查,它可能會很糟糕,但我的下一步是關閉暴露的埠,以便所有流量都必須通過 NGINX 代理,但我認為即使是代理正在使用 Droplet 上的暴露埠將流量路由到那里。
問:
我可以將流量從 NGINX 路由到服務器內的 docker-compose 地址,而不是使用服務器 ip 和埠組合來訪問客戶端站點,以便我可以關閉暴露的埠嗎?
或者,我是否只需要在 compose 中運行一個 NGINX 容器,以便我可以使用 compose 網路來管理流量?我不喜歡這個,因為我將不得不改變服務器上的東西,它對我來說感覺有點脆弱。
域名注冊地址:
- 在職的
- Internet -> http://ip:port(NGINX) -> http://ip:port docker-compose(客戶端埠)== 應用服務!
- Internet -> http://ip:port docker-compose (client port) == App Served
- 不作業
- Internet -> https://DNS:port:80/443(NGINX) -> http://ip:port docker-compose (client port) == "Invalid Host Header"
- 想作業
- Internet -> https://DNS:port:80/443(NGINX) -> 本地組合不通過 h??ttp == 應用服務
啟用站點 # 這是我完成大部分手動配置的地方,這個 conf 和許多其他 nginx 檔案都在 etc/nginx 中
server {
listen 80;
server_name <dns>.net;
index index.html index.htm index.nginx-debian.html;
location / {
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Host $host;
proxy_set_header Connection 'upgrade';
proxy_http_version 1.1;
proxy_cache_bypass $http_upgrade;
proxy_pass http://<ip>:<port>;
}
listen 443 ssl;
ssl_certificate <server filepath>;
ssl_certificate_key <filepath>;
include <letsencrypt nginx conf path>;
ssl_dhparam <letsencrypt pem path>;
}
server {
if ($host = <dns>.net) {
return 301 https://$host$request_uri;
}
listen 80;
server_name <dns>.net;
listen 443 ssl default_server;
server_name _;
return 404;
}
docker-compose
networks:
client:
server:
services:
client:
container_name: clientName
image: "repoImage"
ports:
- 1:1
environment:
- VIRTUAL_HOST=SERVERIPADDRESS
- LETSENCRYPT_HOST=SERVERIPADDRESS
networks:
- client
restart: always
server:
container_name: serverName
networks:
- client
- server
image: "repoImage"
command npm run startProd
ports:
- 2:2
restart: always
env_file:
- <envfilepath>
database:
container_name: dbInstance
networks:
- server
restart: always
image: dbimage
ports:
- 3:3
- 4:4
volumes:
- many
environment
- envVars
uj5u.com熱心網友回復:
如果您使用docker-compose整個系統,它往往會簡化事情,特別是如果它們都在同一臺機器上運行。這樣,您就可以利用 Docker 的網路并最大限度地減少需要公開的埠數量。
例如,您可以設定它以便
- NGINX 是“前門”,
client并server根據主機名或路徑將流量定向到兩者 - 服務通過服務名 埠相互參考
docker-compose.yml
networks:
db-net:
proxy-net:
services:
nginx:
networks:
proxy-net:
ports:
# These are the only ports that will be open on your machine
- 80:80
- 443:443
database:
networks:
db-net:
# no ports exposed
command: <run on port 3306>
server:
networks:
db-net:
proxy-net:
# no ports exposed
command: <run on port 3000>
environment:
- DATABASE_URL=database:3306
client:
networks:
proxy-net:
# no ports exposed
command: <run on port 3000>
nginx.conf
server {
...
location /client {
...
proxy_pass http://client:3000;
}
...
location /server {
...
proxy_pass http://server:3000;
}
...
}
如果您有任何問題或我誤解了您的問題,請告訴我。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/386045.html
