gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 21:06:23 24 4
gpt4 key购买 nike

我正在尝试找到一种使用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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com