docker - 使用 Nginx 的 Dockerized 应用程序(通过 docker-compose) - 502 Bad Gateway Error
问题描述
我有一个 Phoenix 应用程序 MyApp,我正在尝试在 Ubuntu 18.04 上进行 Dockerize 和部署。我尝试按照一些指南正确设置 Nginx,但我收到 502 Bad Gateway 错误或导致重定向过多,具体取决于我尝试设置 Nginx 反向代理的方式。
理想的情况是我可以使用docker-compose up
它来初始化 Web 应用程序和 Nginx。这是我当前的 docker-compose.yml 文件:
码头工人-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 中的卷指定。
数据/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"
任何建议表示赞赏。
解决方案
您需要在 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;
}
}
推荐阅读
- matlab - 在matlab中使用持久变量线程化或激活函数
- python - Python:XML元素树findall()不返回任何东西
- html - Chrome 开发者工具 - 如何锁定 CSS 类列表?
- javascript - 使用 indexOf 匹配的 JS 代码是如何工作的?
- python - 使用神经网络的多元时间序列回归
- ios - 如何在 Swiftui 视图函数中使用 EnvironmentObject?
- python - Django:在模型导入的上下文中没有名为“foo”的模块问题
- jpa - 使用每个 Persist JPA 创建新实体
- react-native - AsyncStorage.removeItem(key) 不会删除项目,除非应用程序重新启动或几分钟后
- javascript - 是否有fingerprintjs 采用的详尽选项列表?