chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Nginx的限流機(jī)制深度解析

馬哥Linux運(yùn)維 ? 來源:馬哥Linux運(yùn)維 ? 2026-04-10 16:40 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

引言:Nginx 不只是反向代理

很多運(yùn)維工程師對(duì) Nginx 的認(rèn)知停留在"反向代理"和"負(fù)載均衡",但實(shí)際上 Nginx 在安全防護(hù)方面也相當(dāng)強(qiáng)大——限流可以防止 CC 攻擊和 API 濫用,黑白名單可以精準(zhǔn)控制訪問來源,基礎(chǔ)安全配置可以防護(hù)常見的 Web 攻擊。

這篇文章系統(tǒng)講解 Nginx 的限流機(jī)制、黑白名單配置、以及生產(chǎn)環(huán)境推薦的安全配置,幫助你把 Nginx 打造成一道堅(jiān)實(shí)的安全防線。

前置知識(shí):Nginx 基礎(chǔ)配置、HTTP 協(xié)議基礎(chǔ)

實(shí)驗(yàn)環(huán)境:CentOS Stream 9 / Ubuntu 24.04 LTS,Nginx 1.26+

1 限流機(jī)制深度解析

1.1 限流的類型

Nginx 限流類型:
  │
  ├── 請(qǐng)求速率限制 (rate limiting)
  │  └── limit_req:限制每秒/每分鐘請(qǐng)求數(shù)
  │
  ├── 并發(fā)連接限制 (connection limiting)
  │  └── limit_conn:限制單個(gè) IP 的并發(fā)連接數(shù)
  │
  ├── 帶寬限制 (bandwidth limiting)
  │  └── limit_rate:限制單連接傳輸速率
  │
  └── 白名單/黑名單 (access limiting)
    └── geo + map:基于 IP 的訪問控制

1.2 限流算法原理

令牌桶算法(Token Bucket)

算法描述:
  - 桶中最多存放 N 個(gè)令牌
  - 每秒放入 R 個(gè)令牌
  - 每個(gè)請(qǐng)求消耗 1 個(gè)令牌
  - 桶滿時(shí),令牌溢出

示意圖:

  令牌生成速率 R=10/秒
  桶容量 B=20

  時(shí)間 t=0: [桶滿了]
        ┌─────┐
        │●●●●●│
        │●●●●●●●●●●●│ 20個(gè)
        │●●●●●●●●●●●●●●●│
        └─────┘

  時(shí)間 t=1: [消耗了10個(gè),放入10個(gè)]
        ┌─────┐
        │●●●●●│
        │●●●●●●●│ 20個(gè)
        │●●●●●●●●●│
        └─────┘

漏桶算法(Leaky Bucket)

算法描述:
  - 請(qǐng)求以任意速率進(jìn)入桶
  - 桶以固定速率漏水
  - 桶滿時(shí),新請(qǐng)求被拒絕

示意圖:

  請(qǐng)求輸入 (可變速率)   桶 (隊(duì)列)    輸出 (固定速率)

  ●●●●          ┌─────┐     ●
  ●●●●●●●●  ──────>   │ ● │ ──────> ●●●
              │ ●● │      ●●●
              │ ●●●│      ●●●●
              └─────┘
              (桶滿則拒絕)

Nginxlimit_req使用令牌桶算法,limit_conn使用簡(jiǎn)單計(jì)數(shù)。

1.3 limit_req 配置詳解

# /etc/nginx/nginx.conf

# 定義限流區(qū)域(共享內(nèi)存)
# 語法:limit_req_zone key zone=name:size rate=rate;
# - key: 用于識(shí)別請(qǐng)求的變量(通常是 $binary_remote_addr)
# - zone: 區(qū)域名稱和共享內(nèi)存大小
# - rate: 速率(r/s 或 r/m)

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/m;
limit_req_zone $binary_remote_addr zone=search_limit:10m rate=5r/s;

# 按服務(wù)器維度限流
limit_req_zone $server_name zone=server_limit:10m rate=1000r/s;

http {
  # 限流區(qū)域
  limit_req_zone $binary_remote_addr zone=global:100m rate=100r/s;

  server {
    listen 80;
    server_name example.com;

    # 全局限流
    limit_req zone=global burst=20 nodelay;

    # API 限流:每秒 10 請(qǐng)求,允許突發(fā) 50
    location /api/ {
      limit_req zone=api_limit burst=50 nodelay;
      proxy_pass http://backend;
    }

    # 登錄限流:每分鐘 1 次,防止暴力破解
    location /login {
      limit_req zone=login_limit burst=5 nodelay;
      limit_req_status 429; # 超限返回 429
      proxy_pass http://backend;
    }

    # 搜索限流:每秒 5 請(qǐng)求
    location /search {
      limit_req zone=search_limit burst=20 nodelay;
      proxy_pass http://backend;
    }
  }
}

1.4 突發(fā)與排隊(duì)機(jī)制

# burst 參數(shù)詳解
# burst=N: 允許 N 個(gè)請(qǐng)求排隊(duì)
# nodelay: 不延遲排隊(duì)請(qǐng)求,立即處理

# 示例 1:允許突發(fā),不延遲
limit_req_zone $binary_remote_addr zone=test:10m rate=10r/s;
location / {
  limit_req zone=test burst=20 nodelay;
}
# 效果:允許最多 30 個(gè)請(qǐng)求同時(shí)處理(10 個(gè)正常 + 20 個(gè)突發(fā))

