服务公告

服务公告 > 综合新闻 > Linux - Linux最佳实践 配置与优化

Linux - Linux最佳实践 配置与优化

发布时间:2026-04-29 06:00
资深运维十年经验总结:Linux系统安全加固与性能优化实战指南,涵盖内核参数调优、防火墙策略、服务优化等核心知识点

一、前言

干了十年运维,见过太多服务器被人顺手提权、数据库被打瘫、磁盘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-星耀云

已经是最后一篇啦!