折腾Linux服务器多年,这里记录一些实际运维中踩过的坑和解决方法。
SSH安全配置
修改SSH默认端口
SSH默认22端口容易被暴力破解,建议改成非常用端口:
步骤1:配置iptables
1 2 3 4 5 6 7 8
| sudo vim /etc/iptables/rules.v4
-A INPUT -p tcp -m state --state NEW -m tcp --dport 822 -j ACCEPT
sudo service iptables restart
|
步骤2:修改SSH配置
1 2 3 4 5 6 7 8 9 10 11
| sudo vim /etc/ssh/sshd_config
Port 822
PermitRootLogin no
AllowUsers username
|
步骤3:重启SSH服务
1 2 3 4 5 6 7 8
| sudo service sshd restart
sudo systemctl restart sshd
sudo systemctl status sshd
|
禁用Root直接登录
创建普通用户:
1 2 3 4 5 6 7 8
| sudo useradd adminuser
sudo passwd adminuser
sudo usermod -aG sudo adminuser
|
配置sudo权限(可选):
1 2 3 4 5 6 7 8
| sudo visudo
adminuser ALL=(ALL) NOPASSWD: ALL
adminuser ALL=(ALL) ALL
|
SSH密钥认证配置
密钥认证比密码更安全,也支持免密登录。
原理说明:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| ┌──────────────────────────────────────────────┐ │ SSH密钥认证流程 │ ├──────────────────────────────────────────────┤ │ │ │ 本地机器 远程服务器 │ │ ┌──────────┐ ┌──────────┐ │ │ │ 私钥文件 │ │ 公钥文件 │ │ │ │(id_rsa) │ ────────► │(authorized│ │ │ │ │ 签名 │ _keys) │ │ │ └──────────┘ └──────────┘ │ │ │ │ │ │ │ 加密通信 │ │ │ └──────────────────────────┘ │ │ │ └──────────────────────────────────────────────┘
|
Windows上MobaXterm生成密钥:
- 打开MobaXterm,选择Tools -> MobaKeyGen
- 选择密钥类型(推荐RSA,2048位)
- 点击Generate生成密钥
- 设置Passphrase(可选,为空即无密码登录)
- 保存私钥文件(如
zx-ssh.ppk)
私钥文件位置:
- Windows 7:
C:\Users\ZX\AppData\Roaming\SSH\UserKeys
- Windows 10:
C:\Users\用户名\.ssh\
服务器端配置:
1 2 3 4 5 6 7 8 9
| mkdir -p ~/.ssh chmod 700 ~/.ssh
vim ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
|
公钥格式转换:
1 2 3 4 5 6 7 8 9
| ssh-keygen -X -f zx-ssh.pub >> ~/.ssh/authorized_keys
chmod 640 ~/.ssh/authorized_keys
chmod 700 ~/.ssh chmod go-w ~/.ssh
|
启用密钥认证:
1 2 3 4 5 6 7 8 9 10 11
| sudo vim /etc/ssh/sshd_config
PubkeyAuthentication yes AuthorizedKeysFile .ssh/authorized_keys ChallengeResponseAuthentication no UsePAM yes
sudo service sshd restart
|
MobaXterm连接:
- 新建Session
- 输入主机地址和端口
- 在Advanced SSH settings标签页:
- 勾选”Specify username”
- 输入用户名(如
adminuser)
- 勾选”Use private key”
- 选择私钥文件(
.ppk文件)
- 连接,输入Passphrase(如果设置了)
系统时区配置
查看当前时间
1 2 3 4 5 6 7 8 9 10 11
| timedatectl
Local time: Tue 2018-03-26 08:11:45 UTC Universal time: Tue 2018-03-26 08:11:45 UTC RTC time: Tue 2018-03-26 08:11:46 Time zone: Etc/UTC (UTC, +0000) System clock synchronized: yes systemd-timesyncd.service active: yes RTC in local TZ: no
|
查看可用时区
1 2 3 4 5
| timedatectl list-timezones
timedatectl list-timezones | grep Asia
|
设置时区
常用时区:
| 地区 |
时区 |
| 中国 |
Asia/Shanghai |
| 印度 |
Asia/Kolkata |
| 日本 |
Asia/Tokyo |
| 美国东部 |
America/New_York |
修改时区:
1 2 3 4 5 6 7 8 9 10 11
| sudo timedatectl set-timezone "Asia/Kolkata"
timedatectl
Local time: Tue 2018-03-26 13:48:23 IST Universal time: Tue 2018-03-26 08:18:23 UTC RTC time: Tue 2018-03-26 08:18:24 Time zone: Asia/Kolkata (IST, +0530)
|
手动同步时间
1 2 3 4 5 6 7 8
| sudo apt-get install ntp
sudo ntpdate pool.ntp.org
sudo service ntp start
|
磁盘空间管理
查看磁盘使用情况
1 2 3 4 5 6 7
| df -h
Filesystem Size Used Avail Use% Mounted on /dev/sda1 50G 35G 12G 75% / /dev/sdb1 200G 50G 150G 25% /data
|
查找大文件
1 2 3 4 5 6 7 8 9 10 11
| sudo find / -size +100M -exec ls -lh {} \; 2>/dev/null
sudo find / -size +1G -exec ls -lh {} \; 2>/dev/null
du -sh /var/log/* | sort -rh | head -20
du -sh * | sort -rh
|
安全删除文件
静态文件删除:
1 2 3 4 5 6 7 8
| sudo rm -rf /var/log/backup/*.log
find /var/log -name "*.log" -mtime +30 -delete
find /path -name "*.tmp" -exec rm -i {} \;
|
动态文件清空:
1 2 3 4 5 6 7 8 9 10 11
| sudo sh -c 'echo "" > /data/log/mongodb/mongodb.log'
echo "" | sudo tee /data/log/mongodb/mongodb.log
echo "" | sudo tee /var/log/nginx/access.log
echo "" | sudo tee /var/log/syslog
|
日志轮转配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| sudo vim /etc/logrotate.d/mongodb
/data/log/mongodb/mongodb.log { daily rotate 7 compress delaycompress missingok notifempty create 640 mongodb mongodb sharedscripts postrotate endscript }
|
服务部署
Ubuntu系统信息
1 2 3 4 5 6 7 8 9
| lsb_release -a
No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 18.04.1 LTS Release: 18.04 Codename: bionic
|
Nginx安装配置
安装:
1 2 3 4 5 6 7 8 9 10 11 12 13
| sudo apt-get update
sudo apt-get install nginx
sudo service nginx start
sudo systemctl start nginx
sudo systemctl status nginx
|
基本配置:
1 2 3 4 5
| sudo vim /etc/nginx/sites-available/default
sudo vim /etc/nginx/sites-available/myapp
|
反向代理配置:
1 2 3 4 5 6 7 8 9 10 11
| server { listen 80; server_name example.com;
location / { proxy_pass http://localhost:3000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }
|
SSL配置:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| server { listen 443 ssl; server_name example.com;
ssl_certificate /path/to/cert.pem; ssl_certificate_key /path/to/key.pem;
ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512; ssl_prefer_server_ciphers on;
location / { proxy_pass http://localhost:3000; } }
|
MongoDB安装配置
安装:
1 2 3 4 5 6 7 8 9 10 11 12
| wget -qO - https://www.mongodb.org/static/pgp/server-4.4.asc | sudo apt-key add -
echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu bionic/mongodb-org/4.4 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-4.4.list
sudo apt-get update sudo apt-get install -y mongodb-org
sudo service mongod start
|
数据目录迁移:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
| sudo mkdir -p /data/db/mongodb sudo mkdir -p /data/log/mongodb
sudo chown -R mongodb:mongodb /data/db sudo chown -R mongodb:mongodb /data/log/mongodb
sudo service mongod stop
sudo cp -r /var/lib/mongodb/* /data/db/mongodb/
cd /data/db/mongodb/ sudo rm -f *.lock sudo rm -rf diagnostic.data/
sudo vim /etc/mongod.conf
storage: dbPath: /data/db/mongodb
systemLog: destination: file logAppend: true path: /data/log/mongodb/mongod.log
sudo service mongod start
tail -f /data/log/mongodb/mongod.log
|
Redis安装配置
安装:
1 2 3 4 5 6 7 8 9 10 11
| sudo apt-get install redis-server
sudo service redis-server start
redis-server
redis-cli ping
|
安全配置:
1 2 3 4 5 6 7 8 9 10 11
| sudo vim /etc/redis/redis.conf
bind 127.0.0.1
requirepass YourStrongPassword
sudo service redis-server restart
|
网络流量监控
iftop实时监控
1 2 3 4 5 6 7 8 9 10 11
| sudo apt-get install iftop
sudo iftop -i eth0
sudo iftop -i eth0 -P
sudo iftop -i eth0 -o 2s
|
nethogs查看进程流量
1 2 3 4 5
| sudo apt-get install nethogs
sudo nethogs eth0
|
流量暴增排查
问题: 国外服务器访问变慢,发现流量飙到200MB/s
排查步骤:
1 2 3 4 5 6 7 8
| sudo iftop -i eth0
sudo netstat -tunap | grep ESTABLISHED
sudo nethogs eth0
|
解决方案:
| 方案 |
优点 |
缺点 |
| 增加网卡 |
快速解决 |
治标不治本 |
| 优化埋点代码 |
解决根本 |
需要时间 |
| 分离分析服 |
架构清晰 |
配置复杂 |
代码优化:
1 2 3 4 5
| db.users.find({}).toArray()
db.users.find({}, { name: 1, score: 1, _id: 0 })
|
增加缓存:
1 2 3 4 5 6 7 8 9 10 11 12
| const getUserCache = async (userId) => { const cacheKey = `user:${userId}`; let user = await redis.get(cacheKey);
if (!user) { user = await db.users.findOne({ _id: userId }); await redis.setex(cacheKey, 3600, JSON.stringify(user)); }
return JSON.parse(user); };
|
AWS CloudWatch监控
功能概述
AWS CloudWatch提供全面的监控和可观测性功能:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| ┌─────────────────────────────────────────────┐ │ CloudWatch功能架构 │ ├─────────────────────────────────────────────┤ │ │ │ ┌─────────────┐ ┌─────────────┐ │ │ │ 收集 │───►│ 监控 │ │ │ │ (Collect) │ │ (Monitor) │ │ │ └─────────────┘ └─────────────┘ │ │ │ │ │ │ ┌─────────────┐ ┌─────────────┐ │ │ │ 操作 │ │ 分析 │ │ │ │ (Act) │ │ (Analyze) │ │ │ └─────────────┘ └─────────────┘ │ │ │ └─────────────────────────────────────────────┘
|
核心功能
收集(Collect):
- 内置指标收集(CPU、内存、磁盘等)
- 自定义指标上报
- 日志收集和聚合
监控(Monitor):
- 可视化仪表板
- 高精度告警(支持1秒级)
- 日志与指标关联分析
操作(Act):
- Auto Scaling自动伸缩
- CloudWatch Events自动化响应
- Lambda函数触发
分析(Analyze):
典型应用场景
| 场景 |
功能 |
| 服务器监控 |
CPU、内存、磁盘、网络监控 |
| 应用监控 |
错误率、延迟、请求量 |
| 日志分析 |
实时日志查询和告警 |
| 自动扩容 |
基于负载自动调整资源 |
| 成本优化 |
资源利用率分析和建议 |
总结一下
Linux服务器运维是个细致活儿,安全、监控、服务部署都得注意。上面这些经验都是实际踩坑踩出来的。
几个重点:
- SSH改端口、禁用root、用密钥认证
- 时区设好,日志时间才准确
- 磁盘空间要监控,日志要轮转
- Nginx/MongoDB/Redis按需求部署
- 流量异常用iftop/nethogs排查
运维检查清单:
参考: