Linux服务器运维踩坑记录

折腾Linux服务器多年,这里记录一些实际运维中踩过的坑和解决方法。

SSH安全配置

修改SSH默认端口

SSH默认22端口容易被暴力破解,建议改成非常用端口:

步骤1:配置iptables

1
2
3
4
5
6
7
8
# 编辑iptables配置文件
sudo vim /etc/iptables/rules.v4

# 添加新端口规则(示例使用822端口)
-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
# 编辑sshd配置文件
sudo vim /etc/ssh/sshd_config

# 修改端口
Port 822

# 可选:禁用root登录(推荐)
PermitRootLogin no

# 可选:仅允许特定用户
AllowUsers username

步骤3:重启SSH服务

1
2
3
4
5
6
7
8
# 使用service命令重启
sudo service sshd restart

# 或使用systemctl(Ubuntu 18.04+)
sudo systemctl restart sshd

# 验证服务状态
sudo systemctl status sshd

禁用Root直接登录

创建普通用户:

1
2
3
4
5
6
7
8
# 添加用户
sudo useradd adminuser

# 设置密码
sudo passwd adminuser

# 添加到sudo组(获得管理员权限)
sudo usermod -aG sudo adminuser

配置sudo权限(可选):

1
2
3
4
5
6
7
8
# 编辑sudoers文件
sudo visudo

# 添加行(免密码sudo)
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生成密钥:

  1. 打开MobaXterm,选择Tools -> MobaKeyGen
  2. 选择密钥类型(推荐RSA,2048位)
  3. 点击Generate生成密钥
  4. 设置Passphrase(可选,为空即无密码登录)
  5. 保存私钥文件(如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
# 创建.ssh目录
mkdir -p ~/.ssh
chmod 700 ~/.ssh

# 编辑或创建authorized_keys文件
vim ~/.ssh/authorized_keys

# 设置权限(重要!)
chmod 600 ~/.ssh/authorized_keys

公钥格式转换:

1
2
3
4
5
6
7
8
9
# 将MobaXterm生成的.pub文件转换为OpenSSH格式
ssh-keygen -X -f zx-ssh.pub >> ~/.ssh/authorized_keys

# 设置权限
chmod 640 ~/.ssh/authorized_keys

# 确保.ssh目录权限正确
chmod 700 ~/.ssh
chmod go-w ~/.ssh

启用密钥认证:

1
2
3
4
5
6
7
8
9
10
11
# 编辑sshd_config
sudo vim /etc/ssh/sshd_config

# 确保以下配置
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
ChallengeResponseAuthentication no
UsePAM yes

# 重启服务
sudo service sshd restart

MobaXterm连接:

  1. 新建Session
  2. 输入主机地址和端口
  3. 在Advanced SSH settings标签页:
    • 勾选”Specify username”
    • 输入用户名(如adminuser
    • 勾选”Use private key”
    • 选择私钥文件(.ppk文件)
  4. 连接,输入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
# 安装NTP服务
sudo apt-get install ntp

# 手动同步
sudo ntpdate pool.ntp.org

# 启动NTP服务
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
# 查找大于100MB的文件
sudo find / -size +100M -exec ls -lh {} \; 2>/dev/null

# 查找大于1GB的文件
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

# 删除N天前的文件
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
# 清空MongoDB日志(无需重启)
sudo sh -c 'echo "" > /data/log/mongodb/mongodb.log'

# 或
echo "" | sudo tee /data/log/mongodb/mongodb.log

# 清空Nginx访问日志
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
# 编辑logrotate配置
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

# 安装Nginx
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
# 导入MongoDB公钥
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

# 复制数据(注意:不要复制.lock文件和diagnostic.data目录)
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
# 应返回: PONG

安全配置:

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
# 安装iftop
sudo apt-get install iftop

# 监控eth0网卡
sudo iftop -i eth0

# 按端口显示
sudo iftop -i eth0 -P

# 显示带宽刻度
sudo iftop -i eth0 -o 2s

nethogs查看进程流量

1
2
3
4
5
# 安装nethogs
sudo apt-get install nethogs

# 查看各进程网络流量
sudo nethogs eth0

流量暴增排查

问题: 国外服务器访问变慢,发现流量飙到200MB/s

排查步骤:

1
2
3
4
5
6
7
8
# 1. 确认流量来源
sudo iftop -i eth0

# 2. 查看各进程网络连接
sudo netstat -tunap | grep ESTABLISHED

# 3. 查看进程网络使用情况
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
// 业务层缓存(Redis示例)
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):

  • 1秒级粒度数据
  • 日志查询和分析
  • 异常检测和洞察

典型应用场景

场景 功能
服务器监控 CPU、内存、磁盘、网络监控
应用监控 错误率、延迟、请求量
日志分析 实时日志查询和告警
自动扩容 基于负载自动调整资源
成本优化 资源利用率分析和建议

总结一下

Linux服务器运维是个细致活儿,安全、监控、服务部署都得注意。上面这些经验都是实际踩坑踩出来的。

几个重点:

  1. SSH改端口、禁用root、用密钥认证
  2. 时区设好,日志时间才准确
  3. 磁盘空间要监控,日志要轮转
  4. Nginx/MongoDB/Redis按需求部署
  5. 流量异常用iftop/nethogs排查

运维检查清单:

  • SSH端口改了,root登录禁了
  • 防火墙规则配好
  • 磁盘使用率有监控
  • 关键服务日志轮转了
  • NTP时间同步正常
  • 备份策略到位了

参考: