关于LNMP绑定二级域名,核心答案一句话说清
LNMP绑定二级域名到指定子目录,核心就是为域名新建独立的server配置块,通过root指令指向子目录,并正确设置server_name实现精准匹配。这个操作绕不开nginx配置文件,却也不需要你成为运维专家跟着下文步骤执行,十分钟内就能完成。
lnmp二级域名绑定子目录的底层逻辑
很多朋友第一次接触lnmp时,会觉得绑定域名是件神秘的事,其实nginx处理请求的方式很简单:当用户访问某个域名,nginx会拿着这个域名去匹配所有server块中的server_name,匹配成功后,就执行该server块内的规则,将请求指向root指定的目录。
server_name的匹配优先级
nginx匹配server_name遵循精确匹配优先、通配符次之、正则最后的原则,这意味着当你同时配置了www.example.com和.example.com时,访问www.example.com会精准命中前者,不会跑到通配符的规则里。
| 匹配类型 | 示例 | 优先级 |
|---|---|---|
| 精确匹配 | server_name www.example.com | 最高 |
| 通配符前置 | server_name .example.com | 次之 |
| 通配符后置 | server_name www.example. | 再次 |
| 正则匹配 | server_name ~^(www.)?example.com$ | 最低 |
为什么修改conf文件比lnmp命令更可控
lnmp一键包自带lnmp vhost add命令,它可以帮你生成配置文件,但如果你需要把二级域名绑定到已有站点的子目录,手动编辑conf反而更直接不用重复创建数据库和FTP账号,也不会因为交互式问答而漏掉某项配置。
lnmp二级域名绑定子目录实操步骤
拿一个真实场景举例:主站example.com绑定在/home/wwwroot/default,现在要把blog.example.com绑定到/home/wwwroot/default/blog这个子目录,重点来了,下面每一步都是可以直接照做的。
第一步:创建子目录并放置测试文件
先确保目标子目录存在,并放一个测试文件验证后续配置是否生效:
mkdir -p /home/wwwroot/default/blog echo "test ok" > /home/wwwroot/default/blog/index.html
这一步看似多余,但实测中很有用配置完nginx后,浏览器访问blog.example.com如果能显示test ok,就说明整个链路已经打通。
第二步:编辑nginx配置文件
LNMP环境下的站点配置文件通常存放在/usr/local/nginx/conf/vhost/目录下,打开主站配置文件,在server块外部新增一个独立的server块:
server {
listen 80;
server_name blog.example.com;
root /home/wwwroot/default/blog;
index index.html index.htm index.php;
access_log /home/wwwlogs/blog.example.com.log;
error_log /home/wwwlogs/blog.example.com-error.log;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ .php$ {
fastcgi_pass unix:/tmp/php-cgi.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
业内的经验是,如果你不知道php-fpm的socket路径,可以通过find / -name "php.sock" 2>/dev/null快速定位,不同LNMP版本的socket位置确实存在差异。
第三步:检测配置并平滑重启
配置文件改完后,必须做两件事,顺序也很有讲究:
- 先执行
nginx -t检测语法,看到ok和successful字样再继续 - 再执行
service nginx reload平滑重载,不要用restart,reload不会中断现有连接
这两步做完,配置就生效了,如果浏览器访问出现403或404,排查思路放在下一部分,但多数情况下你已经成功了一大半。
配置后常见状况与排查思路
配置完成后遇到的问题,其实相当一部分集中在两个方向:PHP文件执行异常和二级域名跳转到主站。
出现404或403怎么定位
404通常是root路径写错了,注意nginx的root是直接拼接域名和路径,比如root /home/wwwroot/default/blog搭配server_name blog.example.com,实际访问blog.example.com时会查找/home/wwwroot/default/blog下的文件,403则大概率是目录权限问题,执行chmod -R 755加上chown -R www:www可以解决绝大多数权限类故障。
二级域名自动跳转到主域名怎么处理
这类情况往往是主站配置里写了rewrite规则,把所有非主域名都301到了主域名,打开主站conf,找到类似这样一行并注释掉:
if ($host != 'example.com') { rewrite ^/(.)$ http://example.com/$1 permanent; }
去掉这个强制跳转后,重新加载nginx,二级域名就能正常访问了,对于lnmp配置多个二级域名的场景,这个改动是极易被忽视的坑。
哪些场景适合目录绑定,哪些场景应该换思路
目录绑定并不是万能的,结合使用场景来判断才够务实。
适合用目录绑定的场景
- 子目录只是一个静态栏目或独立落地页,不涉及单独的数据库
- 博客、帮助中心这类功能模块,与主站共用一套程序代码
- 调试阶段快速验证环境,临时让某个子域名指向测试目录
这类情况下,目录绑定不需要额外创建数据库,也不用部署一套完整程序,时间和资源成本都很低,和宝塔面板这类可视化工具对比,lnmp手动改conf的方式虽然门槛稍高,但胜在轻量可控,对系统资源的占用也更低。
应该改用独立站点或反向代理的场景
如果你有较大流量的小程序或商城需要独立运行,绑定目录会让代码混合、日志混杂,排查问题费时费力,更合理的做法是用lnmp vhost add创建独立站点,配上自己的数据库,形成隔离环境。
举个例子:一个WordPress站点跑在子目录下,同时主站也是WordPress,两套程序共用一份核心代码的情况下,插件或主题升级很容易互相影响,这时候就应该考虑独立部署,或者在nginx层用location /blog/ { proxy_pass http://127.0.0.1:8080; }做反向代理,用独立端口跑一套全新程序,从根源上规避冲突。
涉及到HTTPS证书时,推荐的做法是给二级域名单独申请SSL证书,解绑后做301跳转,而不是在同一个server块里混合处理多个域名的证书逻辑,配置代码参考:如需配置HTTPS访问,在server块中加入ssl_certificate和ssl_certificate_key即可,LNMP环境内置的lnmp ssl add命令可以帮你自动完成证书申请和配置。
避免下一个坑:配置生效顺序与缓存
有一个容易踩但不好察觉的问题:改动配置后,浏览器端和CDN层面的缓存会让你的测试结果失真,建议在无痕模式下访问,或者用curl命令直接看响应头:
curl -I http://blog.example.com
看到HTTP/1.1 200 OK就说明服务器端已经正确响应,此时浏览器打不开基本可以锁定为本地缓存或DNS解析未生效。
DNS的TTL设置也会影响测试,改完conf后,如果你用的域名服务商默认TTL是600秒,理论上最长10分钟内全球解析生效,这一点对国内服务器用户尤其重要,因为运营商DNS缓存有时确实比较顽固。
LNMP绑定二级域名到指定子目录,一次配置的本质就是正确理解server_name与root的配合关系,以及不同匹配规则带来的行为差异,按上述步骤操作,绝大多数lnmp环境都能顺利跑通,如果因为环境差异导致个别位置略有不同,重点检查php-fpm的socket路径和目录权限,这两处是最常见的变量,配置完成后,记得把每一条改动都记在文档里,方便后期回溯,把问题想在前面,长期维护就不那么头疼了。
lnmp如何绑定二级域名到指定子目录常见问题解答
二级域名绑定子目录后,程序里获取的路径总是带上子目录名,怎么解决?
这是thinkphp这类框架常见的路径问题,在程序入口文件或配置文件中设置define('BASE_PATH', '/');,或者通过nginx配置fastcgi_param SCRIPT_NAME $fastcgi_script_name;来修正,具体操作取决于程序框架的路由规则,多数情况下调整程序的base_url配置项即可。
lnmp配置多个二级域名时,需要为每个域名单独配置一个server块吗?
是的,每个二级域名都对应独立的server_name和root,但不需要重复创建数据库和FTP账号,复制现有配置,修改server_name和root这两行即可生成新站点的配置,执行nginx -t确认无误后reload,多个二级域名就能各归其位,据LNMP官方文档说明,这也是LNMP环境最常见的多站点配置方式。
域名解析到服务器后,访问者访问二级域名时是先匹配server_name还是先解析域名?
对于nginx配置层面来说,当然是先有域名解析到这台服务器,nginx接收到请求后才开始匹配server_name,但如果你把两个二级域名解析到同一台服务器,配置了相同的root,访问者打开的是同一个页面,nginx不会报错,行业共识认为,域名解析是前置于nginx处理的前置环节,而server_name的主要职责是在多个站点共存时做精确的设备分流。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/643416.html





