LNMP子域名绑定并不复杂:在DNS里加一条A记录指向服务器IP,再到Nginx的vhost配置中把server_name写成子域名、root指向独立站点目录,执行nginx -t检查语法后重载Nginx,最后确认PHP-FPM与目录权限即可生效。真正容易翻车的不是“绑定”这一步,而是解析没生效、server_name冲突、目录权限不对这三类细节,下面按实际操作顺序拆开讲,命令和路径都能直接对照使用。
LNMP子域名绑定前先理清三层逻辑
很多人一上来就改Nginx配置,改完访问还是主站内容,于是怀疑人生,其实子域名能否访问,取决于三个环节依次打通,缺一层都不行。
域名解析层:A记录决定请求去哪儿
子域名本质是DNS层面的独立主机名,比如shop.example.com,你需要在域名服务商后台添加一条A记录:
- 主机记录填
shop(只填前缀,不要填完整域名) - 记录类型选
A - 记录值填服务器公网IP
- TTL用默认值即可,一般600秒左右
如果要走CDN,就改成CNAME记录指向CDN提供的域名,解析生效时间通常在几分钟到几十分钟,行业内普遍认为全球递归DNS完全刷新可能要更久。
Nginx的server_name层:匹配到哪个站点
Nginx收到请求后,靠HTTP头里的Host字段去比对各个server块的server_name,匹配不上时,请求会落到default_server,于是你看到的是默认站点或主站内容,这就是“配置了却打不开”的最常见原因。
站点根目录与PHP-FPM层:代码从哪儿读、由谁执行
root决定静态文件和入口脚本的位置,PHP-FPM的fastcgi_pass决定PHP由哪个进程池处理,LNMP一键安装包默认多个站点共用一个PHP-FPM池,宝塔则是每个站点独立池,共用池时要注意open_basedir是否限制了新目录,独立池时注意池配置文件是否为新站点生成。
LNMP子域名绑定详细步骤:命令行手工配置版
适合用LNMP一键安装包、习惯SSH操作的环境,下面以shop.example.com绑定到/home/wwwroot/shop.example.com为例。
第一步:先把DNS记录加好
在域名解析后台添加A记录后,用命令验证是否生效:
dig shop.example.com +short # 或 nslookup shop.example.com
返回你的服务器IP才算解析到位,没返回就继续等,别急着改Nginx。
第二步:创建独立站点目录并授权
mkdir -p /home/wwwroot/shop.example.com chown -R www:www /home/wwwroot/shop.example.com chmod -R 755 /home/wwwroot/shop.example.com
LNMP环境下Nginx和PHP-FPM的运行用户通常是www,属主不对会直接导致403。
第三步:复制主站vhost并改写关键字段
cp /usr/local/nginx/conf/vhost/example.com.conf \ /usr/local/nginx/conf/vhost/shop.example.com.conf
打开新文件,重点改这几处:
server_name改成shop.example.comroot改成/home/wwwroot/shop.example.comaccess_log和error_log路径换成子域名专属,便于排查- 伪静态规则文件路径确认存在,比如
include rewrite/wordpress.conf; - PHP部分确认
fastcgi_pass unix:/tmp/php-cgi.sock;与当前PHP版本一致
一个最小可用的server块结构如下:
server {
listen 80;
server_name shop.example.com;
root /home/wwwroot/shop.example.com;
index index.html index.php;
location / {
try_files $uri $uri/ /index.php?$args;
}
location ~ \.php$ {
fastcgi_pass unix:/tmp/php-cgi.sock;
fastcgi_index index.php;
include fastcgi.conf;
}
}
第四步:语法检查后重载,不要直接restart
/usr/local/nginx/sbin/nginx -t
看到syntax is ok和test is successful再执行:
/usr/local/nginx/sbin/nginx -s reload # 或 lnmp nginx reload
reload是平滑重载,不中断现有连接;restart会短暂断流,线上环境优先用前者。
第五步:本地验证响应
curl -I http://shop.example.com
返回200或301/302说明Nginx层已通,如果返回的是主站内容,回到server_name排查;返回403查目录权限;返回502查PHP-FPM。
宝塔面板下LNMP子域名绑定怎么配置才能生效
宝塔用户大多不想碰命令行,面板确实把流程简化了,但几个开关没点对一样不生效,宝塔的站点配置存放在/www/server/panel/vhost/nginx/,本质还是生成Nginx配置。
新建站点时直接填子域名
在“网站-添加站点”里,域名一栏填shop.example.com,会自动生成根目录/www/wwwroot/shop.example.com和独立PHP-FPM池,这是最省事的方式。
已有主站如何追加子域名
进入主站设置,找到“域名管理”,把子域名添加进去,注意:这样添加后子域名和主站共用一个根目录,如果你的目的是让子域名指向独立程序,应该新建站点,而不是在主站里追加。
SSL证书与强制HTTPS的注意点
子域名要单独申请证书,主站的证书不覆盖二级域名(通配符证书除外),宝塔里在子域名站点设置中申请Let's Encrypt,勾选“强制HTTPS”后会写入301跳转,若主站已开强制HTTPS,子域名的80端口访问会被跳转,测试时直接用https://验证。
业内专家指出,证书与域名不匹配是子域名HTTPS报错的头号原因,申请前确认证书的SAN列表包含该子域名。
绑定后打不开?LNMP子域名绑定常见故障排查
解析层面:缓存与记录类型
- 本地DNS缓存:换
dig @8.8.8.8 shop.example.com测试 - 记录类型写错:想走CDN却填了A记录
- 主机记录填了完整域名:变成
shop.example.com.example.com
Nginx层面:server_name冲突与default_server
用nginx -T | grep server_name列出所有server块,确认没有重复,如果子域名配置写在主站文件之后且主站有default_server,未匹配请求会落到主站,另外检查是否漏写listen 80;。
权限与运行环境
- 目录属主是否为
www .user.ini是否残留旧路径限制- 防火墙与安全组是否放行80/443
- SELinux开启时是否拦截了目录读取
应用层面:框架的URL配置
WordPress、Laravel这类程序会在数据库或.env里写死站点URL,绑定子域名后要同步改siteurl和home,否则页面资源仍指向主域名,表现为“能打开但样式全乱”。
手工配置与面板配置的取舍对比
| 对比项 | 命令行手工vhost | 宝塔面板添加 |
|---|---|---|
| 操作门槛 | 需熟悉Nginx语法 | 图形化,上手快 |
| 配置位置 | /usr/local/nginx/conf/vhost/ |
/www/server/panel/vhost/nginx/ |
| PHP-FPM | 常与主站共用池 | 默认独立池 |
| SSL申请 | 需acme.sh或certbot手动 | 面板一键签发 |
| 批量管理 | 脚本可批量生成 | 逐个站点操作 |
| 适合场景 | 多子域名、自动化运维 | 少量站点、个人项目 |
行业共识认为,子域名数量超过十个后,手工维护vhost的出错率会明显上升,此时用配置模板加脚本生成更稳妥。
Q&A:LNMP子域名绑定与配置生效的常见疑问
子域名绑定后访问到主站内容,是什么原因?
Nginx没匹配到子域名的server_name,请求落到了default_server,检查子域名配置文件的server_name拼写、文件是否在include vhost/.conf的加载路径内,以及是否执行过reload,用nginx -T输出完整配置逐段核对最快。
LNMP子域名绑定需要单独装PHP吗?
不需要,PHP-FPM是进程池概念,同一套PHP二进制可以服务多个站点,共用池时确认open_basedir包含新目录;独立池则复制一份pool配置改user、group、listen套接字路径即可隔离运行环境。
子域名必须单独申请SSL证书吗?
普通单域名证书只覆盖申请时填写的那个主机名,主站证书不包含shop.example.com,要么给子域名单独签发,要么使用通配符证书.example.com,近年来免费证书签发已很普及,单站点单独申请的成本并不高,维护上反而更清晰。