tomcat7+nginx+memcached配置Session共享篇

一台服务器+2个tomcat7 (Nginx+tomcat7+memcached)部署负载均衡

0x01 Ngin反向代理通俗讲解+Nginx负载均衡配置(tomcat+nginx)

什么是反向代理?

反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个服务器。

通俗的讲

这里讲得很直白。反向代理方式实际上就是一台负责转发的代理服务器,貌似充当了真正服务器的功能,但实际上并不是,代理服务器只是充当了转发的作用,并且从真正的服务器那里取得返回的数据。这样说,其实nginx完成的就是这样的工作。我们让nginx监听一个端口,譬如80端口,但实际上我们转发给在8080端口的tomcat,由它来处理真正的请求,当请求完成后,tomcat返回,但数据此时没直接返回,而是直接给nginx,由nginx进行返回,这里,我们会以为是nginx进行了处理,但实际上进行处理的是tomcat。
说到上面的方式,也许很多人又会想起来,这样可以把静态文件交由nginx来进行处理。对,很多用到nginx的地方都是作为静态伺服器,这样可以方便缓存那些静态文件,比如CSS,JS,html,htm等文件。

用到的软件nginx.exe

nginx官网下一个。http://nginx.org/en/download.html
当前我用的版本是nginx1.8.0

下完后首先要启动。进入到nginx文件夹,直接start nginx就OK了。

1
2
3
4
启动命令:start nginx
结束命令:nginx –s stop
检查命令:nignx -t
重新加载命令:nginx –s reload

基础篇详细解说请参考:http://cxshun.iteye.com/blog/1535188

打开 \conf\nginx.conf
下面是完整的配置代码

Windows上部署:一台服务器+2个tomcat 部署负载均衡Nginx+tomcat 下面是代码区域

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150

#Nginx所用用户和组,window下不指定
#user nobody;
#工作的子进程数量(通常等于CPU数量或者2倍于CPU)
worker_processes 4;

#错误日志存放路径
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;

#指定pid存放文件
#pid logs/nginx.pid;

