Nginx提供了多种HTTP请求过滤方式:
# 1. 基于IP的访问控制
location /secure/ {
allow 192.168.1.0/24;
deny all;
}
# 2. 基于User-Agent过滤
if ($http_user_agent ~* (bot|spider|crawler)) {
return 403;
}
# 3. 基于Referer过滤
valid_referers none blocked server_names *.example.com;
if ($invalid_referer) {
return 403;
}
# 1. 使用map指令进行复杂匹配
map $http_user_agent $bad_agent {
default 0;
"~*bot" 1;
"~*spider" 1;
}
# 2. 使用geo模块进行地理过滤
geo $blocked_country {
default 0;
192.168.1.0/24 1;
10.0.0.0/8 1;
}
# 3. 请求速率限制
limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s;
upstream backend {
server backend1.example.com weight=5;
server backend2.example.com;
server backup.example.com backup;
}
server {
location / {
proxy_pass http://backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
proxy_buffering on;
proxy_buffer_size 4k;
proxy_buffers 8 16k;
proxy_busy_buffers_size 24k;
proxy_max_temp_file_size 1024m;
# 连接优化
proxy_connect_timeout 60s;
proxy_send_timeout 60s;
proxy_read_timeout 60s;
keepalive_timeout 65;
keepalive_requests 100;
# 缓存优化
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m inactive=60m;
proxy_cache_key "$scheme$request_method$host$request_uri";
Nginx内置状态模块:
location /nginx_status {
stub_status on;
access_log off;
allow 127.0.0.1;
deny all;
}
第三方工具:
ab (Apache Benchmark):
ab -n 1000 -c 100 http://example.com/
wrk:
wrk -t12 -c400 -d30s http://example.com/
JMeter: 更复杂的负载测试场景
瓶颈类型 | 症状 | 解决方案 |
---|---|---|
CPU瓶颈 | worker进程CPU使用率高 | 增加worker_processes,优化正则表达式 |
内存瓶颈 | 高内存使用,频繁交换 | 调整buffer大小,限制连接数 |
网络瓶颈 | 高延迟,低吞吐量 | 启用gzip压缩,优化TCP参数 |
后端瓶颈 | 代理请求慢 | 启用缓存,优化upstream配置 |
启用HTTP/2:
listen 443 ssl http2;
启用Brotli压缩:
brotli on;
brotli_comp_level 6;
brotli_types text/plain text/css application/json application/javascript;
TCP优化:
tcp_nopush on;
tcp_nodelay on;
sendfile on;
连接池优化:
upstream backend {
server backend1.example.com;
keepalive 32;
}
限制请求大小:
client_max_body_size 10m;
限制HTTP方法:
if ($request_method !~ ^(GET|HEAD|POST)$ ) {
return 405;
}
防止DDoS:
limit_req_zone $binary_remote_addr zone=ddos:10m rate=30r/s;
limit_conn_zone $binary_remote_addr zone=conn_limit_per_ip:10m;
通过合理配置这些参数和策略,可以显著提高Nginx的反向代理性能同时保持安全过滤能力。实际应用中应根据具体业务场景和负载测试结果进行调优。