文档

更新于 2026-10-20

这里收集自建服务过程中反复用到的配置与排查方法。每条结论都来自实际环境,命令可以直接复制使用。

TLS 证书自动续期

用 DNS 验证方式签发证书,不依赖 80 端口,也就不必为了验证临时中断线上服务。

acme.sh --issue -d example.com --dns dns_cf --keylength ec-256

# 安装到指定位置,并设置续期后自动重载
acme.sh --install-cert -d example.com -ecc \
  --key-file       /etc/nginx/certs/example.key \
  --fullchain-file /etc/nginx/certs/example.crt \
  --reloadcmd      "systemctl reload nginx"

几个容易忽略的点:--reloadcmd 一定要写,否则证书更新了但进程还在用旧的;ECC 证书体积更小,握手更快;续期失败不会自动告警,建议定期查看 acme.sh --list 的输出。

反向代理与真实客户端 IP

服务放在代理后面时,日志里默认只会看到代理的地址。需要显式传递并信任来源:

proxy_set_header X-Real-IP        $remote_addr;
proxy_set_header X-Forwarded-For  $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;

# 只信任来自本机与内网的上游头
set_real_ip_from 127.0.0.1;
set_real_ip_from 10.0.0.0/8;
real_ip_header X-Forwarded-For;

set_real_ip_from 的范围要尽量小。如果对公网开放信任,任何人都能伪造这个头,日志和限流都会失真。

命令行工具

排查问题时,几个命令能覆盖大部分场景:

其中 --resolve 尤其有用:能在不改 DNS 的前提下验证新配置,出问题时立刻回退。

日常维护

服务保持简单是可维护性的前提。能用配置文件表达的,就不写脚本;能靠 systemd 管理的,就不自己写守护进程。重启前先确认端口归属:

ss -lntp | grep ':443 '
# 若端口被旧进程占用,先停旧服务再启动新服务,
# 否则新进程会因绑定失败而静默退出。