2026-05-19 08:51:26 +08:00
1
2026-05-18 23:52:14 +08:00
1
2026-05-18 22:32:08 +08:00
2
2026-05-18 22:48:12 +08:00
1
2026-05-18 22:32:08 +08:00
1
2026-05-18 22:32:08 +08:00
1
2026-05-18 22:32:08 +08:00
2
2026-05-18 22:48:12 +08:00
1
2026-05-19 08:51:26 +08:00
1
2026-05-19 08:51:26 +08:00
1
2026-05-18 22:32:08 +08:00
1
2026-05-18 23:03:40 +08:00
1
2026-05-18 22:32:08 +08:00

OpenResty Gateway

这个目录用于通过 Docker Compose 启动 OpenResty 网关,并使用 Certbot 申请和续期 Let's Encrypt 证书。

前置条件

  • Linux 服务器
  • Docker 和 Docker Compose
  • openssl
  • crontab,可选,用于安装自动续期任务
  • 域名 DNS 已解析到当前服务器

当前配置使用 network_mode: hostOpenResty 会直接监听宿主机端口。

脚本结构

  • init-certs.sh:首次初始化入口,内部调用 scripts/init-certs-core.sh
  • uninstall.sh:卸载入口,目前用于卸载证书自动续期 cron。
  • scripts/:放具体实现脚本,包括 nginx 域名模板生成、证书初始化核心逻辑、手动续期、安装和卸载续期 cron。

首次部署

进入目录:

cd /path/to/openresty-gateway

如果需要直接执行脚本,可以先添加执行权限:

chmod +x *.sh scripts/*.sh

首次申请证书并启动服务:

先确认 init-certs.sh 里的 DOMAINSCERT_EMAIL 已经按当前部署环境配置好。

sh init-certs.sh

默认情况下,脚本只校验 nginx 配置是否存在,不会自动创建新站点配置。缺配置时可以显式生成基础模板:

sh init-certs.sh --create-missing-conf

这个脚本会:

  1. 校验每个域名都有 nginx 配置、配置里放行 /.well-known/acme-challenge/,且 nginx 引用的证书域名都已加入 DOMAINS
  2. 为缺失的证书路径生成临时 dummy 证书。
  3. 启动 OpenResty保证 /.well-known/acme-challenge/ 可以访问。
  4. 删除本次创建的 dummy 证书文件。
  5. 运行 Certbot 分别为每个域名申请正式证书。
  6. 重启 OpenResty 让正式证书生效。
  7. 如果系统有 crontab,安装证书自动续期 cron 任务。

不想在初始化时安装自动续期任务:

sh init-certs.sh --skip-renew-cron

重复执行 init-certs.sh 不会强制重签已有证书Certbot 会保留还没到期的证书。 重复执行时也不会重复添加 cron安装脚本会先删除旧任务块再写入新任务。

日常启动和停止

启动:

docker compose up -d openresty

停止:

docker compose down

重启:

docker compose restart openresty

检查配置:

docker compose config
docker compose exec openresty openresty -t

查看日志:

docker compose logs -f openresty

证书续期

手动续期:

sh scripts/renew-certs.sh

scripts/renew-certs.sh 使用 certbot renewCertbot 会自己判断证书是否快过期;没到续期时间不会真正重签。

安装自动续期

安装每天 03:00 自动续期:

sh scripts/install-renew-cron.sh

安装脚本可以重复执行。它会先删除旧的自动续期任务块,再写入新的任务,避免重复添加。

自定义执行时间,例如每天 04:30

SCHEDULE="30 4 * * *" sh scripts/install-renew-cron.sh

查看当前 crontab

crontab -l

卸载自动续期:

sh uninstall.sh

自动续期日志:

tail -f logs/cert-renew.log

AI 网关 mock 规则

conf/conf.d/000-ai.sggai.site-mock-small-chat.conf 会优先于 ai.sggai.site.conf 加载。

它会拦截:

  • 路径:/v1/chat/completions
  • 方法:POST
  • JSON 中 "stream": false
  • 请求体不超过 1024 字节
  • messages 文本内容总长度不超过 20 字节

命中后直接返回 mock 响应:

{
  "id": "chatcmpl-mock",
  "object": "chat.completion",
  "created": 1716030000,
  "model": "xxx",
  "choices": [
    {
      "index": 0,
      "message": { "role": "assistant", "content": "ok" },
      "finish_reason": "stop"
    }
  ],
  "usage": { "prompt_tokens": 1, "completion_tokens": 1, "total_tokens": 2 }
}

不满足 mock 条件的请求会继续转发到:

http://10.1.0.1:3001

注意事项

  • certs/logs/、运行时 webroot 文件默认不提交到 Git。
  • 如果证书文件不存在OpenResty 的 HTTPS 配置会启动失败;首次部署请先运行 init-certs.sh
  • ai.sggai.site 当前通过 000- 前缀配置文件覆盖原配置,openresty -t 可能出现同名 server 被忽略的 warning。
  • 如果需要透传带下划线的请求头,例如 Session_id,需要确认 Nginx 的 underscores_in_headers 策略是否符合预期。
Description
No description provided
Readme 94 KiB
Languages
Shell 80.8%
Roff 16.9%
HTML 2.3%