从零开始:Linux 服务器配置详解(一)
本文以 Ubuntu 22.04 LTS 为例,手把手讲解一台全新 Linux 服务器的完整配置流程。涵盖系统初始化、安全加固、网络配置、Web
服务器部署、数据库安装、性能调优与监控等核心环节。无论你是运维新手还是全栈开发者,都能从中建立一套可复用的服务器配置方法论。
目录
- 1. 服务器配置的整体思路
- 2. 系统初始化
- 3. 用户与权限管理
- 4. SSH 安全加固
- 5. 防火墙配置
- 6. 网络与时间同步
- 7. Web 服务器:Nginx
- 8. 数据库:MySQL / PostgreSQL
1. 服务器配置的整体思路
配置一台生产级服务器,建议遵循以下顺序:
系统更新 → 创建用户 → SSH 加固 → 防火墙 → 时间同步
→ Web 服务器 → 数据库 → 应用部署 → 监控 → 备份
核心原则:最小权限原则(Least Privilege)—— 只开放必要的端口,只授予必要的权限,只安装必要的软件。
环境说明
| 项目 | 说明 |
|---|---|
| 操作系统 | Ubuntu 22.04 LTS (ARM64 / x86_64) |
| 权限 | 初始以 root 登录,后续使用 sudo 普通用户 |
| 网络 | 公网 IP,假设为 203.0.113.10 |
| 域名 | 假设为 example.com |
2. 系统初始化
2.1 首次登录
拿到服务器后,首先通过 SSH 登录:
ssh root@203.0.113.10
2.2 更新系统包
# 更新软件包索引
apt update
# 升级所有已安装的软件包
apt upgrade -y
# 安装常用基础工具
apt install -y curl wget git vim unzip htop net-tools \
build-essential software-properties-common \
apt-transport-https ca-certificates gnupg lsb-release
2.3 设置主机名
# 设置有意义的主机名,便于识别
hostnamectl set-hostname web-prod-01
# 验证
hostname
# 输出: web-prod-01
2.4 配置时区
# 设置为上海时区(东八区)
timedatectl set-timezone Asia/Shanghai
# 验证
timedatectl
输出示例:
Local time: Mon 2024-01-15 10:30:00 CST
Universal time: Mon 2024-01-15 02:30:00 UTC
RTC time: Mon 2024-01-15 02:30:00
Time zone: Asia/Shanghai (CST, +0800)
System clock synchronized: yes
NTP service: active
2.5 配置 Swap 分区(内存不足时)
对于 1GB / 2GB 内存的小型服务器,建议添加 Swap:
# 检查是否已有 swap
swapon --show
# 如果没有,创建 2GB swap 文件
fallocate -l 2G /swapfile
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile
# 永久生效
echo '/swapfile none swap sw 0 0' >> /etc/fstab
# 调整 swappiness(值越低越倾向于使用物理内存)
echo 'vm.swappiness=10' >> /etc/sysctl.conf
sysctl -p
3. 用户与权限管理
3.1 创建部署用户
永远不要在生产环境直接使用 root 用户运行应用。
# 创建新用户(假设用户名为 deploy)
adduser deploy
# 按提示设置密码和信息
# Adding user `deploy' ...
# New password: ********
# Retype new password: ********
3.2 赋予 sudo 权限
# 将 deploy 用户加入 sudo 组
usermod -aG sudo deploy
# 验证 sudo 权限
su - deploy
sudo whoami
# 输出: root(表示 sudo 权限正常)
3.3 配置 sudo 免密码(可选,CI/CD 场景常用)
# 为 deploy 用户配置免密 sudo
echo 'deploy ALL=(ALL) NOPASSWD:ALL' > /etc/sudoers.d/deploy
chmod 440 /etc/sudoers.d/deploy
# 验证语法正确性(重要!避免锁定 sudo)
visudo -c
⚠️ 安全提示:免密 sudo 会降低安全性,仅建议在受控环境(如 CI/CD)中使用。生产环境建议保留密码确认。
3.4 目录权限最佳实践
# 应用目录
mkdir -p /var/www/myapp
chown -R deploy:deploy /var/www/myapp
chmod 755 /var/www/myapp
# 日志目录
mkdir -p /var/log/myapp
chown -R deploy:deploy /var/log/myapp
# 配置文件目录(仅 owner 可读写)
mkdir -p /etc/myapp
chown -R deploy:deploy /etc/myapp
chmod 700 /etc/myapp
权限数字速查表:
| 数字 | 权限 | 含义 |
|---|---|---|
| 7 | rwx | 读 + 写 + 执行 |
| 6 | rw- | 读 + 写 |
| 5 | r-x | 读 + 执行 |
| 4 | r– | 只读 |
| 0 | — | 无权限 |
三位数字分别对应:所有者 | 所属组 | 其他人,如
755= 所有者可读写执行,组和其他人可读执行。
4. SSH 安全加固
SSH 是服务器最常被攻击的入口,必须严格加固。
4.1 配置密钥登录
在本地机器上生成密钥对:
# 生成 Ed25519 密钥(比 RSA 更安全更快速)
ssh-keygen -t ed25519 -C "deploy@example.com" -f ~/.ssh/myapp_server
# 将公钥复制到服务器
ssh-copy-id -i ~/.ssh/myapp_server.pub deploy@203.0.113.10
手动配置方式(如果 ssh-copy-id 不可用):
# 在服务器上操作
su - deploy
mkdir -p ~/.ssh
chmod 700 ~/.ssh
# 将本地公钥内容粘贴进去
vim ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
4.2 修改 SSH 配置
编辑 /etc/ssh/sshd_config:
sudo vim /etc/ssh/sshd_config
关键配置项:
# ─── 基础设置 ───
Port 22 # 建议改为非标准端口,如 2222
PermitRootLogin no # 禁止 root 直接登录
MaxAuthTries 3 # 最大认证尝试次数
# ─── 认证设置 ───
PasswordAuthentication no # 禁用密码登录(仅密钥)
PubkeyAuthentication yes # 启用密钥认证
AuthorizedKeysFile .ssh/authorized_keys
# ─── 会话设置 ───
LoginGraceTime 30 # 登录宽限时间(秒)
ClientAliveInterval 300 # 存活检查间隔
ClientAliveCountMax 2 # 最大存活检查次数
X11Forwarding no # 禁用 X11 转发
AllowTcpForwarding no # 禁用 TCP 转发
# ─── 允许的用户 ───
AllowUsers deploy # 仅允许 deploy 用户登录
# ─── 安全算法 ───
Protocol 2 # 仅使用 SSH 协议 v2
KexAlgorithms curve25519-sha256,curve25519-sha256@libssh.org
Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com
MACs hmac-sha2-256-etm@openssh.com,hmac-sha2-512-etm@openssh.com
重启 SSH 服务:
sudo systemctl restart sshd
⚠️ 重要:修改 SSH 配置前,保持当前会话不要断开!先用新配置开一个新终端测试登录,确认成功后再关闭旧会话。否则可能把自己锁在外面。
4.3 安装 Fail2Ban(防暴力破解)
sudo apt install -y fail2ban
# 配置
sudo vim /etc/fail2ban/jail.local
[DEFAULT]
bantime = 3600 # 封禁时长(秒)
findtime = 600 # 检测时间窗口
maxretry = 3 # 最大重试次数
banaction = ufw # 使用 UFW 封禁
[sshd]
enabled = true
port = 22
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
sudo systemctl enable fail2ban
sudo systemctl start fail2ban
# 查看状态
sudo fail2ban-client status sshd
5. 防火墙配置
5.1 使用 UFW(Ubuntu 默认防火墙)
# 查看状态
sudo ufw status verbose
# 设置默认策略:拒绝所有入站,允许所有出站
sudo ufw default deny incoming
sudo ufw default allow outgoing
# 放行 SSH(必须先放行,否则会把自己锁在外面!)
sudo ufw allow 22/tcp comment 'SSH'
# 放行 HTTP 和 HTTPS
sudo ufw allow 80/tcp comment 'HTTP'
sudo ufw allow 443/tcp comment 'HTTPS'
# 如果改了 SSH 端口
# sudo ufw allow 2222/tcp comment 'SSH'
# 限制 SSH 连接频率(防暴力破解)
sudo ufw limit 22/tcp
# 启用防火墙
sudo ufw enable
# 验证
sudo ufw status numbered
输出示例:
Status: active
To Action From
[ 1] 22/tcp LIMIT IN Anywhere
[ 2] 80/tcp ALLOW IN Anywhere
[ 3] 443/tcp ALLOW IN Anywhere
5.2 高级规则示例
# 仅允许特定 IP 访问 SSH
sudo ufw delete allow 22/tcp # 先删除通用规则
sudo ufw allow from 198.51.100.20 to any port 22 proto tcp comment 'Office SSH'
# 允许内网访问数据库端口
sudo ufw allow from 10.0.0.0/8 to any port 3306 proto tcp comment 'Internal MySQL'
# 放行特定端口范围
sudo ufw allow 3000:3100/tcp comment 'App ports'
6. 网络与时间同步
6.1 配置 NTP 时间同步
# 安装 chrony(比 ntpd 更现代)
sudo apt install -y chrony
# 编辑配置
sudo vim /etc/chrony/chrony.conf
# 使用阿里云 NTP 服务器(国内速度快)
server ntp.aliyun.com iburst
server cn.pool.ntp.org iburst
# 允许本地网络同步
allow 10.0.0.0/8
# 即使没有真实硬件时钟,也能同步
makestep 1.0 3
rtcsync
sudo systemctl restart chrony
sudo systemctl enable chrony
# 验证同步状态
chronyc sources -v
6.2 网络参数调优
编辑 /etc/sysctl.conf 或新建 /etc/sysctl.d/99-network.conf:
sudo vim /etc/sysctl.d/99-network.conf
# ─── TCP 连接优化 ───
# 增加文件描述符上限
fs.file-max = 655350
# TCP SYN 队列长度
net.ipv4.tcp_max_syn_backlog = 65536
# TIME_WAIT 状态连接的最大数量
net.ipv4.tcp_max_tw_buckets = 5000
# 启用 TIME_WAIT 快速回收
net.ipv4.tcp_tw_recycle = 1
# 启用 TCP SYN Cookies(防 SYN Flood 攻击)
net.ipv4.tcp_syncookies = 1
# 减少 FIN-WAIT-2 状态时间
net.ipv4.tcp_fin_timeout = 30
# keepalive 探测时间
net.ipv4.tcp_keepalive_time = 600
# ─── 内存分配 ───
# TCP 读写缓冲区
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
# ─── 安全相关 ───
# 禁用 ICMP 重定向
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
# 启用反向路径过滤
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1
# 应用配置
sudo sysctl -p /etc/sysctl.d/99-network.conf
7. Web 服务器:Nginx
7.1 安装 Nginx
# 添加官方仓库(获取最新稳定版)
curl -fsSL https://nginx.org/keys/nginx_signing.key | \
sudo gpg --dearmor -o /usr/share/keyrings/nginx-archive-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] \
http://nginx.org/packages/ubuntu $(lsb_release -cs) nginx" | \
sudo tee /etc/apt/sources.list.d/nginx.list
sudo apt update
sudo apt install -y nginx
# 启动并设置开机自启
sudo systemctl enable nginx
sudo systemctl start nginx
7.2 Nginx 全局配置
编辑 /etc/nginx/nginx.conf:
user nginx;
worker_processes auto; # 自动匹配 CPU 核心数
worker_rlimit_nofile 65535; # worker 进程最大文件描述符
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 10240; # 每个 worker 的最大连接数
use epoll; # 高效事件模型(Linux)
multi_accept on; # 一次接受所有新连接
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
# ─── 日志格式 ───
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for" '
'rt=$request_time uct="$upstream_connect_time" '
'uht="$upstream_header_time" urt="$upstream_response_time"';
access_log /var/log/nginx/access.log main;
# ─── 基础优化 ───
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
keepalive_requests 1000;
server_tokens off; # 隐藏 Nginx 版本号
# ─── 压缩配置 ───
gzip on;
gzip_min_length 1k;
gzip_comp_level 6;
gzip_types text/plain text/css application/json application/javascript
text/xml application/xml application/xml+rss text/javascript
image/svg+xml;
gzip_vary on;
gzip_proxied any;
# ─── 缓冲区 ───
client_body_buffer_size 16k;
client_max_body_size 50m; # 最大上传文件大小
large_client_header_buffers 4 16k;
# ─── 限流 ───
limit_req_zone $binary_remote_addr zone=api:10m rate=10r/s;
# ─── 上游应用 ───
upstream app_backend {
server 127.0.0.1:3000 weight=5;
server 127.0.0.1:3001 weight=5;
keepalive 32;
}
include /etc/nginx/conf.d/*.conf;
}
7.3 站点配置示例
/etc/nginx/conf.d/example.com.conf:
# ─── HTTP → HTTPS 重定向 ───
server {
listen 80;
server_name example.com www.example.com;
return 301 https://$server_name$request_uri;
}
# ─── HTTPS 主站 ───
server {
listen 443 ssl http2;
server_name example.com www.example.com;
}
# ─── SSL 证书 ───
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
# SSL 优化
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers off;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 1d;
ssl_session_tickets off;
# HSTS 安全头
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
# ─── 根路径 → 反向代理到应用 ───
location / {
proxy_pass http://app_backend;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# 超时设置
proxy_connect_timeout 60s;
proxy_send_timeout 60s;
proxy_read_timeout 60s;
# 限流(每秒 10 个请求,突发 20)
limit_req zone=api burst=20 nodelay;
}
# ─── 静态资源直接由 Nginx 处理 ───
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot)$ {
root /var/www/myapp/public;
expires 30d;
add_header Cache-Control "public, immutable";
access_log off;
}
# ─── 健康检查端点 ───
location /health {
access_log off;
return 200 '{"status":"ok"}';
add_header Content-Type application/json;
}
# ─── 禁止访问隐藏文件 ───
location ~ /\. {
deny all;
access_log off;
log_not_found off;
}
}
### 7.4 申请 Let's Encrypt 免费 SSL 证书
```bash
# 安装 Certbot
sudo apt install -y certbot python3-certbot-nginx
# 申请证书(自动修改 Nginx 配置)
sudo certbot --nginx -d example.com -d www.example.com
# 测试自动续期
sudo certbot renew --dry-run
# Certbot 会自动添加 systemd timer 来续期
sudo systemctl status certbot.timer
7.5 验证与重载
# 测试配置语法
sudo nginx -t
# 平滑重载(不中断现有连接)
sudo nginx -s reload
# 查看状态
sudo systemctl status nginx
────────────────────
- 数据库:MySQL / PostgreSQL
8.1 安装 MySQL 8.0
# 添加 MySQL 官方仓库
wget https://dev.mysql.com/get/mysql-apt-config_0.8.29-1_all.deb
sudo dpkg -i mysql-apt-config_0.8.29-1_all.deb
sudo apt update
sudo apt install -y mysql-server
# 启动
sudo systemctl enable mysql
sudo systemctl start mysql
8.2 MySQL 安全初始化
sudo mysql_secure_installation
交互流程:
Securing the MySQL server deployment.
Enter password for user root: ********
VALIDATE PASSWORD COMPONENT:
0 = LOW (长度 >= 8)
1 = MEDIUM (长度 >= 8, 包含数字、大小写、特殊字符)
2 = STRONG (MEDIUM + 字典词检查)
Please enter 0, 1, or 2: 1
Change the password for root? N
Remove anonymous users? Y
Disallow root login remotely? Y
Remove test database and access to it? Y
Reload privilege tables? Y
8.3 创建应用数据库与用户
-- 登录 MySQL
sudo mysql
-- 创建数据库
CREATE DATABASE myapp_db
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;
-- 创建专用用户(最小权限)
CREATE USER 'myapp_user'@'localhost'
IDENTIFIED BY 'StrongP@ssw0rd!2024';
-- 授予仅对应用数据库的权限
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, ALTER, INDEX
ON myapp_db.* TO 'myapp_user'@'localhost';
-- 刷新权限
FLUSH PRIVILEGES;
-- 验证
SHOW GRANTS FOR 'myapp_user'@'localhost';
8.4 MySQL 性能调优
编辑 /etc/mysql/mysql.conf.d/mysqld.cnf:
[mysqld]
# ─── 基础设置 ───
port = 3306
bind-address = 127.0.0.1 # 仅监听本地
max_connections = 200
# ─── InnoDB 优化 ───
innodb_buffer_pool_size = 1G # 建议为物理内存的 50%~70%
innodb_log_file_size = 256M
innodb_flush_log_at_trx_commit = 2 # 1=最安全, 2=性能与安全平衡
innodb_flush_method = O_DIRECT
innodb_file_per_table = 1
# ─── 查询缓存(MySQL 8.0 已移除,此处仅作说明)───
# MySQL 8.0 使用其他优化策略
# ─── 慢查询日志 ───
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 2 # 超过 2 秒记录
log_queries_not_using_indexes = 1
# ─── 字符集 ───
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
sudo systemctl restart mysql
8.5 PostgreSQL 安装(替代方案)
# 添加 PostgreSQL 官方仓库
sudo sh -c 'echo "deb https://apt.postgresql.org/pub/repos/apt \
$(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list'
curl -fsSL https://www.postgresql.org/media/keys/ACCC4CF8.asc | \
sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/pgdg.gpg
sudo apt update
sudo apt install -y postgresql-15
# 切换到 postgres 用户操作
sudo -u postgres psql
-- 创建数据库和用户
CREATE DATABASE myapp_db;
CREATE USER myapp_user WITH ENCRYPTED PASSWORD 'StrongP@ssw0rd!2024';
GRANT ALL PRIVILEGES ON DATABASE myapp_db TO myapp_user;
-- 退出
\q
- 点赞
- 收藏
- 关注作者
评论(0)