服务器虚拟化_存储虚拟化_服务器网络虚拟化

场景:当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的进程模型,这才是能够长治久安的办法之所在。

(全文完)

服务器虚拟化_服务器网络虚拟化_存储虚拟化