SetHttps
面板 · Apache · 容器

宝塔 / 1Panel / Apache / Docker

面板自己有一套证书目录和命名习惯。这里的原则只有一条:让面板继续用它的文件名,用软链指到平台上传的文件, 这样面板升级、站点重建都不会把你的配置冲掉。

先记住三个文件名

平台上传到「证书路径」的文件名由域名决定,不会变:

平台文件面板/服务里通常叫
example.com_full_chain.pemfullchain.pem
example.com_key.pemprivkey.pem
example.com_cert.pemcert.pem(一般不用)

宝塔面板

站点证书目录一般是 /www/server/panel/vhost/cert/<站点名>/。把「证书路径」直接填成这个目录,然后在服务器上做软链:

cd /www/server/panel/vhost/cert/example.com

ln -sf example.com_full_chain.pem fullchain.pem
ln -sf example.com_key.pem        privkey.pem
ln -sf example.com_cert.pem       cert.pem

宝塔的站点 nginx 配置本来就读 fullchain.pem / privkey.pem,所以不需要改配置。不要在宝塔里点「申请 Let's Encrypt 证书」,那会把文件改回它自己签的版本。

不要在面板里删站点重建。重建站点会把 cert 目录一起清掉,软链也就没了。真删了,重新执行上面的三条 ln -sf 就行,证书本身还在平台侧。

重载命令:nginx -s reload,在宝塔环境里等价于 /etc/init.d/nginx reload。

1Panel

OpenResty 站点的证书目录通常是 /opt/1panel/apps/openresty/openresty/conf/ssl/<域名>/。同样用软链:

cd /opt/1panel/apps/openresty/openresty/conf/ssl/example.com
ln -sf example.com_full_chain.pem fullchain.pem
ln -sf example.com_key.pem        privkey.pem

1Panel 的站点配置里 ssl_certificate 指向 fullchain.pem,配好软链后不需要改站点。

1Panel 会在数据库里记录证书来源。如果你在面板里操作过「证书」模块,可能触发它重新申请或覆盖文件;接入后建议不要在面板里再点该站点的证书申请。

Apache

<VirtualHost *:443>
    ServerName example.com
    ServerAlias *.example.com

    SSLEngine on
    SSLCertificateFile      /etc/apache2/ssl/example.com/example.com_full_chain.pem
    SSLCertificateKeyFile   /etc/apache2/ssl/example.com/example.com_key.pem

    SSLProtocol             all -SSLv3 -TLSv1 -TLSv1.1
    SSLCipherSuite          HIGH:!aNULL:!MD5
    Header always set Strict-Transport-Security "max-age=31536000"
</VirtualHost>

Apache 2.4.8 之后不再需要 SSLCertificateChainFile:把完整链放在 SSLCertificateFile 里即可。重载:

apachectl configtest && apachectl -k graceful

Docker 里的 Nginx

关键是证书目录必须挂载进容器,重载要在容器内执行:

docker run -d --name nginx \
  -p 80:80 -p 443:443 \
  -v /etc/nginx/ssl:/etc/nginx/ssl:ro \
  -v /etc/nginx/conf.d:/etc/nginx/conf.d:ro \
  nginx:stable
# 证书更新后
docker exec nginx nginx -t && docker exec nginx nginx -s reload
宿主机上 nginx -s reload 对容器里的进程无效。用 inotify 监听宿主机目录、再 docker exec 重载,是最省心的组合。 另外 :ro 挂载只影响容器内改写,宿主机的上传不受影响。

路径速查

环境证书目录重载
宝塔/www/server/panel/vhost/cert/<站点>/nginx -s reload
1Panel/opt/1panel/apps/openresty/openresty/conf/ssl/<域名>/docker exec 1panel-openresty nginx -s reload
aaPanel/www/server/panel/vhost/cert/<站点>/nginx -s reload
Debian/Ubuntu Apache/etc/apache2/ssl/<域名>/apachectl -k graceful
RHEL 系 Apache/etc/httpd/ssl/<域名>/systemctl reload httpd