客户站点绑定域名

开发的项目,给客户提供自助建站,允许客户绑定自己的域名并给用户的域名生成ssl证书,目前功能已实现,但是实现过方式略复杂,下面是实现方式,请各位指教看能否优化:

1. 让客户把自有域名解析CNAME到我们指定的地址

实现如下:
我们自己的域名 serv.xxx.com 解析到服务器IP 11.22.33.44,客户把自有域名(比如abc.com)的CNAME解析到 serv.xxx.com

然后在我们平台上绑定该域名时,使用dns_get_record('abc.com', DNS_CNAME) 获取解析结果,检测到域名解析成功后,生成该域名的nginx的配置文件abc.com.conf

程序中根据来源域名判断如果是abc.com做对应逻辑
2. 客户绑定域名后,给客户的域名生成ssl证书并自动续签

实现如下:
使用 `https://packagist.org/packages/afosto/yaac` 这个库向 Let's Encrypt 发请求申请ssl证书,使用http校验域名所有权,申请到ssl证书成功后,把证书内容写入文件,然后根据证书文件路径再修改上一步生成的 abc.com.conf 配置文件中写入ssl相关配置

然后使用计划任务续签域名ssl证书


现在存在的问题如下:

问题1. php的dns_get_record 函数有时候获取到的域名解析结果不同,比如大家可以试试 dns_get_record('learnku.com'),我这里就会返回两种结果,分别是:
命令行:php -r "print_r(dns_get_record('learnku.com'));"

有时为结果一:
Array
(
    [0] => Array
        (
            [host] => learnku.com
            [class] => IN
            [ttl] => 3598
            [type] => HINFO
            [cpu] => RFC8482
            [os] =>
        )
    [1] => Array
        (
            [host] => learnku.com
            [class] => IN
            [ttl] => 1152
            [type] => NS
            [target] => dns7.hichina.com
        )
    [2] => Array
        (
            [host] => learnku.com
            [class] => IN
            [ttl] => 1152
            [type] => NS
            [target] => dns8.hichina.com
        )
)

有时为结果二:
Array
(
    [0] => Array
        (
            [host] => learnku.com
            [class] => IN
            [ttl] => 3600
            [type] => HINFO
            [cpu] => RFC8482
            [os] =>
        )
    [1] => Array
        (
            [host] => learnku.com
            [class] => IN
            [ttl] => 565
            [type] => A
            [ip] => 117.50.36.69
        )
    [2] => Array
        (
            [host] => learnku.com
            [class] => IN
            [ttl] => 347
            [type] => NS
            [target] => dns8.hichina.com
        )
    [3] => Array
        (
            [host] => learnku.com
            [class] => IN
            [ttl] => 347
            [type] => NS
            [target] => dns7.hichina.com
        )
)

问题2. 根据域名生成的nginx配置过多,每个域名都要生成对应的nginx配置,每次生成配置文件后还要对nginx进行reload,没有搜索到在nginx中如何方便的管理多个域名和ssl证书
比如客户的域名是
a00001.com
a00002.com
...
a99998.com
a99999.com

那服务器上就会生成10w个nginx配置文件和保存20w个ssl证书文件(当然现在没有这么多),到时候管理这些配置和ssl证书也会很麻烦
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
讨论数量: 8

请教大家有没有更好的方法

2个月前 评论
空山

以前做过类似的,实现方法和你大同小异,期待高人有更好的方法。

2个月前 评论

这种动态网站的可以考虑用 Traefik、Caddy 或 Nginx Unit 这类 HTTP 服务,都支持 ACME 的相关协议,自动获取 TLS 证书!

Traefik 不支持 FPM,需要再 FPM 前再做一层 HTTP 反向代理!Caddy 支持,Unit 则不需要 FPM,进程由 Unit 管理。

2个月前 评论

dns_get_record 可以指定获取解析的类型

2个月前 评论

这点客户量,就算人工操作也不费事啊

2个月前 评论
随波逐流

可以使用 openresty + lua + redis 可以实现 动态多租户

2个月前 评论

这不是很典型的使用域名获取证书的问题吗? Nginx 的 LUA 模块解决这个问题太简单了。搜一下这个 ssl_certificate_by_lua_block ,不太清楚你的网络状况,给你一个 CSDN 的文章

2个月前 评论

Caddy 应该会简单不少。官网上就有一个真实的例子,你把自己域名解析到 demo.caddyserver.com.,然后你的网站就相当于上线了,支持了 HTTPS。

如果网站是固定的话,手动写 Caddyfile 的话,证书不用配置,默认就行。如果网站是动态的话,比如用户可以创建新网站,类似 GitHub Page、Vercel,估计可以用 Caddy 的 JSON API 来控制,动态增删改网站。

2个月前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!