写在前面
在Linux下,使用Nginx的反向代理、负载均衡,可以增强服务器主机CPU的利用率,提交系统的并发量,加大系统的稳定性(一台Tomcat出现问题了,还有其他Tomcat支撑着系统的运行),同时使用Redis可以解决多台Tomcat之间Session和文件共享的问题,从而实现Tomcat集群的搭建。
配置环境:Centos6.5,Tomcat8.0+Jdk1.8+Redis-4.0.5+Nginx-1.12
文章对多台Tomcat共存、Nginx安装配置、Nginx实现集群以及Session、文件共享、Tomcat集群配置二级域名等方面做了说明。若未安装Redis,需先安装Redis。
准备Tomcat
官网下载 tomcat.tar.gz 并上传到服务器上。
解压:tar -vxf tomcat.tar.gz
解压两次获得两台Tomcat,修改端口,确保两台Tomcat对应的端口不冲突。
tomcat8.0.1端口:
tomcat8.0.2端口:
更改完端口后启动Tomcat,并测试能够正常访问,此时可以发现访问项目时得到的Session是不一样的。
Nginx的安装
Nginx下载:Nginx官网
1.说明:Nginx官网下载下来的是源码,Nginx的编译需要c++,同时prce(重定向支持)和openssl(https支持)也需要安装。因此安装Nginx之前需要在linux上先安装对应的环境。
[root@admin home]# yum install gcc-c++
[root@admin home]# yum -y install pcre*
[root@admin home]# yum -y install openssl*
2.解压及编译
[root@admin home]# tar -zxvf nginx-1.12.2.tar.gz
3.进入Nginx目录:
cd nginx-1.12.2
4.设置安装目录为/usr/local/nginx:
./configure --prefix=/usr/local/nginx
5.编译和安装:
[root@admin nginx-1.12.2]# make
[root@admin nginx-1.12.2]# make install
6.启动nginx服务,进入安装目录 /usr/local/nginx
[root@admin home]# cd /usr/local/nginx/sbin
[root@admin sbin]# ./nginx
通过ip访问,若出现Welcome欢迎页面,则表示安装成功。停止服务命令:killall nginx
配置Nginx
vim更改配置文件nginx/conf/nginx.conf
#user nobody;
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
include /usr/local/nginx/conf/sites-enabled/*.conf; #加载配置文件,设置二级域名时使用
sendfile on;
keepalive_timeout 65;
upstream project_nginx{
#服务器配置,weight越大越有机会被访问到,15秒内出现3次错误,接
#下来30s内不再去访问该服务器
server 127.0.0.1:8080 weight=1 max_fails=3 fail_timeout=30s;
server 127.0.0.1:8081 weight=1 max_fails=3 fail_timeout=30s;
}
server {
listen 80;
server_name 域名;
charset utf-8;
#charset koi8-r;
access_log logs/host_access.log;
error_log logs/host_error.log;
location / {
proxy_set_header Host $host:80; #端口跟上面的一致
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://project_nginx;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
修改完配置后,重启Nginx,测试
可以发现,Nginx将访问随机代理给了服务器,但访问项目得到的Session依旧还是不一样的。
Redis实现Session共享
1.说明:案例用的是Tomcat8.0,不同的Tomcat版本会有不同的jar包,这里提供Tomcat8.0版本jar包的下载。将jar包移动到Tomcat安装的目录的lib文件夹下(2台Tomcat都需要进行此操作)。
该实现方式支持在一台主机,多台Tomcat的环境下实现Session共享,对于多台主机,多台tomcat并不适合。
3.修改配置:
<Valve className="com.demo.redis_session.RedisSessionHandlerValve" />
<Manager className="com.demo.redis_session.RedisSessionManager"
host="127.0.0.1"
port="6379"
database="0"
maxInactiveInterval="60" />
两台服务器配置完成后要记得重启,之后测试可发现,Nginx将访问随机代理给了服务器,得到的Session是一样的,清除Session时也是同时的,这样便实现了集群共享Session。
软链接实现文件共享
1.说明:此文件共享只在一台主机多个Tomcat情况下使用,不适合多台主机。
2.软链接实现:
ln -s /home/tomcat8.0.1/webapps/project/upload/ /home/tomcat8.0.2/webapps/project/
这里假设upload为文件上传文件夹,Tomcat8.0.1要存在upload文件夹,Tomcat8.0.2不需要upload文件夹,tomcat8.0.2使用软链接生成upload文件夹,类似于window系统下的快捷方式。也就是在Tomcat8.0.2下访问upload其实是访问Tomcat8.0.1下的upload文件夹。
在tomcat8.0.2/conf目录下修改context.xml,在<context></context>节点之间增加配置:
<Resources allowLinking="true" />
别忘了重启服务器,此时便实现了文件共享。
说说Tomcat集群配置二级域名
1.配置两台Tomcat的server.xml虚拟目录,在<Engine></Engine>结点之间配置虚拟主机
<Host name="二级域名" appBase="webapps"
unpackWARs="true" autoDeploy="true"
xmlValidation="false" xmlNamespaceAware="false">
<Alias>二级域名</Alias>
<Context path="" docBase="qgzx" reloadable="true"></Context>
</Host>
2.配置Nginx虚拟目录,更改配置文件nginx/conf/nginx.conf,在http{}下加载二级域名的配置文件目录。
include /usr/local/nginx/conf/sites-enabled/*.conf;
#加载配置文件,设置二级域名时使用
#include:表示请求时会将/usr/local/nginx/conf/sites-enabled 目录下的文件加载进来
#若没目录,则mkdir手动创建对应的目录
3.编写配置文件 demo_name.conf
upstream demo_nginx{
#服务器配置,weight越大越有机会被访问到,15秒内出现3次错误,接
#下来30s内不再去访问该服务器
server localhost:8080 weight=1 max_fails=3 fail_timeout=30s;
server localhost:8081 weight=1 max_fails=3 fail_timeout=30s;
}
server {
listen 80;
server_name 二级域名; #跟tomcat配置时的二级域名一样
charset utf-8;
access_log logs/name_access.log;
error_log logs/name_error.log;
location / {
proxy_set_header Host $host:80; #端口跟上面的一致
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://demo_nginx;
}
}
别忘了重启Nginx。
最后再说说
到此,便实现了基于Nginx的Tomcat集群搭建,Session和文件共享以及集群下二级域名的配置。文章的具体细节如有问题,欢迎指出,以便一同探讨和学习,十分感谢。