在虚拟机中装好Nginx后,想通过域名而非IP访问网站,核心步骤就三步:把虚拟机的网络模式改成桥接、在Nginx配置文件里添加对应的server块、再把域名解析到这台虚拟机的IP上,配置过程里最容易卡住的是网络模式和防火墙,而不是Nginx本身。
下面我按实际操作的顺序,把每一步怎么弄、为什么这么弄、以及碰到问题怎么排查,完整走一遍。
安装Nginx之前,先想清楚虚拟机网络模式
很多朋友在VMware或VirtualBox里装完Nginx,发现本机用浏览器访问虚拟机IP没反应,第一时间怀疑是Nginx配置错了,其实九成问题出在网络模式上。
虚拟机有三种常见的网络工作方式,区别很大:
- NAT模式:虚拟机通过宿主机上网,宿主机可以访问虚拟机,但局域网里的其他设备访问不到,域名解析到了虚拟机IP,外部请求也进不来。
- 桥接模式:虚拟机直接占用局域网的一个独立IP,和宿主机平级,局域网内所有设备都能通过这个IP访问虚拟机,做域名访问首选这个模式。
- 仅主机模式:只能宿主机和虚拟机互通,外面完全访问不到,一般用来做测试隔离,不适合对外提供网站服务。
行业共识认为,凡是涉及域名访问、对外提供Web服务的场景,必须使用桥接模式。 如果你确认虚拟机用的是NAT模式,先把这个改掉,能省掉后面一大堆排查时间。
修改虚拟机网络模式的实操路径
以VMware为例:
- 关闭虚拟机电源。
- 右键虚拟机名称,打开“设置”。
- 找到“网络适配器”,把网络连接方式从“NAT”改成“桥接模式”。
- 启动虚拟机,重新登录系统,新分配到的IP可以用
ip addr命令查看。
桥接模式下虚拟机相当于局域网里的一台独立主机,你可以把这个IP在浏览器里打一下,如果能看到Nginx的默认欢迎页,说明网络这一关已经通过了,要是还不行,往下看Nginx的安装和配置,但多数情况下问题就出在这一步。
nginx虚拟主机配置不生效?先检查这几个细节
网络通畅之后,才进入正题:配置虚拟主机,Nginx官方文档里把虚拟主机叫Server Block,一个Nginx可以同时跑多个网站,每个网站拥有独立的域名和独立的站点根目录,互不干扰。
第一步:确认Nginx安装方式和配置文件位置
用包管理器安装的Nginx,不同系统路径略有区别:
- CentOS / RHEL系:配置文件在
/etc/nginx/nginx.conf,子配置目录是/etc/nginx/conf.d/,站点根目录一般是/usr/share/nginx/html。 - Ubuntu / Debian系:主配置在
/etc/nginx/nginx.conf,子配置目录是/etc/nginx/sites-available/,启用目录是
/etc/nginx/sites-enabled/,站点根目录一般是/var/www/html。
我建议你只在conf.d或sites-available目录里新建文件,不要去动主配置文件,这样以后网站多了,每个域名一个独立文件,维护起来一目了然。
第二步:创建站点目录和测试页面
假设你的域名是example.com,先建一个存放网站文件的目录:
mkdir -p /var/www/example.com echo "<h1>Hello, Nginx Virtual Host</h1>" > /var/www/example.com/index.html
目录路径可以自定义,但要记住这个路径,后面配置里用的就是它。
第三步:编写虚拟主机配置文件
以CentOS系为例,在/etc/nginx/conf.d/里新建一个文件,文件名建议用域名命名:
vi /etc/nginx/conf.d/example.com.conf
写入以下配置:
server {
listen 80;
server_name example.com www.example.com;
root /var/www/example.com;
index index.html;
access_log /var/log/nginx/example.com.access.log;
error_log /var/log/nginx/example.com.error.log;
}
这里每一行都很关键:
listen 80:监听80端口,这是HTTP默认端口。server_name:填你的完整域名,这是Nginx区分不同网站的关键。root:指定网站文件放在哪个目录,对应刚才建的目录。index:访问域名时默认打开的文件名。
写完保存退出,然后测试配置文件语法:
nginx -t
看到ok和successful这两个关键字,说明配置没问题,然后重载配置让修改生效:
systemctl reload nginx
第四步:设置SELinux或防火墙放行
这一步在CentOS上尤其常见。即使配置文件全对,SELinux处于Enforcing状态时,Nginx可能没有权限访问非默认目录。 你会看到配置没问题、服务也正常,但访问就是404或者403。
快速排查方法:
getenforce
如果返回Enforcing,可以先临时放宽权限测试:
setenforce 0
然后再用浏览器访问,如果能打开了,说明确实是SELinux拦截,需要给网站目录打上正确的标签:
chcon -R -t httpd_sys_content_t /var/www/example.com
之后把SELinux恢复原状态就行。
防火墙方面,确认80端口已经放行:
firewall-cmd --permanent --add-service=http firewall-cmd --reload
Ubuntu系统则检查ufw状态,sudo ufw allow 80即可。
第五步:在虚拟机上直接测试
在虚拟机本地用curl测试,可以排除网络层面的干扰:
curl -H "Host: example.com" http://127.0.0.1
如果返回了你写的HTML内容,说明Nginx虚拟主机本身已经配置成功,那么问题就只剩域名解析这一关了。
nginx虚拟机安装后域名访问不了?从域名解析链路逐段查
Nginx配置完全正常,但域名就是打不开网站,这时候按下面的思路逐环节排查,很快能定位问题。
域名解析的两种场景
你已经购买了真实域名。
到域名服务商的控制台,把A记录指向虚拟机IP,注意,如果虚拟机部署在酷番云、简米云等国内云服务器上,域名必须完成ICP备案,否则80端口会被拦截,据工信部公开信息,未备案域名在国内服务商处不能开通Web访问,这是硬性要求。
本地测试环境,没买域名。
修改本机的hosts文件就行了,Windows路径是C:WindowsSystem32driversetchosts,macOS和Linux是/etc/hosts,最后追加一行:
168.1.100 example.com
把前面的IP换成你虚拟机的实际IP。
排查命令按这个顺序执行
在宿主机上依次执行:
ping example.com:看返回的IP是否等于虚拟机IP,如果ping不同,说明解析没生效或hosts没写对。ping 虚拟机IP:如果IP能通但域名不通,问题出在DNS解析或hosts文件,如果IP都不通,回到网络模式检查,多半是NAT模式或者桥接没接好。- 用
telnet example.com 80或nc -vz example.com 80:测试80端口通不通,如果通,浏览器应该能打开了;如果不通,查防火墙。
一个容易被忽视的缓存问题
修改了hosts文件或域名解析记录后,浏览器可能还在用旧的DNS缓存,Windows下刷新DNS缓存:
ipconfig /flushdns
macOS用sudo killall -HUP mDNSResponder,Linux用sudo systemctl restart systemd-resolved或者sudo resolvectl flush-caches。
Chrome浏览器可以在地址栏输入chrome://net-internals/#dns,点击“Clear host cache”。
nginx绑定域名后常见的几个坑和对应的处理办法
在实际搭建过程中,有些问题出现的频率高得惊人,整理成表格方便对照。
| 故障现象 | 可能原因 | 处理方法 |
|---|---|---|
| 访问域名跳到Nginx默认页 | server_name没有匹配上 | 检查配置文件的server_name是否和域名完全一致;用nginx -t测试后reload |
| 访问虚拟机IP能通,域名不通 | DNS解析没生效 / hosts没配 | 按上面场景二的排查链路逐段检查 |
| 配置了多个虚拟主机,但都显示同一个网站 | 第一个server块被当作默认站点 | 每个server块都明确写server_name,不要留空;用server_name区分而不是靠顺序 |
| 网站目录打不开,报403 Forbidden | index文件不存在或目录权限不对 | 确认目录里有index.html,chmod 755目录权限 |
| 重启虚拟机后IP变了,域名解析失效 | 桥接模式下DHCP重新分配了IP | 在路由器里给虚拟机MAC地址绑定固定IP,或者虚拟机里改静态IP配置 |
这里专门说一下“多个域名指向同一个IP”的情况,很多人问nginx虚拟机怎么配置域名才能让不同域名访问不同网站,其实就是在/etc/nginx/conf.d/下为每个域名各写一个独立的conf文件,server_name写各自的域名,root指各自的目录,两个配置文件同时存在,Nginx会自动按域名路由,互不冲突。
还有一个细节,配置完记得systemctl reload nginx而不是restart,reload是平滑重载,当前连接不中断,restart会断开所有请求,只要是改配置文件,一律用reload。
常见问题速答
nginx配置虚拟主机后域名无法访问,是不是还要修改主配置文件?
不需要修改主配置文件,只要确保主配置文件nginx.conf里有include /etc/nginx/conf.d/.conf;这一行,所有放在conf.d目录下的配置就会自动生效,Ubuntu系统则把配置文件放到sites-available后,在sites-enabled里建一个软链接指向它,然后systemctl reload nginx。
一台虚拟机可以配置多个域名吗?
可以,没有数量限制,每增加一个网站,在conf.d目录下新建一个独立配置文件,server_name写新域名,root指定新网站目录,然后reload nginx就能生效,同一个IP、同一个80端口可以同时承载几十个域名站点,这也是Nginx虚拟主机机制的核心能力。
虚拟机里域名能正常解析,但从外部访问超时,还可能是什么原因?
检查宿主机和虚拟机之间是否有额外的网络隔离策略,企业内网或校园网常常会开启“端口隔离”或“AP隔离”,导致不同设备之间即使同一网段也无法互通,把虚拟机接到路由器主LAN口下,避免经过旁路AP,多数情况下就能解决,如果是云服务器,还需在安全组规则里放行80端口入方向,这一步经常被忽略。
写在最后
解决nginx安装虚拟机后配置虚拟主机并实现域名访问的问题,本质就是顺序正确然后逐层验证,先确认桥接网络,再配置虚拟主机,最后打通域名解析,每一步都有明确命令可以验证,不用瞎猜,配置文件用reload热加载,出现异常时多看/var/log/nginx/error.log里的报错信息,大部分问题都能在日志里找到真正原因。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/628480.html





