docker - Docker编写Nginx,Express,Lakeencrypt SSL获得502 Bad gateway

标签 docker nginx docker-compose

我正在尝试找到一种使用docker-compose将nginx,express和letencrypt的SSL一起发布的方法。关于此的文档很多,因此我引用了这些文档并尝试进行自己的配置,我成功地从此nginx + ssl配置了https://medium.com/@pentacent/nginx-and-lets-encrypt-with-docker-in-less-than-5-minutes-b4b8a60d3a71
所以现在我想将示例nodejs express应用程序放入nginx + ssl docker-compose中。但是我不知道为什么,我从nginx获取502 Bad Gateway而不是express的初始页面。

我正在用我的左侧域和aws ec2 ubuntu16测试此应用。我认为域dns和安全规则设置没有问题。已经打开了80、443、3000个端口。当我在没有Express App的情况下对其进行测试时,它会很好地显示Nginx默认页面。

/etc/nginx/conf.d中的 nginx conf

server {
    listen 80;
    server_name example.com;
    return 301 https://$server_name$request_uri;
}

server {
    listen 443 ssl;
    listen [::]:443 ssl;
    server_name example.com;
    server_tokens off;

    location / {
        proxy_pass http://localhost:3000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
    }

    ssl_certificate /etc/letsencrypt/live/sendpi.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/sendpi.com/privkey.pem;
    include /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;

}

docker-compose.yml
version: '3'

services:
  app:
    container_name: express
    restart: always
    build: .
    ports: 
      - '3000:3000'
  nginx:
    container_name: nginx
    image: nginx:1.15-alpine
    restart: unless-stopped
    volumes:
      - ./data/nginx:/etc/nginx/conf.d
      - ./data/certbot/conf:/etc/letsencrypt
      - ./data/certbot/www:/var/www/certbot
    ports:
      - "80:80"
      - "443:443"
    command: "/bin/sh -c 'while :; do sleep 6h & wait $${!}; nginx -s reload; done & nginx -g \"daemon off;\"'"
  certbot:
    image: certbot/certbot
    restart: unless-stopped
    volumes:
      - ./data/certbot/conf:/etc/letsencrypt
      - ./data/certbot/www:/var/www/certbot
    entrypoint: "/bin/sh -c 'trap exit TERM; while :; do certbot renew; sleep 12h & wait $${!}; done;'"

Express 的Dockerfile
FROM node:12.2-slim
WORKDIR /usr/src/app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["npm", "start"]

我认为SSL可以正常运行,但是express appnginx之间存在一些问题。我怎样才能解决这个问题?

最佳答案

proxy_pass http://localhost:3000

正在将请求代理到运行nginx的容器上的3000端口。相反,您想要连接到运行Express的容器的3000端口。为此,我们需要做两件事。

首先,我们使Express容器在预定义的主机名下对nginx容器可见。我们可以在docker-compose中使用links
nginx:
  links:
    - "app:expressapp"

或者,由于现在将链接视为传统功能,因此更好的方法是使用用户定义的网络。通过定义自己的网络
docker network create my-network 

然后通过在顶层添加以下内容,将您的容器以撰写文件的形式连接到该网络:
networks:
    default:
        external:
            name: my-network

连接到用户定义网络的所有服务都可以通过名称相互访问,而无需显式设置链接。

然后在nginx.conf中,我们使用该主机名代理到express容器:
location / {
    proxy_pass http://app:3000
}

关于docker - Docker编写Nginx,Express,Lakeencrypt SSL获得502 Bad gateway,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57743088/

相关文章:

docker - kubernetes - 环境变量不适用于整数

docker - 为什么默认情况下所有端口都使用此 Docker 镜像发布

apache - 在从 Apache 调用的 PHP-FPM 中设置正确的 REMOTE_ADDR

mysql - docker "mysqld: can' t 读取 '/etc/mysql/mysql.conf.d' 的目录(os errno 2 - 没有这样的文件或目录)”

docker - 为什么我不能在centos7上真正运行docker telegraf容器?

docker - 如何使用 psycopg2 修复我的 docker compose 错误

Nginx:设置默认文件扩展名

python - Django 实例建立直到崩溃站点(更新 : Redis deadlock HIGHLY suspected)

docker - 指定共享卷的数据来源

docker - 不支持 “./docker-compose.yml”中的版本。您可能会看到此错误,因为使用的是错误的Compose文件版本