#使用网络IO模型linux建议epoll,FreeBSD建议采用kqueue,window下不指定。
events {

#允许最大连接数
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 0;
keepalive_timeout 65;
#打开gzip压缩
#gzip on;
#设定负载均衡的服务器列表
upstream local_tomcat{
server localhost:8080 weight=1;
server localhost:9090 weight=1;

}
#第一个虚拟主机
server {
#监听IP端口
listen 8081;
#主机名
server_name localhost;

#设置字符集
#charset koi8-r;
#本虚拟server的访问日志 相当于局部变量
#access_log logs/host.access.log main;

location / {
root html;
index index.html index.htm;
#此处的 http://localhost与upstream localhost对应
proxy_pass http://local_tomcat;
proxy_redirect off;
#后端的Web服务器可以通过X-Forwarded-For获取用户真实IP
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size 10m; #允许客户端请求的最大单文件字节数
client_body_buffer_size 128k; #缓冲区代理缓冲用户端请求的最大字节数
proxy_connect_timeout 90; #nginx跟后端服务器连接超时时间(代理连接超时)
proxy_send_timeout 90; #后端服务器数据回传时间(代理发送超时)
proxy_read_timeout 90; #连接成功后,后端服务器响应时间(代理接收超时)
proxy_buffer_size 4k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小
proxy_buffers 4 32k; #proxy_buffers缓冲区,网页平均在32k以下的话,这样设置
proxy_busy_buffers_size 64k; #高负荷下缓冲大小(proxy_buffers*2)
proxy_temp_file_write_size 64k; #设定缓存文件夹大小,大于这个值,将从upstream服务器传
}

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

# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}

# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}

# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}


# another virtual host using mix of IP-, name-, and port-based configuration
#
#server {
# listen 8000;
# listen somename:8080;
# server_name somename alias another.alias;

# location / {
# root html;
# index index.html index.htm;
# }
#}


# HTTPS server
#
#server {
# listen 443 ssl;
# server_name localhost;

# ssl_certificate cert.pem;
# ssl_certificate_key cert.key;

# ssl_session_cache shared:SSL:1m;
# ssl_session_timeout 5m;

# ssl_ciphers HIGH:!aNULL:!MD5;
# ssl_prefer_server_ciphers on;

# location / {
# root html;
# index index.html index.htm;
# }
#}

}

0x02 (tomcat7+nginx+memcached) 配置Session共享

原由: 先来说一下为什么要用到memcached,因为我的一台服务器上跑2个tomcat7,用了nginx负载均衡,这个时候2个tomcat7的Session就需要共享一致。所以这个时候memcached用上了。

首页构建一个web poject项目,用eclipse新建一个web项目test,该项目下新建一个index.jsp文件,编辑该文件内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<%@ page contentType="text/html; charset=UTF-8" %> 
<%@ page import="java.util.*" %>
<html><head><title>Cluster Test</title></head>
<body>
<%
//HttpSession session = request.getSession(true);
System.out.println(session.getId());
out.println("<br> SESSION ID:" + session.getId()+"<br>");
// 如果有新的请求,则添加session属性
String name = request.getParameter("name");
if (name != null && name.length() > 0) {
String value = request.getParameter("value");
session.setAttribute(name, value);
}
out.print("<b>Session List:</b>");
Enumeration<String> names = session.getAttributeNames();
while (names.hasMoreElements()) {
String sname = names.nextElement();
String value = session.getAttribute(sname).toString();
out.println( sname + " = " + value+"<br>");
System.out.println( sname + " = " + value);
}
%>
</body>
</html>

修改tomcat7\conf\server.xml

对应的另外两台tomcat分别是 tomcat7-1 tomcat7-2

言归正传,tomcat7+nginx+memcached 配置tomcat 集群以及负载均衡首先说一下这个memcached的jar包。我在部署的时候网上各种版本都有很气人。
jar清单:
使用的是memcached-session-manager-tc7-1.6.3 来进行的。
tomcate做session共享所需jar包
jar官网下载:http://code.google.com/p/memcached-session-manager/downloads/list

1
2
3
4
5
6
7
8
9
10
11
12
asm-3.2
javolution-5.4.3.1
kryo-1.04
kryo-serializers-0.8
memcached-session-manager-1.6.3
memcached-session-manager-tc7-1.6.3
minlog-1.2
msm-javolution-serializer-1.6.3
msm-kryo-serializer-1.6.3
msm-xstream-serializer-1.6.3
reflectasm-0.9
spymemcached-2.8.4

把上述说到的jar包下载下来后放到tomcat7/lib 目录下,修改另外2个tomcat7的配置文件tomcat7\conf\context.xml
  在标签之间加入如下代码:

1
2
3
4
5
6
7
8
<Manager
className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="n1:127.0.0.1:11211"
sticky="false"
sessionBackupAsync="false"
lockingMode="uriPattern:/path1|/path2"
requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"/>

说明:
这里的memcachedNodes是填写memcached节点,多个节点时可以以空隔分开,如: n1:localhost:11211 n2:localhost:11212 /localhost改为安装memcached的服务器的IP
sessionBackupTimeout 单位为分钟
修改后重启两个TOMCAT和nginx即可,这个时候已经解决SESSION的共享问题.

启动
然后启动memcached服务、启动nginx、启动2个tomcat7。在浏览器中输入localhost:8080/test/index.jsp 重复刷新发现session的值不变如下所示,session共享成功!
SESSION ID:76AC7C56C4B278ADFDEC6EA782192D15-n1.tomcat7-1

先写到这里,以上Windows系统上操作如上,后续补上linux的配置

0x03 centos7服务器配置 (tomcat7+nginx+memcached) 配置Session共享

上一篇是讲配置Windows篇,言归正传这一篇是讲centos7服务器上配置 Nginx+tomcat+memcached 配置Session共享

一步一步教你做

CentOS 7安装Nginx
CentOS 7安装Memcached
查看Memcached状态比较好的一款web后台管理工具是PHP写的要搭建PHP环境Memadmin

CentOS 7安装Nginx

参考借鉴:http://www.ssiyo.com/centos7_nginx1_9.html
参考借鉴:http://www.centoscn.com/nginx/2015/1007/6261.html

安装依赖的类库

1
2
3
4
5
6
7
8
9
10
11
yum install -y zlib zlib-devel openssl openssl-devel pcre pcre-deve

cd /usr/local/

mkdir nginx

cd nginx-1.9.9

./configure --prefix=/usr/local/nginx --with-http_stub_status_module

make && make install

nginx开机启动
vi /etc/rc.d/rc.local
加入如下:

1
2
/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
chmod +x /etc/rc.d/rc.local

nginx 启动

1
/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf

查看端口进程

1
2
ps -ef |grep nginx
netstat -ntlp

开始firewall端口服务

1
firewall-cmd --permanent --zone=public --add-service=http

/////////////////////////////////////////////////////////////////////
nginx 常用命令

1
2
3
/usr/local/nginx/sbin/nginx -s reload   
/usr/local/nginx/sbin/nginx -s stop
/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf

这里我安装好了以后启动nginx服务。到这个目录下面。/usr/local/nginx/sbin/
执行./nginx 就启动成功了。

0x04 Linux centos7 安装memcached

安装说明
安装环境:CentOS-7
安装方式:源码安装
软件:libevent-2.0.22-stable.tar.gz memcached-1.4.25.tar.gz
安装位置:/usr/local/libevent
/usr/local/memcached
下载地址官网
http://memcached.org/
http://libevent.org/

下载路径
wget http://www.memcached.org/files/memcached-1.4.25.tar.gz
wget https://sourceforge.net/projects/levent/files/libevent/libevent-2.0/libevent-2.0.22-stable.tar.gz

安装前提
Memcache用到了libevent这个库用于Socket的处理,所以还需要安装libevent,libevent的最新版本是libevent-2.0.22。(如果你的系统已经安装了libevent,可以不用安装)

安装libevent
将libevent-2.0.22-stable.tar.gz local创建libevent文件夹上传到/usr/local中执行以下操作:

1
2
3
4
5
6
7
8
mkdir -p /usr/local/libevent  //创建libevent目录
tar -zxvf libevent-2.0.21-stable.tar.gz // 解压压缩包
rm -rf libevent-2.0.21-stable.tar.gz // 删除压缩包
cd /libevent-2.0.21-stable

./configure -prefix=/usr/local/libevent //安装指定路径
make //编译
make install //安装

安装memcached,同时需要安装中指定libevent的安装位置:
将memcached-1.4.25.tar.gz文件上传到/usr/local中执行以下操作:

1
2
3
4
5
6
7
8
mkdir -p /usr/local/memcached //创建memcached目录
tar -zxvf memcached-1.4.25.tar.gz // 解压压缩包
rm -rf memcached-1.4.25.tar.gz // 删除压缩包
cd /usr/local/memcached-1.4.25

./configure -prefix=/usr/local/memcached --with-libevent=/usr/local/libevent 注:安装memcached时需要指定libevent的安装位置
make //编译
make install //安装

测试libevent是否安装成功:

1
[root@localhost libevent]#  ls -al /usr/local/libevent/lib/ | grep libevent

测试memcached是否安装成功:

1
[root@localhost libevent]#  ls -al /usr/local/memcached/bin/mem*

memcached必须启动才能完成服务,启动memcached:

1
[root@localhost lib]# /usr/local/memcached/bin/memcached -l 101.200.141.201 -d -p 11211 -u root -m 128  -P /usr/local/memcached/memcached.pid

具体各个参数的含义请看:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
-p 监听的端口  是设置Memcache监听的端口,这里设置11211,最好是1024以上的端口,
-l 连接的IP地址, 默认是本机 是监听的服务器IP地址,
-d start 启动memcached服务
-d restart 重起memcached服务
-d stop|shutdown 关闭正在运行的memcached服务
-d install 安装memcached服务
-d uninstall 卸载memcached服务
-u 以的身份运行 (仅在以root运行的时候有效) 是运行Memcache的用户,这里是root,
-m 最大内存使用,单位MB。默认64MB 是分配给Memcache使用的内存数量,单位是MB,这里是10MB,
-M 内存耗尽时返回错误,而不是删除项
-c 最大同时连接数,默认是1024 选项是最大运行的并发连接数,默认是1024,这里设置256,按照服务器的负载量来设定,
-f 块大小增长因子,默认是1.25-n 最小分配空间,key value flags默认是48
-h 显示帮助
-P :设置保存Memcache的pid文件 注:-P(P为大写)

结束memcached进程
如果要结束Memcache进程,执行:cat pid文件路径
kill 进程ID,具体如下

1
2
3
[root@localhost memcached]# cat memcached.pid
16741
[root@localhost memcached]# kill 16741

测试Memcached启动成功

1
2
 telnet 101.200.141.201 11211 
stats

退出当前状态:Ctrl+】+回车
telnet> quit telnet 就退出了。

防火墙开放11211端口
增加11211端口到防火墙配置中,执行以下操作:

1
[root@admin ~]# vi  /etc/sysconfig/iptables

增加以下代码

1
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 11211 -j ACCEPT

重启防火墙

1
[root@admin java]# service iptables restart

安装中遇到的问题
tomcat7\conf\context.xml在配置 transcoderFactoryClass=”de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory” 如果你是从网上下载的kryo-serializers-0.8.jar版本,需要使用0.10版本,
否则报错:Caused by: java.lang.ClassNotFoundException: de.javakaffee.kryoserializers.DateSerializer
贴出下载地址:https://repo1.maven.org/maven2/de/javakaffee/kryo-serializers/0.10/