# 示例 2:允許突發(fā),延遲處理
location / {
  limit_req zone=test burst=20; # 超過 10r/s 的請(qǐng)求會(huì)延遲
}
# 效果:請(qǐng)求被延遲而不是拒絕,響應(yīng)變慢但不返回錯(cuò)誤

# 示例 3:不允許突發(fā)
location / {
  limit_req zone=test burst=0; # 嚴(yán)格按速率處理
}
# 效果:超過速率的請(qǐng)求直接拒絕

# 示例 4:delay 參數(shù)(延遲突發(fā))
location / {
  limit_req zone=test burst=20 delay=10;
}
# 效果:前 10 個(gè)突發(fā)請(qǐng)求正常處理,后續(xù)請(qǐng)求延遲

1.5 limit_req 日志控制

# 限流日志配置
limit_req_log_level info warn error;

server {
  listen 80;
  server_name example.com;

  # 設(shè)置返回狀態(tài)碼
  limit_req_status 503;

  location /api/ {
    limit_req zone=api_limit burst=50 nodelay;
    # 觸發(fā)限流時(shí)記錄 warn 級(jí)別日志
    proxy_pass http://backend;
  }
}

2 限并發(fā)(limit_conn)配置

2.1 并發(fā)連接限制原理

# 定義并發(fā)限制區(qū)域
# 語法:limit_conn_zone key zone=name:size;

limit_conn_zone $binary_remote_addr zone=addr:10m;
limit_conn_zone $server_name zone=server_conn:10m;

server {
  listen 80;
  server_name example.com;

  # 限制單個(gè) IP 最多 10 個(gè)并發(fā)連接
  limit_conn addr 10;

  # 限制整個(gè)服務(wù)器最多 1000 個(gè)并發(fā)連接
  limit_conn server_conn 1000;

  # 設(shè)置返回狀態(tài)碼
  limit_conn_status 503;

  location / {
    proxy_pass http://backend;
  }
}

2.2 針對(duì)特定資源的并發(fā)限制

# 下載站點(diǎn)并發(fā)限制
server {
  listen 80;
  server_name download.example.com;

  # 整體并發(fā)限制
  limit_conn addr 100;

  location /download/ {
    # 下載目錄限制為 5 個(gè)并發(fā)
    limit_conn addr 5;
    limit_conn_status 503;

    alias /var/www/download/;
    autoindex on;
  }

  location /video/ {
    # 視頻限制為 2 個(gè)并發(fā)(節(jié)省帶寬)
    limit_conn addr 2;
    limit_conn_status 503;

    alias /var/www/video/;
  }
}

2.3 帶寬限制

server {
  listen 80;
  server_name example.com;

  location / {
    proxy_pass http://backend;
  }

  # 限制下載速度(字節(jié)/秒)
  # 這里 500k = 512000 bytes/s
  location /download/ {
    alias /var/www/download/;
    limit_rate_after 10m; # 前 10MB 不限速
    limit_rate 500k;    # 之后限速 500KB/s
  }

  # 根據(jù)狀態(tài)限制速度
  map $status $limit_rate {
    200   1m;   # 成功響應(yīng)限速 1MB/s
    302   5m;   # 重定向限速 5MB/s
    default 500k;  # 其他情況限速 500KB/s
  }

  location /video/ {
    alias /var/www/video/;
    limit_rate $limit_rate;
  }
}

3 黑白名單配置

3.1 基于 IP 的訪問控制

server {
  listen 80;
  server_name example.com;

  # 基本deny/allow 語法(舊方法,按順序匹配)
  # 注意:舊方法按順序匹配,匹配到就停止

  # 允許內(nèi)網(wǎng),deny 其他所有
  allow 10.0.0.0/8;
  allow 172.16.0.0/12;
  allow 192.168.0.0/16;
  deny all;

  # 或者反過來:拒絕某些IP
  deny 192.168.1.100;
  deny 192.168.1.200;
  allow all;

  location / {
    proxy_pass http://backend;
  }
}

3.2 geo 模塊實(shí)現(xiàn)動(dòng)態(tài)黑白名單

# geo 模塊:根據(jù) IP 地址映射值
geo $geo {
  default    0;

  # 白名單
  10.0.0.0/8   1;
  172.16.0.0/12 1;
  192.168.0.0/16 1;

  # 黑名單(高風(fēng)險(xiǎn) IP)
  192.168.1.100 2;
  192.168.1.200 2;

  # 特定 IP
  1.2.3.4    0;  # 明確放行
  5.6.7.8    99;  # 明確拒絕
}

server {
  listen 80;
  server_name example.com;

  # 黑名單直接拒絕
  if ($geo = 99) {
    return 403;
  }

  # 白名單特殊處理
  if ($geo = 1) {
    # 內(nèi)網(wǎng)用戶不限流
    set $limit_rate 0;
  }

  location / {
    # 黑名單用戶限制
    if ($geo = 2) {
      limit_rate 10k;
    }

    proxy_pass http://backend;
  }
}

3.3 map 模塊實(shí)現(xiàn)復(fù)雜規(guī)則

# map 模塊:根據(jù)變量值映射到另一個(gè)值

