CentOS Stream 9 从安装到运维:企业级Linux服务器部署实战指南
1. 从零到一为什么选择CentOS Stream 9作为你的新起点最近在社区里看到不少朋友在问CentOS 9的安装配置结合最近一些网络热词比如“centos9镜像下载”、“linux国产”这些感觉大家对于新一代的企业级Linux发行版既好奇又有点无从下手。作为一个从CentOS 6一路用到Stream 9的老用户我想结合自己的实际部署经验来聊聊这个“熟悉的陌生人”。CentOS Stream 9它不再是过去那个“RHEL的免费复刻版”而是变成了RHEL的上游开发分支。这个定位的转变意味着它比过去的CentOS更“前沿”一些能让你提前体验到下一个RHEL次要版本的新特性对于想紧跟技术潮流又需要稳定基础的用户来说其实是个挺有意思的选择。我选择在全新的服务器上部署它主要是看中了几个点一是它继承了RHEL强大的稳定性和企业级软件生态二是作为上游它能让我更早地接触和测试新内核、新工具链比如GCC 11、Python 3.9三是它的生命周期支持依然有保障。当然对于生产环境你可能需要更谨慎地评估。但无论是用于学习、开发测试还是作为前沿技术的尝鲜平台CentOS Stream 9都是一个非常扎实的起点。接下来我会把从镜像获取、安装、基础配置到常用环境搭建的完整链条拆开揉碎了讲清楚里面会穿插很多我实际踩过的坑和验证过的优化项。2. 安装前的关键决策镜像、引导与分区规划安装Linux第一步往往就决定了后续的体验是否顺畅。很多人卡在启动不了或者分区不合理上回头重装费时费力。2.1 获取与验证官方镜像首先镜像的来源一定要可靠。最直接的途径是访问CentOS官方站点或认可的镜像站。不要随便在第三方网站下载以免镜像被篡改植入后门。下载完成后务必要进行校验和验证。这是很多新手会忽略但极其重要的一步。# 假设你下载的镜像文件名为 CentOS-Stream-9-latest-x86_64-dvd1.iso # 首先下载对应的校验文件通常是 .iso 和 .iso.sha256sum 成对出现 wget https://mirror.centos.org/centos/9-stream/BaseOS/x86_64/iso/CentOS-Stream-9-latest-x86_64-dvd1.iso.sha256sum # 然后计算你本地镜像文件的SHA256值 sha256sum CentOS-Stream-9-latest-x86_64-dvd1.iso # 将计算出的哈希值与下载的 .sha256sum 文件中的内容进行比对 cat CentOS-Stream-9-latest-x86_64-dvd1.iso.sha256sum如果两者一致恭喜你镜像文件是完整且未被修改的。如果不一致请立即删除并重新下载。2.2 制作启动盘与引导设置有了干净的镜像接下来是制作启动介质。我强烈推荐使用dd命令或者RufusWindows下这类工具以“DD镜像模式”写入U盘而不是普通的“ISO镜像模式”。对于Linux和类Unix系统安装盘“DD模式”的兼容性是最好的它能确保U盘被做成一个完整的、可引导的磁盘镜像拷贝。# Linux/macOS下使用dd命令请务必确认of参数是你的U盘设备如/dev/sdb而不是分区如/dev/sdb1 # 使用 lsblk 命令确认U盘设备名 sudo dd if./CentOS-Stream-9-latest-x86_64-dvd1.iso of/dev/sdb bs4M statusprogress oflagsync注意dd命令非常强大但也危险一旦of目标设备指定错误可能会清空你的系统硬盘数据。操作前请反复确认。制作好启动盘后进入服务器的BIOS/UEFI设置。这里有几个关键点启动模式如果你的服务器支持UEFI并且你计划使用GPT分区表对于大于2TB的磁盘是必须的请确保设置为“UEFI”启动模式或者“UEFI优先”。如果是老旧的纯BIOSLegacy模式则对应MBR分区表。安全启动Secure Boot对于CentOS Stream 9通常可以开启Secure Boot系统安装的引导程序shim是经过签名的。如果遇到无法引导的情况可以尝试暂时关闭Secure Boot进行安装。启动顺序将你的U盘设为第一启动项。2.3 磁盘分区方案兼顾性能与管理的艺术安装程序进入图形化界面后最重要的决策之一就是磁盘分区。自动分区虽然方便但往往不够优化。对于服务器我习惯手动分区以下是一个兼顾系统性能、数据安全和后期维护的通用方案以一块数据盘为例系统盘同理但更精细挂载点建议大小文件系统类型说明与理由/boot或/boot/efi1GB (UEFI) / 500MB (BIOS)xfs (boot) / vfat (efi)/boot存放内核和引导文件。UEFI模式下需要单独的/boot/efi(EFI系统分区)格式必须是vfat。大小给足避免未来内核更新过多导致空间不足。/(根分区)50-100GBxfs根目录存放系统核心文件、基本应用程序。不建议太小要预留安装软件和系统日志的空间。XFS是CentOS/RHEL系列的默认且成熟的文件系统处理大文件性能好。/home视需求而定xfs用户家目录。将用户数据和系统分离是好习惯。这样即使系统崩溃需要重装只要不格式化/home用户数据就能保留。可以根据服务器用途分配剩余大部分空间。/var30-50GBxfs存放可变数据如日志(/var/log)、缓存、数据库文件等。日志增长可能很快单独分区可以防止日志写满导致整个系统瘫痪。对于邮件、Web服务器这个分区应该更大。/tmp10-20GBxfs临时文件目录。有些程序会在这里生成大量临时文件。单独分区可以设置特定的挂载选项如noexec, nodev, nosuid以增强安全性。swap物理内存的1-2倍现代服务器可酌情减少swap交换分区。当物理内存不足时使用。对于内存大于16GB的服务器如果确认应用内存需求稳定可以设置等于或略小于物理内存的大小甚至对于拥有超大内存如128GB以上的云主机如果确保内存充足可以只给4-8GB的swap用于休眠支持。分区实操心得LVM的取舍上述方案是基于直接分区的。对于灵活性要求极高的环境强烈推荐使用LVM逻辑卷管理。你可以先创建几个大的物理卷PV然后加入卷组VG最后在VG上按需划分逻辑卷LV来对应上面的各个挂载点。这样做的好处是未来某个分区如/home空间不足时可以从VG中动态扩容而无需停机或迁移数据。安装程序界面可以直接配置LVM对于新手来说稍微复杂一点但长远来看管理更便捷。文件系统格式坚持使用XFS。它是RHEL/CentOS的“亲儿子”针对大容量存储和并发I/O做了大量优化特别是处理海量小文件如日志时其性能和管理工具链如xfs_growfs在线扩容都非常成熟可靠。Ext4虽然通用但在CentOS生态下XFS是更受推荐的选择。预留未分配空间如果你不确定未来用途或者磁盘非常大可以在分区时留出一部分空间不分配。这部分空间后期可以用于创建新的分区或者扩容现有的LVM卷组为未来留下弹性。3. 首次启动后的“开箱即用”配置清单系统安装完成重启后以root用户登录。别急着装应用先把系统基础环境调校好这能让后续所有操作事半功倍。3.1 网络配置从DHCP到静态IP的稳定化安装时如果使用了DHCP首次启动后第一件事就是配置静态IP这对于服务器至关重要。CentOS Stream 9使用NetworkManager和nmcli命令行工具作为网络管理的主流传统的/etc/sysconfig/network-scripts/目录下的ifcfg-*文件方式在9中已不被推荐用于新配置。# 1. 查看当前的网络连接名称 nmcli connection show # 你会看到类似 Wired connection 1 或 ens192 这样的NAME。 # 2. 假设连接名是 ens192我们将其配置为静态IP # 修改IPv4配置方法为manual并设置地址、网关、DNS nmcli connection modify ens192 ipv4.method manual \ ipv4.addresses 192.168.1.100/24 \ ipv4.gateway 192.168.1.1 \ ipv4.dns 8.8.8.8 114.114.114.114 # 这里 192.168.1.100/24 是IP和子网掩码/24代表255.255.255.0 # DNS服务器设置了两个用空格分隔。 # 3. 使配置生效 nmcli connection up ens192 # 4. 验证配置 ip addr show ens192 ping -c 4 8.8.8.8 # 测试外网连通性 nslookup www.baidu.com # 测试DNS解析注意如果你的服务器有多个网卡或者需要配置bonding、桥接等复杂网络nmcli同样可以胜任但命令会更复杂。对于简单的服务器上述静态IP配置已经足够。确保IP地址、网关和DNS服务器地址符合你实际的网络规划。3.2 系统更新与基础工具安装打好底子配置好网络接下来更新系统并安装一批必备的“瑞士军刀”式工具。# 1. 更新系统所有包到最新版本 dnf update -y # CentOS Stream 9 使用 dnf 作为包管理器yum 是其符号链接。 # 2. 安装常用工具集 dnf install -y epel-release # 首先安装EPEL仓库它提供了大量额外的软件包 dnf install -y vim wget curl net-tools lsof bash-completion htop tree psmisc ncdu git # 简要说明 # vim: 强大的文本编辑器。 # wget/curl: 网络下载工具。 # net-tools: 包含ifconfig, netstat等传统网络工具虽然ip命令是未来但很多脚本仍依赖它们。 # lsof: 列出打开的文件排查“文件被占用”问题的神器。 # bash-completion: Bash命令自动补全增强。 # htop: 交互式进程查看器比top更直观。 # tree: 以树状图列出目录内容。 # psmisc: 包含pstree, killall等工具。 # ncdu: 磁盘使用情况分析器交互式界面很好用。 # git: 版本控制工具。更新与安装避坑点epel-release这是必须的。很多常用的、不在基础仓库里的软件如htop,ncdu, 后来的nginx等都来自EPEL仓库。安装时可能会询问是否导入GPG密钥确认即可。大版本更新谨慎dnf update会更新所有包。对于生产服务器建议先在一台测试机上操作观察有无不兼容变更。虽然Stream 9作为上游相对稳定但保持谨慎总是好的。选择最小化安装如果你在安装时选择了“最小化安装Minimal Install”那么上述大部分工具都需要手动安装。这是一个干净的开始推荐给所有服务器。3.3 安全加固第一步防火墙与SELinux安全不是可选项。CentOS Stream 9默认启用了firewalld防火墙和SELinux。对于新手SELinux可能是最让人头疼的但请不要直接禁用它。理解并正确配置它是系统安全的重要防线。配置firewalld开放必要端口 假设我们要开放SSH(22)、HTTP(80)、HTTPS(443)端口。# 查看默认区域和当前规则 firewall-cmd --list-all # 永久开放端口--permanent参数表示写入配置重启后生效 firewall-cmd --permanent --add-servicessh # 开放SSH服务端口22 firewall-cmd --permanent --add-servicehttp # 开放HTTP服务端口80 firewall-cmd --permanent --add-servicehttps # 开放HTTPS服务端口443 # 如果你需要开放特定端口比如一个自定义的8080端口 # firewall-cmd --permanent --add-port8080/tcp # 重新加载防火墙配置使更改立即生效同时保留永久配置 firewall-cmd --reload # 再次查看确认 firewall-cmd --list-all理解并应对SELinux SELinux会在进程和文件上打上安全上下文标签强制实施访问控制。很多服务启动失败比如Nginx无法读取网页文件MySQL无法写数据目录都是SELinux上下文不对导致的。查看上下文ls -Z /var/www/html临时解决不推荐长期使用如果确定是SELinux阻止可以临时设置为宽容模式观察日志setenforce 0。但这会降低安全性。正确解决方法使用正确的SELinux布尔值很多常见问题都有预设的开关。例如允许HTTPD服务访问网络setsebool -P httpd_can_network_connect on(-P表示永久生效)。修正文件上下文如果文件或目录的SELinux标签不对使用chcon或semanage修复。例如将自定义网页目录的上下文设置为和/var/www/html一样chcon -R -t httpd_sys_content_t /path/to/your/webdir。查看日志绝大多数SELinux拒绝信息都记录在/var/log/audit/audit.log中。更友好的查看方式是使用sealert工具需要安装setroubleshoot-server包sealert -a /var/log/audit/audit.log。它会给出详细的分析和修复建议命令。我的建议是保持SELinux处于强制模式Enforcing。遇到权限问题时首先怀疑SELinux并通过上述方法解决。这能帮你建立起对强制访问控制机制的理解极大地提升系统安全性。4. 核心服务环境搭建实战Web、数据库与开发栈基础系统稳固后就可以搭建具体的应用环境了。这里以最常见的LAMP/LEMP栈和开发环境为例。4.1 Web服务器Nginx vs. Apache的选择与配置Nginx因其高并发、低内存占用和反向代理的强大能力在现代Web架构中更受欢迎。这里以安装Nginx为例。# 安装Nginx (来自EPEL仓库) dnf install -y nginx # 启动Nginx并设置开机自启 systemctl start nginx systemctl enable nginx # 检查防火墙确保80/443端口已开放前面已做 # 现在可以通过服务器IP访问到Nginx欢迎页面了基础配置与虚拟主机 Nginx的主配置文件是/etc/nginx/nginx.conf但通常我们不在主配置里直接修改而是在/etc/nginx/conf.d/目录下为每个网站创建独立的.conf文件。假设我们要配置一个域名为www.yourdomain.com的网站根目录在/var/www/yourdomain。创建网站根目录并设置权限mkdir -p /var/www/yourdomain chown -R nginx:nginx /var/www/yourdomain # 将目录所有者改为nginx运行用户 chmod -R 755 /var/www/yourdomain创建虚拟主机配置文件vim /etc/nginx/conf.d/yourdomain.conf输入以下内容server { listen 80; server_name www.yourdomain.com yourdomain.com; root /var/www/yourdomain; index index.html index.htm; location / { try_files $uri $uri/ 404; } # 如果需要处理PHP可以添加下面这个location块需先安装PHP-FPM # 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; # } error_page 404 /404.html; location /404.html { } error_page 500 502 503 504 /50x.html; location /50x.html { } }测试配置并重载Nginxnginx -t # 测试配置文件语法看到 syntax is ok 和 test is successful 才算成功 systemctl reload nginx # 平滑重载配置不影响现有连接SELinux上下文别忘了给网站目录设置正确的SELinux标签否则Nginx会报403错误。chcon -R -t httpd_sys_content_t /var/www/yourdomain # 如果网站需要写入文件如上传、缓存还需要额外授权 # chcon -R -t httpd_sys_rw_content_t /var/www/yourdomain/upload4.2 数据库安装以MySQL 8.0 / MariaDB 10.5为例CentOS Stream 9默认仓库可能提供的是较新版本的MySQL或MariaDB。这里以安装MySQL 8.0为例。# 1. 启用MySQL官方仓库如果需要特定版本如MySQL 8.0 # 访问 https://dev.mysql.com/downloads/repo/yum/ 获取最新的repo包 wget https://dev.mysql.com/get/mysql80-community-release-el9-1.noarch.rpm sudo dnf install -y mysql80-community-release-el9-1.noarch.rpm # 2. 安装MySQL服务器 sudo dnf install -y mysql-community-server # 3. 启动并设置开机自启 sudo systemctl start mysqld sudo systemctl enable mysqld # 4. 获取初始临时密码 sudo grep temporary password /var/log/mysqld.log # 输出类似A temporary password is generated for rootlocalhost: 初始密码 # 5. 运行安全配置向导 sudo mysql_secure_installation按照向导提示操作输入临时密码 - 设置新强密码 - 移除匿名用户 - 禁止root远程登录建议 - 移除测试数据库 - 重新加载权限表。关键配置与优化 MySQL的主配置文件是/etc/my.cnf。对于生产环境你需要根据服务器内存调整一些关键参数。以下是一个针对4GB内存服务器的示例配置片段可以放在/etc/my.cnf.d/my-server.cnf中[mysqld] # 基础 datadir/var/lib/mysql socket/var/lib/mysql/mysql.sock # 内存相关 innodb_buffer_pool_size 1G # 对于4G内存分配1-1.5G给InnoDB缓冲池是合理的起点 key_buffer_size 256M # MyISAM表索引缓存如果不用MyISAM可以设小点 query_cache_size 0 # MySQL 8.0已移除查询缓存此项无效但配置文件中可能还有可以注释掉 # 连接与线程 max_connections 200 # 最大连接数根据应用调整 thread_cache_size 10 # 日志 slow_query_log 1 slow_query_log_file /var/log/mysql-slow.log long_query_time 2 # 超过2秒的查询视为慢查询 # InnoDB配置 innodb_log_file_size 256M innodb_flush_log_at_trx_commit 1 # 最安全性能稍差。2或0可提升性能但牺牲一定安全性。修改配置后需要重启MySQLsudo systemctl restart mysqld。4.3 开发环境配置Python、Node.js与GitPython 3.9CentOS Stream 9默认可能已经安装了Python 3.9。你可以通过python3 --version查看。如果需要安装其他版本如Python 3.11建议使用dnf从AppStream仓库安装特定模块版本或者使用pyenv进行多版本管理避免破坏系统自带的Python。# 查看可用的Python版本 dnf module list python39 # 安装Python 3.9及其常用开发包 dnf install -y python39 python39-devel # 使用python3.9命令调用Node.js 18Node.js在默认仓库中版本可能较旧。建议从NodeSource仓库安装LTS版本。# 安装NodeSource仓库脚本以Node.js 18.x为例 curl -fsSL https://rpm.nodesource.com/setup_18.x | sudo bash - # 安装Node.js sudo dnf install -y nodejs # 验证 node --version npm --versionGit前面基础工具已经安装。这里主要说配置。# 设置全局用户名和邮箱 git config --global user.name Your Name git config --global user.email your.emailexample.com # 生成SSH密钥用于免密连接Git仓库如GitHub, GitLab ssh-keygen -t ed25519 -C your.emailexample.com # 推荐ed25519算法更安全 # 一路回车默认保存在 ~/.ssh/id_ed25519 和 ~/.ssh/id_ed25519.pub # 查看公钥并复制到你的Git托管平台 cat ~/.ssh/id_ed25519.pub5. 进阶配置与运维效率工具系统和服务跑起来后还有一些配置能极大提升管理效率和系统可靠性。5.1 时间同步NTP配置保持时间一致服务器时间不准会导致日志时间错乱、证书验证失败、分布式系统混乱等一系列问题。使用chronyd服务进行时间同步。# 1. 安装chrony通常已预装 dnf install -y chrony # 2. 编辑配置文件可以添加更快的国内NTP服务器 vim /etc/chrony.conf # 在 pool 开头的行下面可以添加或替换为 # server ntp.aliyun.com iburst # server cn.pool.ntp.org iburst # 3. 启动并设置开机自启 systemctl start chronyd systemctl enable chronyd # 4. 查看时间同步状态 chronyc sources -v chronyc trackingiburst参数可以让客户端在启动后快速进行数次同步加速初始同步过程。5.2 配置系统日志轮转logrotate系统和服务日志会不断增长需要定期轮转、压缩和清理。logrotate是完成这个任务的利器。它通过cron定期运行。# 查看Nginx的日志轮转配置示例 cat /etc/logrotate.d/nginx你可以为自定义应用创建轮转配置。例如在/etc/logrotate.d/下创建文件myapp/var/log/myapp/*.log { daily # 每天轮转 missingok # 如果日志文件丢失不报错 rotate 30 # 保留30份旧日志 compress # 压缩旧日志 delaycompress # 延迟一天压缩方便查看最新的旧日志 notifempty # 如果日志为空则不轮转 create 640 nginx adm # 轮转后创建新日志文件并设置权限和属主 sharedscripts # 在所有日志轮转后执行一次postrotate脚本 postrotate # 发送信号让Nginx重新打开日志文件这里以自定义应用为例如果是Nginx通常是 nginx -s reopen # kill -USR1 cat /var/run/myapp.pid 2/dev/null 2/dev/null || true endscript }logrotate通常由cron.daily在每天定时运行。你也可以手动测试配置logrotate -d /etc/logrotate.d/myapp-d是调试模式不实际执行。5.3 使用Cockpit进行Web可视化管理如果你不习惯纯命令行或者希望有一个轻量级的Web控制台来监控服务器状态、管理容器、查看日志等Cockpit是一个不错的选择。它是Red Hat家族自带的现代化管理工具。# 安装Cockpit及相关模块 dnf install -y cockpit cockpit-podman cockpit-machines cockpit-storaged cockpit-networkmanager # 启动并启用服务 systemctl start cockpit.socket # Cockpit使用socket激活更节省资源 systemctl enable cockpit.socket # 开放9090端口如果防火墙开启 firewall-cmd --permanent --add-servicecockpit firewall-cmd --reload安装完成后在浏览器中访问https://你的服务器IP:9090使用系统的root或具有sudo权限的用户登录即可。在Cockpit里你可以直观地查看系统资源使用情况CPU、内存、磁盘、网络、查看系统日志、管理用户、配置网络、甚至管理Podman容器Docker的替代品。6. 常见问题排查与性能调优思路即使按照步骤操作也难免会遇到问题。这里列举几个安装配置后可能遇到的典型问题及其排查思路。6.1 网络连通性问题排查链路如果配置完静态IP后无法上网可以按照以下链路排查检查IP配置ip addr show确认IP和子网掩码是否正确配置且网卡状态为UP。检查网关ip route show查看默认网关default via ...是否正确。测试网关连通性ping -c 4 192.168.1.1你的网关IP。如果不通可能是物理线路、交换机端口或本地防火墙非firewalld可能是网络设备防火墙问题。测试DNS解析nslookup www.baidu.com。如果返回server cant find说明DNS解析失败。检查/etc/resolv.conf文件中的nameserver设置是否正确或者用ping 8.8.8.8测试是否能到达外网IP。如果IP能通但域名不能解析就是DNS问题。检查firewalldfirewall-cmd --list-all确认没有误拦截。可以临时关闭防火墙测试systemctl stop firewalld如果网络恢复说明是防火墙规则问题。检查NetworkManager连接状态nmcli connection show --active查看活动连接。nmcli device status查看设备状态。6.2 服务启动失败通用排查步骤以systemctl start nginx失败为例查看状态详情systemctl status nginx.service -l。-l参数会显示完整的日志输出这里通常会有第一手的错误信息。查看服务特定日志大多数服务有自己的日志文件。对于Nginx可以看/var/log/nginx/error.log。对于MySQL看/var/log/mysqld.log。使用journalctl -u nginx.service-u指定单元名也能查看systemd管理的服务的日志。检查配置文件语法很多服务提供语法检查命令。如Nginx的nginx -tMySQL的mysqld --verbose --help或启动前检查。检查端口占用ss -tlnp | grep :80查看80端口是否被其他进程占用。检查SELinux如果日志中出现“Permission denied”且文件权限正常立刻怀疑SELinux。使用sealert -a /var/log/audit/audit.log或ausearch -m avc -ts recent查看SELinux拒绝信息。检查依赖有些服务依赖其他服务或文件系统。确保所有依赖已就绪。6.3 基础性能观察与调优点系统安装配置好后如何知道它运行得是否健康整体负载uptime命令查看1、5、15分钟的平均负载。htop直观查看CPU、内存、进程。内存free -h查看内存使用。重点看available列这是系统可用的内存包括缓存和缓冲。Linux会充分利用内存做缓存所以used高不一定有问题。磁盘I/Oiostat -x 1查看磁盘利用率(%util)、等待时间(await)。如果%util持续接近100%说明磁盘是瓶颈。网络iftop或nethogs查看实时网络流量和进程占用。简单调优I/O调度器对于SSD建议使用noop或deadline调度器。可以通过cat /sys/block/sda/queue/scheduler查看当前echo noop /sys/block/sda/queue/scheduler临时修改需根据磁盘实际名称如nvme0n1。内核参数对于高并发Web服务器可能需要调整网络相关参数如net.core.somaxconnTCP连接队列、net.ipv4.tcp_tw_reuse等。修改/etc/sysctl.conf文件然后执行sysctl -p生效。修改内核参数需要谨慎最好有依据和测试。服务配置如前面MySQL配置示例根据硬件资源调整服务的内存、连接数等参数是最直接的性能调优手段。从选择镜像、规划分区到配置网络、安全加固再到搭建Web、数据库和开发环境最后到日常的运维工具和问题排查这套流程覆盖了一台CentOS Stream 9服务器从零到生产就绪状态的核心路径。每个环节的决策和操作背后都包含着对稳定性、安全性和可维护性的权衡。我自己的习惯是任何新服务器上线前都会用一份类似的检查清单过一遍确保基础牢靠。尤其是SELinux和防火墙初期多花点时间理解它们后期能避免无数诡异的“玄学”问题。记住最好的配置不是最复杂的而是最适合你当前业务需求、并且你能够完全理解和掌控的那一套。