
场景:当IDC遇上虚拟化——一位老运维的实战笔记
十五年间,于IDC不断摸爬滚打,历经机房搬迁之事,遭遇硬盘损坏状况,面对网络瘫痪情形,亦见证了虚拟化技术,怎样将数据中心,从类似“搬砖”之态,转变为如“乐高”之状。
今儿不谈那些虚头巴脑的,径直从实战层面着手,就拿一台物理服务器的部署当作例子,引领你于虚拟化环境里头构建起一整套完备的 LNMP 环境,并且达成域名解析、SSL 配置、CDN 接入、安全加固以及备份恢复的全部流程。
这套方案已在上百个生产环境中验证,可直接复用。
准备:硬件与软件清单
物理服务器:建议64GB内存,2TB存储,双网卡绑定。
用于虚拟化的平台,存在VMware vSphere 7.0及以上版本,或者KVM(在本文之中是以KVM作为示例,其命令具有通用性)。
操作系统:CentOS Stream 9(最小化安装)。
有一种组合,它包含了宝塔面板(此为可选项,不过建议通过手动搭建的方式来掌握其中的细节),还有Nginx,以及MySQL 8.0,另外还有PHP 8.1。
域名:假设为example.com,提前备案并指向CDN。
分步实操:从虚拟机创建到站点上线
1. 创建虚拟机并安装Linux基础环境
# 在KVM宿主机上创建虚拟机(已有镜像路径按实际调整)
virt-install
--name web01
--ram 16384
--vcpus 4
--disk path=/var/lib/libvirt/images/web01.qcow2,size=200
--network bridge=br0
--graphics vnc
--location /iso/CentOS-Stream-9-latest-x86_64-dvd1.iso
目标是,分配十六GB的内存,分配四个核心的CPU,分配二百GB的磁盘,通过桥接网络,让虚拟机与物理网络处于同等层级。
需要注意的事情是:磁盘的格式最好来使用qcow2,它是支持快照操作以及压缩功能的;网桥模式的话必须要在宿主机上面提前配置好br0。
排错的思路为,要是没办法借助VNC去进行连接之时,核查防火墙有没有把5900端口给放开,或者去改用串口安装,而这个串口安装是使用--graphics none。
2. 基础安全加固与软件源配置
登录虚拟机后立即执行:
# 更新系统并安装基础工具
dnf update -y && dnf install -y vim wget curl git lsof net-tools
# 关闭SELinux(生产环境建议enforcing但按需放行,这里演示简化)
setenforce 0
sed -i 's/^SELINUX=./SELINUX=disabled/' /etc/selinux/config
# 配置Nginx官方源
cat > /etc/yum.repos.d/nginx.repo << EOF
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
EOF
目的:对系统补丁进行准备,对工具链予以准备,并且将SELinux关闭,以此避免后续出现权限干扰的情况(在实际生产过程中,需根据需求开启并配置相应策略)。
有这样一些事项要点需要注意:把SELinux配置进行修改之后,是需要重新启动然后才能生效的情形,不过可以在当前这个时段暂时不必重新启动,而是能够继续开展相关操作。
3. 手动搭建LNMP环境(拒绝一键包,掌握细节)
安装Nginx:
dnf install -y nginx
systemctl enable nginx --now
安装MySQL 8.0:
dnf install -y mysql-server
systemctl enable mysqld --now
mysql_secure_installation # 执行安全脚本,设置root密码,移除匿名用户等
安装PHP 8.1及扩展:
dnf install -y epel-release
dnf module reset php
dnf module enable php:8.1 -y
dnf install -y php php-fpm php-mysqlnd php-gd php-xml php-mbstring php-curl php-zip php-opcache
systemctl enable php-fpm --now
目的:确保每个组件独立可控,便于后期故障排查。
请注意,PHP - FPM默认监听的是“/run/php - fpm/www.sock”,而Nginx是需要做出与之相匹配的配置的。
检查排错思路,要是 Nginx 没办法解析 PHP,可查看 /etc/nginx/conf.d/default.conf 里 location~ .php$ 的 fastcgi_pass 有没有正确指向 sock 或者 9000 端口。
4. 配置Nginx虚拟主机与PHP解析
对/etc/nginx/conf.d/example.com.conf进行编辑。
server {
listen 80;
server_name example.com www.example.com;
root /var/www/example.com;
index index.php index.html;
access_log /var/log/nginx/example.com_access.log main;
error_log /var/log/nginx/example.com_error.log warn;
location / {
try_files $uri $uri/ /index.php?$args;
}
location ~ .php$ {
fastcgi_pass unix:/run/php-fpm/www.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
# 静态文件缓存
location ~ .(jpg|jpeg|png|gif|ico|css|js)$ {
expires 30d;
add_header Cache-Control "public, immutable";
}
}
创建站点目录并测试:
mkdir -p /var/www/example.com
echo "" > /var/www/example.com/index.php
nginx -t && systemctl reload nginx
要达到的目标是,达成域名跟站点相绑定的状况,开启 PHP 解析的功能,并且对静态资源缓存予以优化。
请注意,事项,关于root路径那必须得是,与PHP - FPM进程用户,此用户默认是apache或者nginx,并且这个路径得是该用户可读的。
错误排查思想路径如下,一旦出现403这种情况,那就去查看目录权限状况,要是出现502这种状况,那就去检验PHP - FPM是不是在运行,以及sock文件权限是不是准确无误。
5. 域名解析与CDN接入
将 A 记录添加于域名 DNS 服务商那里,使其指向源站 IP,或者在 CDN 暂未开启的情况下,一开始先指向 CDN。
拿 Cloudflare 当作例子,添加站点之后,于 DNS 设置里开启代理(橙色云朵),这个时候域名已经接入 CDN。

返还至Nginx配置,要去获取真实访客IP,先要安装ngx_http_realip_module模块,并且要在http块里添加。
set_real_ip_from 103.21.244.0/22; # Cloudflare IP段,以官方最新为准
set_real_ip_from 103.22.200.0/22;
# ... 其他段
real_ip_header CF-Connecting-IP;
目的:隐藏源站IP,利用CDN加速及防护。
需特别留意的事项是,一定要定期去更新CDN的IP段,不然的话,日志里面全部都是CDN节点的IP,这样就没有办法去溯源真实的访客了。
6. 进行SSL/HTTPS配置,(此为Let's Encrypt免费证书的配置)。
dnf install -y certbot python3-certbot-nginx
certbot --nginx -d example.com -d www.example.com
依据提示将邮箱输入进去,对条款表示同意,证书会自动去申请,并且会对Nginx配置作出修改。
证书续期:
echo "0 0,12 root python -c 'import random; import time; time.sleep(random.random() 3600)' && certbot renew -q" | sudo tee -a /etc/crontab
目的:启用HTTPS加密传输,提升安全性与搜索引擎排名。
下列注意要点为:于生产环境当中,建议采用DNS - 01验证方式,此方式即通配符证书那种方式,而该方式适合应用于多个子域名的情形。
7. 安全加固与备份恢复策略
系统层面:
# 配置防火墙
firewall-cmd --permanent --add-service={http,https}
firewall-cmd --reload
# SSH加固:禁用root密码登录,使用密钥
sed -i 's/^#PermitRootLogin yes/PermitRootLogin prohibit-password/' /etc/ssh/sshd_config
systemctl restart sshd
数据库层面:
规定时期进行备份,执行这样的操作:mysqldump -u root -p --all - databases > / backup / mysql_$(date +%F).sql。
结合cron每日备份,并同步至异地存储(如OSS)。
文件层面:
tar -czf /backup/web_$(date +%F).tar.gz /var/www/example.com
恢复测试:
模拟误删文件,从备份恢复:
rm -rf /var/www/example.com
tar -xzf /backup/web_2026-03-03.tar.gz -C /
systemctl reload nginx
目的:形成闭环,确保灾难发生时能快速恢复。
8. 虚拟化环境下的高级玩法:热迁移与快照
在KVM宿主机执行:
# 创建快照(升级前必备)
virsh snapshot-create-as web01 pre_upgrade_snap "Before nginx upgrade"
# 热迁移至另一台宿主机
virsh migrate --live web01 qemu+ssh://target-host/system --unsafe
请注意,热迁移这项要求,是共享存储(其形式比如NFS)或者有着相同磁盘路径才行;快照呢,它会占用磁盘空间,所以得定期去清理。
排错实战:一次Nginx 502故障复盘
现象:访问站点返回502 Bad Gateway。
排查步骤:
1. 对Nginx错误日志进行查看,通过执行:tail -f /var/log/nginx/example.com_error.log,从中发现了:connect() to unix:/run/php-fpm/www.sock failed。
2. 施行对PHP - FPM状态的检查,按照这样的代码形式:systemctl status php-fpm,所呈现的结果是Active: failed。
3. 通过执行,tail -20 /var/log/php-fpm/error.log,去对PHP - FPM日志进行查看,结果发现,出现了pool www seems busy 这种情况。
4. 对PHP - FPM流程管控予以调节:对位于“/etc/php-fpm.d/www.conf”的文件进行编辑,从5调整至20“pm.max_children”的值的大小,在“pm.start_servers”方面,将其值从2调整成5。
5. 重新启动PHP - FPM,通过输入这样的代码:systemctl restart php-fpm,最终问题获得解决。
经验总结:在高并发的情况下,需要结合pm.status_path来进行监控,进而动态调整进程数,或者改用pm = dynamic这种模式。
总结:虚拟化让运维从“救火”走向“设计”
借助KVM虚拟化,我们于一台物理机之上,隔离出来多个环境,各个虚拟机独立开展LNMP栈运行,彼此之间不存在互相干扰的情况。
整合CDN,融入SSL,进行备份,实施迁移,据此构建了具备高可用性、易于扩展性的IDC服务架构。
记住,工具仅仅是手段,去理解底层的逻辑,像是虚拟化的原理,还有Nginx的进程模型,这才是能够长治久安的办法之所在。
(全文完)


Comments NOTHING