【整理】Nginx+Tomcat+Memcached实现服务器集群负载均衡

一. 准备工作
1.1 创建用户及工作目
root用户登录后执行

useradd csdn    -------创建用户csdn
passwd  csdn    -------给已创建的用户csdn设置密码
说明:新创建的用户会在/home下创建一个用户目录csdn
1.2.1 系统
centOS 64位
1.2.2 软件
Nginx:1.12.1 stable version及相关库
JDK:8u141/1.8
Memcached及相关jar包

tomcat1/2/3:7.0.79    
二. JDK的安装
2.1 准备
从Java官方网站下载相应的JDK版本,如jdk-8u141-linux-x64.tar.gz,并放在/usr/java目录下。
2.2 安装步骤
进入放有jdk安装包的目录

cd /usr/java
直接解压,配置环境变量

# tar –xvf jdk-8u141-linux-x64.tar.gz 
1、 修改环境变量

# vi /etc/profile
2、 在最后加入以下几行:
export JAVA_HOME=/usr/java/jdk-8u141-linux-x64
export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$PATH:$JAVA_HOME/bin
3、 执行以下命令让配置文件生效
source /etc/profile
三. Tomcat的安装
3.1 准备tomcat安装包
apache-tomcat-7.0.79.zip
3.2 安装步骤
将tomcat上传到相应用户目录
使用Xftp工具把tomcat安装包apache-tomcat-7.0.79.zip包在windows环境下解压后,文件夹apache-tomcat-7.0.79直接传输到/home/ csdn/目录下即可。
3.3 配置tomcat
/home/csdn/apache-tomcat-7.0.79/conf/server.xml中以下代码处添加utf-8编码,如下图所示:

3.4 启动tomcat
#使用命令进入到tomcat的bin目录下
#./startup.sh 启动tomcat
#./shutdown.sh 关闭tomcat
以上,一个tomcat就配置好了。
3.5 配置多台tomcat
如果要同时配置多个及以上tomcat(以两个为例,多个依此类推)
则需修改环境变量如下:
vi /etc/profile
加入以下代码
CATALINA_1_BASE=/home/csdn/tomcat1
CATALINA_1_HOME=/home/csdn/tomcat1
export CATALINA_1_BASE CATALINA_1_HOME
CATALINA_2_BASE=/home/csdn/tomcat2
CATALINA_2_HOME=/home/csdn/tomcat2
export CATALINA_2_BASE CATALINA_2_HOME
TOMCAT_1_HOME=/home/csdn/tomcat1
export TOMCAT_1_HOME
TOMCAT_2_HOME=/home/csdn/tomcat2
export TOMCAT_2_HOME
并分别修改tomcat的startup.sh和shutdown.sh(两个文件都需要)
第一个tomcat:
export CATALINA_HOME=$CATALINA_1_HOME
export CATALINA_BASE=$CATALINA_1_BASE

第二个tomcat:

export CATALINA_BASE=$CATALINA_2_BASE
export CATALINA_HOME=$CATALINA_2_HOME

然后配置tomcat/conf/server.xml文件

Tomcat1端口分配表(tomcat全部采用默配置)

端口

端口号

指令端口

8005

http端口

8080

https端口

8443

Ajp端口

8009

Tomcat2端口分配表

端口

端口号

指令端口

9005

http端口

9080

https端口

9443

Ajp端口

9009



四.Nginx安装及配置

http://blog.csdn.net/u010028869/article/details/50485245

http://www.cnblogs.com/zrbfree/p/6419043.html

https://jingyan.baidu.com/article/02027811617b971bcd9ce541.html

http://blog.csdn.net/tx122/article/details/7534273

4.1 先决条件
4.1.1 GCC 安装

yum -y install gcc gcc-++ autoconf automake

yum install gcc
4.1.2 PCRE库

yum -y install pcre-devel

yum install pcre pcre-devel
4.1.3 zlib库

yum install zlib zlib-devel
下载zlib-1.2.11.tar.gz包
上传zlib源码到服务器的/usr/local/src

tar - zxvf  zlib-1.2.11.tar.gz
cd zlib-1.2.11
./configure
make install
4.1.4 OpenSSL库
yum install openssl openssl-devel
4.2 Nginx安装
4.2.1 安装
上传nginx-1.12.1.tar.gz源码到服务器的/usr/local/src
tar – zxvf nginx-1.12.1.tar.gz
cd nginx-1.12.1
./configure --prefix=/usr/local/nginx
make & make install
4.2.2 启动&关闭
首先介绍如何查看Nginx的进程号:
用命令:ps -ef|grep nginx 查看

