1. 服务器初始化概述
服务器初始化是每个系统管理员和运维工程师的必修课。作为IT基础设施的第一道工序,它直接决定了后续所有服务的稳定性和安全性。我在过去十年里处理过上千台服务器的初始化工作,从物理机到云主机,从Web服务器到数据库集群,总结出了一套高效可靠的标准化流程。
不同于简单的系统安装,完整的服务器初始化包含硬件检查、系统部署、安全加固、性能调优等关键环节。合理的初始化能让服务器在生命周期内减少30%以上的运维问题,特别是在高并发场景下,初始配置的细微差别可能导致性能指数级差异。
2. 初始化前的准备工作
2.1 硬件环境确认
物理服务器需要检查:
- RAID卡配置(建议RAID10用于数据库,RAID5用于存储)
- 内存ECC校验状态
- 网卡绑定模式(LACP/主备)
- 电源冗余配置
云服务器需确认:
- 实例规格与业务负载匹配
- 云盘类型(SSD/高效云盘)
- 网络带宽峰值和基准值
- 安全组默认规则
重要提示:生产环境务必避免使用突发性能实例,容易导致性能波动。
2.2 系统镜像选择
根据业务类型选择基础镜像:
- CentOS/RHEL:传统企业首选,兼容性好
- Ubuntu LTS:较新的软件支持
- Debian:稳定性优先
- 定制化镜像:预装Docker/K8s等
建议最小化安装(Minimal Install),减少不必要的软件包。我曾遇到因默认安装GUI导致系统资源被占用的案例。
3. 操作系统初始化流程
3.1 分区方案设计
推荐分区方案(以100G系统盘为例):
code复制/boot 1G ext4
/ 50G xfs
/var 20G xfs
swap 内存的1-1.5倍(不超过32G)
/data 剩余空间 xfs(单独挂载点)
数据库服务器需要特别考虑:
- /var/lib/mysql 单独分区
- 关闭swap(MySQL优化建议)
- 使用noatime挂载选项
3.2 基础安全配置
- 用户权限管理:
bash复制# 创建运维账号
useradd ops -G wheel
passwd ops
# 禁止root远程登录
sed -i 's/^PermitRootLogin.*/PermitRootLogin no/' /etc/ssh/sshd_config
# 配置sudo权限
visudo
# 添加:%wheel ALL=(ALL) NOPASSWD: ALL
- SSH加固:
bash复制# 修改默认端口
sed -i 's/#Port 22/Port 22222/' /etc/ssh/sshd_config
# 禁用密码认证
sed -i 's/#PasswordAuthentication yes/PasswordAuthentication no/' /etc/ssh/sshd_config
# 重启服务
systemctl restart sshd
- 防火墙规则:
bash复制# CentOS 7+
firewall-cmd --permanent --add-port=22222/tcp
firewall-cmd --reload
# Ubuntu
ufw allow 22222/tcp
ufw enable
4. 系统参数调优
4.1 内核参数优化
编辑/etc/sysctl.conf:
conf复制# 避免TCP TIME_WAIT状态过多
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
# 增大文件描述符限制
fs.file-max = 655350
# 内存分配策略
vm.swappiness = 10
vm.overcommit_memory = 1
# 网络相关
net.core.somaxconn = 32768
net.ipv4.tcp_max_syn_backlog = 8192
应用配置:sysctl -p
4.2 资源限制配置
/etc/security/limits.conf:
code复制* soft nofile 65535
* hard nofile 65535
* soft nproc 65535
* hard nproc 65535
对于Java应用需要额外设置:
code复制tomcat soft memlock unlimited
tomcat hard memlock unlimited
5. 基础服务部署
5.1 时间同步配置
Chrony服务(推荐):
bash复制yum install -y chrony # CentOS
apt install -y chrony # Ubuntu
systemctl enable chronyd
systemctl start chronyd
# 检查同步状态
chronyc sources -v
5.2 日志管理方案
- 配置logrotate:
bash复制vim /etc/logrotate.d/myapp
/var/log/myapp/*.log {
daily
missingok
rotate 30
compress
delaycompress
notifempty
create 640 root adm
sharedscripts
postrotate
/bin/kill -HUP `cat /var/run/myapp.pid 2>/dev/null` 2>/dev/null || true
endscript
}
- 考虑接入ELK或Loki等日志系统
6. 监控与维护
6.1 基础监控部署
Prometheus Node Exporter安装:
bash复制wget https://github.com/prometheus/node_exporter/releases/download/v1.3.1/node_exporter-1.3.1.linux-amd64.tar.gz
tar xvf node_exporter-*.tar.gz
mv node_exporter-*/node_exporter /usr/local/bin/
cat > /etc/systemd/system/node_exporter.service <<EOF
[Unit]
Description=Node Exporter
[Service]
ExecStart=/usr/local/bin/node_exporter
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable --now node_exporter
6.2 定期维护任务
- 配置自动安全更新:
bash复制# CentOS
yum install -y yum-cron
sed -i 's/apply_updates = no/apply_updates = yes/' /etc/yum/yum-cron.conf
systemctl enable --now yum-cron
# Ubuntu
apt install -y unattended-upgrades
dpkg-reconfigure -plow unattended-upgrades
- 设置磁盘检查任务:
bash复制echo "0 5 * * * root /usr/sbin/xfs_repair -n /dev/sda1" > /etc/cron.d/disk-check
7. 常见问题排查
7.1 SSH连接失败
检查步骤:
- 确认端口是否开放:
telnet server_ip 22222 - 检查防火墙规则:
iptables -L -n - 查看SSH日志:
journalctl -u sshd -f - 验证密钥权限:
chmod 600 ~/.ssh/id_rsa
7.2 性能突然下降
快速诊断命令:
bash复制top -c # 查看CPU使用
free -h # 内存状态
df -h # 磁盘空间
ss -s # 网络连接数
dmesg -T | tail -20 # 内核日志
iotop -o # 磁盘IO
8. 初始化检查清单
最后分享我的标准检查表(部分):
- [ ] 确认SELinux状态(建议disabled/permissive)
- [ ] 测试所有管理账号的sudo权限
- [ ] 验证备份方案是否生效
- [ ] 检查关键目录权限(/etc, /var/log等)
- [ ] 确认监控系统数据采集正常
- [ ] 压力测试网络吞吐量
- [ ] 验证系统日志无异常报错
在实际操作中,我习惯用Ansible将这套流程模板化。以下是一个简单的playbook示例:
yaml复制- hosts: all
become: yes
tasks:
- name: 安装基础工具包
yum:
name: ['vim','git','htop','iotop','sysstat']
state: present
- name: 配置时区
timezone:
name: Asia/Shanghai
- name: 禁用IPv6
sysctl:
name: net.ipv6.conf.all.disable_ipv6
value: 1
sysctl_set: yes
记住,没有放之四海皆准的配置,根据业务特点调整才是关键。比如电商系统需要优化TCP栈,而AI训练服务器则要重点调整内存分配策略。
