当前位置:论坛首页 > Linux面板 > 讨论

通过 nginx 为面板绑定 Let's Encrypt 证书 + 自动续期,稳定不挂

发表在 Linux面板2018-4-25 01:36 [复制链接] 0 4268

本帖最后由 xiaopiao 于 2018-4-25 01:45 编辑

应该有人看到标题就知道是用 nginx 的反向代理,当然 Apache 也是可以实现。
宝塔的面板只要一开启 SSL 过一段时间就会链接不上,只能重启宝塔面板的服务来恢复。
一开始以为这个只是个别现象,没想到来了论坛才知道不少人也有和我相同的症状。
据说这个问题是 python 与 OpenSSL 不是很兼容导致,如果真是这样只能等到 python 和 OpenSSL 互相兼容。
不过这里有另外一个临时的解决方案,就是通过 nginx 的反向代理来实现面板 SSL,搭配宝塔的 Let's Encrypt 证书自动续期,岂不美哉?如果你用的是 Apache,也是可以实现。
首先,你需要先将面板管理域名添加到「网站」中,例如:cp.example.com
1.png
然后,点击「设置」,点击左侧菜单的「SSL」,再点击「Let's Encrypt」,勾选面板管理域名,点击申请完成证书的申请,这里需要注意面板管理域名外网能够访问(如果是第一次创建应该是显示宝塔默认的「创建成功」页面)
1.png
下一步是点击「反向代理」,「目标 URL」填入 http://127.0.0.1:8888,「发送域名」保持默认即可,然后勾选「启用反向代理」,在提示成功后,建议将「开启缓存」也勾上
1.png
到这一步你的面板域名已经可以作为宝塔面板的管理域名了,但是仅仅这样设置是有很多问题。
比如说自动续期功能就失效了,因为开启反向代理后,会连同 Let's Encrypt 的域名验证地址也一并转发。
所以我们并不能直接使用宝塔面板提供的反向代理功能,而是需要自己配置代理规则。
我们先取消上一步的「启用反向代理」,提示成功后,点击「配置文件」,在你启用 SSL 后,宝塔会自动在配置文件中添加类似 listen 443 ssl http2; 的一行数据,我们在这里回车,并且输入
listen 8888 ssl http2;

1.png
请注意,其中的 8888 将是作为面板的访问端口(这里我已经提前将面板端口修改为 8443),如果你希望直接使用 443 作为访问端口(即 https://cp.example.com/ 不带任何端口访问),则不需要添加这一行。

接下来找到 #ERROR-PAGE-END 并且在下面输入
#BT-Panel-SSL-START
location ~ /purge(/.*)
{
    proxy_cache_purge cache_one $host$request_uri$is_args$args;
    #access_log  /www/wwwlogs/{$host}_purge_cache.log;
}
location ~ .*\.(js|css|jpg|png|gif|jpeg)?$
{
    if ($server_port = 8888)
    {
        proxy_pass http://127.0.0.1:8443;
        add_header X-Cache $upstream_cache_status
        expires 12h;
    }
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header REMOTE-HOST $remote_addr;
    #缓存相关配置 根据需求关闭
    proxy_cache cache_one;
    proxy_cache_key $host$request_uri$is_args$args;
    proxy_cache_valid 200 304 301 302 1h;
    #持久化连接相关配置 根据需求打开
    #proxy_connect_timeout 30s;
    #proxy_read_timeout 86400s;
    #proxy_send_timeout 30s;
    #proxy_http_version 1.1;
    #proxy_set_header Upgrade $http_upgrade;
    #proxy_set_header Connection "upgrade";
}
location /
{
    if ($server_port = 8888)
    {
        proxy_pass http://127.0.0.1:8443;
    }
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header REMOTE-HOST $remote_addr;
    proxy_redirect http://$host/ https://$host:$server_port/;
    #隐藏「面板 SSL」按钮
    sub_filter '"setPanelSSL()"' 'style="display:none"';
    sub_filter_types *;
    sub_filter_once on;
}
#BT-Panel-SSL-END

注意修改其中标红的端口为你的访问端口,修改其中标蓝的端口为你的面板端口,然后点击「保存」宝塔会自动为你重载 nginx 配置文件,如果配置文件有错误的地方,将保存失败。
如果你希望直接使用 443 作为访问端口,则将红标的端口修改为 443 即可。
保存完成后,需要在「安全」中为刚刚添加的访问端口进行放行,放行后即可通过 SSL 访问面板,例如:https://cp.example.com:8888/
1.png
最后关于这个解决方案的一些问题:
  • 「安全」中不能正确显示登陆地址,只能显示为 127.0.0.1;
  • 「面板设置」存在问题不能保存;
  • 可能还有其它未知问题(并未详细测试);
  • 不建议生产环境使用。

使用道具 举报 只看该作者 回复
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

普通问题处理

论坛响应时间:72小时

问题处理方式:排队(仅解答)

工作时间:白班:9:00 - 18:00

紧急运维服务

响应时间:3分钟

问题处理方式:宝塔专家1对1服务

工作时间:工作日:9:00 - 18:30

宝塔专业团队为您解决服务器疑难问题

点击联系技术免费分析

工作时间:09:00至18:30

快速回复 返回顶部 返回列表