从零开始:Linux 服务器配置详解(一)

举报
solitern 发表于 2026/08/13 15:31:27 2026/08/13
【摘要】 本文以 Ubuntu 22.04 LTS 为例,手把手讲解一台全新 Linux 服务器的完整配置流程。涵盖系统初始化、安全加固、网络配置、Web服务器部署、数据库安装、性能调优与监控等核心环节。无论你是运维新手还是全栈开发者,都能从中建立一套可复用的服务器配置方法论。 目录1. 服务器配置的整体思路2. 系统初始化3. 用户与权限管理4. SSH 安全加固5. 防火墙配置6. 网络与时间同步...

本文以 Ubuntu 22.04 LTS 为例,手把手讲解一台全新 Linux 服务器的完整配置流程。涵盖系统初始化、安全加固、网络配置、Web
服务器部署、数据库安装、性能调优与监控等核心环节。无论你是运维新手还是全栈开发者,都能从中建立一套可复用的服务器配置方法论。


目录


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

────────────────────

  1. 数据库: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
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。