Linux下配置nginx-tomcat-redis负载均衡配置
概述
性能测试时,
1、单独测试一个tomcat,并发用户为300时,服务响应时间正常,未出现错误;
2、使用默认的nginx配置,并发用户100,tomcat服务器上出现大量(10000+)TIME_WAIT;
分析原因,发现nginx默认使用短连接导致的,开启长连接(keepalive)模式后,并发正常;
记录各项配置如下:
集群环境
应用服务 | 应用版本 |
---|---|
测试机 | Loadrunner11 |
nginx | nginx/1.14.0 |
redis | redis-4.0.11 |
java | 1.6.0_32 |
tomcat | 6.0.32 |
Linux服务器配置
配置参数 | 配置值 | 备注 |
---|---|---|
开启对于TCP时间戳的支持 | net.ipv4.tcp_timestamps=1 | 默认值:1 |
减少SYN-ACK重传次数 | net.ipv4.tcp_synack_retries=2 | 默认值:5 |
减少SYN重传次数 | net.ipv4.tcp_syn_retries=2 | 默认值:6 |
减少tcp存活时间 | net.ipv4.tcp_keepalive_time=300 | 默认值:7200 |
启用time_wait重用 | net.ipv4.tcp_tw_reuse=1 | 默认值:0 |
redis配置
配置参数 | 配置值 |
---|---|
Redis版本 | redis-4.0.11.tar.gz |
安装目录 | “/usr/local/bin/redis-server /usr/local/etc/redis.conf” |
端口 | port 6379 |
最大内存 | maxmemory 1gb |
最大内存策略 | maxmemory-policy allkeys-lru |
session存储 | save “” |
ip绑定 | bind 0.0.0.0 |
保护模式 | protected-mode no |
守护进程 | daemonize yes |
启动 | $ redis-server /usr/local/etc/redis.conf |
nginx配置(nginx.conf)
#user nobody;
worker_processes 32;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
use epoll;
worker_connections 1024;
}
http {
include 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"';
#access_log logs/access.log main;
sendfile on;
tcp_nopush on; #防止网络阻塞
keepalive_timeout 60s;
#gzip on;
upstream backend{
least_conn;
server 192.168.0.2:8081 weight=1 max_fails=2 fail_timeout=10s;
server 192.168.0.2:8082 weight=1 max_fails=2 fail_timeout=10s;
server 192.168.0.2:8083 weight=1 max_fails=2 fail_timeout=10s;
keepalive 100;
}
server {
listen 80;
server_name 192.168.0.1;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root html;
index index.html index.htm;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
location /test/{
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_redirect http://$host http://$host:80;
proxy_connect_timeout 5s; #默认值60s, nginx连接到后端服务器的连接超时时间
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_pass http://backend;
}
#location /status{
# stub_status on;
# access_log off;
#allow 192.168.0.3;
#deny all;
}
}
}
添加环境变量
vi /etc/profile
尾行添加
PATH=$PATH:/usr/local/nginx/sbin
export PATH
保存关闭后运行 source /etc/profile 即会加入环境变量
tomcat配置
使用redis保持session同步
context.xml
<Valve className="com.radiadesign.catalina.session.RedisSessionHandlerValve" />
<Manager className="com.radiadesign.catalina.session.RedisSessionManager"
host="192.168.0.1"
port="6379"
database="0"
maxInactiveInterval="1800"/>
server.xml
<Connector port="8081" protocol="HTTP/1.1"
redirectPort="8443" proxyPort="8081"
connectionTimeout="20000"
maxThreads="300"
acceptCount="50"
/>
测试结果(并发1000)
Lr脚本内部设置的思考时间为9秒:lr_think_time(9);
如下为1000并发用户时的测试结果,平均响应时间约为11秒,且相对处于一个稳定的状态:
关于超时问题
追求完美的人,会对上面那红色的46个错误耿耿于怀,详细错误描述如下所示:
Action.c(4): Error -27796: Failed to connect to server “192.168.0.1:80”: [10060] Connection timed out
这个问题困扰了我很久(确切的说截止目前也没有解决);该问题在并发用户数大于300后就一直存在,且错误数量一直维持在20~50范围内,暂且记下此问题,等我对NGINX有深入研究后再来解决。