# 定義 IP 名單文件
map $remote_addr $ip_whitelist {
  default     0;
  include     /etc/nginx/whitelist.conf;
}

map $remote_addr $ip_blacklist {
  default     0;
  include     /etc/nginx/blacklist.conf;
}

map $request_uri $rate_limit {
  default                 100r/s;
  ~* ^/api/v1/login           1r/m;
  ~* ^/api/v1/search           5r/s;
  ~* ^/admin               10r/s;
}

server {
  listen 80;
  server_name example.com;

  # 黑名單拒絕
  if ($ip_blacklist = 1) {
    return 403;
  }

  # 限流
  limit_req_zone $binary_remote_addr zone=api:10m rate=$rate_limit;

  location / {
    limit_req zone=api burst=50 nodelay;
    proxy_pass http://backend;
  }
}

3.4 維護(hù)模式實(shí)現(xiàn)

# 維護(hù)模式配置

map $ Maintenance_mode $limit {
  default 0;
  on   99; # 維護(hù)模式返回 99,即無限流
}

geo $whitelist {
  default     0;
  # 允許運(yùn)維人員 IP 訪問
  10.0.1.0/24   1;
  192.168.1.100  1;
}

server {
  listen 80;
  server_name example.com;

  # 維護(hù)開關(guān)(可通過 API 或文件控制)
  set $maintenance false;
  # 或者從文件讀取
  # set_from_config_file $maintenance /var/www/maintenance.flag;

  # 白名單在維護(hù)模式下仍可訪問
  if ($whitelist = 1) {
    set $maintenance false;
  }

  if ($maintenance = true) {
    return 503;
  }

  location / {
    proxy_pass http://backend;
  }

  # 503 錯(cuò)誤時(shí)顯示維護(hù)頁(yè)面
  error_page 503 @maintenance;
  location @maintenance {
    root /var/www/html;
    rewrite ^(.*)$ /maintenance.html break;
    internal;
  }
}

4 黑白名單文件管理

4.1 名單文件格式

# /etc/nginx/whitelist.conf 格式
# 每行一個(gè) IP 或網(wǎng)段
10.0.0.0/8
172.16.0.0/12
192.168.0.0/16
203.0.113.0/24
123.45.67.89

# /etc/nginx/blacklist.conf 格式
# 被禁止的 IP
192.168.1.100
10.10.10.50
123.123.123.123

# 也可以是網(wǎng)段
192.168.100.0/24

4.2 動(dòng)態(tài)更新名單腳本

#!/bin/bash
# update_blacklist.sh - 自動(dòng)更新黑名單

BLACKLIST_FILE="/etc/nginx/blacklist.conf"
BLACKLIST_URL="https://api.example.com/blacklist/ipv4"

# 備份當(dāng)前黑名單
cp"$BLACKLIST_FILE""${BLACKLIST_FILE}.bak"

# 下載新黑名單
curl -s"$BLACKLIST_URL">"$BLACKLIST_FILE"

# 檢查文件是否有效
if[ $? -eq 0 ] && [ -s"$BLACKLIST_FILE"];then
 # 測(cè)試 Nginx 配置
  nginx -t

 if[ $? -eq 0 ];then
   # 重新加載 Nginx
    nginx -s reload
   echo"$(date): 黑名單已更新"
 else
   # 恢復(fù)備份
    mv"${BLACKLIST_FILE}.bak""$BLACKLIST_FILE"
   echo"$(date): Nginx 配置測(cè)試失敗,已恢復(fù)"
 fi
else
 echo"$(date): 下載失敗,已恢復(fù)"
  mv"${BLACKLIST_FILE}.bak""$BLACKLIST_FILE"
fi
# 添加到 crontab
echo"*/5 * * * * /usr/local/bin/update_blacklist.sh">> /var/spool/cron/root

# 或者使用 systemd timer
cat > /etc/systemd/system/nginx-blacklist.service < /etc/systemd/system/nginx-blacklist.timer <

5 基礎(chǔ)安全配置

5.1 隱藏版本號(hào)和指紋

server {
  listen 80;
  server_name example.com;

  # 隱藏 Nginx 版本號(hào)
  server_tokens off;

  # 隱藏 PHP 版本號(hào)(需在 php-fpm 配置)
  # /etc/php-fpm.d/www.conf
  # php_admin_value[expose_php] = off

  # 自定義響應(yīng)頭
  add_header X-Content-Type-Options "nosniff" always;
  add_header X-Frame-Options "SAMEORIGIN" always;
  add_header X-XSS-Protection "1; mode=block" always;
  add_header Referrer-Policy "no-referrer-when-downgrade" always;
  add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline'; style-src 'self' 'unsafe-inline';" always;

  # 移除暴露信息的響應(yīng)頭
  proxy_set_header X-Powered-By "";
  proxy_set_header X-AspNetMvc-Version "";

  location / {
    proxy_pass http://backend;
  }
}

5.2 防止常見攻擊

# 防止 SQL 注入
if ($query_string ~* "union.*select.*(") {
  return 403;
}

