文档
这里收集自建服务过程中反复用到的配置与排查方法。每条结论都来自实际环境,命令可以直接复制使用。
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 的范围要尽量小。如果对公网开放信任,任何人都能伪造这个头,日志和限流都会失真。
命令行工具
排查问题时,几个命令能覆盖大部分场景:
ss -lntp查看监听端口与对应进程journalctl -u 服务名 -f实时跟踪服务日志openssl s_client -connect host:443 -servername 域名单独验证 SNI 与证书curl -v --resolve 域名:443:IP绕过 DNS 直接测试某个后端
其中 --resolve 尤其有用:能在不改 DNS 的前提下验证新配置,出问题时立刻回退。
日常维护
服务保持简单是可维护性的前提。能用配置文件表达的,就不写脚本;能靠 systemd 管理的,就不自己写守护进程。重启前先确认端口归属:
ss -lntp | grep ':443 '
# 若端口被旧进程占用,先停旧服务再启动新服务,
# 否则新进程会因绑定失败而静默退出。