好的!下面是关于 Nginx 日志配置、错误页面配置、流量控制 的第九天学习笔记或教程,内容详细且实用。


Nginx 日志配置、错误页面配置、流量控制(第九天)


一、Nginx 日志配置

1. 访问日志(access_log)

  • 记录客户端请求的详细信息,默认关闭,需配置开启。

配置示例:

http {
    log_format main '$remote_addr - $remote_user [$time_local] "$request" '
                    '$status $body_bytes_sent "$http_referer" '
                    '"$http_user_agent" "$http_x_forwarded_for"';

    access_log /var/log/nginx/access.log main;
}
  • $remote_addr:客户端 IP
  • $request:请求行
  • $status:响应状态码
  • $body_bytes_sent:发送给客户端的字节数
  • $http_referer:来源页面
  • $http_user_agent:客户端浏览器信息

2. 错误日志(error_log)

  • 记录错误信息,方便排查故障。

配置示例:

error_log /var/log/nginx/error.log warn;
  • 日志级别有:debuginfonoticewarnerrorcrit,默认 error

二、错误页面配置

  • 自定义 Nginx 错误页面,提升用户体验。

配置示例:

server {
    listen 80;
    server_name example.com;

    error_page 404 /custom_404.html;
    error_page 500 502 503 504 /custom_50x.html;

    location = /custom_404.html {
        root /usr/share/nginx/html;
        internal;
    }

    location = /custom_50x.html {
        root /usr/share/nginx/html;
        internal;
    }
}
  • error_page 指定错误码对应的页面。
  • internal 表示此页面只能由 Nginx 内部调用,用户不能直接访问。

三、流量控制

1. 限速(limit_rate)

  • 限制客户端下载速度,防止单个请求占用带宽。

示例:

location /downloads/ {
    limit_rate 100k;  # 限速 100 KB/s
}

2. 限连接数(limit_conn)

  • 限制每个客户端的并发连接数。

配置示例:

http {
    limit_conn_zone $binary_remote_addr zone=addr:10m;

    server {
        location / {
            limit_conn addr 5;  # 单个IP最多5个连接
        }
    }
}

3. 限请求速率(limit_req)

  • 限制客户端请求频率,防止 DDoS 攻击。

配置示例:

http {
    limit_req_zone $binary_remote_addr zone=req_limit_per_ip:10m rate=10r/s;

    server {
        location /api/ {
            limit_req zone=req_limit_per_ip burst=5 nodelay;
        }
    }
}
  • rate=10r/s:每秒允许10个请求。
  • burst=5:允许瞬间突发5个请求。
  • nodelay:请求超出限制立即返回错误,不延迟处理。

四、总结

主题说明
日志配置access_log 和 error_log 配置详解
错误页面自定义 404、5xx 等错误页面
流量控制限速(limit_rate)、限连接(limit_conn)、限请求速率(limit_req)

好的!这里为你整理一份全面、系统的 Nginx 学习笔记,涵盖日志配置、错误页面配置、流量控制,并且拓展到高可用负载均衡、HTTPS配置及性能调优,适合进阶掌握和实战应用。


Nginx 全面教程(日志 / 错误页面 / 流量控制 / 负载均衡 / HTTPS / 性能优化)


1. Nginx 日志配置

1.1 访问日志 access_log

  • 记录所有请求信息,便于分析访问情况。
http {
    log_format main '$remote_addr - $remote_user [$time_local] "$request" '
                    '$status $body_bytes_sent "$http_referer" '
                    '"$http_user_agent" "$http_x_forwarded_for"';

    access_log /var/log/nginx/access.log main;
}

常用变量说明:

变量含义
$remote_addr客户端 IP
$time_local请求时间
$request请求行
$status状态码
$body_bytes_sent发送给客户端的字节数
$http_referer来源页面
$http_user_agent浏览器 User-Agent
$http_x_forwarded_for真实客户端 IP(代理时)

1.2 错误日志 error_log

  • 记录错误信息,便于排错。
error_log /var/log/nginx/error.log warn;

日志级别:

等级描述
debug调试信息
info普通信息
notice普通但重要信息
warn警告
error错误
crit严重错误