# 防止 XSS
if ($query_string ~* "

5.3 HTTPS 安全配置

server {
  listen 443 ssl http2;
  server_name example.com;

  # SSL 證書
  ssl_certificate /etc/nginx/ssl/example.com.crt;
  ssl_certificate_key /etc/nginx/ssl/example.com.key;

  # TLS 版本控制(禁用 SSLv3 和 TLS 1.0/1.1)
  ssl_protocols TLSv1.2 TLSv1.3;

  # 密碼套件配置
  ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384;
  ssl_prefer_server_ciphers off;

  # OCSP Stapling
  ssl_stapling on;
  ssl_stapling_verify on;
  resolver 8.8.8.8 8.8.4.4 valid=300s;
  resolver_timeout 5s;

  # SSL 會(huì)話緩存
  ssl_session_cache shared10m;
  ssl_session_timeout 1d;
  ssl_session_tickets off;

  # HSTS (HTTP Strict Transport Security)
  add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;

  # 安全頭部
  add_header X-Content-Type-Options "nosniff" always;
  add_header X-Frame-Options "SAMEORIGIN" always;
  add_header X-XSS-Protection "1; mode=block" always;
  add_header Referrer-Policy "no-referrer-when-downgrade" always;

  # SSL 證書安全檢查(定期執(zhí)行)
  # openssl s_client -connect example.com:443 -tls1_2
}

# HTTP 重定向到 HTTPS
server {
  listen 80;
  server_name example.com;
  return 301 https://$server_name$request_uri;
}

5.4 請(qǐng)求大小和超時(shí)控制

http {
  # 請(qǐng)求體大小限制(默認(rèn) 1M)
  client_max_body_size 10m;
  client_body_buffer_size 128k;

  # 請(qǐng)求頭大小限制
  large_client_header_buffers 4 8k;

  # 超時(shí)設(shè)置
  client_body_timeout 15s;
  client_header_timeout 15s;
  send_timeout 30s;

  # 保持連接
  keepalive_timeout 65;
  keepalive_requests 100;

  server {
    listen 80;
    server_name example.com;

    # 上傳目錄特殊限制
    location /upload {
      client_max_body_size 100m;
      client_body_timeout 300s;
    }
  }
}

6 CC 攻擊防護(hù)實(shí)戰(zhàn)

6.1 CC 攻擊識(shí)別

#!/bin/bash
# detect_cc.sh - 檢測(cè) CC 攻擊

LOG_FILE="/var/log/nginx/access.log"
THRESHOLD=100 # 單 IP 每分鐘請(qǐng)求數(shù)閾值

echo"=== CC 攻擊檢測(cè) ==="

# 統(tǒng)計(jì)最近 1 分鐘每個(gè) IP 的請(qǐng)求數(shù)
awk -vlimit=$THRESHOLD'{
  ip[$1]++
  time[$1, $4]++
}
END {
  for (key in time) {
    split(key, parts, SUBSEP)
    if (time[key] > limit) {
      print parts[1], "請(qǐng)求數(shù):", time[key]
    }
  }
}'"$LOG_FILE"| sort | uniq

echo""
echo"=== 短時(shí)間高頻請(qǐng)求 TOP 20 ==="
awk'{print $1}'"$LOG_FILE"| sort | uniq -c | sort -rn | head -20

echo""
echo"=== 響應(yīng)碼分布 ==="
awk'{print $9}'"$LOG_FILE"| sort | uniq -c | sort -rn

6.2 CC 攻擊防護(hù)配置

# CC 防護(hù)配置示例

# 1. 基礎(chǔ)限流
limit_req_zone $binary_remote_addr zone=cc_protect:100m rate=100r/s;

# 2. 按 URI 限流(某些 URI 更容易被攻擊)
limit_req_zone $binary_remote_addr zone=api_limit:50m rate=30r/s;
limit_req_zone $binary_remote_addr zone=search_limit:50m rate=5r/s;

# 3. 瀏覽器指紋驗(yàn)證
map $http_user_agent $is_bot {
  default             0;
  ~*python|curl|wget|scrapy   1;
  ~*bot|spider|crawl       2;
}

server {
  listen 80;
  server_name example.com;

  # User-Agent 過濾
  if ($is_bot = 1) {
    limit_req zone=cc_protect burst=10;
  }
  if ($is_bot = 2) {
    return 403;
  }

  # 動(dòng)態(tài)限流(根據(jù)響應(yīng)狀態(tài)動(dòng)態(tài)調(diào)整)
  limit_req_zone $binary_remote_addr zone=dynamic:50m rate=10r/s;

  # URI 限流
  location /api/ {
    limit_req zone=api_limit burst=50 nodelay;
    proxy_pass http://api_backend;
  }

  location /search {
    limit_req zone=search_limit burst=20 nodelay;
    proxy_pass http=backend;
  }

  # 靜態(tài)資源允許較高并發(fā)
  location /static/ {
    limit_req zone=cc_protect burst=200 nodelay;
    proxy_pass http://static_backend;
    expires 7d;
    add_header Cache-Control "public, no-transform";
  }
}

6.3 自動(dòng)封鎖腳本

#!/bin/bash
# auto_block.sh - 自動(dòng)封鎖攻擊 IP

LOG_FILE="/var/log/nginx/access.log"
BLACKLIST_FILE="/etc/nginx/blacklist.conf"
THRESHOLD=500 # 每分鐘請(qǐng)求超過此值則封鎖
WINDOW=1   # 時(shí)間窗口(分鐘)

echo"$(date): 開始檢測(cè)和封鎖"

