服务器与大带宽专家 · 持牌IDC/CDN/ISP服务商
简米科技官网JIANMI TECH
资讯 2026-10-14 简米科技 5,972 字 14 分钟阅读

虚拟机搭建nginx教程怎么做?详细步骤与常见问题解析

导读在虚拟机上搭建Nginx并不复杂,实际耗时一般在十分钟左右,最常出问题的地方不是Nginx本身,而是虚拟机网络的端口转发配置,本文从零开始,带你走完虚拟机环境准备、Nginx安装、配置、启动验证的全流程,并针对大家最容易踩的几个坑给出直接解法,先认清一个问题:虚拟机里装Nginx,到底比物理机麻烦在哪很多人照着……

在虚拟机上搭建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要不要编译安装”,多数情况下

虚拟机搭建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启动失败的常见原因

端口被占用导致启动失败

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)。

虚拟机能打开但宿主机打不开

这一条放在最后压轴,因为它是最常见的,排查顺序应按优先级排列:

  1. 确认Nginx在虚拟机内部正常运行:在虚拟机内执行curl localhost,能看到HTML输出说明Nginx正常
  2. 确认端口转发规则生效:回到宿主机,执行telnet 虚拟机IP 80,看端口是否可达
  3. 确认防火墙状态:检查ufw或firewalld(对应文章前面第四步)
  4. 检查VMware NAT设置:有些版本修改NAT设置后需要重启VMware的NAT服务,在Windows服务里找到“VMware NAT Service”,右键重启

一个特别容易混淆的点:宿主机访问的是localhost:8080,不是虚拟机IP:8080,因为端口转发规则定义在宿主机的VMnet8网卡上,从宿主机访问时,走的是NAT转发链,有人拿着虚拟机IP在宿主机浏览器里访问,结果连不上,于是以为是Nginx的问题,其实换回localhost就好。

nginx虚拟机配置端口转发的两种方式对比

虚拟机搭建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即代表卸载干净。

分享本文
本文为 简米科技官网 原创,已由运维技术专家审核。转载请注明来源:原文链接
售前咨询 服务热线 售后 邮箱