188 lines
4.3 KiB
Markdown
188 lines
4.3 KiB
Markdown
# OpenResty Gateway
|
||
|
||
这个目录用于通过 Docker Compose 启动 OpenResty 网关,并使用 Certbot 申请和续期 Let's Encrypt 证书。
|
||
|
||
## 前置条件
|
||
|
||
- Linux 服务器
|
||
- Docker 和 Docker Compose
|
||
- `openssl`
|
||
- `crontab`,可选,用于安装自动续期任务
|
||
- 域名 DNS 已解析到当前服务器
|
||
|
||
当前配置使用 `network_mode: host`,OpenResty 会直接监听宿主机端口。
|
||
|
||
## 脚本结构
|
||
|
||
- `init-certs.sh`:首次初始化入口,内部调用 `scripts/init-certs-core.sh`。
|
||
- `uninstall.sh`:卸载入口,目前用于卸载证书自动续期 cron。
|
||
- `scripts/`:放具体实现脚本,包括 nginx 域名模板生成、证书初始化核心逻辑、手动续期、安装和卸载续期 cron。
|
||
|
||
## 首次部署
|
||
|
||
进入目录:
|
||
|
||
```bash
|
||
cd /path/to/openresty-gateway
|
||
```
|
||
|
||
如果需要直接执行脚本,可以先添加执行权限:
|
||
|
||
```bash
|
||
chmod +x *.sh scripts/*.sh
|
||
```
|
||
|
||
首次申请证书并启动服务:
|
||
|
||
先确认 `init-certs.sh` 里的 `DOMAINS` 和 `CERT_EMAIL` 已经按当前部署环境配置好。
|
||
|
||
```bash
|
||
sh init-certs.sh
|
||
```
|
||
|
||
默认情况下,脚本只校验 nginx 配置是否存在,不会自动创建新站点配置。缺配置时可以显式生成基础模板:
|
||
|
||
```bash
|
||
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 任务。
|
||
|
||
不想在初始化时安装自动续期任务:
|
||
|
||
```bash
|
||
sh init-certs.sh --skip-renew-cron
|
||
```
|
||
|
||
重复执行 `init-certs.sh` 不会强制重签已有证书;Certbot 会保留还没到期的证书。
|
||
重复执行时也不会重复添加 cron;安装脚本会先删除旧任务块,再写入新任务。
|
||
|
||
## 日常启动和停止
|
||
|
||
启动:
|
||
|
||
```bash
|
||
docker compose up -d openresty
|
||
```
|
||
|
||
停止:
|
||
|
||
```bash
|
||
docker compose down
|
||
```
|
||
|
||
重启:
|
||
|
||
```bash
|
||
docker compose restart openresty
|
||
```
|
||
|
||
检查配置:
|
||
|
||
```bash
|
||
docker compose config
|
||
docker compose exec openresty openresty -t
|
||
```
|
||
|
||
查看日志:
|
||
|
||
```bash
|
||
docker compose logs -f openresty
|
||
```
|
||
|
||
## 证书续期
|
||
|
||
手动续期:
|
||
|
||
```bash
|
||
sh scripts/renew-certs.sh
|
||
```
|
||
|
||
`scripts/renew-certs.sh` 使用 `certbot renew`,Certbot 会自己判断证书是否快过期;没到续期时间不会真正重签。
|
||
|
||
## 安装自动续期
|
||
|
||
安装每天 03:00 自动续期:
|
||
|
||
```bash
|
||
sh scripts/install-renew-cron.sh
|
||
```
|
||
|
||
安装脚本可以重复执行。它会先删除旧的自动续期任务块,再写入新的任务,避免重复添加。
|
||
|
||
自定义执行时间,例如每天 04:30:
|
||
|
||
```bash
|
||
SCHEDULE="30 4 * * *" sh scripts/install-renew-cron.sh
|
||
```
|
||
|
||
查看当前 crontab:
|
||
|
||
```bash
|
||
crontab -l
|
||
```
|
||
|
||
卸载自动续期:
|
||
|
||
```bash
|
||
sh uninstall.sh
|
||
```
|
||
|
||
自动续期日志:
|
||
|
||
```bash
|
||
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 响应:
|
||
|
||
```json
|
||
{
|
||
"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 条件的请求会继续转发到:
|
||
|
||
```text
|
||
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` 策略是否符合预期。
|