用 nginx 把多个服务收进一个域名
子域名、反向代理、WebSocket 转发,以及几个容易踩的坑。
一个域名下面跑好几个服务很常见:博客、面板、接口。与其记一堆端口号,不如用子域名区分,访问起来更直观。
先规划好域名结构
我的习惯是主域名给静态站点,子域名按用途划分,比如 newapi.apizone.cn 给管理面板。规划好之后再动 nginx,避免后面反复改。
server 块怎么写
静态站点直接 root 指目录,配合 try_files;需要反向代理的服务用 proxy_pass 转发到本地端口。关键是把 Host、X-Real-IP、X-Forwarded-For 都透传过去,否则后端拿到的来源信息就是错的。
WebSocket 和流式响应
面板类服务经常用 WebSocket,必须显式设置 proxy_http_version 1.1 和 Upgrade 头,还要把 Connection 头设成 upgrade。流式接口则要关掉 proxy_buffering,否则响应会被攒着一次性返回。
几个老坑
server_name不匹配时会落到第一个 server 块,容易出现"配置明明写了却不生效"的错觉。- 默认站点如果没有删掉,可能一直在抢请求。
- 改完一定要
nginx -t,再systemctl reload nginx,不要直接 restart。
配置能跑起来只是第一步,把日志打开、确认请求真的进来了,才算配好。