如何将 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:

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 是“前门”,根据主机名或路径
  • 将流量定向到 clientserver
  • 服务通过服务名+端口互相引用

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;
  }
  ...
}

如果您有任何问题或者我误解了您的问题,请告诉我。