① 启动方式:
【Nginx启动文件地址】 -c 【Nginx配置文件地址】
/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
② 三种关闭方式:
从容停止 : 
Kill -QUIT 13421
快速停止 : 
kill -TERM 13421 或 kill -INT 13421
强制停止 :
pkill -9 nginx
③ 重启
第一种reload命令:
[root@localhost local]# cd /usr/local/nginx/sbin/
[root@localhost sbin]# ./nginx -s reload
第二种发送信号方式:
kill -HUP 13421
4.2.3 配置
修改Nginx核心配置文件nginx.conf
下面配置文件中的几个关键点:
(1) 进程数与每个进程的最大连接数
#是否启用nobody用户
#user nobody;
#工作进程个数,一般跟服务器cpu核数相等,或者核数的两倍
worker_processes 2;
#单个进程最大连接数
events{
worker_connections 1024;
}
① nginx进程数,建议设置为和服务器cup核数相等,或者是核数的两倍
② 单个进程最大连接数,该服务器的最大连接数=连接数*进程数;
服务器支持最大并发数=(连接数*进程数) /2 ,因为反向代理是双向的。
(2)Nginx的基本配置
#nginx基本配置
server{
listen 8088; #端口号
server_name localhost; #服务名
}
① 监听端口一般都为http端口:80;可以修改为其他,这里修改为8088。
② server_name :默认为localhost ,这里修改为服务器ip地址。
(3)负载均衡列表基本配置
#服务器集群
upstream mycluster{
#这里添加的是上面启动好的两台Tomcat服务器
server 10.22.50.129:8080 weight=1;
server 10.22.50.129:9080 weight=1;
}
location /{
#将访问请求转向至服务器集群,mycluster和上面upstream mycluster 对应
proxy_pass http://mycluster;
# 真实的客户端IP
proxy_set_header X-Real-IP $remote_addr;
# 请求头中Host信息
proxy_set_header Host $host;
# 代理路由信息,此处取IP有安全隐患
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# 真实的用户访问协议
proxy_set_header X-Forwarded-Proto $scheme;
}
① location / {}:负载均衡访问的请求,可以添加筛选,假如我们要对所有的jsp后缀的文件进行负载均衡时,可以这样写:location ~ .*.jsp$ {}
② proxy_pass:请求转向自定义的服务器列表,这里我们将请求都转向标识为http://mycluster 的负载均衡服务器列表;
③ 在负载均衡服务器列表的配置中,Server指令:指定服务器的ip地址,weight是权重,可以根据机器配置定义权重(如果某台服务器的硬件配置十分好,可以处理更多的请求,那么可以为其设置一个比较高的weight;而有一台的服务器的硬件配置比较差,那么可以将前一台的weight配置为weight=2,后一台差的配置为weight=1)。weigth参数表示权值,权值越高被访问到的几率越大;

(4)配置定向转发 

#定向转发至某台服务器
location ~ ^/csdnupdate/.*\.tml$ {
        #将访问请求转向至特定服务器
        proxy_pass http://10.22.50.129:9080;
        # 真实的客户端IP
        proxy_set_header   X-Real-IP        $remote_addr; 
        # 请求头中Host信息
        proxy_set_header   Host             $host; 
        # 代理路由信息,此处取IP有安全隐患
        proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
        # 真实的用户访问协议
        proxy_set_header   X-Forwarded-Proto $scheme;
    }

#配置定向转发远程可访问文件,资源文件下载使用
location ^~ /csdnupdate/update/ {
        #将访问请求转向至特定服务器
        proxy_pass http://10.22.50.129:9080;
        # 真实的客户端IP
        proxy_set_header   X-Real-IP        $remote_addr; 
        # 请求头中Host信息
        proxy_set_header   Host             $host; 
        # 代理路由信息,此处取IP有安全隐患
        proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
        # 真实的用户访问协议
        proxy_set_header   X-Forwarded-Proto $scheme;
    }
#配置定向转发远程可访问文件
location ^~ /upload/ {
        #将访问请求转向至特定服务器
        proxy_pass http://10.22.50.129:9080;
        # 真实的客户端IP
        proxy_set_header   X-Real-IP        $remote_addr; 
        # 请求头中Host信息
        proxy_set_header   Host             $host; 
        # 代理路由信息,此处取IP有安全隐患
        proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
        # 真实的用户访问协议
        proxy_set_header   X-Forwarded-Proto $scheme;
    }


(5)完整的配置文件示例

