V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
wind1986
V2EX  ›  问与答

自定义域名+自动 https 实现原理

  •  
  •   wind1986 · 262 天前 · 1556 次点击
    这是一个创建于 262 天前的主题,其中的信息可能已经有所发展或是发生改变。
    看了一下这个帖子, https://www.v2ex.com/t/788330
    需求一致, 但是就算这样的话, 我服务器是 nginx, 让用户自己上传 https 证书, 好像也很麻烦, 还得修改 nginx 配置以及配置证书, 想问问这里是否有什么简单的办法?
    19 条回复    2024-02-20 16:20:23 +08:00
    LeegoYih
        1
    LeegoYih  
       262 天前
    可以参考 GitHub Pages 的玩法
    LeegoYih
        2
    LeegoYih  
       262 天前
    GitHub Pages 支持自定义域名,用的是 Let's Encrypt 的证书: https://docs.github.com/en/pages/getting-started-with-github-pages/securing-your-github-pages-site-with-https
    InDom
        3
    InDom  
       262 天前
    你帮他签发就好了,首先他肯定需要将域名 cname 给你,然后到你提供的页面输入域名绑定,你绑定的时候,就直接后台调用生成证书的脚本就好了。

    至于 nginx ,你是可以自己设置的对吧。
    wind1986
        4
    wind1986  
    OP
       262 天前
    @LeegoYih #2 但是这个好像还需要修改 nginx 配置, 有点麻烦, 我想让用户自己维护证书, 不想用 Let's Encrypt 的
    wind1986
        5
    wind1986  
    OP
       262 天前
    @InDom 恩, 不过有点没明白 nginx 应该怎么配置
    证书可以帮他生成(也可以让他自己购买上传给我)
    InDom
        6
    InDom  
       262 天前
    @wind1986 #5 简单来说,这种情况必然是脚本自动管理 nginx 了,你可以为每个域名一个 server ,里面为这个域名指向一对密钥。

    例如如下:/etc/nginx/sites-enable/www_a_com.conf

    server {
    listen 443 ssl;
    server_name www.a.com;

    # 该域名的证书和私钥
    ssl_certificate /etc/nginx/certs/www_a_com/cert.crt;
    ssl_certificate_key /etc/nginx/certs/www_a_com/private.key;

    include /etc/nginx/site-common.conf
    }
    leonshaw
        7
    leonshaw  
       262 天前   ❤️ 1
    nginx ssl_certificate 配置可以包含变量的,把证书用域名相关的文件名存放。
    wind1986
        8
    wind1986  
    OP
       262 天前
    @InDom #6 好吧, 这样感觉好麻烦了, 每次还需要新增 nginx 配置文件, 并 reload nginx
    wind1986
        9
    wind1986  
    OP
       262 天前
    @leonshaw 的确, 这样稍微方便点, 不过域名貌似还是需要配置
    wu00
        10
    wu00  
       262 天前
    不一定非得 nginx 啊,那么多反代,找不出一个可以通过接口动态配置 server_name 的吗?
    就算 nginx 也能装 GUI 之类的管理工具实现的吧
    clf
        12
    clf  
       262 天前
    可以试试 caddy 做网关?支持 api 的方式热更新配置信息。
    wind1986
        13
    wind1986  
    OP
       262 天前
    @wu00 类似于贴牌这种, 还是需要自动的, 不能纯手动哈哈
    wind1986
        14
    wind1986  
    OP
       262 天前
    @clf 恩, 主要还是已经用了 nginx, caddy 不熟悉, 不是特别敢尝试
    wind1986
        15
    wind1986  
    OP
       262 天前
    @LeegoYih #11 靠谱! 我去研究研究!
    wu00
        16
    wu00  
       262 天前
    要让 Nginx 调用 API 获取配置并进行更新,你可以使用 Nginx 自带的模块 ngx_http_lua_module 结合 Lua 脚本来实现。
    下面是一个示例的 Nginx 配置,演示如何在 Lua 脚本中调用 API 获取配置并更新:

    ``` nginx
    http {
    lua_shared_dict config_cache 1m;

    server {
    listen 80;
    server_name domainA.com;

    location / {
    access_by_lua_block {
    -- 尝试从缓存中获取配置
    local config = ngx.shared.config_cache:get("my_config")

    if not config then
    -- 从 API 获取配置
    local res = ngx.location.capture('/api/config')
    if res.status == ngx.HTTP_OK then
    config = res.body
    -- 缓存配置
    ngx.shared.config_cache:set("my_config", config)
    end
    end

    -- 更新 server_name
    if config then
    ngx.var.server_name = config
    end
    }

    # 其他配置...
    }
    }
    }
    ```


    在上述示例中,使用了`ngx_http_lua_module`模块和 Lua 脚本。当请求到达 Nginx 服务器时,Lua 脚本在`access_by_lua_block`中执行。

    脚本的主要逻辑是:
    1. 首先,尝试从缓存中获取配置,如果缓存中存在配置,则直接使用。
    2. 如果缓存中不存在配置,则通过调用`ngx.location.capture`函数来发起 HTTP 请求,获取配置。这里的`'/api/config'`是 API 的 URL 地址,你需要根据实际情况进行修改。
    3. 如果 HTTP 请求返回状态为 200 OK ,则获取到配置内容,并将其缓存起来。
    4. 最后,根据配置更新`server_name`的值。

    这样,每当有请求到达时,Lua 脚本会尝试获取最新的配置并更新`server_name`。

    请注意,该示例仅提供了基本的框架,你需要根据实际需求进行修改和调整,例如添加错误处理、身份验证和缓存策略等。另外,为了使用`ngx_http_lua_module`模块,你需要确保已经将该模块编译到你的 Nginx 中。
    wind1986
        17
    wind1986  
    OP
       262 天前
    @wu00 #16 恩, 感谢, 这个还是挺方便的, 我到时候测试看看
    Lax
        18
    Lax  
       262 天前   ❤️ 1
    先问问有多少用户?

    如果让用户上传,要考虑的事情就太多了。需要对上传的文件做验证,还要管理用户的密钥,每一步都有大坑
    用 certbot 管理 nginx 的证书,一行命令就能搞定。lua 脚本去做动态管理,或者 caddy 之类的工具也很多。
    wind1986
        19
    wind1986  
    OP
       262 天前
    @Lax 考虑自己上传, 人工校验一把, 这种一般不是很频繁, 而且设置一次就够了, 你说的这个我也去了解了解
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   942 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 21:55 · PVG 05:55 · LAX 13:55 · JFK 16:55
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.