客户站点绑定域名
开发的项目,给客户提供自助建站,允许客户绑定自己的域名并给用户的域名生成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证书也会很麻烦
请教大家有没有更好的方法
以前做过类似的,实现方法和你大同小异,期待高人有更好的方法。
这种动态网站的可以考虑用 Traefik、Caddy 或 Nginx Unit 这类 HTTP 服务,都支持 ACME 的相关协议,自动获取 TLS 证书!
dns_get_record 可以指定获取解析的类型
这点客户量,就算人工操作也不费事啊
可以使用
openresty
+lua
+redis
可以实现动态多租户
这不是很典型的使用域名获取证书的问题吗? Nginx 的 LUA 模块解决这个问题太简单了。搜一下这个
ssl_certificate_by_lua_block
,不太清楚你的网络状况,给你一个 CSDN 的文章Caddy 应该会简单不少。官网上就有一个真实的例子,你把自己域名解析到 demo.caddyserver.com.,然后你的网站就相当于上线了,支持了 HTTPS。
如果网站是固定的话,手动写 Caddyfile 的话,证书不用配置,默认就行。如果网站是动态的话,比如用户可以创建新网站,类似 GitHub Page、Vercel,估计可以用 Caddy 的 JSON API 来控制,动态增删改网站。