CentOS 7通过Nginx反向代理实现多Tomcat负载均衡
一、JDK1.8 环境搭建
1、上传文件解压
[root@localhost tmp]# tar -zxvf jdk-8u172-linux-x64.tar.gz -C /opt
[root@localhost tmp]# cd /opt
[root@localhost opt]# mv jdk1.8.0_161 jdk1.8
2、检查环境,已经安装删除
[root@localhost mysoft]# ps -aux|grep java
[root@localhost mysoft]# rpm -e --nodeps rpm -qa | grep java
3、配置环境变量
[](javascript:void(0)😉
[root@localhost /]# vim /etc/profile
# 文件末尾追加 下面内容 shit+g 跳到文件末尾
# JAVA_HOME
export JAVA_HOME=/opt/jdk1.8
export PATH=$PATH:$JAVA_HOME/bin#注意添加完成后需要执行命令配置生效[root@localhost /]# source /etc/profile
[](javascript:void(0)😉
4、检测安装成功
[root@localhost /]# java -version
openjdk version "1.8.0_161"
OpenJDK Runtime Environment (build 1.8.0_161-b14)
OpenJDK 64-Bit Server VM (build 25.161-b14, mixed mode)
二、TOMCAT8 安装
1、上传安装包
[root@localhost tmp]# tar -zxvf apache-tomcat-8.5.40.tar.gz -C /opt
[root@localhost opt]# mv apache-tomcat-8.5.40 tomcat8
2、启动服务
[root@localhost bin]# pwd
/opt//tomcat8/bin
[root@localhost bin]# ./startup.sh
3、访问测试
http://127.0.0.1:8080/
4、一台服务器配置多个tomcat
需要注意的是多台tomcat配置在同一个机器上避免冲突,需要修改端口
在opt下复制tomcat8改名为tomcat,然后进入到conf目录下修改server.xml文件
vi /opt/tomcat/conf/server.xml
具体修改内容如下:
同时为了体现出各个Tomcat的区别,顺便修改一下各个tomcat的index.jsp文件用于区分tomcat
vi /opt/tomcat/webapps/ROOT/index.jsp
三、Nginx的安装
步骤 1: 添加 yum 源
Nginx 不在默认的 yum 源中,可以使用 epel 或者官网的 yum 源,本例使用官网的 yum 源。
$ sudo rpm -ivh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
安装完 yum 源之后,可以查看一下。
[](javascript:void(0)😉
[root@localhost ~]# sudo yum repolist
已加载插件:fastestmirror
Loading mirror speeds from cached hostfile
* base: mirrors.huaweicloud.com
* extras: mirrors.huaweicloud.com
* updates: mirrors.aliyun.com
源标识 源名称 状态
base/7/x86_64 CentOS-7 - Base 10,070
extras/7/x86_64 CentOS-7 - Extras 413
mysql-connectors-community/x86_64 MySQL Connectors Community 175
mysql-tools-community/x86_64 MySQL Tools Community 120
mysql56-community/x86_64 MySQL 5.6 Community Server 564
nginx/x86_64 nginx repo 206
updates/7/x86_64 CentOS-7 - Updates 1,134
repolist: 12,682
[](javascript:void(0)😉
可以发现 nginx repo
已经安装到本机了。
步骤 2: 安装
yum 安装 Nginx,非常简单,一条命令。
$ sudo yum install nginx
步骤 3: 配置 Nginx 服务
设置开机启动
$ sudo systemctl enable nginx
启动服务
$ sudo systemctl start nginx
停止服务
$ sudo systemctl restart nginx
重新加载,因为一般重新配置之后,不希望重启服务,这时可以使用重新加载。
$ sudo systemctl reload nginx
步骤 4: 打开防火墙端口
默认 CentOS7 使用的防火墙 firewalld 是关闭 http 服务的(打开 80 端口)。
$ sudo firewall-cmd --zone=public --permanent --add-service=http
success
$ sudo firewall-cmd --reload
success
打开之后,可以查看一下防火墙打开的所有的服务
$ sudo firewall-cmd --list-service
ssh dhcpv6-client http
可以看到,系统已经打开了 http 服务。
Nginx 是一个很方便的反向代理,需要指出的是 CentOS 7 的 SELinux,使用反向代理需要打开网络访问权限。
$ sudo setsebool -P httpd_can_network_connect on
打开网络权限之后,反向代理可以使用了。Nginx安装文件默认在/etc/nginx目录下,
然后直接访问服务器IP,若出现以下信息则说明到这里我们的Nginx就安装成功了!
四、配置Nginx完成反向代理、负载均衡
修改Nginx配置文件,注意特别注意:http里面默认的东西需要全部删除
vi nginx.conf
[](javascript:void(0)😉
events {
# 各工程最大连接数
worker_connections 1024;
}
http {
# upstream 各服务器地址以及权重,权重越大代表访问率越大
upstream alie.com {
server xxx.xx.xx.66:8081 weight=2;
server xxx.xx.xx.66:8080 weight=1;
}
server {
# 端口默认80
# 配置域名,由于没有域名,因此使用localhost
server_name localhost;
location / {
# 反向代理,这里的地址与上面配置的upstream需一致,实现负载均衡
proxy_pass http://alie.com;
proxy_redirect default;
}
}
}
[](javascript:void(0)😉
重启Nginx并进行访问测试
$ sudo systemctl reload nginx
直接访问服务器的80端口,Nginx便会通过反向代理将请求转发至配置好的服务器集群中,通过不断刷新即可发现可以访问不同的tomcat。
至此,使用Nginx通过反向代理实现负载均衡就已经完成啦。
五、绑定其他端口
Nginx 默认绑定的端口是 http 协议的默认端口,端口号为:80
,如果需要绑定其他端口,需要注意 SELinux 的配置
例如:绑定 8081 端口,但是会发现无法启动,一般的报错如下
YYYY/MM/DD hh:mm:ss [emerg] 46123#0: bind() to 0.0.0.0:8081 failed (13: Permission denied)
此时需要更改 SELinux 的设置。我们使用 SELinux 的管理工具 semanage
进行操作,比较方便。
安装 semanage
使用如下命令
$ sudo yum install policycoreutils-python
然后查看是否有其他协议类型使用了此端口
$ sudo semanage port -l | grep 8081
transproxy_port_t tcp 8081
返回了结果,表明已经被其他类型占用了,类型为 transproxy_port_t
。
我们还要查看一下 Nginx 的在 SELinux 中的类型 http_port_t
绑定的端口
$ sudo semanage port -l | grep http_port_t
http_port_t tcp 80, 81, 443, 488, 8008, 8009, 8443, 9000
pegasus_http_port_t tcp 5988
第一行 http_port_t
中没有包含 8081
这个端口。因此需要修改 8081
端口到 http_port_t
类型中。
$ sudo semanage port -m -p tcp -t http_port_t 8081
如果没有其他协议类型使用想要绑定的端口,如 8001
,则我们只要新增到 SELinux 中即可。
$ sudo semanage port -l | grep 8001
$ sudo semanage port -a -p tcp -t http_port_t 8001
此时,重新启动 Nginx 即可。
六、安装redis 同步session的作用
1、下载fedora的epel仓库
yum install epel-release
2、安装redis数据库
yum install redis
3、常见命令介绍
[](javascript:void(0)😉
systemctl start redis #启动服务
systemctl stop redis #停止服务
systemctl restart redis #重启服务
systemctl status redis #查看服务状态
systemctl enable redis #设置开机自启动
ps -ef | grep redis #查看redis进程
netstat -lnp|grep 6379 #查看端口
[](javascript:void(0)😉
在centos7.3默认安装readis后配置文件在/etc/目录下
4.修改redis配置文件
vi /etc/redis.conf
修改配置文件redis.conf 大概在55行左右。修改bind 后面的ip为 0.0.0.0 即可,
七、配置tomcat session redis同步
通过TomcatClusterRedisSessionManager,这种方式支持redis3.0的集群方式,下载tomcat-cluster-redis-session-manager.zip包,解压放到tomcat/lib下
注意:在github要下载最新版的包
在tomcat/conf/context.html这个标签里面配置,切记tomcat关闭哦
[](javascript:void(0)😉
<Context>
<WatchedResource>WEB-INF/web.xml</WatchedResource>
<Valve className ="tomcat.request.session.redis.SessionHandlerValve"/>
<Manager className ="tomcat.request.session.redis.SessionManager"/>
host="127.0.0.1"
port="6379"
password="" 如果设置了密码则在这里配置上
database="0" redis默认16个database 第一个是0 最后一个是15
maxInactiveInterval="60" />
</Context>
[](javascript:void(0)😉
配置会话到期时间在…/conf/web.xml
<session-config>
<session-timeout>60</session-timeout>
</session-config>
启动tomcat服务
[root@localhost bin]# cd /opt/tomcat1/bin/
[root@localhost bin]# ./startup.sh
[root@localhost bin]# cd /opt/tomcat2/bin/
[root@localhost bin]# ./startup.sh
测试,增加文件
在tomcat/webapps/ROOT新建文件session.jsp
[root@localhost ROOT]# vi /opt/tomcat1/webapps/ROOT/session.jsp
文件内容如下:
[](javascript:void(0)😉
<%@page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<head>
<title>tomcat-1</title>
</head>
<body>
<h1><font color="red">Session serviced by tomcat</font></h1>
<table aligh="center" border="1">
<tr>
<td>Session ID</td>
<td><%=session.getId() %></td>
<% session.setAttribute("abc","abc");%>
</tr>
<tr>
<td>Created on</td>
<td><%= session.getCreationTime() %></td>
</tr>
</table>
tomcat-1
</body>
<html>
[](javascript:void(0)😉
Tomcat-1节点与tomcat-2节点配置相同,测试,我们每次强刷他的sessionID都是一致的,所以我们认为他的session会话保持已经完成,你们也可以选择换个客户端的IP地址来测试
<tr>
<td>Created on</td>
<td><%= session.getCreationTime() %></td>
</tr>
</table>
tomcat-1
</body>
```
[[外链图片转存中…(img-SSpZgouJ-1606101939755)]](javascript:void(0)😉
Tomcat-1节点与tomcat-2节点配置相同,测试,我们每次强刷他的sessionID都是一致的,所以我们认为他的session会话保持已经完成,你们也可以选择换个客户端的IP地址来测试
[外链图片转存中…(img-YmX5mNSI-1606101939764)]
[外链图片转存中…(img-iSy8bhbN-1606101939767)]