小智 9
我遇到了同样的问题。我正在将 docker 集群部署到生产环境,并希望为其自动生成 SSL 证书。当 SSL 证书到位后,我想强制所有流量重定向到 https。它不是超级迷人,但这是我想出的解决方案。
我的 nginx 服务器有 2 个配置文件:app.conf 和 tlsapp.conf
应用程序配置文件
server {
listen 80;
server_name example.com;
location /.well-known/acme-challenge/ {
allow all;
root /var/www/public;
}
}
Run Code Online (Sandbox Code Playgroud)
tlsapp.conf
server {
listen 80;
server_name example.com;
location / {
return 301 https://example.com$request_uri;
}
}
server {
listen 443 ssl http2;
server_name example.com;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
include /etc/nginx/opt/options-ssl-nginx.conf;
ssl_dhparam /etc/nginx/opt/ssl-dhparams.pem;
root /var/www/public;
index index.php;
error_log /var/log/nginx/error.log;
access_log /var/log/nginx/access.log;
...
}
Run Code Online (Sandbox Code Playgroud)
然后,我从自定义映像部署 nginx 容器。
nginx.Dockerfile
FROM nginx:alpine
COPY docker-config/nginx/conf.d/app.conf /etc/nginx/conf.d/app.conf
COPY docker-config/nginx/conf.d/tlsapp.conf /etc/nginx/conf.d/tlsapp.bkp
COPY docker-config/nginx/opt/ /etc/nginx/opt/
COPY docker-config/nginx/entrypoint.sh /custom-entrypoint.sh
RUN chmod 775 /custom-entrypoint.sh
ENTRYPOINT ["/custom-entrypoint.sh"]
RUN ["/docker-entrypoint.sh"]
CMD ["nginx", "-g", "daemon off;"]
Run Code Online (Sandbox Code Playgroud)
最后,我的自定义 nginx 映像中有一个自定义入口点。基本上,这个入口点所做的就是检查 ssl 证书是否已创建。如果有,它会启用 tlsapp 配置并禁用仅用于使用 certbot 引导证书的配置。
入口点.sh
#!/usr/bin/env sh
set -e
if [ -d "/etc/letsencrypt/live" ]; then
mv /etc/nginx/conf.d/app.conf /etc/nginx/conf.d/app.bkp
mv /etc/nginx/conf.d/tlsapp.bkp /etc/nginx/conf.d/tlsapp.conf
fi
exec "$@"
Run Code Online (Sandbox Code Playgroud)
当尚未生成 ssl 证书时,此设置允许我的 nginx 容器在新的生产环境中启动。它为 certbot 提供了足够的访问权限来将证书生成到共享持久卷中。然后我所要做的就是重新部署 nginx 容器,它将启动,查看证书,并启用我站点的实际配置,强制所有流量通过 https。
我不喜欢这种设置,因为它需要为新的生产环境进行尴尬的重新部署,并且如果您的设置比针对一台 nginx 服务器的一个应用程序更复杂,则可能会出现问题,但它可以工作。
不。为什么你的钥匙不存在?
| 归档时间: |
|
| 查看次数: |
2941 次 |
| 最近记录: |