在虚拟机上搭建Nginx并不复杂,实际耗时一般在十分钟左右,最常出问题的地方不是Nginx本身,而是虚拟机网络的端口转发配置。本文从零开始,带你走完虚拟机环境准备、Nginx安装、配置、启动验证的全流程,并针对大家最容易踩的几个坑给出直接解法。
先认清一个问题:虚拟机里装Nginx,到底比物理机麻烦在哪
很多人照着网上的教程装Nginx,明明每一步都执行成功,但浏览器就是打不开页面,根子往往不在Nginx配置上,而在虚拟机的网络模式。
VMware或VirtualBox默认的NAT模式,会让虚拟机拥有一个独立的内部IP(比如192.168.x.x),宿主机能ping通这个IP,但外部设备访问不到,你需要手动设置端口转发规则,把宿主机的某个端口映射到虚拟机的80端口上。
另一种做法是使用桥接模式,让虚拟机直接获取局域网IP,这样就不需要端口转发,但桥接模式要求你的路由器有足够的IP分配空间,且部分校园网、公司网络限制严格,桥接后可能直接断网。
如果你问“虚拟机安装nginx有什么好处”,行业共识认为最大的好处是环境隔离:把Nginx跑在一个独立的系统里,测试配置改坏了,删除虚拟机重来即可,不影响宿主机系统干净度,这一点在本地学习Nginx配置时价值尤其明显。
- 学习用途:推荐NAT模式+端口转发,安全且不占局域网IP
- 长期使用或模拟生产环境:推荐桥接模式,访问方式更直观
- 只想临时跑一下:不要装虚拟机,直接用Docker跑Nginx更省事
虚拟机搭建nginx教程:从空白系统到页面跑通
第一步:确认你的虚拟机网络模式
打开VMware,右键虚拟机→设置→网络适配器。
建议选择NAT模式,这里有个容易忽略的细节:如果虚拟机已经装好系统,修改网络模式后,需要进入虚拟机内部重启网络服务或直接重启虚拟机,否则新配置不生效。
Ubuntu系统执行:
sudo systemctl restart networking
CentOS/RHEL系的命令是:
sudo systemctl restart network
部分新版本CentOS使用NetworkManager,命令为:
sudo systemctl restart NetworkManager
第二步:更新系统并安装Nginx
Ubuntu/Debian系:
sudo apt update sudo apt install nginx -y
安装完成后Nginx会自动启动,检查运行状态:
systemctl status nginx
看到active (running)就说明Nginx本体没问题。
CentOS/RHEL系:
CentOS默认仓库里的Nginx版本偏老,如果你希望用较新的Nginx版本,先添加官方仓库:
sudo dnf install epel-release -y sudo dnf install nginx -y
启动并设置开机自启:
sudo systemctl start nginx sudo systemctl enable nginx
验证安装版本:
nginx -v
这里补充一句:如果你问“虚拟机搭建nginx要不要编译安装”,多数情况下

