宝塔托管的 Nginx,加一个虚拟主机该改哪个文件
在一台装了宝塔的机器上新增站点,最容易做错的不是配置内容,而是「该改哪里」和「怎么让它生效」。
先确认它到底归谁管
我碰到过这样一个现象:执行 systemctl status nginx 返回 inactive,但 ss -lntp 明明显示 80 端口被 nginx 进程占着。
原因是宝塔安装的 Nginx 是源码编译进自己的目录,由面板的脚本直接拉起,并没有注册成 systemd 服务。这时候如果习惯性地去执行 systemctl restart nginx,轻则无效,重则把面板管理的进程弄成一个没人管的孤儿。
# 二进制不在 /usr/sbin,而在宝塔目录下
/www/server/nginx/sbin/nginx
# 检查配置、生效,都走这个二进制
/www/server/nginx/sbin/nginx -t
/www/server/nginx/sbin/nginx -s reload
结论:先看清二进制在哪、谁把它拉起来的,再动手。
目录约定
编译版宝塔的布局是固定套路,记住这几条基本够用了:
/www/server/nginx/sbin/nginx # 可执行文件
/www/server/nginx/conf/ # 主配置
/www/server/panel/vhost/nginx/ # 每个站点一个 .conf
/www/wwwroot/<域名>/ # 站点根目录
关键在于 nginx.conf 末尾那行引入:
include /www/server/panel/vhost/nginx/*.conf;
也就是说,新增站点应该在 vhost/nginx/ 下放一个独立的 域名.conf,而不是去改主配置。改主配置的后果是:下次面板重写配置时你的修改会被覆盖掉。
同理,主配置里那行
include enable-php.conf; 出现在默认 server 块内部。你要是在默认 server 块里动手脚,很可能影响机器上其他站点的 PHP 解析。
一个最小可用的静态站配置
server {
listen 80;
server_name example.com www.example.com;
root /www/wwwroot/example.com;
index index.html;
charset utf-8;
location / {
try_files $uri $uri/ =404;
}
# 静态资源交给浏览器缓存
location ~* \.(css|js|svg|png|jpg|webp|woff2)$ {
expires 7d;
add_header Cache-Control "public";
}
access_log /www/wwwlogs/example.com.log;
error_log /www/wwwlogs/example.com.error.log;
}
两个细节值得单独说:
try_files $uri $uri/ =404;明确让不存在的地址返回 404,而不是被兜底逻辑吞掉。静态站尤其需要,否则搜索引擎会抓到一堆内容相同的页面。- 日志放
/www/wwwlogs/,这是面板的日志目录,面板的日志切割功能只认这个位置。
部署动作的正确顺序
# 1. 建目录并放文件
mkdir -p /www/wwwroot/example.com
# 2. 写 vhost 配置
vi /www/server/panel/vhost/nginx/example.com.conf
# 3. 语法检查——这一步不能省
/www/server/nginx/sbin/nginx -t
# 4. 平滑重载,不断连接
/www/server/nginx/sbin/nginx -s reload
顺序里唯一不能省的是第 3 步。nginx -t 会一次性加载所有 server 块,配置写错时它会直接拒绝,而 reload 在检查失败时不会破坏正在运行的 worker——但前提是你真的检查了。
顺带清理的两件事
配置加完之后,我把机器上遗留的两类东西清了一下:一个是 default 站点没有根目录导致访问裸 IP 时报 500;另一个是文件权限——用 root 解压的站点目录,Nginx 的 worker 用户读不到时表现是 403,但错误信息藏在 access log 里不明显,最好部署完直接 chown -R www:www。