nginx调优

本文介绍了如何自定义Nginx的404错误页面,并讲解了查看服务器状态信息的方法。同时,文章详细阐述了如何解决'Too many open files'问题,以及如何优化HTTP和EVENT模块。此外,还探讨了Nginx使用limit_req_zone进行限流的配置,包括对uri后缀限流、缓冲队列长度和限速的设定,以及如何在有代理层的情况下获取真实IP进行限流。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

如何自定义返回给客户段的404错误页面

http{

 fastcgi_intercept_error on; //错误页面重定向

  server{

  error_page 404 /40x.html   //自定义错误页面

 location = /40x.html{

  root html;   

}

error_page 500 502 503 504 /50x.html;

location = /50x.html{

 root html;

  }

}

}

 

如何查看服务器状态信息

需要添加模板 --with-http_stub_status_module开启模板功能,此模板可以查看Nginx连接数等信息

 

./configure --with-http_stub_status_module

修改配置文件nginx.conf

/usr/local/nginx/conf/nginx.conf

Location /status{

         stub_status on;

}

curl http://192.168.4.5/status

 

状态的参数的意义

Active connections  当前活动的连接数量

Accepts   已经接受客户端的连接总数量

Handled  已经处理客户端的连接总数量(一般与accepts一致,除非服务限制了连接数量)

Requests  客户端发送的请求数量

Reading  当前服务器正在读取客户端请求头的数量

Writing 当前服务器正在写响应信息的数量

Waiting 当前多少客户端在等待服务器的响应

 

 

浏览网站时提示“Too many open files”如何解决

可以对EVENT模块优化

max_clients=worker_processes * worker_connections

注意修改系统ulimit限制/etc/security/limits.conf

enents{

worker_connections 10000; //每次worker最大并发连接数

Use epoll;

}

 

如何解决客户端访问头部信息过长的问题

可以对HTTP模块优化

http{

keepalive_timeout 10;  //保持连接的超时时间

gzip on;

gzip_min_length 1000;

client_header_buffer_size 1k; //默认请求包头信息的缓存

large_client_header_buffers 44k; //大请求包头部信息的缓存个数与容量

}

//先根据client_header_buffer分配,如果不够,再根据large值分配

 

如果需要处理大量静态文件,需要保持这些文件句柄为打开状态,避免后续再次打开

http{

open_file_cache   max=2000 inactive=20s;

open_file_cache_valid 60s;

open_file_cache_min_uses 5;

open_file_cache_errors off;

//设置服务器最大缓存2000个文件句柄,关闭20秒内无请求的文件句柄

//文件句柄的有效时间是60秒,60秒后过期

//只有访问次数超过5次会被缓存

}

 

 

如何让客户端浏览器缓存数据

客户端浏览器缓存数据

http{

location ~*\.(jpg|jpeg|git|png|css|js|ico|xml)${

           access_log off;

           Expires 30d;

}

}

 

Nginx使用limit_req_zone对同一IP访问进行限流

nginx可以使用ngx_http_limit_req_module模块的limit_req_zone指令进行限流访问,防止用户恶意攻击刷爆服务器。ngx_http_limit_req_module模块是nginx默认安装的

在nginx.conf文件中的http模块下配置

limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;

说明:区域名称为one(自定义),占用空间大小为10m,平均处理的请求频率不能超过每秒一次。

$binary_remote_addr是$remote_addr(客户端IP)的二进制格式,固定占用4个字节(可能是C语言的long类型长度)。而$remote_addr按照字符串存储,占用7-15个字节。这样看来用$binary_remote_addr可以节省空间,但网上又说64位系统下都是占用64个字节,没搞清楚,总之尽量用$binary_remote_addr吧。

第二,在http模块的子模块server下面配置

location ~* .htm$ {
limit_req zone=one burst=5  nodelay;
proxy_pass http://backend_tomcat;
}

我这里是对uri后缀为htm的请求限流,注意limit_req zone=one burst=5  nodelay;

其中zone=one和前面的定义对应。

burst这个网上都说峰值之类的,通过亲自试验发现这么说并不准确,应该叫缓冲队列的长度比较合适。

nodelay字面的意思是不延迟,具体说是对用户发起的请求不做延迟处理,而是立即处理。比如我上面定义的rate=1r/s,即每秒钟只处理1个请求。如果同一时刻有两个后缀为htm的请求过来了,若设置了nodelay,则会立刻处理这两个请求。若没设置nodelay,则会严格执行rate=1r/s的配置,即只处理一个请求,然后下一秒钟再处理另外一个请求。直观的看就是页面数据卡了,过了一秒后才加载出来。

真正对限流起作用的配置就是rate=1r/s和burst=5这两个配置。下面我们来分析一下具体案例。

某一时刻有两个请求同时到达nginx,其中一个被处理,另一个放到了缓冲队列里。虽然配置了nodelay导致第二个请求也被瞬间处理了,但还是占用了缓冲队列的一个长度,如果下一秒没有请求过来,这个占用burst一个长度的空间就会被释放,否则就只能继续占用着burst的空间,直到burst空间占用超过5之后,再来请求就会直接被nginx拒绝,返回503错误码。

可见,如果第二秒又来了两个请求,其中一个请求又占用了一个burst空间,第三秒、第四秒直到第五秒,每秒都有两个请求过来,虽然两个请求都被处理了(因为配置了nodelay),但其中一个请求仍然占用了一个burst长度,五秒后整个burst长度=5都被占用了。第六秒再过来两个请求,其中一个请求就被拒绝了。

这是我根据实际测试结果推论的,可能和真实的理论有所出入,但这样讲我觉得比较好理解。有清楚的朋友欢迎告知!

这里用到的$binary_remote_addr是在客户端和nginx之间没有代理层的情况。如果你在nginx之前配置了CDN,那么$binary_remote_addr的值就是CDN的IP地址。这样限流的话就不对了。需要获取到用户的真实IP进行限流。简单说明如下:

## 这里取得原始用户的IP地址
map $http_x_forwarded_for  $clientRealIp {
"" $remote_addr;
~^(?P<firstAddr>[0-9\.]+),?.*$$firstAddr;
}

## 针对原始用户 IP 地址做限制
limit_req_zone $clientRealIp zone=one:10m  rate=1r/s;

同理,我们可以用limit模块对网络爬虫进行限流。

http模块

limit_req_zone $anti_spider zone=anti_spider:10m rate=1r/s;

server模块

location / {

limit_req zone=anti_spider burst=2 nodelay;
if ($http_user_agent ~* "spider|Googlebot") {
set $anti_spider $http_user_agent;
}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值