不需要,源码编译通常用于修改编译参数或集成第三方模块,日常学习和常规使用直接用系统包管理器安装即可,省时省力且方便卸载。
第三步:配置虚拟机端口转发(NAT模式下必做)
假设你的宿主机是Windows,虚拟机是Ubuntu,虚拟机的IP是192.168.10.128,Nginx监听80端口。
打开VMware的“编辑→虚拟网络编辑器”,选择NAT模式对应的VMnet8,点击NAT设置,添加端口转发规则:
- 主机端口:8080(可自己定,别跟宿主机已有服务冲突)
- 虚拟机IP地址:192.168.10.128
- 虚拟机端口:80
- 描述:随便写,比如nginx-web
宿主机是Windows,直接用浏览器访问http://localhost:8080,就能看到Nginx的默认欢迎页。
宿主机是Mac,VMware Fusion的NAT设置路径不太一样,在“虚拟机→网络适配器”里选择“共享”模式,然后在虚拟机的网络设置中查看当前IP,配置方式类似,实际体验中,Mac用户更多选择桥接模式,宿主机直接访问虚拟机IP,更直观。
第四步:放行防火墙端口,别让Nginx被“憋死”
这一步是最多人忽略的,Nginx启动了,虚拟机内部用curl访问没问题,但宿主机就是打不开十有八九是防火墙没放行。
Ubuntu的ufw防火墙:
sudo ufw allow from any to any port 80 proto tcp sudo ufw allow from any to any port 8080 proto tcp
如果ufw状态是inactive,说明没启用防火墙,规则可加可不加,建议加上,防止后续启用时忘记放行。
CentOS的firewalld:
sudo firewall-cmd --permanent --add-port=80/tcp sudo firewall-cmd --permanent --add-port=8080/tcp sudo firewall-cmd --reload
验证规则已生效:
sudo firewall-cmd --list-ports
如果用的是云服务器+本地虚拟机混合环境,还要检查安全组策略,但纯本地虚拟机一般不用考虑这层。
第五步:修改Nginx默认站点,搭建你的第一个页面
Nginx默认站点的配置文件位置,在Ubuntu下是/etc/nginx/sites-available/default,CentOS下是/etc/nginx/nginx.conf,两个系统的配置语法完全一样,只是组织方式有区别。
创建一个自定义站点配置,是更推荐的做法,在Ubuntu下:
sudo nano /etc/nginx/sites-available/myweb
写入基础配置:
server {
listen 80;
server_name localhost;
root /var/www/myweb;
index index.html index.htm;
location / {
try_files $uri $uri/ =404;
}
}
创建网站目录和测试页面:
sudo mkdir -p /var/www/myweb echo "<h1>我的第一个Nginx页面</h1>" | sudo tee /var/www/myweb/index.html
启用站点配置:
sudo ln -s /etc/nginx/sites-available/myweb /etc/nginx/sites-enabled/ sudo nginx -t sudo systemctl reload nginx
nginx -t这步一定要执行,它用来检查配置文件语法,输出syntax is ok和test is successful才算通过,如果报错,会直接告诉你错误在第几行,按照提示修改即可。

