【问题标题】:Dockerized app with Nginx (via docker-compose) - 502 Bad Gateway Error使用 Nginx 的 Dockerized 应用程序(通过 docker-compose) - 502 Bad Gateway Error
【发布时间】:2019-08-10 17:10:18
【问题描述】:

我有一个 Phoenix 应用程序 MyApp,我正在尝试在 Ubuntu 18.04 上进行 Dockerize 和部署。我尝试按照一些指南正确设置 Nginx,但我收到 502 Bad Gateway 错误或导致重定向过多,具体取决于我尝试设置 Nginx 反向代理的方式。

理想的情况是我可以使用docker-compose up,它将初始化网络应用程序和 Nginx。这是我当前的 docker-compose.yml 文件:

docker-compose.yml

version: '3.5'

services:
  nginx:
    image: nginx:latest
    restart: unless-stopped
    volumes:
      - ./data/nginx/app.conf:/etc/nginx/nginx.conf
      - ./data/nginx/error.log:/etc/nginx/error_log.log
      - ./data/nginx/cache/:/etc/nginx/cache
      - /etc/letsencrypt/:/etc/letsencrypt/
    environment:
      - ENV=production
      - APPLICATION_URL=http://myapp.domain
    ports:
      - 80:80
      - 443:443

  ...

  web:
    depends_on:
      - nginx
    image: "myapp:0.1.0"
    restart: unless-stopped
    expose:
      - "80"
    env_file:
      - config/docker.env

如果不包含 Nginx,myapp 的相同映像版本可与 ports: - 80:4000 一起使用,因为 Phoenix 被配置为期望端口 4000 上的流量。我相信,以下是我的 nginx 应用程序配置,由 docker-compose 中的卷指定。 yml。

data/nginx/app.conf

events {

}

http {
  client_max_body_size 20m;

  proxy_cache_path /etc/nginx/cache keys_zone=one:500m max_size=1000m;

  server {
      proxy_cache one;
      listen 80;
      listen 443 ssl;
      server_name myapp.domain;

      location / {
          proxy_pass http://localhost:4000;
          rewrite ^/myapp.domain(.*)$ $1 break;
      }

      ssl_certificate /etc/letsencrypt/live/myapp.domain/fullchain.pem;
      ssl_certificate_key /etc/letsencrypt/live/myapp.domain/privkey.pem;
      include /etc/letsencrypt/options-ssl-nginx.conf;
  }
}

我不知道如何设置端口,以便通过 Nginx 正确发送 Web 流量并反向代理到 myapp。我相信 localhost 会起作用,因为当我运行 docker-compose up 时,我看到了 Running MyAppWeb.Endpoint with cowboy 2.6.1 at http://localhost:4000

当我尝试访问该站点时,我在我的服务器日志中看到了这个 [error] 6#6: *1 connect() failed (111: Connection refused) while connecting to upstream, client: 162.158.119.89, server: myapp.domain, request: "GET / HTTP/1.1", upstream: "http://127.0.0.1:4000/", host: "myapp.domain"

感谢任何建议。

【问题讨论】:

  • Phoenix 应用 dockerfile 怎么样?
  • @ThanhNguyenVan 我认为它不应该相关,因为应用程序确实可以编译并且可以通过 HTTP 访问,当 Nginx 实现在一些配置更改后被删除时。包含 Nginx 作为 docker-compose 的服务是否需要更改我的 Dockerfile?

标签: docker nginx docker-compose phoenix-framework


【解决方案1】:

你需要在 nginx 容器上链接 web 服务,docker-compose 看起来像:

services:
  nginx:
    image: nginx:latest
    restart: unless-stopped
    volumes:
      - ./data/nginx/app.conf:/etc/nginx/nginx.conf
      - ./data/nginx/error.log:/etc/nginx/error_log.log
      - ./data/nginx/cache/:/etc/nginx/cache
      - /etc/letsencrypt/:/etc/letsencrypt/
    environment:
      - ENV=production
      - APPLICATION_URL=http://myapp.domain
    ports:
      - 80:80
      - 443:443
    links:
      - web

  web:
      depends_on:
        - nginx
      image: "myapp:0.1.0"
      restart: unless-stopped
      expose:
        - "4000"
      env_file:
        - config/docker.env

那就更新data/nginx/app.conf

events {

}

http {
  client_max_body_size 20m;

  proxy_cache_path /etc/nginx/cache keys_zone=one:500m max_size=1000m;

  server {
      proxy_cache one;
      listen 80;
      listen 443 ssl;
      server_name myapp.domain;

      location / {
          proxy_pass http://web:4000;
          rewrite ^/myapp.domain(.*)$ $1 break;
      }

      ssl_certificate /etc/letsencrypt/live/myapp.domain/fullchain.pem;
      ssl_certificate_key /etc/letsencrypt/live/myapp.domain/privkey.pem;
      include /etc/letsencrypt/options-ssl-nginx.conf;
  }
}

【讨论】:

  • 感谢您的建议!这实际上消除了很多困惑,因为我现在看到了 Docker 如何或多或少地将服务名称插入为我认为的 IP。 Nginx 配置中的第二行也应该是rewrite ^/web(.*)$ $1 break;?现在我收到 521 错误,我的 Phoenix 应用程序说它是 Could not check origin for Phoenix.Socket transportOrigin of the request: https://server-ip。好消息是它似乎正在到达我的 Phoenix 应用程序,所以谢谢!希望我能找出下一个错误。
猜你喜欢
  • 1970-01-01
  • 2016-10-23
  • 2014-08-04
  • 2020-04-22
  • 2020-12-14
  • 1970-01-01
  • 1970-01-01
  • 2017-07-31
  • 2013-06-16
相关资源
最近更新 更多