在虚拟机里部署nginx并让它通过域名访问,是搭建测试环境、模拟生产架构时非常常见的需求。整个流程拆开来看只涉及三件事:把nginx安装好、在配置文件里用server_name把域名和站点绑定、再让域名能够解析到虚拟机的IP。这三步分别对应安装、配置、解析三个环节,任何一环出问题,浏览器里都会表现为页面打不开,或者打开的根本不是想要的站点。本文以Windows虚拟机为例,把完整过程逐步讲清楚,并附上多域名实战案例和高频问题的排查方法。

一、安装准备:在Windows虚拟机中部署nginx
nginx官方提供了Windows版本的压缩包,直接从官网下载zip包即可,解压后就能运行,没有额外的安装步骤。建议把它解压到一个纯英文、无空格的目录下,例如C:\nginx,避免中文路径引发各种奇怪的问题。解压完成后,目录结构大致是这样的:主程序nginx.exe在根目录,配置文件全部放在C:\nginx\conf目录里,其中最核心的就是nginx.conf;日志文件写在C:\nginx\logs,默认的欢迎页面放在C:\nginx\html。
启动和停止nginx都在命令行里完成。打开cmd,切换到nginx目录后执行start nginx,然后在浏览器访问虚拟机本机的127.0.0.1,看到欢迎页就说明服务已经跑起来了。需要特别注意的是,Windows下nginx是以多个进程方式运行的,一个master进程加若干worker进程,用tasklist命令可以确认进程是否存在。常用命令如下:
cd C:\nginx start nginx tasklist | findstr nginx nginx -t nginx -s reload nginx -s quit nginx -s stop
这里面有两个命令后面会反复用到。nginx -t用来检查配置文件语法是否正确,每次改完配置先跑一遍它,能避免把错误配置直接加载进运行中的服务;nginx -s reload则是平滑重载配置,worker进程会逐个替换,不会中断正在处理的请求,而nginx -s stop是快速停止。改完配置忘记执行reload,是新手最常犯的错误之一,浏览器里自然看不到任何变化。
二、核心配置:用server块和server_name绑定域名
nginx所有的站点配置都写在server块里,而server块必须位于http块内部。打开C:\nginx\conf\nginx.conf,把里面默认的server块看懂,基本就掌握了配置的门道。先看整体骨架:
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
server {
listen 80;
server_name localhost;
location / {
root html;
index index.html index.htm;
}
}
}
server块里有三个关键指令。listen 80声明这个站点监听80端口;server_name就是域名绑定的核心,nginx收到请求后会取出浏览器请求头里的Host字段,和所有server块的server_name做匹配,命中哪个就由哪个server块处理;root指定这个站点的文件根目录,index指定默认首页。把默认的server块改成绑定自己的域名,就是域名配置的第一步:
server {
listen 80;
server_name www.test.local;
location / {
root C:\nginx\html\test;
index index.html index.htm;
}
}
这里把站点目录换成了C:\nginx\html\test,记得先建好这个目录并放入一个index.html,否则访问时会得到404或者403。server_name支持精确匹配、通配符匹配和正则匹配三种写法,本地测试用精确匹配就足够了。如果一个端口上没有任何server_name命中,请求会交给标记了default_server的那个server块处理,没有标记则交给配置文件里的第一个server块,这一点在排查域名指向错误站点时非常有用。改完保存,执行nginx -t确认语法无误,再执行nginx -s reload让配置生效。
另外提醒一点编辑器的问题。不要用系统自带的记事本直接编辑nginx.conf,它容易保存出带BOM的编码格式,导致nginx识别出莫名其妙的字符。建议用VS Code或者Notepad++打开,统一保存为UTF-8编码。
三、域名解析:让域名指向虚拟机的IP
server_name配置好之后,还差最后一环:浏览器输入域名时,这个域名必须能解析成虚拟机的IP地址。生产环境这一步由DNS服务器完成,本地测试环境则用hosts文件来模拟。先在虚拟机里执行ipconfig查看它的IP地址,假设拿到的是192.168.72.128。
接下来分两种场景。第一种是在虚拟机内部自己测试,直接编辑虚拟机里的hosts文件,路径是C:\Windows\System32\drivers\etc\hosts,把域名指到本机回环地址即可。第二种也是更常见的场景:在宿主机的浏览器里访问虚拟机站点,这时要修改的是宿主机的hosts文件,把域名指向虚拟机的IP。hosts内容类似这样:
192.168.72.128 www.test.local 192.168.72.128 api.test.local 127.0.0.1 localhost
修改hosts文件有几个细节容易踩坑。首先它受系统保护,必须用管理员身份打开编辑器才能保存,普通权限保存时会提示拒绝访问;其次改完之后建议执行ipconfig /flushdns刷新DNS缓存,否则系统可能还在用旧的解析结果;最后浏览器自身也有DNS缓存,测试时用无痕窗口或者换个浏览器,能排除这层干扰。
虚拟机的网络模式也直接影响连通性。NAT模式下虚拟机处于独立的子网,宿主机可以直接访问虚拟机IP,但局域网里其他物理机访问不到;桥接模式下虚拟机会从路由器拿到一个和宿主机同网段的IP,局域网内其他设备也能访问。如果发现宿主机ping不通虚拟机,优先检查网络模式和虚拟机的防火墙设置。
四、实战案例:一台虚拟机承载多个域名站点
单域名跑通之后,多域名就是同一套逻辑的叠加。假设要在虚拟机上同时部署两个站点:商城和博客,分别通过www.shop.local和www.blog.local访问。先准备目录,在C:\nginx\html下新建shop和blog两个文件夹,各自放入一个内容不同的index.html,方便区分访问到的是哪个站点。
然后在nginx.conf的http块里写两个server块,两个站点监听同一个80端口,靠不同的server_name区分:
server {
listen 80;
server_name www.shop.local;
location / {
root C:\nginx\html\shop;
index index.html;
}
}
server {
listen 80;
server_name www.blog.local;
location / {
root C:\nginx\html\blog;
index index.html;
}
}
接着在hosts文件里把两个域名都指向虚拟机IP,执行nginx -t和nginx -s reload,浏览器分别访问两个域名,就能看到两个不同的站点。这就是nginx基于域名的虚拟主机功能,一台服务器、一个端口,靠Host字段分流到不同站点,生产环境里大量网站就是这样跑在同一台nginx上的。
当站点数量多起来之后,把所有server块都堆在nginx.conf里会变得难以维护。更好的做法是在C:\nginx\conf下新建一个vhost目录,每个站点单独一个conf文件,比如C:\nginx\conf\vhost\shop.conf、C:\nginx\conf\vhost\blog.conf,然后在nginx.conf的http块里加一行include vhost\*.conf;,nginx启动时会自动把所有站点的配置加载进来,增删站点只需要动对应的文件,主配置文件保持干净。
五、常见问题与注意事项
80端口被占用。Windows虚拟机里如果装过IIS或者SQL Server的Reporting服务,80端口经常被抢占,nginx启动会失败,或者请求被别的服务接走。用下面的命令定位占用进程:
netstat -ano | findstr :80 tasklist | findstr 3524 taskkill /PID 3524 /F
netstat会列出占用80端口的进程PID,假设是3524,再用tasklist确认它是什么程序,最后决定是结束进程还是停掉对应服务。如果不想争抢端口,也可以把nginx的listen改成8080之类的端口,访问时在域名后面带上端口号即可。
改了配置不生效。排查顺序固定三步:先跑nginx -t确认语法没错;再确认执行过nginx -s reload;最后看日志,C:\nginx\logs\error.log里几乎能找到所有问题的答案。还有一种情况是虚拟机里跑了多份nginx,进程混乱导致你以为reload了,实际reload的是另一个目录的实例,用tasklist确认进程情况后彻底清理再启动。
宿主机访问不通。域名解析对了但页面打不开,多半是防火墙。Windows防火墙默认拦截入站连接,可以添加放行规则:
netsh advfirewall firewall add rule name="nginx 80" dir=in action=allow protocol=TCP localport=80
测试阶段也可以临时关闭防火墙来验证,确认是防火墙问题后再补上规则。同时注意NAT模式下只有宿主机能访问虚拟机,局域网其他设备要访问需要切换到桥接模式。
403和404。404通常是root路径写错或者首页文件名和index指令不一致;403常见于目录里没有index指定的文件、目录路径拼错,或者站点目录放在了权限受限的位置。把站点目录统一放在C:\nginx\html下管理最省心。
虚拟机IP变化。如果虚拟机网络用的是DHCP,重启后IP可能变化,hosts里的解析就会失效。建议在虚拟机的网络设置里配置静态IP,或者在虚拟机软件里查看并固定其分配到的地址,一劳永逸。
整体流程回顾一遍:安装解压、编写server块绑定server_name、hosts解析域名到虚拟机IP、reload生效、防火墙放行。每一步都验证通过再进入下一步,出问题时按环节逐个排查,虚拟机里的nginx域名配置其实并不复杂。
nginx域名配置Windows虚拟机hosts文件修改时间:2026-10-02 20:10:32