排查Nginx启动失败的常见原因
端口被占用导致启动失败
Nginx默认监听80端口,如果有其他服务(Apache、Tomcat等)占用了80端口,Nginx启动时会报address already in use。
查看端口占用情况:
sudo lsof -i:80
确认是哪个进程占用了端口,要么停掉旧服务,要么修改Nginx监听端口,本地学习环境建议直接停掉不用的服务:
sudo systemctl stop apache2 sudo systemctl disable apache2
权限问题导致403 Forbidden
配置正确但访问返回403,通常和目录权限有关,Nginx的worker进程以www-data(Ubuntu)或nginx(CentOS)用户运行,如果你的网站目录放在root用户的主目录下,Nginx没有权限读取。
解决问题最简单的方式:
sudo chown -R www-data:www-data /var/www/myweb sudo chmod -R 755 /var/www/myweb
SELinux拦截导致访问失败(CentOS特有)
CentOS默认开启SELinux,可能拦截Nginx读取网站目录,如果配置、权限都没问题,但访问还是403,大概率是SELinux在“作祟”。
先看SELinux状态:
getenforce
输出Enforcing说明SELinux正在强制模式,临时关闭:
sudo setenforce 0
再次访问页面,如果能打开了,说明确实是SELinux的问题,这时不要直接永久关闭SELinux,更稳妥的做法是为网站目录设置正确的SELinux上下文:
sudo semanage fcontext -a -t httpd_sys_content_t "/var/www/myweb(/.)?" sudo restorecon -Rv /var/www/myweb
如果semanage命令不存在,先安装policycoreutils-python-utils(CentOS 8+)或policycoreutils-python(CentOS 7)。
虚拟机能打开但宿主机打不开
这一条放在最后压轴,因为它是最常见的,排查顺序应按优先级排列:
- 确认Nginx在虚拟机内部正常运行:在虚拟机内执行
curl localhost,能看到HTML输出说明Nginx正常 - 确认端口转发规则生效:回到宿主机,执行
telnet 虚拟机IP 80,看端口是否可达 - 确认防火墙状态:检查ufw或firewalld(对应文章前面第四步)
- 检查VMware NAT设置:有些版本修改NAT设置后需要重启VMware的NAT服务,在Windows服务里找到“VMware NAT Service”,右键重启
一个特别容易混淆的点:宿主机访问的是localhost:8080,不是虚拟机IP:8080,因为端口转发规则定义在宿主机的VMnet8网卡上,从宿主机访问时,走的是NAT转发链,有人拿着虚拟机IP在宿主机浏览器里访问,结果连不上,于是以为是Nginx的问题,其实换回localhost就好。
nginx虚拟机配置端口转发的两种方式对比
| 对比维度 | NAT模式+端口转发 | 桥接模式 |
|---|---|---|
| 配置复杂度 | 需要设置端口映射 | 无需额外设置,直接用IP访问 |
| 对外暴露范围 | 仅宿主机可访问(可配置公网映射) | 局域网内所有设备均可访问 |
| 安全性 | 相对更隐蔽 | 暴露在局域网中,需注意防护 |
| 适用场景 | 本地开发、学习测试 | 模拟公网环境、需要多设备联调 |
如果你选桥接模式,但虚拟机获取不到IP,检查虚拟机网络适配器是否选择了“桥接模式”,并且宿主机连接的是Wi-Fi还是网线,Wi-Fi连接有时需要VMware将桥接网卡指定为无线网卡(虚拟网络编辑器里,桥接到下拉框选择对应无线网卡)。
让Nginx随系统自动运行
安装Nginx时,大多数情况下默认已经设置了开机自启,但如果你手动修改过,或者使用了编译安装,需要自己配置。
sudo systemctl enable nginx
检查是否已设置自启:
systemctl is-enabled nginx
输出enabled说明正常,输出disabled或static则需重新开启。
虚拟机安装nginx后的基础性能优化
很多人在虚拟机上装完Nginx就急着部署业务,忽略了几个基础优化项,虽然虚拟机性能比不上物理机,但简单的配置调整能减少资源浪费。
调整worker进程数:
worker_processes auto;
开启gzip压缩:
gzip on; gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript image/svg+xml;
设置连接超时:
keepalive_timeout 65; client_max_body_size 20M;
client_max_body_size特别实用,默认是1M,如果业务涉及文件上传,不调大这个值会直接返回413错误。
常见问题精炼解答
虚拟机里Nginx启动正常,但宿主机访问不了,怎么排查最快
先用curl localhost在虚拟机内部确认Nginx确实在工作,然后检查端口转发规则是否添加正确,重点看虚拟机IP是否填写正确虚拟机IP变了,NAT转发规则里的IP和端口都可能导致访问失败,最后排查防火墙,放行对应端口。
重启虚拟机后Nginx不能访问,但没改动任何配置
大概率是虚拟机重启后IP地址发生了变化,NAT端口转发规则里绑定的是旧IP,重启后DHCP重新分配了地址,解决方法是给虚拟机配置静态IP,或者在虚拟网络编辑器里设置DHCP的地址保留(将某个IP固定分配给指定MAC地址)。
编译安装的Nginx怎么卸载后才不会留下残留
先用make uninstall尝试卸载,这个命令会读取编译时生成的Makefile,自动删除已安装的文件,如果Makefile文件已被删除,只能手动清理,一般Nginx编译安装的默认路径是/usr/local/nginx,直接删除整个目录,然后清理/usr/local/nginx/conf/nginx.conf等配置文件,再检查/etc/init.d/或/usr/lib/systemd/system/下是否有Nginx的启动脚本残留,清理完毕后执行nginx -v,提示command not found即代表卸载干净。
