CentOS 9服务器从零部署到生产环境配置全指南
1. 项目概述:为什么选择CentOS 9作为你的服务器基石
如果你正在寻找一个稳定、安全且拥有长期支持的企业级Linux发行版来搭建你的生产环境,那么CentOS Stream 9(通常我们简称为CentOS 9)绝对是一个绕不开的选项。尽管它已经从传统的“下游重建版”转变为RHEL的“上游开发版”,但这恰恰意味着你能更早地接触到最新的、经过红帽严格测试的技术栈,对于追求前沿稳定性的开发者和运维来说,这反而成了一种优势。我最近刚在一台新服务器上完整部署了一套基于CentOS 9的开发环境,从系统安装到基础服务配置,踩过一些坑,也总结了不少让系统“开箱即用”的顺畅技巧。这篇文章,我就以一个过来人的身份,带你走一遍从零开始安装和配置CentOS 9的全过程,不仅仅是把系统跑起来,更重要的是把它配置成一个高效、安全、便于后续开发的坚实平台。无论你是Linux新手,还是有一定经验想了解CentOS 9新特性的朋友,这篇手把手的实录都能给你提供直接的参考。
2. 安装前的关键决策与准备工作
在真正按下安装按钮之前,花点时间做好规划和准备,能避免后续很多不必要的麻烦。这一步往往被新手忽略,但却是老手们格外重视的环节。
2.1 镜像获取与启动介质制作
首先,你需要从官方或可靠的镜像站获取CentOS Stream 9的ISO镜像文件。直接访问CentOS官方站点即可找到下载链接,选择适合你硬件架构的版本(通常是x86_64)。这里有个小经验:如果你计划在物理服务器上安装,建议下载“DVD ISO”或“Everything ISO”,它们包含了大量的基础软件包,在无网络或网络受限的环境下安装会非常方便。如果是在虚拟机里测试学习,“Minimal ISO”就足够了。
获取镜像后,你需要将其制作成启动介质。对于物理服务器,通常使用Rufus、balenaEtcher等工具将ISO刻录到U盘。关键点在于:在Rufus中,分区类型建议选择“GPT”,目标系统类型选择“UEFI (非CSM)”,这能更好地支持新硬件。对于虚拟机(如VMware Workstation或VirtualBox),则简单得多,新建虚拟机时直接指定ISO文件路径即可。
2.2 硬件与分区规划
安装前,心里要对服务器的硬件有个数。特别是内存和磁盘空间。对于最小化安装,1GB内存和10GB磁盘空间勉强够用,但如果你想顺畅地运行图形界面或部署应用,我建议至少分配2GB内存和20GB磁盘空间。生产环境则根据实际应用需求上不封顶。
分区方案是另一个核心决策点。对于新手,直接使用安装程序提供的“自动配置分区”是最安全省心的。但对于有经验的管理员,手动分区能带来更好的性能和灵活性。一个经典的服务器手动分区方案如下:
- /boot (约1GB):存放系统内核和启动文件。使用ext4文件系统即可。
- / (根目录,20-50GB):存放系统核心文件和应用程序。同样使用ext4或xfs(CentOS 9默认)。
- /home (视情况而定):存放用户数据。如果服务器是多用户环境,可以独立分区并分配较大空间。
- swap (交换分区):传统经验是物理内存的1-2倍,但在如今内存动辄几十GB的时代,这个规则已不绝对。对于内存大于8GB的服务器,分配4-8GB的swap通常足够;如果内存非常大(如64GB以上),甚至可以完全不设swap,或者只设一个小的swap文件以备不时之需。
注意:在虚拟机安装时,如果你选择了“自动配置分区”,安装程序可能会创建一个很大的
/boot/efi分区(约600MB)和一个biosboot分区(约1MB),这是为UEFI启动模式准备的,属于正常情况,无需担心。
2.3 安装模式选择:图形化还是最小化?
CentOS 9安装程序会让你选择“带GUI的服务器”或“最小安装”。我的个人建议是:对于服务器,一律选择“最小安装”。
“最小安装”只安装最核心的系统包,没有图形界面,系统极其纯净、资源占用少、受攻击面小。所有你需要的工具,都可以后续通过dnf命令按需安装。通过SSH远程管理才是服务器运维的常态。图形界面(GUI)不仅消耗大量内存和CPU资源,还会引入不必要的服务和潜在的安全漏洞。记住,服务器的核心价值是稳定运行服务,而不是提供一个桌面环境。
3. 系统安装过程步步解析
假设你已经做好了启动介质并启动了安装程序,下面我们进入图形化安装界面。整个过程是向导式的,但有几个页面需要特别关注。
3.1 语言、时区与软件选择
安装界面首先让你选择语言,这个选择主要影响安装过程本身的提示语言,系统安装后的语言环境可以再改。我通常直接选择“English (United States)”,保持一致性。
接下来是关键的一步:“安装目的地”。也就是磁盘分区。如果你选择手动分区,点击进入后,会看到你的磁盘。点击“自定义”,然后按我们之前规划的方案,点击“+”号逐个创建挂载点(如/boot,/,/home等),设置期望的大小和文件系统类型(建议根分区使用XFS,它是CentOS/RHEL的默认和推荐文件系统,在处理大文件时性能更优)。
然后配置“网络和主机名”。务必在这里就打开以太网连接!点击进入,找到你的网卡(通常是ens192或eth0),将右上角的开关拨到“ON”。这样系统在安装过程中就能连接网络,为后续软件包安装和更新打下基础。同时,在下方设置好你的主机名,例如server01.yourdomain.com。
“软件选择”页面,正如前文所述,请果断选择“最小安装”。下方的附加环境暂时一个都不要勾选。
3.2 根密码与用户创建
在“Root密码”页面,为root管理员账户设置一个强密码。请务必记录并妥善保管。虽然最佳实践是禁用root的SSH登录而使用普通用户sudo,但安装阶段root密码是必须的。
我强烈建议在“用户创建”页面,创建一个用于日常管理的普通用户。例如,创建一个用户名为admin的用户,并勾选“将此用户设为管理员”,这相当于将其加入wheel组,拥有sudo权限。同时为这个用户设置一个强密码。这样做的好处是,你以后可以通过admin用户登录,使用sudo执行特权命令,既安全又方便审计。
完成所有设置后,点击“开始安装”。安装程序会格式化磁盘、复制文件、安装软件包。这个过程取决于你的硬件速度和所选软件包数量,一般需要10到30分钟。
安装完成后,点击“重启系统”。重启后,你会看到命令行登录界面。用你刚才创建的普通用户(如admin)或root登录,恭喜你,一个最精简的CentOS 9系统已经运行起来了。
4. 首次登录后的必备基础配置
系统安装完成只是第一步。一个“裸”的系统离生产就绪还差得远。接下来的一系列配置,才是让这台服务器变得好用、安全的关键。
4.1 网络配置静态IP(告别动态获取)
安装时我们只是启用了网络,获取的是DHCP分配的动态IP。对于服务器来说,一个固定的静态IP是必须的。CentOS 9使用NetworkManager和nmcli命令进行网络管理,这是与老版本(使用network-scripts)一个很大的不同。
首先,查看当前的网络连接名:
nmcli connection show通常你会看到一个名为“有线连接 1”或类似ens192的连接。记住它的名字,比如ens192。
接下来,编辑这个连接的配置,将其设置为静态IP。假设我们要设置IP为192.168.1.100/24,网关为192.168.1.1,DNS服务器为8.8.8.8和114.114.114.114:
sudo 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"这条命令的意思是:将连接ens192的IPv4方法改为手动,设置地址、网关和DNS。
然后,重启网络连接使配置生效:
sudo nmcli connection up ens192最后,验证一下:
ip addr show ens192 ping -c 4 8.8.8.8你应该能看到配置的静态IP,并且能够ping通外网。
4.2 系统更新与基础工具安装
新系统第一件事就是更新所有软件包到最新版本,以获取安全补丁和错误修复。CentOS 9使用dnf作为包管理器(可以看作是yum的下一代)。
sudo dnf update -y这个-y参数表示自动回答“yes”,省去确认环节。更新过程可能会花费一些时间。
更新完成后,安装一些最常用、几乎离不开的工具集:
sudo dnf install -y vim wget curl net-tools bash-completion epel-release- vim:比默认的
vi更强大的文本编辑器。 - wget/curl:命令行下载工具。
- net-tools:包含
ifconfig,netstat等传统网络工具(虽然ip命令是未来,但很多脚本和习惯还在用ifconfig)。 - bash-completion:为bash shell提供命令自动补全功能,极大提升效率。
- epel-release:安装EPEL(Extra Packages for Enterprise Linux)仓库。这是一个由Fedora社区维护的高质量附加软件包仓库,里面有大量官方仓库没有的实用软件,如
htop,ncdu等。安装它是后续丰富软件生态的基础。
安装完EPEL仓库后,可以再安装两个神器:
sudo dnf install -y htop ncdu- htop:一个交互式的进程查看器,比
top更直观、功能更强。 - ncdu:一个磁盘使用分析器,可以快速找出哪个目录占用了大量空间。
4.3 配置SSH服务增强安全
默认的SSH配置虽然能用,但不够安全。我们需要修改其配置文件。
sudo vim /etc/ssh/sshd_config找到并修改以下几行(如果行首有#注释,请删除#以启用该配置):
Port 2222 # 将默认的22端口改为一个非标准端口,能减少大量自动化扫描攻击 PermitRootLogin no # 禁止root用户直接通过SSH登录,强制使用普通用户+sudo PasswordAuthentication yes # 初期可以保持为yes,方便密码登录。后期配置密钥后可以改为no PubkeyAuthentication yes # 启用公钥认证修改端口后,务必记得更新系统的防火墙规则(如果防火墙是开启的):
sudo firewall-cmd --permanent --add-port=2222/tcp sudo firewall-cmd --reload然后重启SSH服务:
sudo systemctl restart sshd重要:在关闭当前SSH连接之前,请先打开一个新的终端窗口,用新端口(ssh -p 2222 admin@your_server_ip)测试是否能成功连接。确认无误后,再关闭原来的连接。这是防止错误配置把自己锁在服务器外面的标准操作。
5. 开发环境核心组件安装实录
基础系统配置妥当后,我们就可以根据需求安装各种开发环境了。以下是我在部署Web应用时最常安装的几个组件。
5.1 安装与配置Python 3
CentOS 9默认已经安装了Python 3.9,但可能不是最新版。你可以先查看版本:
python3 --version如果需要安装更新的版本,例如Python 3.11,由于官方仓库版本可能较旧,我们可以通过编译安装或使用第三方仓库。这里介绍一种相对简单的方法:使用dnf安装python39或python311模块(如果仓库提供)。
# 首先搜索可用的Python模块 sudo dnf module list python* # 假设我们看到有python39和python311 sudo dnf install -y python311安装后,你可能需要调整系统默认的python3命令指向新版本。一个更干净的做法是使用alternatives系统或直接使用python3.11命令。
接下来安装Python的包管理工具pip:
sudo dnf install -y python311-pip然后升级pip并安装虚拟环境工具virtualenv,这是管理项目依赖的黄金标准:
sudo pip3.11 install --upgrade pip sudo pip3.11 install virtualenv实操心得:对于生产服务器,我强烈建议每个应用都使用独立的虚拟环境。这样应用之间的依赖不会冲突,部署和迁移也干净利落。例如,为你的项目myapp创建环境:virtualenv /opt/myapp/venv,然后通过source /opt/myapp/venv/bin/activate进入该环境安装依赖。
5.2 安装与配置Node.js
Node.js在官方仓库中的版本可能也比较旧。我们可以从NodeSource这个第三方仓库安装最新的LTS版本。
# 安装NodeSource仓库脚本(以Node.js 18.x LTS为例) curl -fsSL https://rpm.nodesource.com/setup_18.x | sudo bash - # 然后安装Node.js sudo dnf install -y nodejs安装完成后,验证:
node --version npm --versionNode.js自带的npm是社区标准的包管理器,但对于大型项目,你可能还想安装yarn或pnpm:
sudo npm install -g yarn5.3 安装与配置Java (OpenJDK)
安装Java环境非常简单,CentOS 9的AppStream仓库提供了多个版本的OpenJDK。
# 搜索可用的JDK版本 sudo dnf search openjdk # 例如安装最新的OpenJDK 21(长期支持版本) sudo dnf install -y java-21-openjdk-devel安装后,检查版本并设置默认的Java版本(如果系统中有多个Java):
java -version sudo alternatives --config java # 如果存在多个,用此命令选择通常,你还需要设置JAVA_HOME环境变量。找到Java的安装路径:
dirname $(dirname $(readlink -f $(which java)))假设输出是/usr/lib/jvm/java-21-openjdk,那么将其添加到/etc/profile或用户家目录的.bashrc中:
echo 'export JAVA_HOME=/usr/lib/jvm/java-21-openjdk' | sudo tee -a /etc/profile.d/java.sh echo 'export PATH=$JAVA_HOME/bin:$PATH' | sudo tee -a /etc/profile.d/java.sh source /etc/profile.d/java.sh5.4 安装与配置Git
Git是版本控制的必备工具,安装非常简单:
sudo dnf install -y git安装后,进行全局配置,这在提交代码时很重要:
git config --global user.name "Your Name" git config --global user.email "your.email@example.com" # 让Git输出带颜色,更易读 git config --global color.ui auto # 设置默认分支名为main git config --global init.defaultBranch main6. 数据库与Web服务器安装配置
一个完整的后端环境离不开数据库和Web服务器。这里以最流行的MySQL和Nginx为例。
6.1 安装与配置MySQL 8.0
CentOS 9的AppStream仓库提供了MySQL 8.0。直接安装即可:
sudo dnf install -y mysql-server安装完成后,启动MySQL服务并设置开机自启:
sudo systemctl start mysqld sudo systemctl enable mysqldMySQL 8.0在首次启动时,会自动为root用户生成一个临时密码。这个密码记录在MySQL的错误日志中。查看日志获取密码:
sudo grep 'temporary password' /var/log/mysqld.log你会看到一行类似[Note] [MY-010454] [Server] A temporary password is generated for root@localhost: 临时密码的输出。复制这个临时密码。
接下来运行安全安装脚本,它会引导你更改root密码、移除匿名用户、禁止root远程登录等:
sudo mysql_secure_installation按照提示操作:输入刚才找到的临时密码;设置新的强密码;移除匿名用户(选Y);禁止root远程登录(选Y,生产环境强烈建议);移除测试数据库(选Y);最后重新加载权限表(选Y)。
完成后,你就可以用新密码登录MySQL了:
mysql -u root -p6.2 安装与配置Nginx
Nginx在EPEL仓库中。我们已经安装了epel-release,所以可以直接安装:
sudo dnf install -y nginx启动Nginx并设置开机自启:
sudo systemctl start nginx sudo systemctl enable nginx如果系统防火墙(firewalld)是开启的,需要放行HTTP(80)和HTTPS(443)端口:
sudo firewall-cmd --permanent --add-service=http sudo firewall-cmd --permanent --add-service=https sudo firewall-cmd --reload现在,打开浏览器,访问你的服务器IP地址,应该能看到Nginx的默认欢迎页面。
Nginx的主要配置文件在/etc/nginx/nginx.conf,站点配置文件通常放在/etc/nginx/conf.d/目录下,以.conf结尾。例如,为你的应用创建一个配置文件:
sudo vim /etc/nginx/conf.d/myapp.conf一个简单的反向代理配置示例如下:
server { listen 80; server_name your_domain.com; location / { proxy_pass http://localhost:3000; # 假设你的Node.js应用跑在3000端口 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } }每次修改配置后,需要测试配置语法并重载Nginx:
sudo nginx -t # 测试配置,看到`syntax is ok`和`test is successful`才算通过 sudo systemctl reload nginx # 平滑重载配置,不影响现有连接7. 运维效率工具与系统调优
系统能跑起来之后,我们还需要一些工具来监控它、优化它,让运维工作更轻松。
7.1 防火墙管理:firewalld基础
CentOS 9默认使用firewalld作为防火墙前端。它的核心概念是“区域”和“服务”。前面我们已经用过了firewall-cmd命令。
- 查看当前区域和规则:
sudo firewall-cmd --list-all - 永久添加一个端口:
sudo firewall-cmd --permanent --add-port=8080/tcp - 永久移除一个服务:
sudo firewall-cmd --permanent --remove-service=http - 重载防火墙使永久规则生效:
sudo firewall-cmd --reload
注意事项:--permanent参数表示规则永久生效,但不会立即应用到当前运行时配置。必须执行--reload后,永久规则才会同时成为运行时规则。也可以不加--permanent,那样规则只会在本次运行中生效,重启firewalld服务后失效。生产环境修改防火墙规则务必谨慎,最好在本地测试或保有其他访问途径(如控制台)。
7.2 系统服务管理:systemctl精通
systemctl是管理系统服务(守护进程)的核心工具。
- 启动服务:
sudo systemctl start service_name - 停止服务:
sudo systemctl stop service_name - 重启服务:
sudo systemctl restart service_name - 重载服务配置(不重启):
sudo systemctl reload service_name(并非所有服务都支持) - 查看服务状态:
sudo systemctl status service_name(这是最常用的命令之一,可以查看是否运行、最近的日志等) - 启用开机自启:
sudo systemctl enable service_name - 禁用开机自启:
sudo systemctl disable service_name - 查看所有已启动的服务:
systemctl list-units --type=service --state=running
7.3 日志查看:journalctl实战
CentOS 9使用systemd-journald来管理系统日志,查看日志的命令是journalctl。
- 查看所有日志:
sudo journalctl - 查看指定服务的日志:
sudo journalctl -u nginx.service - 查看最新日志并持续输出(类似
tail -f):sudo journalctl -f - 查看今天以来的日志:
sudo journalctl --since today - 以更友好的时间格式显示:
sudo journalctl --since "1 hour ago" -o short-precise
对于传统的文本日志(如/var/log/messages,/var/log/secure等),依然可以使用tail,cat,grep等命令查看。例如,查看SSH登录失败记录:sudo grep 'Failed password' /var/log/secure。
7.4 性能监控与排查
除了安装的htop,系统自带了一些基础但强大的工具:
top/htop:实时进程监控。htop更直观,支持鼠标操作和树状视图。vmstat:查看虚拟内存、进程、CPU活动等统计信息。vmstat 2 5表示每2秒采样一次,共采样5次。iostat:查看CPU和磁盘I/O统计。需要安装sysstat包:sudo dnf install -y sysstat。free -h:以人类可读格式查看内存使用情况。df -h:查看磁盘空间使用情况。du -sh *:查看当前目录下各文件/文件夹的大小。
当系统出现响应慢的问题时,一个快速的排查顺序是:先用htop看CPU和内存谁吃紧了;再用iostat看磁盘是否在疯狂读写(%util接近100%);接着用df -h看是不是磁盘满了;最后用journalctl -f或tail -f /var/log/messages看看有没有相关的错误日志。
8. 常见问题与故障排查实录
即使按照步骤操作,也难免会遇到问题。这里记录几个我在安装配置CentOS 9时遇到的高频问题及其解决方法。
8.1 网络连接失败,ping不通外网
现象:系统安装后,ping 8.8.8.8提示“Network is unreachable”或一直无响应。
排查步骤:
- 检查网卡状态:
ip addr show。确认你的以太网卡(如ens192)是否存在,并且是否有分配到IP地址(inet那一行)。如果没有IP,可能是DHCP没成功或网线没插好。 - 检查NetworkManager:
sudo systemctl status NetworkManager。确保服务是active (running)状态。 - 检查连接配置:
nmcli connection show。确认你的连接是“已连接”状态。如果不是,尝试sudo nmcli connection up ens192。 - 检查路由:
ip route show。应该有一条默认路由(default via ...指向你的网关)。如果没有,可能是网关没设对。 - 检查DNS:
cat /etc/resolv.conf。里面应该有nameserver行。如果是在nmcli里配置的DNS,这里会自动更新。 - 检查防火墙:
sudo firewall-cmd --state。如果是running,尝试暂时关闭防火墙测试:sudo systemctl stop firewalld。如果关闭后网络通了,说明是防火墙规则挡住了,需要正确放行。
8.2sudo命令报错“用户不在sudoers文件中”
现象:用新建的普通用户执行sudo命令时,提示username is not in the sudoers file. This incident will be reported.
原因:创建用户时没有将其加入wheel组(拥有sudo权限的组)。
解决方法:
- 先用root用户登录。
- 执行
usermod -aG wheel your_username,将你的用户加入wheel组。-aG参数表示“追加到以下组”,避免移除用户其他现有组。 - 退出root,重新用你的用户登录(或开启一个新的SSH会话),
sudo权限即可生效。
8.3dnf安装软件时速度极慢或报错
现象:执行sudo dnf update或sudo dnf install时,下载速度很慢,或者提示“无法同步缓存”、“无法下载元数据”。
原因:默认的CentOS仓库镜像可能在国内访问速度不佳。
解决方法:更换为国内的镜像源,如阿里云、腾讯云、清华大学的镜像站。
- 备份原有仓库文件:
sudo cp /etc/yum.repos.d/centos-stream.repo /etc/yum.repos.d/centos-stream.repo.backup - 编辑仓库文件:
sudo vim /etc/yum.repos.d/centos-stream.repo - 将其中的
mirrorlist=或baseurl=开头的行注释掉(在行首加#)。 - 添加国内镜像源。以阿里云为例,在
[baseos]和[appstream]等段落下添加:
将baseurl=https://mirrors.aliyun.com/centos-stream/$stream/BaseOS/$basearch/os/$stream替换为9(对于CentOS Stream 9),$basearch通常是x86_64。具体URL请参考镜像站官方说明。 - 清理并重建缓存:
sudo dnf clean all && sudo dnf makecache
8.4 服务启动失败,systemctl status显示错误
现象:例如sudo systemctl start nginx失败,sudo systemctl status nginx显示failed,并有一段红色的错误描述。
排查步骤:
- 仔细阅读状态输出:
status命令的最后几行通常会给出关键错误信息,如“端口已被占用”、“配置文件语法错误”、“权限不足”等。 - 使用
journalctl查看详细日志:sudo journalctl -u nginx.service --since "5 minutes ago" -p err。这条命令会筛选出最近5分钟内Nginx服务的错误级别日志,信息往往更详细。 - 常见原因:
- 端口冲突:用
sudo ss -tlnp | grep :80查看80端口被谁占用。 - 配置文件语法错误:对于Nginx,一定要用
sudo nginx -t测试配置。对于其他服务,通常也有类似的测试命令,如apachectl configtest。 - 权限问题:检查服务运行用户(如
nginx用户)是否有权访问它需要的文件或目录。用ls -l查看文件属主和权限。 - 依赖服务未启动:有些服务依赖其他服务(如数据库)。确保依赖服务已启动并运行正常。
- 端口冲突:用
8.5 磁盘空间不足报警
现象:执行命令或安装软件时提示“No space left on device”。
排查与解决:
- 快速定位:使用
df -h查看哪个分区使用率接近100%。 - 找出大文件/目录:进入使用率高的分区挂载点(如
/),使用ncdu /(需要提前安装)进行交互式分析,它能快速扫描并按大小排序,直观地告诉你哪个目录占用了最多空间。或者用命令sudo du -sh /* | sort -rh | head -10查看根目录下最大的10个目录。 - 常见清理目标:
- 日志文件:
/var/log目录。可以使用sudo journalctl --vacuum-time=7d清理7天前的系统日志。检查/var/log下是否有特定应用产生的巨大日志文件。 - 缓存包:
dnf的缓存位于/var/cache/dnf/,可以安全清理:sudo dnf clean all。 - Docker/容器:如果使用了Docker,它的镜像、容器、卷可能占用大量空间,位于
/var/lib/docker。 - 临时文件:
/tmp目录。但注意有些正在运行的程序可能会用到其中的文件。
- 日志文件:
- 清理后:再次运行
df -h确认空间已释放。
经过以上从规划、安装、基础配置、环境搭建到运维排错的全流程,你的CentOS 9服务器已经从一张白纸,变成了一个功能完备、安全可控、随时可以承载应用的生产力环境。记住,Linux服务器的管理是一个持续的过程,定期更新系统、检查日志、监控性能是好习惯的开始。这套配置流程和问题排查思路,不仅适用于CentOS 9,其核心思想对于其他Linux发行版也同样具有参考价值。
