【问题标题】:How to configure nginx with docker-compose?如何使用 docker-compose 配置 nginx?
【发布时间】:2020-02-28 15:33:24
【问题描述】:

我有一个包含 3 个容器的简单应用程序,它们都在同一个 AWS EC2 服务器中运行。我想将 Nginx 配置为反向代理,但是我对 Nginx 很陌生,不知道如何正确设置 conf 文件。

这是我的 docker-compose:

version: "3"
services:

  nginx:
    container_name: nginx
    image: nginx:latest
    ports:
      - "80:80"
    volumes:
      - ./conf/nginx.conf:/etc/nginx/nginx.conf

  frontend:
    container_name: frontend
    image: myfrontend:image
    ports:
      - "3000:3000"

  backend:
    container_name: backend
    depends_on:
      - db
    environment:
      DB_HOST: db
    image: mybackend:image
    ports:
      - "8400:8400"

  db:
    container_name: mongodb
    environment:
      MONGO_INITDB_DATABASE: myDB
    image: mongo:latest
    ports:
      - "27017:27017"
    volumes:
      - ./initialization/db:/docker-entrypoint-initdb.d
      - db-volume:/data/db

volumes:
  db-volume:

后端从数据库中获取数据并将其发送给前端呈现。

这是我的 nginx.conf 文件:

events {
  worker_connections  4096;  
}

http {
 server {
   listen 80;
   listen [::]:80;

   server_name myDomainName.com;

   location / {
       proxy_pass http://frontend:3000/;
       proxy_set_header Host $host;
   }

   location / {
      proxy_pass http://backend:8400/;
      proxy_pass_request_headers on;
    }

 }
}

如何设置 nginx 为前端和后端容器提供服务?

【问题讨论】:

    标签: docker nginx docker-compose nginx-config


    【解决方案1】:

    您可以使用以下 Nginx 配置来解决您的问题

    events {
      worker_connections  4096;  
    }
    
    http {
    
     server {
        listen       80 default_server;
        server_name  frontend.*;
    
        location / {
            resolver 127.0.0.11 ipv6=off;
    
            set $target http://frontend:3000;
    
            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_pass $target;
        }
      }
    
      server {
        listen       80;
        server_name  backend.*;
    
        location / {
            resolver 127.0.0.11 ipv6=off;
    
            set $target http://backend:8400;
    
            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_pass $target;
        }
      }
    }
    

    Nginx 将为不同域名的后端和前端提供服务,通过以下等主机,您将能够访问已定义域名上的服务

    127.0.0.1 backend.me frontend.me
    

    【讨论】:

    • 我拥有一个域名,并希望两个容器一起使用它。用 nginx 不可能吗?
    • 可以更详细地描述你到底想做什么?如果您有两个服务,通常需要有 DNS 记录。除非您计划将这两个应用程序托管在具有不同位置的同一 DNS 记录上,即(mydomain.com/app1 和 mydomain.com/app2)
    • 这是一个运行用户界面(前端)和从数据库获取数据的后端的应用程序。现在我想起来了,我不确定我是否需要一个反向代理来应对这种情况。
    • 你肯定需要一个前端的反向代理,但如果后端和数据库应用程序不应该被最终用户访问,你应该从 docker-compose 中删除端口部分并执行不要将它们包含在 nginx 配置中