
做服务器环境这件事最烦的不是装系统本身而是装完之后那一片空荡荡的终端——没网络、没工具链、没服务整个虚拟机就像一台没通电的交换机。我过去几年给团队搭测试环境几乎每周都要回答一遍虚拟机装好了然后呢这个问题。这篇文章就把我的标准答案整理出来不管你是用VMware Workstation还是VirtualBox装完系统之后按这个顺序把网络、开发工具链、Nginx多站点、数据库和容器环境依次搭好就能得到一套真正能干活的服务环境。适合刚接触虚拟机、或者打算把办公电脑变成轻量级开发/测试服务器的人参考。文章里的操作以Ubuntu 22.04和CentOS 7.9为主虚拟机软件主要讲VMwareVirtualBox的原理也基本通用命令差异我会单独标出来。1. 先把网络玩明白虚拟机联网与主机互通配置很多人装完虚拟机发现上不了网或者宿主机访问不到虚拟机里的服务第一反应是系统没装好。其实九成情况都是网络模式选错了。虚拟机网络这块选对模式等于成功了一半。1.1 三种网络模式怎么选NAT、桥接、仅主机VMware给虚拟机提供了三种常见网络模式VirtualBox里叫法略有不同但原理一致。它们的区别可以看下面这张表网络模式虚拟机能否访问外网宿主机能否访问虚拟机局域网设备能否访问虚拟机典型用途NAT能能需端口转发或IP直连不能默认推荐开发测试首选桥接能能能虚拟机当独立服务器用仅主机不能能不能纯离线环境、安全测试最常踩的坑是虚拟机要当Web服务器给局域网同事访问结果用NAT模式配了半天端口转发越弄越乱。反过来只是想本机开发调试却选了桥接结果IP频繁变动、网络冲突MySQL连接断断续续。我的建议很简单开发测试一律先用NAT等需要对外提供服务时再改桥接。NAT模式下虚拟机和宿主机天然就是一个隔离网络外网访问通过宿主机转发对办公网络几乎没有冲击。1.2 固定IP给虚拟机一个永久住址NAT模式默认用DHCP分配IP这有个隐患——虚拟机重启后IP可能变。你做Nginx虚拟主机配置、Docker端口映射时IP一变所有配置全得改。所以我装完系统第一件事就是给虚拟机配静态IP。以Ubuntu 22.04为例新版用netplan编辑/etc/netplan/00-installer-config.yamlnetwork: ethernets: ens33: dhcp4: no addresses: - 192.168.10.128/24 routes: - to: default via: 192.168.10.2 nameservers: addresses: [223.5.5.5, 8.8.8.8] version: 2注意ens33是网卡名VMware里通常是这个名字VirtualBox可能是enp0s3可以用ip addr查看。网关192.168.10.2对应VMware NAT模式的默认网段VMware的NAT网段一般是192.168.x.0网关是192.168.x.2具体在编辑→虚拟网络编辑器里看。CentOS 7改法不一样编辑/etc/sysconfig/network-scripts/ifcfg-ens33文件名里的网卡名要对应BOOTPROTOstatic ONBOOTyes IPADDR192.168.10.128 NETMASK255.255.255.0 GATEWAY192.168.10.2 DNS1223.5.5.5改完用systemctl restart network重启网卡ip addr确认IP。确认能ping通网关后再ping www.baidu.com验证外网。外网不通但网关通了基本就是DNS没配好。1.3 SSH远程连接告别在虚拟机窗口里敲命令虚拟机窗口虽然能用但体验太差——复制粘贴麻烦、看日志费劲、多开几个终端就乱。我建议立刻装SSH服务然后用宿主机终端远程连进去操作。# Ubuntu / Debian sudo apt install -y openssh-server sudo systemctl enable ssh sudo systemctl start ssh # CentOS / Rocky sudo yum install -y openssh-server sudo systemctl enable sshd sudo systemctl start sshd宿主机连的时候SecureCRT、Xshell、Windows Terminal都可以命令都一样ssh user192.168.10.128这里有个容易忽略的点NAT模式下宿主机能不能直连虚拟机IP取决于VMware的NAT设置。默认情况下宿主机是可以直接访问虚拟机IP的不需要额外配置。如果连不上检查虚拟机的防火墙# 查看防火墙状态 sudo ufw status # 开放22端口 sudo ufw allow 22CentOS的话还要注意SELinux和firewalldsudo firewall-cmd --permanent --add-port22/tcp sudo firewall-cmd --reload2. 装服务之前的地基换源、开发工具链与共享能力虚拟机系统刚装好时软件源指向的是官方源在国内下载速度一言难尽。之前我给虚拟机装个gcc等了三分钟进度条才动一下。后来学乖了所有Linux虚拟机装完系统第一件事永远是换源。2.1 更换软件源把快递仓库搬到身边Ubuntu 22.04的源配置在/etc/apt/sources.list。我直接改用阿里云镜像sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak然后用sed把archive.ubuntu.com和security.ubuntu.com替换成mirrors.aliyun.comsudo sed -i s/archive.ubuntu.com/mirrors.aliyun.com/g /etc/apt/sources.list sudo sed -i s/security.ubuntu.com/mirrors.aliyun.com/g /etc/apt/sources.list sudo apt updateCentOS 7的源替换稍微麻烦点因为官方把mirrorlist和baseurl都写在了repo文件里。我常用的做法是直接下载阿里的repo文件覆盖curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo sed -i s/$releasever/7/g /etc/yum.repos.d/CentOS-Base.repo yum clean all yum makecache换源之后安装速度不是快一点点是快好几倍。第一次我帮同事换完源他感叹说以前装东西像拨号上网现在像光纤。2.2 C/C开发环境编译环境也是服务环境的一部分热搜词里有虚拟机(ubuntu)配置c语言环境说明很多人装虚拟机就是为了学C语言或者编译开源项目。这块其实没什么技术含量但步骤不对会浪费很多时间。最小可用的C/C开发环境是三件套gcc、g、make。一条命令搞定sudo apt install -y build-essentialbuild-essential是Ubuntu的元包会一次性装上gcc、g、make、libc-dev等。CentOS对应的是sudo yum groupinstall -y Development Tools验证装好没gcc --version make --version但光有三件套还不够。我写过几个小项目链接阶段报错找不到pthread库、dl库都是一开始没装开发库导致的。建议顺手装上这些sudo apt install -y libssl-dev libxml2-dev libreadline-dev写第一个测试程序确认环境可用#include stdio.h int main() { printf(Hello from VM!\n); return 0; }编译运行gcc -o hello hello.c ./hello这个环节对新手特别友好看到Hello from VM!输出就说明整个编译链路是通的。2.3 安装增强工具复制粘贴和文件共享不装VMware Tools或VirtualBox增强功能虚拟机用起来非常憋屈宿主机往虚拟机拖个压缩包拖不进去复制一段日志还得手动敲一遍。装上增强工具以后体验完全不一样。VMware Workstation的菜单路径是虚拟机 → 安装VMware Tools。如果菜单是灰色的把光驱设置为自动检测。挂载后sudo mount /dev/cdrom /mnt cd /mnt cp VMwareTools-*.tar.gz /tmp cd /tmp tar zxf VMwareTools-*.tar.gz cd vmware-tools-distrib sudo ./vmware-install.pl全程一路回车默认安装最后重启虚拟机。重启之后就能双向拖拽文件、共享剪贴板了。另外我习惯顺手配置一个共享目录这样代码放宿主机虚拟机直接挂载两边不用来回拷贝。VMware里虚拟机 → 设置 → 选项 → 共享文件夹 → 添加。挂载命令sudo mkdir -p /mnt/hgfs sudo vmhgfs-fuse .host:/ /mnt/hgfs -o allow_other -o uid1000VirtualBox的话在设备菜单里选择安装增强功能之后在虚拟机设置里配置共享文件夹。需要说明的是这个挂载命令的路径和参数在不同版本里稍有差异如果你的版本不是这样优先查一下当前版本对应的挂载方式。3. 用Nginx搭多站点服务环境一机多用热搜词里有一长串本地虚拟机 多端口nginx 开发环境多站点自定义域名配置这确实是虚拟机最实用的场景之一。很多人电脑上跑着好几个前后端项目全都怼在宿主机上端口乱成一锅粥依赖版本冲突、环境互相污染。用虚拟机当统一Web服务层清爽得多。3.1 Nginx安装与目录结构Ubuntu装Nginxsudo apt install -y nginxCentOSsudo yum install -y nginx装完先看一下运行状态sudo systemctl status nginx curl http://localhost看到Welcome to nginx就说明基础服务起来了。然后必须搞清楚Nginx的目录结构。Ubuntu的Nginx和CentOS略有不同目录/文件UbuntuCentOS主配置/etc/nginx/nginx.conf/etc/nginx/nginx.conf站点配置目录/etc/nginx/sites-available//etc/nginx/conf.d/启用站点目录/etc/nginx/sites-enabled/同conf.dHTML根目录/var/www/html//usr/share/nginx/html/很多新手喜欢把所有配置都堆在nginx.conf里我不建议。Nginx设计出sites-available和sites-enabled这种目录就是为了把每个站点隔离管理。Ubuntu下我的习惯是每个项目一个配置文件先软链接启用再reload。3.2 多端口多站点一个IP跑N个服务假设我要在虚拟机上同时跑三个站点站点A前端Demo监听8081端口站点B后端API监听8082端口站点C管理后台监听8083端口在/etc/nginx/sites-available/下新建一个vm-sites文件server { listen 8081; server_name demo.local; root /var/www/demo; index index.html; } server { listen 8082; server_name api.local; location / { proxy_pass http://127.0.0.1:5000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } } server { listen 8083; server_name admin.local; root /var/www/admin; index index.html; }然后启用并重载sudo ln -s /etc/nginx/sites-available/vm-sites /etc/nginx/sites-enabled/ sudo nginx -t sudo systemctl reload nginx注意nginx -t这一步非常重要。改完配置先测试语法再reload不然写错一个分号整个Nginx直接挂掉。用curl验证curl http://127.0.0.1:8081 curl http://127.0.0.1:8082 curl http://127.0.0.1:8083三个端口分别返回不同内容多站点就成功了。这时候宿主机浏览器直接访问http://192.168.10.128:8081就能看到站点A。URL里的IP是虚拟机的静态IP记得上一步配了静态IP这里才好使。3.3 自定义域名hosts文件一键实现端口加IP访问虽然能用但每次都要敲一长串地址记不住也不好看。既然Nginx配置里写了server_name demo.local那就让宿主机直接用域名访问。修改宿主机的hosts文件WindowsC:\Windows\System32\drivers\etc\hostsmacOS / Linux/etc/hosts追加三行192.168.10.128 demo.local 192.168.10.128 api.local 192.168.10.128 admin.local保存后宿主机浏览器访问http://demo.local:8081DNS解析会跳过公网直接指向虚拟机IP然后Nginx根据server_name匹配到对应站点。这个方案我用了很长时间好处是每个项目有独立域名语义改端口互不影响。比如以后新增站点只要改Nginx配置加一个server块再往hosts加一条记录前后不超过三分钟。不过用hosts的方式只对开发环境友好如果虚拟机要部署到测试服务器让同事们一起访问那么大家各自的hosts都要加同样记录。更省事的方法是内网自建DNS比如dnsmasq让局域网所有机器自动解析这些自定义域名。这块内容展开讲又是一大篇我之后的文章再专门写。4. 数据库与容器化服务环境的进阶选择Nginx搭好了Web服务有了入口但一个完整的环境还缺数据层和更灵活的应用部署方式。这一节先讨论一个经常被问到的问题数据库和中间件是直接装在虚拟机里还是用Docker跑4.1 裸装还是Docker分情况选我的建议是分阶段学习Linux基础、熟悉systemctl管理服务用裸装日常开发多个项目、需要不同版本环境用Docker模仿生产环境跑一套完整服务编排也用Docker以MySQL为例裸装方式sudo apt install -y mysql-server sudo systemctl enable mysql sudo systemctl start mysql sudo mysql_secure_installationCentOS上装的是MariaDBCentOS 7默认用MariaDB替代MySQL命令几乎一致。裸装之后从宿主机连MySQL默认情况下是连不上的因为MySQL只监听127.0.0.1。需要改配置sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf找到bind-address 127.0.0.1改成0.0.0.0然后重启MySQL、创建远程用户CREATE USER dev% IDENTIFIED BY password; GRANT ALL PRIVILEGES ON *.* TO dev%; FLUSH PRIVILEGES;宿主机用Navicat或DataGrip连192.168.10.128:3306就能连上。这步踩坑的人非常多我见过十个人里有八个卡在bind-address上。Docker方式更省心一条命令就能起一个MySQL并映射端口docker run -d \ --name mysql-dev \ -p 3306:3306 \ -e MYSQL_ROOT_PASSWORDpassword \ mysql:8.0Redis也一样docker run -d --name redis-dev -p 6379:6379 redis:7这里我不展开Docker安装步骤了因为发行版不同安装方式差异不小。Ubuntu通常用官方脚本装CentOS用yum装docker-ce。装好Docker之后你会发现部署数据库这类基础组件的效率提升不是一点半点回滚也方便。4.2 快照虚拟机环境最大的杀手锏虚拟机相比物理机的最大优势不是省电是快照。我搭服务环境的时候每完成一个重要节点就拍一个快照刚装完系统、配好静态IP拍一个基础系统装完Nginx、配好多站点拍一个Web服务层装好Docker和数据库拍一个完整开发环境这样做的价值只有经历过才懂。我做实验把Nginx配置改坏了nginx -t报错一查半天没找到错在哪里这时候只要恢复到Web服务层快照一分钟回到之前的状态。还有一次升级Python版本把系统库搞崩了也是靠快照救回来的。VMware里虚拟机 → 快照 → 拍摄快照VirtualBox里叫备份操作都很直观。需要注意快照不是越拍越多越好保留2到3个关键节点就够了每个快照会占用磁盘空间。我这边的体验数字是一个安装完常用工具的基础快照通常占1到2GB具体取决于你装了什么东西。4.3 端口映射与对外发布最后补充一个NAT模式下对外服务的技巧。如果你只是自己电脑上开发测试直接用虚拟机IP加端口就行。但如果你想在同一个局域网里让别人也访问你的虚拟机服务继续用NAT就比较麻烦了建议把虚拟机网络切换成桥接模式。切换桥接后虚拟机会从局域网路由器重新拿一个IP或者在配置里改成静态IP从此虚拟机和你的物理机在网络上完全平等其他人直接访问这个IP就能进虚拟机里的服务。VMware里切换桥接很简单虚拟机设置 → 网络适配器 → 选择桥接模式然后在虚拟机里重新配置IP就行。VirtualBox在设置 → 网络 → 连接方式里选桥接网卡。5. 常见问题排查装环境过程中最折磨人的几个坑我见过太多人卡在同样的地方这里把高频问题统一梳理一遍。5.1 VMware Workstation 无法连接虚拟机热搜词里有一条很典型vmware workstation 无法连接到虚拟机。请确保您有权运行该程序、访问该程序使用。这个提示通常出现在打开已存在的虚拟机或者虚拟机异常退出之后。我遇到过的情况主要有三类第一类是VMware相关服务没启动。Windows下按WinR输入services.msc找到VMware Authorization Service看是否启动设为自动并启动。第二类是虚拟机磁盘被锁定。虚拟机没正常退出、VMware进程还在后台占用文件就会报这个错。解决办法是打开任务管理器把VMware进程全结束或者重启电脑再打开。第三类权限问题。安装VMware的时候如果当前Windows用户权限不够授权服务无法正常访问vmware.exe。这种情况可以右键VMware图标选以管理员身份运行然后重新注册服务。5.2 虚拟机安装Linux系统时蓝屏虚拟机安装linux蓝屏这条热搜也很有代表性。装Windows虚拟机蓝屏我能理解装Linux也蓝屏问题一般出在宿主机的虚拟化支持或者固件设置上。蓝屏代码里最常见的是VIDEO_DXGKRNL_FATAL_ERROR或SYSTEM_SERVICE_EXCEPTION。我排查的思路是确认宿主机CPU虚拟化已开启。任务管理器 → 性能 → CPU看虚拟化是否已启用。没有的话进BIOS开Intel VT-x或AMD-V。VM设置里检查加速引擎。如果是VMware 15以下的版本跑新一代Linux内核低版本驱动不兼容也会蓝屏升级VMware版本到17以上基本能解决。VirtualBox也有类似问题处理方式大同小异确认主板BIOS里虚拟化开着并且VirtualBox版本不要太老。5.3 其他高频小毛病复制粘贴失效装了VMware Tools还是会遇到复制粘贴突然失灵的情况。重启一下VM Tools服务通常能解决sudo systemctl restart vmware-tools sudo vmware-user-sessions再不行就把虚拟机关机重启。注意Ubuntu 22.04的对应服务名是open-vm-tools命令是sudo systemctl restart open-vm-tools。VNC Viewer里鼠标变成点没反应这个发生在虚拟机跑图形界面、用VNC连接的时候。常见原因是VNC服务默认启用了X11鼠标协议和客户端逻辑冲突。解决办法是在vnc server配置中把指针设备设置为usb或者换用X0vnc并启用-localhostno配合单独参数。具体配置方式在不同VNC服务版本里不一样我遇到过一次用的方案是修改启动脚本里-pointer相关参数这个得根据你的实际版本查。宿主机访问虚拟机网站失败排错顺序是一层一层来先看虚拟机自己curl localhost能不能通再看ip addr确认IP然后在宿主机ping虚拟机IP最后检查虚拟机防火墙是否放行了对应端口。不要直接去改Nginx配置大部分问题出在网络层而不是服务层。VirtualBox虚拟机复制后打不开VirtualBox复制.vdi文件再挂载经常报错无法打开。解决办法是在VirtualBox里用复制功能生成新虚拟机而不是手动拷贝vdi文件。手动拷贝的话需要在Storage里重新挂载并且可能还要处理UUID冲突。UUID冲突的报错信息通常带着一串十六进制ID这时可以用VBoxManage internalcommands sethduuid 磁盘路径.vdi重新生成UUID。写在最后搭建环境的正确心态虚拟机里搭服务环境本质上是在模拟一台远程服务器而不是在本地电脑上装软件。你的一切操作逻辑都应该围绕这个环境能复现、能备份、能回滚来展开。所以我一直在强调静态IP、快照、SSH、统一服务管理这些习惯一旦建立以后真正上手云服务器时会顺手得多。我个人实际使用中的体会是与其等环境坏了再排查不如在搭环境早期就花十分钟把所有服务设置成开机自启并验证一遍。这个习惯帮我省下过大量时间——毕竟多花十分钟做一次干净利落的初始化配置远比以后每用一次就手动启动一遍服务要划算得多。把常用的Nginx、SSH、MySQL这些用systemctl enable全部设好虚拟机开机的瞬间环境就是可用的这才是合理顺手的服务环境。