服务公告
Linux - Linux最佳实践 配置与优化
发布时间:2026-04-29 06:00
一、前言
干了十年运维,见过太多服务器被人顺手提权、数据库被打瘫、磁盘IO爆表的惨案。说实话,大多数问题都是基础配置没做好。Linux不像Windows那样给你图形界面点点就完事,得靠命令行一点点抠。这篇文章把最核心的安全加固和性能优化方案讲透,不玩虚的,都是实战检验过的硬招。
二、操作步骤
步骤1:内核参数调优
系统默认参数保守得跟没开过一样,高并发场景直接歇菜。先看看当前配置:
# 查看当前网络连接数限制
sysctl net.core.somaxconn
net.core.somaxconn = 128
# 查看文件描述符限制
sysctl fs.file-max
fs.file-max = 9223372036854775807
# 查看当前打开文件数限制
ulimit -n
1024
生产环境这个文件描述符1024根本不够用,改法如下:
# 编辑sysctl配置
cat >> /etc/sysctl.conf << 'EOF'
# 网络参数优化
net.core.somaxconn = 65535
net.core.netdev_max_backlog = 65535
net.ipv4.tcp_max_syn_backlog = 65535
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 1200
# 文件描述符优化
fs.file-max = 2097152
# 内存管理优化
vm.swappiness = 10
vm.dirty_ratio = 60
vm.dirty_background_ratio = 5
EOF
# 应用配置
sysctl -p
# 验证生效
sysctl net.core.somaxconn
net.core.somaxconn = 65535
步骤2:用户资源限制配置
单个用户能把系统资源吃光这种事,必须从源头卡死。编辑limits.conf:
# CentOS/RHEL路径
vim /etc/security/limits.conf
# Ubuntu路径
vim /etc/security/limits.conf
# 添加以下配置
* soft nofile 655350
* hard nofile 655350
* soft nproc 655350
* hard nproc 655350
# 切换到root测试
su - opsadmin
ulimit -n
655350
确保 PAM 加载了 limits 模块:
# CentOS/RHEL检查
grep -q "session required pam_limits.so" /etc/pam.d/login || echo "session required pam_limits.so" >> /etc/pam.d/login
# Ubuntu检查
grep -q "session required pam_limits.so" /etc/pam.d/common-session || echo "session required pam_limits.so" >> /etc/pam.d/common-session
# 验证PAM配置
cat /etc/security/limits.conf | grep -E "nofile|nproc"
* soft nofile 655350
* hard nofile 655350
步骤3:SSH安全加固
SSH是入口,入口守不好等于门户大开。密码登录必须干掉:
# 编辑SSH配置
vim /etc/ssh/sshd_config
# 关键配置项
Port 2222 # 改默认端口,别用22
PermitRootLogin no # 禁止root直接登录
PasswordAuthentication no # 禁用密码认证
PubkeyAuthentication yes # 只允许密钥登录
MaxAuthTries 3 # 最多尝试3次
ClientAliveInterval 300 # 5分钟无活动断开
AllowUsers opsadmin@10.0.0.0/8 # 限制来源IP段
# 重启服务验证
# CentOS/RHEL
systemctl restart sshd
# Ubuntu
systemctl restart ssh
# 测试密钥登录
ssh -p 2222 opsadmin@your_server_ip
Last login: Mon Dec 16 10:23:45 2024 from 10.0.5.100
[opsadmin@prod-server ~]$
⚠️ 安全警告:执行前务必确保公钥已正确配置,否则可能永久失去服务器访问权限!
步骤4:防火墙策略配置
防火墙规则得严格,服务只开必要的端口。先清空后重建:
# CentOS/RHEL - 使用firewalld
systemctl start firewalld
systemctl enable firewalld
# 放行SSH(自定义端口)、HTTP、HTTPS
firewall-cmd --permanent --add-port=2222/tcp
firewall-cmd --permanent --add-service=http
firewall-cmd --permanent --add-service=https
# 限制SSH来源为内网段
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="10.0.0.0/8" port port="2222" protocol="tcp" accept'
# 删除默认的SSH规则
firewall-cmd --permanent --remove-service=ssh
# 重载并验证
firewall-cmd --reload
firewall-cmd --list-all
public (active)
ports: 2222/tcp 80/tcp 443/tcp
services: http https
# Ubuntu - 使用ufw
ufw enable
# 放行SSH、web服务
ufw allow 2222/tcp
ufw allow 80/tcp
ufw allow 443/tcp
# 限制SSH来源
ufw allow from 10.0.0.0/8 to any port 2222 proto tcp
# 查看规则
ufw status numbered
Status: active
To Action From
-- ------ ----
[ 1] 2222/tcp ALLOW Anywhere
[ 2] 80/tcp ALLOW Anywhere
[ 3] 443/tcp ALLOW Anywhere
[ 4] 2222/tcp ALLOW 10.0.0.0/8
步骤5:服务管理和自启动审计
跑着无用服务就是给自己埋雷。检查并关闭非必要服务:
# 查看所有正在运行的服务
systemctl list-units --type=service --state=running
UNIT LOAD ACTIVE SUB DESCRIPTION
crond.service loaded active running Command Scheduler
dbus.service loaded active running D-Bus System Message Bus
firewalld.service loaded active running firewalld - dynamic firewall daemon
postfix.service loaded active running Postfix Mail Transport Agent
sshd.service loaded active running OpenSSH server daemon
systemd-journald loaded active running Journal Service
vsftpd.service loaded active running Vsftpd ftp daemon
# 关闭不必要的服务
# CentOS/RHEL
systemctl stop postfix
systemctl disable postfix
systemctl stop vsftpd
systemctl disable vsftpd
# Ubuntu
systemctl stop postfix
systemctl disable postfix
# 验证自启动状态
systemctl list-unit-files --type=service | grep enabled
crond.service enabled
firewalld.service enabled
sshd.service enabled
步骤6:日志轮转和系统审计
日志吃满磁盘是常见事故,logrotate必须配置好:
# 查看日志占用空间
du -sh /var/log/*
4.2G /var/log/messages
1.8G /var/log/secure
956M /var/log/nginx
# 配置日志轮转
cat > /etc/logrotate.d/system-logs << 'EOF'
/var/log/messages /var/log/secure /var/log/maillog {
daily
rotate 14
compress
delaycompress
missingok
notifempty
create 0600 root root
sharedscripts
postrotate
systemctl reload rsyslog > /dev/null 2>&1 || true
endscript
}
EOF
# 手动测试轮转
logrotate -f /etc/logrotate.d/system-logs
# 验证轮转结果
ls -lh /var/log/messages*
-rw------- 1 root root 4.2G /var/log/messages
-rw------- 1 root root 156M /var/log/messages-20241216.gz
步骤7:性能监控基线建立
优化完得有个基准,后续出问题好对比。采集基线数据:
# CPU和负载基线
uptime
10:30:15 up 45 days, 3:22, 2 users, load average: 0.52, 0.48, 0.45
# 内存使用基线
free -h
total used free shared buff/cache available
Mem: 31Gi 8.2Gi 12.5Gi 156Mi 10.3Gi 22.5Gi
Swap: 2Gi 0B 2Gi
# 磁盘IO基线
iostat -x 1 5
Linux 5.4.0- generi (prod-server)
avg-cpu: %user %nice %system %iowait %steal %idle
2.35 0.00 0.78 0.23 0.00 96.64
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
vda 0.00 0.50 0.50 1.50 16.00 28.00 44.00 0.01 5.00 4.00 6.00 3.00 0.60
# 网络连接基线
ss -s
Total: 245 (kernel 312)
TCP: 142 (established: 42, closed: 58, orphaned: 0, synrecv: 0, ack: 86)
# 写入基线配置
cat > /opt/monitoring/baseline.json << 'EOF'
{
"timestamp": "2024-12-16T10:30:00",
"load_avg": [0.52, 0.48, 0.45],
"cpu_idle": 96.64,
"mem_available_gb": 22.5,
"disk_util_avg": 0.60,
"tcp_connections": 142
}
EOF
步骤8:自动化巡检脚本部署
光优化不够,得持续监控。部署每日巡检:
# 创建巡检脚本
cat > /usr/local/bin/health_check.sh << 'EOF'
#!/bin/bash
LOGFILE="/var/log/health_check-$(date +%Y%m%d).log"
{
echo "========== System Health Check $(date) =========="
echo -e "\n[1] Load Average:"
uptime | awk -F'load average:' '{print $2}'
echo -e "\n[2] Memory Usage:"
free -h | grep Mem
echo -e "\n[3] Disk Usage:"
df -h / | tail -1
echo -e "\n[4] Top 5 Processes by CPU:"
ps aux --sort=-%cpu | head -6
echo -e "\n[5] Network Connections:"
ss -s | head -3
echo -e "\n[6] Failed SSH Attempts (last 24h):"
journalctl -u sshd --since "24 hours ago" | grep -i "failed" | wc -l
} > $LOGFILE 2>&1
# 发送告警(需要配置邮件服务)
if grep -q "100%" /var/log/messages 2>/dev/null; then
echo "Warning: High resource usage detected" | mail -s "Health Alert" admin@example.com
fi
EOF
chmod +x /usr/local/bin/health_check.sh
# 配置定时任务
crontab -l | grep health_check || echo "0 9 * * * /usr/local/bin/health_check.sh" >> /var/spool/cron/root
# 测试执行
/usr/local/bin/health_check.sh
cat /var/log/health_check-20241216.log
========== System Health Check Mon Dec 16 10:30:00 UTC 2024 ==========
[1] Load Average:
0.52, 0.48, 0.45
[2] Memory Usage:
Mem: 31Gi 8.2Gi 12.5Gi 156Mi 10.3Gi 22.5Gi
[3] Disk Usage:
/dev/vda1 100G 42G 58G 42% /
[4] Top 5 Processes by CPU:
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 12345 2.1 0.5 234567 89012 ? S 10:00 0:32 python app.py
root 23456 1.3 0.2 112345 45678 ? S 09:00 0:15 nginx: worker
三、常见问题FAQ
Q1:修改sysctl参数后提示"sysctl: setting key "xxx": Invalid argument",怎么回事?
这个通常是值超出系统允许范围。比如 vm.swappiness 范围是0-100,你写200肯定报错。还有 net.core.somaxconn 最小值是16,最大值受内核限制。遇到这问题先查手册:sysctl -a | grep 参数名,看当前有效范围。或者用 modprobe -l | grep tcp 确认相关内核模块加载了没。
Q2:防火墙关了SSH端口,结果自己被锁外面了,咋整?
这是作死行为No.1。正确的姿势是在另一个终端提前测试好规则,验证能连再删除旧规则。或者用 firewall-cmd --add-port=2222/tcp --permanent 新旧端口并存一段时间,确认新规则生效后再删旧的。实在倒霉进不去,只能通过云控制台VNC或IPMI重置。
Q3:服务器上跑了200多个进程,哪些该关哪些该留?
先把非必要的服务列出来:systemctl list-units --type=service,对着红帽或Ubuntu官方文档看每个服务是干啥的。基本原则:网络文件系统客户端(NFS/CIFS相关)、蓝牙、打印服务、没用的定时任务,都可以禁。保留的底线是 sshd、firewalld/ufw、rsyslog、chronyd(时间同步)。生产环境最好出一份服务清单,让团队确认签字。
Q4:limits.conf改了用户没生效,怎么排查?
三步走:首先确认改了的是系统级限制还是用户级限制,用户级用 ulimit -n 能看到;其次检查 /etc/pam.d/ 下有没有加载 pam_limits.so 模块;最后看是不是有 systemd 的用户限制覆盖了,编辑 /etc/security/limits.conf 后重启 sshd,或者直接重开一个会话窗口验证。顺手提一句,改完用 getconf PAGE_SIZE 确认下系统能识别到新限制。
四、总结
Linux优化这事儿,说到底就是两句话:该关的关,该调的调。安全上卡死SSH入口、配好防火墙规则、禁用非必要服务;性能上把内核参数放出来、文件描述符管够、日志别把磁盘撑爆。这些活儿做完,再部署一套自动化巡检,后续躺着也能发现问题。
记住,优化完了必须记录基线数据,不然出问题了你都不知道是优化前就这德性还是后来跑歪了。建议把所有配置变更都进Git,碰到故障直接 git diff 还原战场。生产环境操作前,测试环境先跑通,别拿线上服务器当试验田。
延伸阅读:
- 《Linux Performance Tools》 - Brendan Gregg,系统性能分析必读
- Red Hat Performance Tuning Guide - 红帽官方出品,适合RHEL/CentOS
- Linux内核文档 /usr/share/doc/kernel-doc-*/Documentation/sysctl/ - 权威参数说明
相关推荐
上一篇: Apache-星耀云
已经是最后一篇啦!