通常,当Nginx
尝试读取不存在的证书时,它将退出并抛出错误。
我可以定义任何后备证书如果主要证书不存在怎么办?
答案1
不。为什么你的密钥不存在?
答案2
我也遇到了同样的问题。我正在将 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;
}
}
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;
...
}
然后我从自定义映像部署我的 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;"]
最后,我的自定义 nginx 映像中有一个自定义入口点。基本上,这个入口点所做的就是检查是否已创建 ssl 证书。如果已创建,它将启用 tlsapp 配置并禁用仅用于使用 certbot 引导证书的配置。
入口点
#!/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 "$@"
此设置允许我的 nginx 容器在未生成 SSL 证书的情况下在新的生产环境中启动。它为 certbot 提供了足够的访问权限,以将证书生成到共享持久卷中。然后我要做的就是重新部署 nginx 容器,它将启动、查看证书并启用我的站点的实际配置,强制所有流量通过 https。
我不喜欢这种设置,因为它需要对新的生产环境进行尴尬的重新部署,如果你的设置比一个应用程序针对一个 nginx 服务器更复杂,可能会出现问题,但它可以工作。