nginx-tomcat-redis负载均衡配置

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/huryer/article/details/82143503

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;
        }   
    }
}

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有深入研究后再来解决。

猜你喜欢

转载自blog.csdn.net/huryer/article/details/82143503