因为做了一个秒杀的项目,所以需要使用jmeter压测,请求是50000个,如果是单击压测的话会出现很多error,原因就是单机的负载是有限的。所以使用nginx来做负载均衡,将请求转发到多个服务上。
但是压测的时候发现仍然出现很多错误,这就很不正常了,进入nginx目录下的logs目录,查出error.log文件,其中出现了大量如下从错误日志:
一、
2021/04/02 09:19:25 [error] 22#22: *249 open() "/usr/share/nginx/html/seckill/do_seckill" failed (2: No such file or directory), client: 192.168.63.15, server: localhost, request: "POST /seckill/do_seckill HTTP/1.1", host: "192.168.63.128"
在linux中一切皆文件,上面的意思就是打开文件失败,没有这个文件,那么就在配置文件中(events块)将连接数调大:
worker_connections 10240;#每一个进程打开的最大连接数,包含了nginx与客户端和nginx与upstream之间的连接
具体多大看具体情况。并且添加:
worker_rlimit_nofile 20480; #每个进程打开的最大的文件数
这个配置受限于操作系统/etc/security/limits.conf,所以还要将这个文件添加如下配置:
hard nofile 204800
soft nofile 204800
soft core unlimited
soft stack 204800
二、再进行压测,jmeter没有出现error,但是在nginx日志中又出现下面日志:
2021/04/07 02:41:02 [error] 25#25: *45386 no live upstreams while connecting to upstream, client: 192.168.63.15, server: 192.168.63.128, request: "POST /seckill/do_seckill HTTP/1.1", upstream: "http://myserver/seckill/do_seckill", host: "192.168.63.128"
这个就和设置的负载均衡有关了,因为我在配置文件中是这样配置的:
upstream myserver {
server 192.168.63.120:8080 weight=2 max_fails=3 fail_timeout=50s;
server 192.168.63.125:8080 weight=2 max_fails=3 fail_timeout=50s;
server 192.168.63.128:8080 weight=1 max_fails=3 fail_timeout=50s;
keepalive 200;#nginx与服务之间的最大空闲长连接
}
50s内失败重试次数为3,超过3次后就将当前服务剔除,50s后再进行重试。
这样就会导致一台服务down掉的时候,流量全部打到另外一台服务器。如果另外一个也down掉,那么就会打印日志。将重试次数调大,no live upstreams”出现的概率变少了很多,但却没有完全消失。