如何将 Nginx 反向代理到本地托管(在具有 ssh 访问权限的服务器上)docker-compose
How to Nginx reverse Proxy to a locally hosted (on a server with ssh access) docker-compose
我不太清楚如何在这种状态下让它工作,我喜欢尽可能不必以不同的方式重做所有事情。
我有一个数字海洋水滴 运行 一个 NGINX 服务器以及一个 docker-compose 带有客户端、服务器和数据库映像 运行 里面。
我设想做的是通过 NGINX 保护流量并将其路由到服务器,NGINX 将代理到从组合公开的客户端应用程序。
so (互联网) -> DNS(NGINX) -> 客户端 -> 服务器 -> 数据库
现在,当连接到 docker 中暴露的 ip:port 时,这可以正常工作,因为我在 Droplet 上使用 uwp 打开了它,它是 http 而不是 https。
我可以从 NGINX 代理到 ip:port,这很好,据我所知,这是从互联网到 nginx,返回到互联网,到客户端应用程序,但它的工作。
现在我保护并设置了一个 DNS 并通过 NGINX 路由它并收到“无效主机 Header”响应。
它是一个 angular 应用程序,所以我可以禁用主机 header 检查,它可能是 groovy 但我的下一步将关闭我暴露的端口,以便所有流量都必须通过 NGINX 代理,但我认为即使代理也在使用 Droplet 上的暴露端口将流量路由到那里。
提问:
我可以将来自 NGINX 的流量路由到服务器内的 docker-compose 地址,而不是使用服务器 ip 和端口组合来访问客户端站点,以便我可以关闭我暴露的端口吗?
或者我是否只需要 运行 一个 NGINX 容器在 compose 中,这样我就可以使用 compose 网络来管理流量?我不喜欢这个,因为我将不得不改变服务器上的东西,它对我来说有点脆弱。
TLDR:
- 正在工作
- Internet -> http://ip:port(NGINX) -> http://ip:port docker-compose(客户端端口)== App Served!
- Internet -> http://ip:port docker-compose(客户端端口)== App Served
- 不工作
- Internet -> https://DNS:port:80/443(NGINX) -> http://ip:port docker-compose(客户端端口)==“无效主机Header"
- 想工作
- Internet -> https://DNS:port:80/443(NGINX) -> 本地撰写而不是通过 http == App Served
sites-enabled # 这是我进行最多手动配置的地方
这个 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
如果您对整个系统使用 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;
}
...
}
如果您有任何问题或者我误解了您的问题,请告诉我。
我不太清楚如何在这种状态下让它工作,我喜欢尽可能不必以不同的方式重做所有事情。
我有一个数字海洋水滴 运行 一个 NGINX 服务器以及一个 docker-compose 带有客户端、服务器和数据库映像 运行 里面。
我设想做的是通过 NGINX 保护流量并将其路由到服务器,NGINX 将代理到从组合公开的客户端应用程序。
so (互联网) -> DNS(NGINX) -> 客户端 -> 服务器 -> 数据库
现在,当连接到 docker 中暴露的 ip:port 时,这可以正常工作,因为我在 Droplet 上使用 uwp 打开了它,它是 http 而不是 https。
我可以从 NGINX 代理到 ip:port,这很好,据我所知,这是从互联网到 nginx,返回到互联网,到客户端应用程序,但它的工作。
现在我保护并设置了一个 DNS 并通过 NGINX 路由它并收到“无效主机 Header”响应。
它是一个 angular 应用程序,所以我可以禁用主机 header 检查,它可能是 groovy 但我的下一步将关闭我暴露的端口,以便所有流量都必须通过 NGINX 代理,但我认为即使代理也在使用 Droplet 上的暴露端口将流量路由到那里。
提问:
我可以将来自 NGINX 的流量路由到服务器内的 docker-compose 地址,而不是使用服务器 ip 和端口组合来访问客户端站点,以便我可以关闭我暴露的端口吗?
或者我是否只需要 运行 一个 NGINX 容器在 compose 中,这样我就可以使用 compose 网络来管理流量?我不喜欢这个,因为我将不得不改变服务器上的东西,它对我来说有点脆弱。
TLDR:
- 正在工作
- Internet -> http://ip:port(NGINX) -> http://ip:port docker-compose(客户端端口)== App Served!
- Internet -> http://ip:port docker-compose(客户端端口)== App Served
- 不工作
- Internet -> https://DNS:port:80/443(NGINX) -> http://ip:port docker-compose(客户端端口)==“无效主机Header"
- 想工作
- Internet -> https://DNS:port:80/443(NGINX) -> 本地撰写而不是通过 http == App Served
sites-enabled # 这是我进行最多手动配置的地方 这个 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
如果您对整个系统使用 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;
}
...
}
如果您有任何问题或者我误解了您的问题,请告诉我。