#设置用户组
user nobody;
#工作进程个数,一般跟服务器cpu核数相等,或者核数的两倍
worker_processes 2;
#单个进程最大连接数
events{
    worker_connections 1024; 
}
http{
    keepalive_timeout 65;
    gzip on;
    #服务器集群
    upstream mycluster{
         #集群有几台服务器即可配置几台,weight表示权重,权重越大被访问到的几率越大
        #这里添加的是上面启动好的两台Tomcat服务器
         server 10.22.50.129:8080 weight=1;
         server 10.22.50.129:9080 weight=1;
    }
    #nginx基本配置
    server{
        listen 8088;    #端口号
        server_name localhost; #服务名
        #通用匹配至集群
        location /{
            #将访问请求转向至服务器集群,mycluster和上面upstream mycluster 对应
            proxy_pass http://mycluster;
            # 真实的客户端IP
            proxy_set_header   X-Real-IP        $remote_addr; 
            # 请求头中Host信息
            proxy_set_header   Host             $host; 
            # 代理路由信息,此处取IP有安全隐患
            proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
            # 真实的用户访问协议
            proxy_set_header   X-Forwarded-Proto $scheme;
        }     
       #定向转发至某台服务器
  location ~ ^/csdnupdate/.*\.tml$ {
        #将访问请求转向至特定服务器
        proxy_pass http://10.22.50.129:9080;
        # 真实的客户端IP
        proxy_set_header   X-Real-IP        $remote_addr; 
        # 请求头中Host信息
        proxy_set_header   Host             $host; 
        # 代理路由信息,此处取IP有安全隐患
        proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
        # 真实的用户访问协议
        proxy_set_header   X-Forwarded-Proto $scheme;
    }
#配置定向转发远程可访问文件,资源文件下载使用
location^~ /csdnupdate/update/ {
        #将访问请求转向至特定服务器
        proxy_pass http://10.22.50.129:9080;
        # 真实的客户端IP
        proxy_set_header   X-Real-IP        $remote_addr; 
        # 请求头中Host信息
        proxy_set_header   Host             $host; 
        # 代理路由信息,此处取IP有安全隐患
        proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
        # 真实的用户访问协议
        proxy_set_header   X-Forwarded-Proto $scheme;
    }
#配置定向转发远程可访问文件
location^~ /upload/ {
        #将访问请求转向至特定服务器
        proxy_pass http://10.22.50.129:9080;
        #真实的客户端IP
        proxy_set_header   X-Real-IP        $remote_addr; 
        # 请求头中Host信息
        proxy_set_header   Host             $host; 
        # 代理路由信息,此处取IP有安全隐患
        proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
        #真实的用户访问协议
        proxy_set_header   X-Forwarded-Proto $scheme;
    }
        error_page   500 502 503 504  /50x.html; 
        location = /50x.html {  
            root   html; 
        } 
    }
} 


转发条件可以按需修改。以上,最基本的Nginx配置差不多就是上面这些内容,当然仅仅是最基础的配置。    


五.配置session共享    

http://blog.csdn.net/u013628152/article/details/50485949

http://blog.csdn.net/shirdrn/article/details/9731215

http://blog.csdn.net/a__java___a/article/details/8738932

http://www.cnblogs.com/carbon3/p/5870230.html

http://blog.csdn.net/u010028869/article/details/50773174

http://blog.csdn.net/big1980/article/details/8454333    

5.1 Memcached安装及配置
a) 安装包准备
i. http://libevent.org/ 下载安装memcached前必需要的包libevent-2.0.15 我安装的是这个版本
ii. http://memcached.org/下载linux下的memcached的安装包
b) 安装libevent-2.0.15
首先检查系统中是否安装了libevent

rpm -qa|grep libevent
如果安装了则查看libevent的安装路径,后续安装时需要用到
rpm -ql libevent
如果没有安装,则先安装libevent
wget http://www.monkey.org/~provos/libevent-1.4.12-stable.tar.gz   
tar -zxvf libevent-1.4.12-stable.tar.gz -C /usr/local/  
cd libevent-1.4.12-stable/  
./configure -prefix=/usr/libevent  
make
make install  

c) 安装memcached
1.首先是下载memcached的安装包