2. 自定义错误页面

提升用户体验,避免默认丑陋的错误提示。

server {
    listen 80;
    server_name example.com;

    error_page 404 /404.html;
    error_page 500 502 503 504 /50x.html;

    location = /404.html {
        root /usr/share/nginx/html;
        internal;
    }

    location = /50x.html {
        root /usr/share/nginx/html;
        internal;
    }
}
  • internal 表示只能被 Nginx 内部调用,不允许外部直接访问。

3. 流量控制

3.1 限速 limit_rate

控制下载速度,避免单连接占用过多带宽。

location /downloads/ {
    limit_rate 200k;
}

3.2 限连接数 limit_conn

限制单个客户端并发连接数,防止连接泛滥。

http {
    limit_conn_zone $binary_remote_addr zone=addr:10m;

    server {
        location / {
            limit_conn addr 10;
        }
    }
}

3.3 限请求速率 limit_req

限制请求频率,防止爬虫或DDoS攻击。

http {
    limit_req_zone $binary_remote_addr zone=req_limit_per_ip:10m rate=5r/s;

    server {
        location /api/ {
            limit_req zone=req_limit_per_ip burst=10 nodelay;
        }
    }
}

4. 高可用负载均衡配置

4.1 反向代理负载均衡

http {
    upstream backend {
        server 192.168.1.101 weight=5 max_fails=3 fail_timeout=30s;
        server 192.168.1.102 weight=3 max_fails=3 fail_timeout=30s;
        server 192.168.1.103 backup;
    }

    server {
        listen 80;
        location / {
            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;
        }
    }
}
  • 权重(weight):分配请求比例。
  • 最大失败次数(max_fails)失败超时(fail_timeout):节点健康检查。
  • backup:备用服务器。

4.2 负载均衡算法

  • round-robin(默认)
  • least_conn(最少连接)
  • ip_hash(基于客户端 IP)

示例:

upstream backend {
    least_conn;
    server 192.168.1.101;
    server 192.168.1.102;
}

5. HTTPS 配置与安全加固

5.1 生成 SSL 证书(自签)

openssl req -newkey rsa:2048 -nodes -keyout nginx.key -x509 -days 365 -out nginx.crt

5.2 Nginx 配置 HTTPS

server {
    listen 443 ssl;
    server_name example.com;

    ssl_certificate /path/to/nginx.crt;
    ssl_certificate_key /path/to/nginx.key;

    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers on;

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

5.3 重定向 HTTP 到 HTTPS

server {
    listen 80;
    server_name example.com;
    return 301 https://$host$request_uri;
}

6. 性能调优

6.1 开启 Gzip 压缩

http {
    gzip on;
    gzip_min_length 1024;
    gzip_types text/plain application/javascript text/css application/json image/svg+xml;
    gzip_comp_level 5;
}

6.2 缓存静态资源

location ~* \.(js|css|png|jpg|jpeg|gif|svg|ico)$ {
    expires 7d;
    add_header Cache-Control "public";
}

6.3 连接优化

worker_processes auto;
worker_connections 10240;
keepalive_timeout 65;

7. 完整示例配置片段

http {
    log_format main '$remote_addr - $remote_user [$time_local] "$request" '
                    '$status $body_bytes_sent "$http_referer" '
                    '"$http_user_agent" "$http_x_forwarded_for"';

    access_log /var/log/nginx/access.log main;
    error_log /var/log/nginx/error.log warn;

    limit_conn_zone $binary_remote_addr zone=addr:10m;
    limit_req_zone $binary_remote_addr zone=req_limit_per_ip:10m rate=10r/s;

    gzip on;
    gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;

    upstream backend {
        least_conn;
        server 192.168.1.101;
        server 192.168.1.102;
    }

    server {
        listen 80;
        server_name example.com;

        error_page 404 /404.html;
        error_page 500 502 503 504 /50x.html;

        location = /404.html {
            root /usr/share/nginx/html;
            internal;
        }

        location / {
            limit_conn addr 10;
            limit_req zone=req_limit_per_ip burst=20 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;
        }
    }
}