目录
前言
通常情况下,一个Tomcat站点由于可能出现单点故障及无法应付过多客户复杂多样的请求等问题,不能单独应用于生产环境中,这时就需要nginx服务器作为后端网站程序的反向代理及负载均衡器,来提升整个站点的负载并发能力。
一、项目详情
1、项目工作分布
由Nginx作为负载均衡器,Tomcat作为应用服务器的负载集群的设置方法。
Nginx服务器作为前端,Tomcat服务器作为后端,web页面请求由Nginx服务来进行转发。
但是不是把所有的web请求转发,而是将静态页面请求Nginx服务器自己来处理,动态页面请求,转发给后端的Tomcat服务器来处理。
据我们所知,Tomcat是属于轻量级的应用服务器,可接受访问量可能会不足,所以我们需要多台Tomcat服务器,然后通过Nginx配置权重来进行挑选Tomcat服务器去进行处理,负载均衡的一种策略。
2、Nginx负载均衡
Nginx是一款非常优秀的 http服务器软件,它能够支持高达50000个并发连接数的响应,拥有强大的静态资源处理能力,运行十分的稳定,并且内存、CPU等系统资源消耗非常低。目前很多大型网站都应用Nginx服务器作为后端网站程序的反向代理及负载均衡器,来提升整个站点的负载并发能力。
二、环境部署
主机 | 操作系统 | IP地址 | 安装软件 |
Nginx | CentOS7.4 | 192.168.159.11 | nginx-1.12.2.tar.gz |
Tomcat | CentOS7.4 | 192.168.159.20 | apache-tomcat-9.0.16.tar.gz、jdk-8u201-linux-x64.rpm |
Tomcat | CentOS7.4 | 192.168.159.50 | apache-tomcat-9.0.16.tar.gz、jdk-8u201-linux-x64.rpm |
三、Nginx与Tomcat安装
1、Nginx安装
1-1、关闭防火墙及开机自启
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# systemctl disable firewalld
Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
[root@localhost ~]# setenforce 0
1-2、脚本一键安装nginx
#!/bin/bash
#======编译安装nginx服务======
#安装所需开发包和编译环境、编译器
yum -y install pcre-devel zlib-devel openssl-devel gcc gcc-c++ make
#创建程序用户,便于准确控制访问
useradd -M -s /sbin/nologin nginx
#解压安装包
cd /opt
tar zxvf nginx-1.12.2.tar.gz -C /opt/
#指定安装路径、指定用户名、组名、启用模块以支持统计状态
cd nginx-1.12.2/
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module --with
-file-aio --with-http_gzip_static_module --with-http_flv_module --with-http_ssl_module
#编译及安装
make && make install
#软链接便于系统识别nginx操作命令
ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
#添加nginx系统服务
echo '[Unit]
Description=nginx
After=network.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStart=/usr/local/nginx/sbin/nginx
ExecrReload=/bin/kill -s HUP $MAINPID
ExecrStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target' > /lib/systemd/system/nginx.service
#赋权及开启服务、开启开机自启
chmod 754 /lib/systemd/system/nginx.service
systemctl start nginx.service
systemctl enable nginx.service
1-3、验证
2、部署两台Tomcat
#!/bin/bash
#关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
#安装JDK
cd /opt
rpm -qpl jdk-8u201-linux-x64.rpm
rpm -ivh jdk-8u201-linux-x64.rpm
java -version
#设置JDK环境变量
echo 'export JAVA_HOME=/usr/java/jdk1.8.0_201-amd64
export CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar
export PATH=$JAVA_HOME/bin:$PATH' > /etc/profile.d/java.sh
source /etc/profile
#安装启动Tomcat
cd /opt
tar zxvf apache-tomcat-9.0.16.tar.gz
mv apache-tomcat-9.0.16 /usr/local/tomcat
/usr/local/tomcat/bin/startup.sh
执行脚本:
验证结果:
3、动静分离配置
3-1、Tomcat Server 1
IP:192.168.159.20
[root@localhost ~]# mkdir /usr/local/tomcat/webapps/lic
[root@localhost ~]# vim /usr/local/tomcat/webapps/lic/index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<head>
<title>JSP test2 page</title>
</head>
<body>
<% out.println("动态页面:蓦然回首");%>
</body>
</html>
[root@localhost ~]# vim /usr/local/tomcat/conf/server.xml
<Host name="tomcat1" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">
<Context docBase="/usr/local/tomcat/webapps/lic" path="" reloadable="true" />
</Host>
#配置详解
Host name :主机名
appBase : Tomcat程序工作目录,相对路径为webapps,绝对路为/usr/local/tomcat/webapps
unpackWARs :tomcat在webapps文件夹中发现war包文件时,是否自动将其解压
autoDeploy :设为true,则web.xml发生变化时,tomcat自动重新部署程序。实现这个功能必需允许后台处理xmlvalidation :是否开启对XML文件的验证
xmlNamespaceAware :是否启用xml命名空间,设置该值与xmlValidation为true,表示对web.xml文件执行有效性检验
docBase : wEB应用的目录(本地路径)
path:设置访问的URI为WEB应用的根目录(URL路径),""表示默认,加载系统中自带的类(class文件)
reloadable :是否在程序有改动时重新载入
[root@localhost ~]# /usr/local/tomcat/bin/shutdown.sh
[root@localhost ~]# /usr/local/tomcat/bin/startup.sh
3-2、Tomcat Server 2
IP:192.168.159.50
[root@localhost ~]# mkdir /usr/local/tomcat/webapps/lic
[root@localhost ~]# vim /usr/local/tomcat/webapps/lic/index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<head>
<title>JSP test2 page</title>
</head>
<body>
<% out.println("动态页面:那人却在灯火阑珊处");%>
</body>
</html>
[root@localhost ~]# vim /usr/local/tomcat/conf/server.xml
<Host name="tomcat2" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">
<Context docBase="/usr/local/tomcat/webapps/lic" path="" reloadable="true" />
</Host>
[root@localhost ~]# /usr/local/tomcat/bin/shutdown.sh
[root@localhost ~]# /usr/local/tomcat/bin/startup.sh
4、Nginx server配置
4-1、静态页面配置
[root@localhost ~]# echo '<html><body><h1>这是默认目录静态页面</h1></body></html>' > /usr/local/nginx/html/index.html
[root@localhost ~]# cat /usr/local/nginx/html/index.html
<html><body><h1>这是默认目录静态页面</h1></body></html>
[root@localhost ~]# mkdir /usr/local/nginx/html/tupian
[root@localhost ~]# cd /usr/local/nginx/html/tupian
[root@localhost tupian]# rz -E
rz waiting to receive.
[root@localhost tupian]# ls
qiche.jpg
[root@localhost tupian]# vim /usr/local/nginx/conf/nginx.conf
#gzip on;
upstream tomcat_server {
server 192.168.159.20:8080 weight=1;
server 192.168.159.50:8080 weight=1;
}
server {
listen 80;
server_name www.accp.com;
charset utf-8;
#access_log logs/host.access.log main;
location ~ .*.jsp$ {
proxy_pass http://tomcat_server;
proxy_set_header HOST $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|css)$ {
root /usr/local/nginx/html/tupian;
expires 10d;
}
location / {
root html;
index index.html index.htm;
}
5、测试
5-1、测试静态页面效果
浏览器访问http://192.168.159.11/
浏览器访问http://192.168.159.11/qiche.jpg
5-2、测试负载均衡效果,不断刷新浏览器测试
浏览器访问http://192.168.159.11/lic/index.jsp
总结
可将两个或多个Tomcat server放到Nginx的 upstream中组成一个负载均衡集群,然后通过proxy_pass这种Web代理的方式在location中设置集群站点,然后再通过weight值来分别对Tomcat server进行权重的设置。
在生产环境中,Tomcat server的硬件配置可能不尽相同,可以通过修改相应服务器的weight值,对配置较高或配置较低的服务器的访问请求进行分配控制。