wget http://memcached.googlecode.com/files/memcached-1.4.15.tar.gz  
2.修改安装包的执行操作权限
chmod 777 memcached-1.4.15.tar.gz
3.解压安装包到指定目录
tar -zxvf memcached-1.4.15.tar.gz -C /usr/local
4.进入解压后的目录
cd /usr/local/memcached-1.4.15/  
5.配置、编译、安装
注:configure时需要指定libevent的安装路径
./configure -with-libevent=/usr/libevent -prefix=/usr/local/memcached  
make  
make install
6.安装成功后启动一下看安装是否成功
/usr/local/memcached/bin/memcached -d -m 64 -p 11211 -u root 
/usr/local/memcached/bin/memcached -d -m 64 -p 11211 -u nobody
d) 给出memcached启动命令参数详解
-p <num> TCP端口,默认为11211,可以不设置
-U <num> UDP端口,默认为11211,0为关闭
-s <file> UNIX socket
-a <mask> access mask for UNIX socket, in octal (default: 0700)
-l <addr> 监听的 IP 地址,本机可以不设置此参数
-d 以守护程序(daemon)方式运行
-u 指定用户,如果当前为 root ,需要使用此参数指定用户
-m <num> 最大内存使用,单位MB。默认64MB
-M 禁止LRU策略,内存耗尽时返回错误,而不是删除项
-c <num> 最大同时连接数,默认是1024
-v verbose (print errors/warnings while in event loop)
-vv very verbose (also print client commands/reponses)
-vvv extremely verbose (also print internal state transitions)
-h 帮助信息
-i print memcached and libevent license
-P <file> 保存PID到指定文件
-f <factor> 增长因子,默认1.25
-n <bytes> 初始chunk=key+suffix+value+32结构体,默认48字节
-L 启用大内存页,可以降低内存浪费,改进性能
-t <num> 线程数,默认4。由于memcached采用NIO,所以更多线程没有太多作用
-R 每个event连接最大并发数,默认20
-C 禁用CAS命令(可以禁止版本计数,减少开销)
-b Set the backlog queue limit (default: 1024)
-B Binding protocol-one of ascii, binary or auto (default)
-I 调整分配slab页的大小,默认1M,最小1k到128M
上面加粗的参数,需要重点关注,正常启动的例子
启动:
/usr/bin/memcached -m 64 -p 11212 -u nobody -c 2048 -f 1.1 -I 1024 -d -l 10.211.55.9
连接:
telnet 10.211.55.9 11212
Trying 10.211.55.9...
Connected to 10.211.55.9.
Escape character is '^]'.
e) 结束Memcache进程
# kill `cat /tmp/memcached.pid`
或是 通过ps -ef | grep memcached 找到pid ,然后kill
也可以启动多个守护进程,不过端口不能重复。
# ps -ef | grep memcached
root 28914 1 0 07:27 ? 00:00:00 memcached -d -m 128 -l localhost -p 11211 -u root (启动ok)
f) 测试memcached
#telnet localhost 11211
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
5.2 配置所需jar包
http://code.google.com/p/memcached-session-manager/downloads/list可以下载所需要的包。
不管你选择哪种序列化策略,你都需要  memcached-session-manager-${version}.jar,如果你使用的是tomcat6,则还需要下载    memcached-session-manager-tc6-${version}.jar,如果使用的是tomcat7则下载  memcached-session-manager-tc7-${version}.jar。同时还需要下载  spymemcached-2.7.3.jar和memcached-2.5.jar 。
每种序列号策略下载单独需要的jar包,具体如下:

将下图所提到的包全部拷贝到tomcat的lib下(所有负载的tomcat都需要)

5.3 context.xml配置
a) 非黏性session管理的配置示例, 修改每台tomcat的conf目录下得context.xml文件或者server.xml文件
<Context>  
  ...  
  <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"  
    memcachedNodes="n1:host1.yourdomain.com:11211,n2:host2.yourdomain.com:11211"  
    sticky="false"  
    sessionBackupAsync="false"  
    lockingMode="uriPattern:/path1|/path2"  
    requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"  
    transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"  
    />  
</Context>
其中,n1:host1.yourdomain.com:11211, n2:host2.yourdomain.com:11211是memcache的地址和端口,可使用127.0.0.1:11211

b) 黏性session管理的配置示例

<Context>  
  ...  
  <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"  
    memcachedNodes="n1:host1.yourdomain.com:11211,n2:host2.yourdomain.com:11211"  
    failoverNodes="n1"  
    requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"  
    transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"  
    />  
</Context>  

以上就是tomcat1的配置信息,对于tomcat2我们只需要修改一下failoverNodes属性的值为"n2" ,这样tomcat2就会优先把session存放到memcached "n1"节点,其余配置信息都一样。

说明:n1,n2memcached启动检测节点。

启动tomcat的结果如下:


说明:以上部分内容有些转载自上面列举出的链接博客,此篇博文是在具体项目实践中对整个过程的整理。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值