Skip to content

🛡️ 安全配置

限流(Rate Limiting)

限流就像景区限流——每秒只能进这么多游客,防止人太多挤爆。

nginx
http {
    # 定义限流区域:每个 IP 每秒 10 个请求
    limit_req_zone $binary_remote_addr zone=api_limit:10m rate=10r/s;
    limit_req_zone $binary_remote_addr zone=login_limit:10m rate=1r/s;

    server {
        listen 80;

        # API 接口限流
        location /api/ {
            limit_req zone=api_limit burst=20 nodelay;
            proxy_pass http://127.0.0.1:3000;
        }

        # 登录接口更严格:每秒 1 个请求
        location /api/login {
            limit_req zone=login_limit burst=3 nodelay;
            proxy_pass http://127.0.0.1:3000;
        }
    }
}

📝 备注: 📝 burst=20 nodelay:允许瞬间突发 20 个请求(队伍长度),nodelay 表示不排队直接处理,超出的直接返回 503。

访问控制

nginx
# 只允许特定 IP 访问管理后台
location /admin/ {
    allow 192.168.1.0/24;          # 允许内网
    allow 10.0.0.1;                # 允许特定 IP
    deny all;                      # 拒绝其他所有

    proxy_pass http://127.0.0.1:8080/;
}

# HTTP Basic Auth(用户名密码认证)
location /secret/ {
    auth_basic "Restricted Area";
    auth_basic_user_file /etc/nginx/.htpasswd;

    root /var/www/html;
}
bash
# 生成密码文件
sudo apt install apache2-utils
sudo htpasswd -c /etc/nginx/.htpasswd admin
New password:
Re-type new password:
Adding password for user admin

安全响应头

nginx
server {
    # 隐藏 Nginx 版本号(不让人知道你的版本,减少攻击面)
    server_tokens off;

    # 防止点击劫持
    add_header X-Frame-Options "SAMEORIGIN" always;

    # 防止 MIME 类型嗅探
    add_header X-Content-Type-Options "nosniff" always;

    # 注意:X-XSS-Protection 已被 Chrome 78+ 弃用,现代安全实践推荐只用 CSP
    # add_header X-XSS-Protection "1; mode=block" always;

    # 内容安全策略
    add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline'; style-src 'self' 'unsafe-inline';" always;
}