# 多套 Trojan 与 Nginx 配置修复

此变更需要配套的新 xbctl 和 easy-install.sh，不要只替换脚本搭配旧二进制。

## Nginx 基础配置丢失

`easy-install.sh --repair-nginx` 只修复基础配置：识别缺失、空文件或旧安装器生成的孤立 stream 块，备份现有 Nginx 目录，再通过 Debian 软件包恢复缺失配置。不会删除 /etc/oo 或申请新证书；软件包重装可能启停 Nginx。自定义主配置不会被覆盖，检查失败会停止。它不会凭空找回已删除的域名规则。

## 多套服务

不同域名可以共用外部 443；内部 Trojan 监听端口需分别配置，例如 10443 / 10444。健康端口和证书续期端口也应避免冲突。安装器的 --trojan-upstream 必须和面板实际下发的节点监听端口一致，它不会替你修改面板监听端口。

已有规则时，必须显式指定 --trojan-upstream 和 --acme-http-port。
针对已有实例补齐 Nginx 时，多实例环境必须指定 --instance，避免修改错实例：

```sh
sudo bash easy-install.sh --resume-nginx --instance YOUR_INSTANCE_ID \
  --domain b.example.com --trojan-upstream 127.0.0.1:10444 \
  --acme-http-port 18081
```

命令复用有效证书，只设置选中实例的回落地址和续期端口。若一个机器实例下还有多个动态节点，它们的节点级端口和证书参数仍需在面板中正确配置；该命令不替面板自动分配所有节点端口。共享节点进程重启会导致其他实例短暂重连。

写入规则时保留已有监听器及其他域名，添加同域名同后端幂等；同域名指向不同后端会拒绝操作，即使有 --force 也不覆盖。包含自定义正则等未知映射语法时停止，要求人工检查。Nginx 检查或重载失败恢复原配置文件。

## 共用非 443 端口或混用端口组

安装器新增 `--listen-port 9443`（默认 443）。同一外部端口的多个域名合并到同一监听器；不同外部端口分别保存配置，并使用独立的 Nginx 变量和 upstream 名称。同一域名可在不同端口组映射到不同后端。

```sh
sudo bash easy-install.sh --resume-nginx --instance YOUR_INSTANCE_ID \
  --domain c.example.com --listen-port 9443 \
  --trojan-upstream 127.0.0.1:10445 --acme-http-port 18082
```

客户端连接 c.example.com:9443，SNI 为 c.example.com；面板下发的内部监听端口须为 10445。云安全组与防火墙需要放行外部端口。TLS 证书不按端口区分，HTTP-01 验证仍需外部 80。

外部端口不能与内部 Trojan/HTTPS 回落端口重复。若使用外部 8443，必须通过 `--web-upstream` 指定另一个真实 HTTPS 后端端口，因为默认回落端口也是 8443。未知 SNI 走指定 HTTPS 后端；该后端不存在时不会获得正常网页。

同一域名复用多个端口时，必须保留原 HTTP-01 验证服务；安装器拒绝覆盖该域名已有的不同验证端口。不同域名、不同实例应分别使用不同续期端口。旧配置若一个监听器同时监听多个不同端口，脚本会拒绝修改，需先人工拆分。

只删除 9443 组的一条规则（不影响 443 组）：

```sh
sudo oo nginx trojan-sni --listen 9443 --domain c.example.com --remove --write --reload
```

## 删除默认 443 组规则

```sh
sudo oo nginx trojan-sni --domain b.example.com --remove --write --reload
```

也可以直接使用管理程序：

```sh
sudo /usr/local/bin/xbctl nginx trojan-sni --domain b.example.com --remove --write --reload
```

仅删除该域名的 SNI 映射，不删除实例、证书、其他域名规则及 HTTP 续期配置。若默认规则也指向该服务，会拒绝删除并提示先处理默认规则。实例回收站不等同于此命令，不能依赖它自动清理 Nginx 路由。
