我正在尝试找到一种使用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 app
和nginx
之间存在一些问题。我怎样才能解决这个问题?
最佳答案
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/