# 獲取最近 N 分鐘的高頻 IP
CURRENT_MIN=$(date +"%d/%b/%Y:%H:%M")

# 使用 awk 統(tǒng)計(jì)并封鎖
awk -vlimit=$THRESHOLD-v blacklist=$BLACKLIST_FILE'
BEGIN {
  # 讀取現(xiàn)有黑名單
  while ((getline line < blacklist) > 0) {
    blocked[line] = 1
  }
  close(blacklist)
}

{
  ip = $1
  requests[ip]++
}

END {
  for (ip in requests) {
    if (requests[ip] > limit && !blocked[ip]) {
      print ip >> blacklist
      print "封鎖 IP:", ip, "請(qǐng)求數(shù):", requests[ip]
      system("nginx -t && nginx -s reload")
    }
  }
}
'"$LOG_FILE"

echo"$(date): 檢測(cè)完成"

7 綜合配置示例

7.1 生產(chǎn)環(huán)境完整配置

# /etc/nginx/nginx.conf

user nginx;
worker_processes auto;
worker_rlimit_nofile 65535;

error_log /var/log/nginx/error.log warn;
pid /run/nginx.pid;

events {
  worker_connections 10240;
  use epoll;
  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 buffer=16k flush=5s;

  # 性能優(yōu)化
  sendfile on;
  tcp_nopush on;
  tcp_nodelay on;
  keepalive_timeout 65;
  keepalive_requests 1000;
  types_hash_max_size 2048;

  # 安全頭部
  server_tokens off;
  add_header X-Frame-Options "SAMEORIGIN" always;
  add_header X-Content-Type-Options "nosniff" always;
  add_header X-XSS-Protection "1; mode=block" always;

  # Gzip 壓縮
  gzip on;
  gzip_vary on;
  gzip_proxied any;
  gzip_comp_level 6;
  gzip_types text/plain text/css text/xml application/json application/javascript application/rss+xml application/atom+xml image/svg+xml;

  # 限流區(qū)域定義
  limit_req_zone $binary_remote_addr zone=global:100m rate=100r/s;
  limit_req_zone $binary_remote_addr zone=api:50m rate=50r/s;
  limit_req_zone $binary_remote_addr zone=login:10m rate=1r/m;
  limit_req_zone $server_name zone=server_limit:100m rate=1000r/s;

  limit_conn_zone $binary_remote_addr zone=addr:50m;
  limit_conn_zone $server_name zone=server_conn:50m;

  # IP 名單
  geo $whitelist {
    default     0;
    10.0.0.0/8   1;
    172.16.0.0/12  1;
    192.168.0.0/16 1;
  }

  map $request_uri $rate_limit {
    default             50r/s;
    ~* ^/api/v1/login       1r/m;
    ~* ^/api/v1/search       10r/s;
    ~* ^/admin           10r/s;
    ~* ^/static          500r/s;
  }

  # 封禁 IP 列表
  map $remote_addr $is_blocked {
    default     0;
    include     /etc/nginx/blocked.conf;
  }

  # 上游服務(wù)器
  upstream backend {
    server 127.0.0.1:8080 max_fails=3 fail_timeout=30s;
    server 127.0.0.1:8081 max_fails=3 fail_timeout=30s;
    keepalive 32;
  }

  upstream api_backend {
    server 127.0.0.1:9000 max_fails=3 fail_timeout=30s;
    server 127.0.0.1:9001 max_fails=3 fail_timeout=30s;
    keepalive 64;
  }

  server {
    listen 80;
    listen [::]:80;
    server_name example.com www.example.com;

    # 封禁 IP
    if ($is_blocked = 1) {
      return 403;
    }

    # 全局限流
    limit_req zone=global burst=200 nodelay;

    # 根路徑
    location / {
      limit_req zone=api burst=100 nodelay;
      proxy_pass http://backend;
      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_http_version 1.1;
      proxy_set_header Connection "";
    }

    # API 接口
    location /api/ {
      limit_req zone=api burst=50 nodelay;
      limit_req_status 429;
      proxy_pass http://api_backend;
      proxy_set_header Host $host;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_http_version 1.1;
      proxy_set_header Connection "";
    }

    # 登錄接口(嚴(yán)格限流)
    location /api/v1/login {
      limit_req zone=login burst=10 nodelay;
      limit_req_status 429;
      proxy_pass http://api_backend;
    }

    # 搜索接口
    location /api/v1/search {
      limit_req zone=api burst=30 nodelay;
      proxy_pass http://api_backend;
    }

    # 靜態(tài)資源
    location /static/ {
      alias /var/www/static/;
      expires 7d;
      add_header Cache-Control "public, no-transform";
      limit_req zone=global burst=500 nodelay;
    }

    # 上傳(嚴(yán)格限制大小和速度)
    location /upload {
      client_max_body_size 100m;
      client_body_timeout 300s;
      limit_req zone=login burst=5 nodelay;
      proxy_pass http://api_backend;
    }

    # 健康檢查
    location /health {
      access_log off;
      return 200 "OK";
    }

    # 封禁敏感路徑
    location ~ /. {
      deny all;
    }

    location ~ .(env|config|ini|log|sh|sql|conf|bak)$ {
      deny all;
    }

    # 錯(cuò)誤頁(yè)面
    error_page 429 /429.html;
    location = /429.html {
      root /usr/share/nginx/html;
    }

    error_page 502 503 504 /50x.html;
    location = /50x.html {
      root /usr/share/nginx/html;
    }
  }

  # HTTPS 配置
  server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name example.com www.example.com;

    ssl_certificate /etc/nginx/ssl/example.com.crt;
    ssl_certificate_key /etc/nginx/ssl/example.com.key;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;
    ssl_prefer_server_ciphers off;
    ssl_session_cache shared10m;
    ssl_session_timeout 1d;

    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;

    # 引用 HTTP 配置
    # 使用 include 復(fù)用上述 server 塊配置
    include /etc/nginx/conf.d/*.conf;
  }

  # HTTP 重定向到 HTTPS
  server {
    listen 80;
    listen [::]:80;
    server_name example.com www.example.com;
    return 301 https://$server_name$request_uri;
  }
}

7.2 配置文件結(jié)構(gòu)建議

# 推薦的文件結(jié)構(gòu)
/etc/nginx/
├── nginx.conf       # 主配置
├── mime.types       # MIME 類型
├── conf.d/
│  ├── upstream.conf   # 上游服務(wù)器配置
│  ├── blacklist.conf   # 黑名單 IP
│  ├── whitelist.conf   # 白名單 IP
│  ├── blocked.conf    # 被封禁 IP
│  ├── rate_limit.conf  # 限流區(qū)域定義
│  ├── security.conf   # 安全配置
│  └── ssl.conf     # SSL 配置
└── ssl/
  ├── example.com.crt
  └── example.com.key

7.3 配置語法檢查

#!/bin/bash
# test_nginx_config.sh - 驗(yàn)證 Nginx 配置

echo"=== Nginx 配置測(cè)試 ==="

# 測(cè)試主配置
nginx -t

if[ $? -eq 0 ];then
 echo""
 echo"=== 配置測(cè)試通過 ==="
 echo""
 echo"=== 正在檢查常用配置 ==="

 # 檢查語法錯(cuò)誤
 echo"1. 檢查 conf.d/*.conf"
 forfin/etc/nginx/conf.d/*.conf;do
   if[ -f"$f"];then
     echo"  文件:$(basename $f)"
   fi
 done

 # 檢查 SSL 證書
 echo""
 echo"2. SSL 證書檢查"
 if[ -f /etc/nginx/ssl/example.com.crt ];then
   echo"  證書:$(openssl x509 -in /etc/nginx/ssl/example.com.crt -noout -dates)"
 fi

 # 檢查端口監(jiān)聽
 echo""
 echo"3. 端口監(jiān)聽檢查"
  ss -tlnp | grep :80
  ss -tlnp | grep :443

 # 檢查限流區(qū)域
 echo""
 echo"4. 限流區(qū)域"
  grep -E"limit_req_zone|limit_conn_zone"/etc/nginx/nginx.conf

 echo""
 echo"=== 所有檢查完成 ==="
else
 echo"? 配置測(cè)試失敗,請(qǐng)檢查語法"
fi

8 監(jiān)控與日志分析

8.1 限流統(tǒng)計(jì)

#!/bin/bash
# rate_limit_stats.sh - 限流統(tǒng)計(jì)

LOG_FILE="/var/log/nginx/error.log"

echo"=== Nginx 限流統(tǒng)計(jì) ==="
echo""

# 統(tǒng)計(jì)限流次數(shù)
echo"[1] 限流觸發(fā)次數(shù)(按類型]"
grep -c"limiting requests""$LOG_FILE"2>/dev/null ||echo"0"
grep -c"limiting connections""$LOG_FILE"2>/dev/null ||echo"0"

# 統(tǒng)計(jì)限流來源 TOP 10
echo""
echo"[2] 限流觸發(fā) TOP 10 IP"
grep"limiting requests""$LOG_FILE"2>/dev/null | 
  awk'{print $NF}'| 
  sed's/client: //'| 
  sort | uniq -c | sort -rn | head -10

# 統(tǒng)計(jì)被拒絕的 IP
echo""
echo"[3] 429 錯(cuò)誤 TOP 10"
awk'$9 == "429" {print $1}'/var/log/nginx/access.log 2>/dev/null | 
  sort | uniq -c | sort -rn | head -10

# 統(tǒng)計(jì) 403 錯(cuò)誤(可能被黑名單攔截)
echo""
echo"[4] 403 錯(cuò)誤(可能攔截)TOP 10"
awk'$9 == "403" {print $1}'/var/log/nginx/access.log 2>/dev/null | 
  sort | uniq -c | sort -rn | head -10

# 統(tǒng)計(jì)限流原因
echo""
echo"[5] 限流原因分布"
grep"limiting requests""$LOG_FILE"2>/dev/null | 
  grep -oE'zone="[^"]+"'| 
  sort | uniq -c | sort -rn

8.2 Prometheus 指標(biāo)

# Nginx 暴露 metrics(需要 nginx-module-vts 或 nginx-prometheus)
# 或者使用 access_by_lua 記錄到 Prometheus

# 使用 Lua 模塊記錄指標(biāo)
location /metrics {
  access_log off;
  # 限流指標(biāo)
  limit_req_status 429;
  limit_conn_status 503;
}
# Prometheus 告警規(guī)則
groups:
-name:nginx_rate_limit_alerts
 rules:
  -alert:HighRateLimitRejections
   expr:|
     sum(rate(nginx_http_requests_total{status="429"}[5m]))
     / sum(rate(nginx_http_requests_total[5m])) * 100 > 10
   for:5m
   labels:
    severity:warning
   annotations:
    summary:"Nginx 限流拒絕率過高"
    description:"429 錯(cuò)誤率超過 10%,當(dāng)前值:{{ $value }}%"

  -alert:HighConnectionRejections
   expr:|
     sum(rate(nginx_http_requests_total{status="503"}[5m]))
     / sum(rate(nginx_http_requests_total[5m])) * 100 > 5
   for:5m
   labels:
    severity:critical
   annotations:
    summary:"Nginx 并發(fā)連接拒絕率過高"
    description:"503 錯(cuò)誤率超過 5%,當(dāng)前值:{{ $value }}%"

9 總結(jié)與檢查清單

限流配置速查

# 限流區(qū)域定義
limit_req_zone $binary_remote_addr zone=name:10m rate=10r/s;
limit_conn_zone $binary_remote_addr zone=name:10m;

# 應(yīng)用限流
limit_req zone=name burst=20 nodelay;
limit_req_status 429;

# 應(yīng)用并發(fā)限制
limit_conn name 10;
limit_conn_status 503;

# 帶寬限制
limit_rate_after 10m;
limit_rate 500k;

黑白名單速查

# 基本 IP 控制
allow 10.0.0.0/8;
deny all;

# geo 模塊
geo $geo {
  default 0;
  10.0.0.0/8 1;
}

# map 模塊
map $remote_addr $is_blocked {
  default 0;
  include /etc/nginx/blacklist.conf;
}

安全配置速查

# 隱藏版本
server_tokens off;

# 安全頭部
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 Strict-Transport-Security "max-age=31536000" always;

# 防止敏感文件
location ~ /. { deny all; }
location ~ .(env|config|ini|log)$ { deny all; }

# HTTPS
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;

排查檢查清單

#!/bin/bash
# nginx_security_check.sh - 安全配置檢查

echo"=========================================="
echo"  Nginx 限流與安全配置檢查"
echo"=========================================="

echo""
echo"[1] 限流配置檢查"
grep -E"limit_req_zone|limit_conn_zone"/etc/nginx/nginx.conf

echo""
echo"[2] 限流應(yīng)用檢查"
grep -E"limit_req|limit_conn"/etc/nginx/nginx.conf | head -20

echo""
echo"[3] 安全頭部檢查"
grep -E"server_tokens|X-Frame|X-Content|X-XSS|Strict-Transport"/etc/nginx/nginx.conf

echo""
echo"[4] SSL/TLS 配置"
grep -E"ssl_protocols|ssl_ciphers"/etc/nginx/nginx.conf

echo""
echo"[5] 黑名單檢查"
if[ -f /etc/nginx/blocked.conf ];then
 echo"已封鎖 IP 數(shù):$(wc -l < /etc/nginx/blocked.conf)"
? ??echo"最近封禁:"
? ? tail -5 /etc/nginx/blocked.conf
else
? ??echo"未配置黑名單文件"
fi

echo""
echo"[6] Nginx 版本"
nginx -v 2>&1

echo""
echo"[7] 配置語法測(cè)試"
nginx -t

echo""
echo"=========================================="

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 服務(wù)器
    +關(guān)注

    關(guān)注

    14

    文章

    10339

    瀏覽量

    91731
  • HTTP
    +關(guān)注

    關(guān)注

    0

    文章

    538

    瀏覽量

    35539
  • nginx
    +關(guān)注

    關(guān)注

    0

    文章

    193

    瀏覽量

    13199

原文標(biāo)題:一次說清楚 Nginx 限流、黑白名單和基礎(chǔ)安全配置

文章出處:【微信號(hào):magedu-Linux,微信公眾號(hào):馬哥Linux運(yùn)維】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    解析keepalived+nginx實(shí)現(xiàn)高可用方案技術(shù)

    之前講了Nginx 如何實(shí)現(xiàn)負(fù)載均衡以及如何實(shí)現(xiàn)動(dòng)靜分離,實(shí)現(xiàn)系統(tǒng)的分布式部署,提高系統(tǒng)的并發(fā)性能。但是,有個(gè)問題:如果Nginx 系統(tǒng)掛了,整個(gè)系統(tǒng)就都不可用了。Nginx 處于整個(gè)系統(tǒng)非常重要
    的頭像 發(fā)表于 09-30 15:52 ?4656次閱讀
    <b class='flag-5'>解析</b>keepalived+<b class='flag-5'>nginx</b>實(shí)現(xiàn)高可用方案技術(shù)

    I2C通信設(shè)計(jì)深度解析

    I2C通信設(shè)計(jì)深度解析
    發(fā)表于 08-12 21:31

    深度解析Tengine的調(diào)試與資源監(jiān)控方法論

    摘要: Tengine是由淘寶網(wǎng)發(fā)起的Web服務(wù)器項(xiàng)目。它在Nginx的基礎(chǔ)上,針對(duì)大訪問量網(wǎng)站的需求,提供更強(qiáng)大的流量負(fù)載均衡能力、全站HTTPS服務(wù)、安全防攻擊、鏈路追蹤等眾多高級(jí)特性。團(tuán)隊(duì)
    發(fā)表于 06-12 17:37

    AUTOSAR架構(gòu)深度解析 精選資料推薦

    AUTOSAR架構(gòu)深度解析本文轉(zhuǎn)載于:AUTOSAR架構(gòu)深度解析目錄AUTOSAR架構(gòu)深度解析A
    發(fā)表于 07-28 07:40

    AUTOSAR架構(gòu)深度解析 精選資料分享

    AUTOSAR架構(gòu)深度解析本文轉(zhuǎn)載于:AUTOSAR架構(gòu)深度解析AUTOSAR的分層式設(shè)計(jì),用于支持完整的軟件和硬件模塊的獨(dú)立性(Independence),中間RTE(Runtime
    發(fā)表于 07-28 07:02

    C語言深度解析

    C語言深度解析,本資料來源于網(wǎng)絡(luò),對(duì)C語言的學(xué)習(xí)有很大的幫助,有著較為深刻的解析,可能會(huì)對(duì)讀者有一定的幫助。
    發(fā)表于 09-28 07:00

    一文知道Nginx服務(wù)器的緩存原理和機(jī)制

    Nginx服務(wù)器的緩存原理,是在學(xué)習(xí)過程中比較重要的一個(gè)知識(shí)點(diǎn),學(xué)習(xí)通透之后,對(duì)于自己的能力會(huì)有不小的提升——而且提升不只限于nginx一方面,技術(shù)理論一通百通,對(duì)于理解其他內(nèi)容也會(huì)有很大幫助。
    的頭像 發(fā)表于 10-05 09:01 ?2976次閱讀
    一文知道<b class='flag-5'>Nginx</b>服務(wù)器的緩存原理和<b class='flag-5'>機(jī)制</b>

    深度解析Asp.Net2.0中的Callback機(jī)制

    深度解析Asp.Net2.0中的Callback機(jī)制(ups電源技術(shù)維修)-該文檔為深度解析Asp.Net2.0中的Callback
    發(fā)表于 09-27 16:28 ?1次下載
    <b class='flag-5'>深度</b><b class='flag-5'>解析</b>Asp.Net2.0中的Callback<b class='flag-5'>機(jī)制</b>

    Nginx如何監(jiān)控

    搭建了Nginx集群后,需要繼續(xù)深入研究的就是日常Nginx監(jiān)控。
    的頭像 發(fā)表于 08-22 10:03 ?2106次閱讀

    限流方案常用算法 常用的限流方案

    需要注意的是借助Redis實(shí)現(xiàn)的限流方案可用于分布式系統(tǒng),而guava實(shí)現(xiàn)的限流只能應(yīng)用于單機(jī)環(huán)境。如果你覺得服務(wù)器端限流麻煩,可以在不改任何代碼的情況下直接使用容器限流
    發(fā)表于 04-08 10:50 ?780次閱讀

    搭建Keepalived+Lvs+Nginx高可用集群負(fù)載均衡

    nginx包,推薦使用穩(wěn)定版本 2、上傳nginx到linux系統(tǒng) 3、安裝依賴環(huán)境 (1)安裝gcc環(huán)境 ? yum?install?gcc-c++ ? (2)安裝PCRE庫(kù),用于解析正則表達(dá)式 ? yum?install?
    的頭像 發(fā)表于 06-25 15:39 ?4407次閱讀
    搭建Keepalived+Lvs+<b class='flag-5'>Nginx</b>高可用集群負(fù)載均衡

    Nginx 如何實(shí)現(xiàn)高性能低消耗

    。Nginx具有豐富的模塊庫(kù)、靈活的配置、較低資源消耗等優(yōu)點(diǎn)。下面,我們一起深入看一下Nginx的工作機(jī)制 1. Nginx 如何實(shí)現(xiàn)高性能低消耗的呢? 我們從以下幾個(gè)方面說明以下:
    的頭像 發(fā)表于 11-11 11:31 ?1299次閱讀
    <b class='flag-5'>Nginx</b> 如何實(shí)現(xiàn)高性能低消耗

    Nginx核心功能深度解析

    Nginx核心功能深度解析
    的頭像 發(fā)表于 05-09 10:50 ?986次閱讀

    Nginx限流與防爬蟲配置方案

    在互聯(lián)網(wǎng)業(yè)務(wù)快速發(fā)展的今天,網(wǎng)站面臨著各種流量沖擊和惡意爬蟲的威脅。作為運(yùn)維工程師,我們需要在保證正常用戶訪問的同時(shí),有效防范惡意流量和爬蟲攻擊。本文將深入探討基于Nginx限流與防爬蟲解決方案,從原理到實(shí)踐,為大家提供一套完整的防護(hù)體系。
    的頭像 發(fā)表于 09-09 15:52 ?1050次閱讀

    Nginx中Master與Worker進(jìn)程的工作機(jī)制

    Nginx是現(xiàn)代互聯(lián)網(wǎng)架構(gòu)中最常用的Web服務(wù)器和反向代理軟件。很多運(yùn)維工程師使用Nginx多年,卻對(duì)其核心架構(gòu)一知半解,配置優(yōu)化時(shí)只會(huì)機(jī)械地調(diào)整幾個(gè)參數(shù)。本文從Nginx進(jìn)程模型出發(fā),深入講解worker進(jìn)程的工作
    的頭像 發(fā)表于 04-08 14:21 ?90次閱讀