目录
4.2 nginx处理静态图片,Tomcat处理动态页面配置,两者相结合显示
前言
通常情况下,一个 Tomcat 站点由于可能出现单点故障及无法应付过多客户复杂多样的请求等情况,不能单独应用于生产环境下,所以我们需要一套更可靠的解决方案
Nginx 是一款非常优秀的 http 服务器软件,它能够支持高达 5000 个并发连接数的响应,拥有强大的静态资源处理能力,运行稳定,并且内存、CPU 等系统资源消耗非常低
目前很多大型网站都应用 Nginx 服务器作为后端网站的反向代理及负载均衡器,来提升整个站点的负载并发能力
一、Nginx实现负载均衡原理
1、 原理
Nginx服务器作为前端,Tomcat服务器作为后端,web页面请求由Nginx服务来进行转发。 但是不是把所有的web请求转发,而是将静态页面请求Nginx服务器自己来处理,动态页面请求,转发给后端的Tomcat服务器来处理。
据我们所知,Tomcat是属于轻量级的应用服务器,可接受访问量可能会不足,所以我们需要多台Tomcat服务器,然后通过Nginx配置权重来进行挑选Tomcat服务器去进行处理,负载均衡的一种策略。
Nginx服务器 1、首页使用精准匹配 2、静态页面使用正则匹配自己处理 3、动态页面使用正则匹配jsp结尾的请求,使用proxy_pass转发给Tomcat服务器。
如图所示:
2、Nginx静态处理优势
- Nginx处理静态页面的效率远高于Tomcat的处理能力
- 若Tomcat的请求量为1000次,则Nginx的请求量为6000次
- Tomcat每秒的吞吐量为0.6M,Nginx的每秒吞吐量为3 .6M
- Nginx处理静态资源的能力是Tomcat处理的6倍
3、Nginx动静分离原理
服务端接收来自客户端的请求中,既有静态资源也有动态资源,静态资源有Nginx提供服务,动态资源Nginx转发至后端。
二、 Nginx+Tomcat 动静分离
1、实验环境
服务器名 | IP地址 |
---|---|
nginx | 20.0.0.10 |
tomcat01 | 20.0.0.11 |
tomcat02 | 20.0.0.12 |
2、搭建nginx服务
[root@nginx01 ~]# yum -y install gcc gcc-c++ make pcre-devel zlib-devel
[root@nginx01 ~]# useradd -M -s /sbin/nologin nginx
[root@nginx01 ~]# tar zxvf nginx-1.12.2.tar.gz
[root@nginx01 ~]# cd nginx-1.12.2/
[root@nginx01 nginx-1.12.2]# ./configure \
> --prefix=/usr/local/nginx \
> --user=nginx \
> --group=nginx
[root@nginx01 nginx-1.12.2]# make && make install
[root@nginx1 nginx-1.12.2]# ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/ ##创建nginx命令软连接
[root@nginx1 nginx-1.12.2]# nginx -t ##检查语法
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
[root@nginx nginx-1.12.2]# vim /etc/init.d/nginx ##创建nginx启动脚本
#!/bin/bash
# chkconfig: - 99 20
# description: Nginx Service Control Script
PROG="/usr/local/nginx/sbin/nginx"
PIDF="/usr/local/nginx/logs/nginx.pid"
case "$1" in
start)
$PROG
;;
stop)
kill -s QUIT $(cat $PIDF)
;;
restart)
$0 stop
$0 start
;;
reload)
kill -s HUP $(cat $PIDF)
;;
*)
echo "Usage: $0 {start|stop|restart|reload}"
exit 1
esac
exit 0
[root@nginx nginx-1.12.2]# chmod +x /etc/init.d/nginx ##增加权限
[root@nginx nginx-1.12.2]# chkconfig --add nginx ##添加到service管理
[root@nginx nginx-1.12.2]# service nginx start ##开启nginx
[root@nginx nginx-1.12.2]# netstat -ntap |grep 80
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 66115/nginx: master
[root@nginx1 nginx-1.12.2]# systemctl stop firewalld.service ##关闭防火墙
[root@nginx1 nginx-1.12.2]# setenforce 0
3、搭建tomcat服务
[root@tomcat01 ~]# systemctl stop firewalld.service
[root@tomcat01 ~]# setenforce 0
[root@tomcat01 ~]# tar zxvf jdk-8u91-linux-x64.tar.gz -C /usr/local/
[root@tomcat01 ~]# vim /etc/profile
export JAVA_HOME=/usr/local/jdk1.8.0_91
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH
[root@tomcat01 ~]# source /etc/profile
[root@tomcat01 ~]# tar zxvf apache-tomcat-8.5.16.tar.gz -C /usr/local/
[root@tomcat01 ~]# cd /usr/local/
[root@tomcat01 local]# mv apache-tomcat-8.5.16/ tomcat
[root@tomcat01 local]# ln -s /usr/local/tomcat/bin/startup.sh /usr/local/bin/
[root@tomcat01 local]# ln -s /usr/local/tomcat/bin/shutdown.sh /usr/local/bin/
[root@tomcat01 local]# startup.sh
Using CATALINA_BASE: /usr/local/tomcat
Using CATALINA_HOME: /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME: /usr/local/jdk1.8.0_91/jre
Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Tomcat started.
[root@tomcat01 local]# netstat -ntap | grep 8080
tcp6 0 0 :::8080 :::* LISTEN 17841/java
4、动静分离配置过程
4.1 nginx显示静态页面,tomcat显示动态页面
nginx服务器添加静态页面
[root@nginx nginx-1.12.2]# vim /usr/local/nginx/conf/nginx.conf
server {
listen 80;
server_name localhost;
location ~.*.jsp$ { ##添加以下几行
proxy_pass http://20.0.0.11:8080; ##指向Tomcat服务器地址
proxy_set_header Host $host;
}
[root@nginx nginx-1.12.2]# cd /usr/local/nginx/html/
[root@nginx html]# vim index.html
<!DOCTYPE html>
<html>
<head>
<title>静态页面</title> ##修改标题
<meta http-equiv="content-type" content="text/html;charset=utf-8"> ##设置支持中文字符集
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>静态网站</h1> ##修改内容主题
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>这是一个静态网页.</em></p> ##设置页尾内容
</body>
</html>
[root@nginx html]# service nginx stop
[root@nginx html]# service nginx start
tomcat服务器添加动态服务器
[root@tomcat01 local]# cd /usr/local/tomcat/webapps/
[root@tomcat01 webapps]# mkdir test
[root@tomcat01 webapps]# vim test/index.jsp
<!DOCTYPE html>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import="java.util.Date" %>
<%@ page import="java.text.SimpleDateFormat" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>动态页面</title>
</head>
<body>
<div>动态页面</div>
</body>
</html>
4.2 nginx处理静态图片,Tomcat处理动态页面配置,两者相结合显示
●Tomcat指图片路径路径,nginx放图片
●目录名称需要和Java项目名称相同
[root@tomcat01 webapps]# vim /usr/local/tomcat/webapps/test/index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import="java.util.Date" %>
<%@ page import="java.text.SimpleDateFormat" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/ html4/loose.dtd">
<html>
<head>
<title>it works!</title>
</head>
<body>
<div> 这是动态页面</div>
<img src="a.jpg"/> ##指图片路径
</body>
</html>
[root@nginx html]# vim /usr/local/nginx/conf/nginx.conf
location ~.*\.(gif|jpg|jpeg|png|bmp|swf|css)$ { ##添加此段内容,匹配这些类型的文件
root html; ##html站点目录'
expires 30d; ##缓存时间30天'
}
[root@nginx ~]# cd /usr/local/nginx/html
[root@nginx html]# mkdir test
[root@nginx html]# cp /usr/local/nginx/html/a.jpg /usr/local/nginx/html/test/
[root@nginx html]# cd test/
[root@nginx test]# ll
总用量 52
-rw-r--r--. 1 root root 52848 12月 3 03:10 a.jpg
5、负载均衡配置过程
在配置一台tomcat服务器命名为tomcat02,和之前的nginxtomcat01一起实现负载均衡
tomcat02配置:
[root@tomcat02 ~]# tar zxvf jdk-8u91-linux-x64.tar.gz -C /usr/local/
[root@tomcat02 ~]# vim /etc/profile
export JAVA_HOME=/usr/local/jdk1.8.0_91
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH
[root@tomcat02 ~]# source /etc/profile
[root@tomcat02 ~]# tar zxvf apache-tomcat-8.5.16.tar.gz -C /usr/local/
[root@tomcat02 ~]# cd /usr/local/
[root@tomcat02 local]# mv apache-tomcat-8.5.16/ tomcat
[root@tomcat02 local]# ln -s /usr/local/tomcat/bin/startup.sh /usr/local/bin/
[root@tomcat02 local]# ln -s /usr/local/tomcat/bin/shutdown.sh /usr/local/bin/
[root@tomcat02 local]# startup.sh
Using CATALINA_BASE: /usr/local/tomcat
Using CATALINA_HOME: /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME: /usr/local/jdk1.8.0_91/jre
Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Tomcat started.
[root@tomcat02 local]# netstat -ntap | grep 8080
tcp6 0 0 :::8080 :::* LISTEN 17841/java
nginx配置文件修改
[root@nginx nginx-1.12.2]# vim /usr/local/nginx/conf/nginx.conf
...省略内容
#gzip on;
upstream tomcat-server { '添加节点服务器地址'
server 20.0.0.11:8080 weight=1;
server 20.0.0.12:8080 weight=1;
}
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root html;
index index.html index.htm;
proxy_pass http://tomcat_server; '设置转发到节点服务器'
}
...省略内容
[root@nginx ~]# systemctl restart nginx
tomcat01配置文件
[root@tomcat01 local]# mkdir -pv /web/webapp1
[root@tomcat01 local]# vim /web/webapp1/index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<head>
<title>JSP test1 page</title>
</head>
<body>
<% out.println("Welcome tomcat01 Web");%>
</body>
</html>
[root@tomcat01 local]# vim /usr/local/tomcat/conf/server.xml
......148行处修改
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">
<Context docBase="/web/webapp1" path="" reloadable="false"> ####添加此段站点信息
</Context>
[root@tomcat001 tomcat]# shutdown.sh ##关闭服务
[root@tomcat01 tomcat]# startup.sh ##开启服务
tomcat02配置文件:
[root@tomcat02 local]# mkdir -pv /web/webapp1
[root@tomcat02 local]# vim /web/webapp1/index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<head>
<title>JSP test1 page</title>
</head>
<body>
<% out.println("Welcome tomcat02 Web");%>
</body>
</html>
[root@tomcat02 local]# vim /usr/local/tomcat/conf/server.xml
......148行处修改
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">
<Context docBase="/web/webapp1" path="" reloadable="false"> ####添加此段站点信息
</Context>
[root@tomcat02 tomcat]# shutdown.sh ##关闭服务
[root@tomcat02 tomcat]# startup.sh ##开启服务
验证:浏览器出入nginx地址20.0.0.10会轮询
总结
在生产环境中,Tomcat server 的硬件配置可能不尽相同,可以通过修改相应服务器的 weight 值,对配置较高或配置较低的服务器的访问请求进行分配控制