一、动静分离原理
动静分离总的来说就是把请求到服务端的动态请求和静态资源的请求分离开,这样在请求
量很大的时候能够缓解服务端的压力。之前项目需要用到nginx 和tomcat 结合来实现动静
分离和负载均衡,在这里整理一下做为总结。
服务端接收来自客户端的请求中,有一部分是静态资源的请求,例如html,css,js和图片
资源等等,有一部分是动态数据的请求。因为tomcat处理静态资源的速度比较慢,所
以我们可以考虑把所有静态资源独立开来,交给处理静态资源更快的服务器例如nginx
处理,而把动态请求交给tomcat处理。
二、动静分离的实现
注:本文是在 centos-6.5 64 位操作系统搭建的
1.java环境安装
首先下载 jdk、tomcat 和 nginx 的安装包,可到各大官网下载,这里我的jdk用的是1.7版本,tomcat 用的是8.0版本,nginx 用的是1.7.7版本。
jdk 安装
//解压到 /usr/local/java/目录
# tar -zxvf jdk-7u67-linux-x64.tar.gz -C /usr/local/java/
//配置环境变量
# vi /etc/profile
在最后加入以下几行:
JAVA_HOME=/usr/java/jdk1.7.0_71
CLASS_PATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
PATH=$JAVA_HOME/bin:$PATH
exportJAVA_HOMECLASS_PATHPATH
执行下面命令立即生效
# source /etc/profile
2.tomcat 安装
1>解压安装tomcat源码包
#tar -zxvf apache-tomcat-8.5.6.tar.gz -C /usr/local/tomcat/
2>配置tomcat的环境变量:
[root@localhost ~]# vi /etc/profile.d/tomcat.sh
添加内容:
export CATALINA_HOME=/usr/local/tomcat
export PATH=$PATH:$CATALINA_HOME/bin
[root@node3 tomcat]# catalina.sh version #查看tomcat版本
Using CATALINA_BASE: /usr/local/tomcat
Using CATALINA_HOME: /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME: /home/java/jdk1.7.0_79
Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Server version: Apache Tomcat/8.5.6
Server built: Oct 6 2016 20:15:31 UTC
Server number: 8.5.6.0
OS Name: Linux
OS Version: 2.6.32-642.4.2.el6.x86_64
Architecture: amd64
JVM Version: 1.7.0_79-b15
JVM Vendor: Oracle Corporation
catalina.sh start #启动tomcat
catalina.sh stop #停止tomcat
netstat -tnlp | grep java #8080端口是否处于监听状态
tcp 0 0 ::ffff:127.0.0.1:8005 :::* LISTEN 10428/java
tcp 0 0 :::8009 :::* LISTEN 10428/java
tcp 0 0 :::8080 :::* LISTEN 10428/java
3>tomcat开机启动
vim /etc/init.d/tomcat
添加 脚本如下:
# Tomcat init script for Linux.
#
# chkconfig: 2345 96 14
# description: The Apache Tomcat servlet/JSP container.
JAVA_HOME=/home/java/jdk1.7.0_79
CATALINA_HOME=/usr/local/tomcat
export JAVA_HOME CATALINA_HOME
# export CATALINA_OPTS="-Xms128m -Xmx256m"
exec $CATALINA_HOME/bin/catalina.sh $*
chmod +x /etc/init.d/tomcat
chkconfig tomcat on
4>tomcat管理界面
添加tomcat管理用户
vim /usr/local/tomcat/conf/tomcat-users.xml
脚本示例1:
<role rolename="manager"/>
<role rolename="manager-gui"/>
<user username="tomcat" password="tomcat" roles="manager-gui,manager"/>
脚本示例2:
<role rolename="tomcat"/>
<role rolename="role1"/>
<role rolename="manager"/>
<role rolename="manager-gui"/>
<role rolename="admin"/>
<role rolename="admin-gui"/>
<role rolename="manager-script"/>
<role rolename="manager-jmx"/>
<role rolename="manager-status"/>
<user username="tomcat" password="tomcat" roles="tomcat"/>
<user username="both" password="tomcat" roles="tomcat,role1"/>
<user username="role1" password="tomcat" roles="role1"/>
<user username="admin" password="admin" roles="tomcat,role1"/>
<user username="tomcat" password="" roles="manager-gui"/>
<user username="Tomcat" password="Tomcat" roles="admin-gui,admin,manager-gui,manager,manager-script,manager-jmx,manager-status"/>
</tomcat-users>
同时还需要修改,如无新建conf/Catalina/localhost/manager.xml 内容如下:
vim /usr/local/tomcat/conf/Catalina/localhost/manager.xml
<Context privileged="true" antiResourceLocking="false"
docBase="${catalina.home}/webapps/manager">
<Valve className="org.apache.catalina.valves.RemoteAddrValve" allow="^.*$" />
</Context>
5>修改日志格式
修改tomcat的默认日志格式,方便查看通过代理服务器访问的客户端真实ip。
在server.xml配置文件中修改pattern部分:
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log" suffix=".txt"
pattern="%{X-Real-IP}i %h %l %u %t %D %r %s %b" />
配置后的日志:172.18.109.207 172.18.109.234 - - [06/Nov/2016:17:30:24 +0800] 24 GET /dd_number/homepage.jspx HTTP/1.0 200 192
重启tomcat即可生效。
3.安装nginx
//在nginx包的目录解压nginx,可解压缩到任意目录,这里解压缩到当前目录
# tar zxvf nginx-1.7.7.tar.gz
//进入nginx-1.7.7目录,进行编译
# cd nginx-1.7.7
# ./configure --prefix=/usr/loacl/nginx/
# make && make install
nginx需要编译,所以发现无法编译,那么可能是机器没有安装编译环境,需要安装编译环境,执行如下命令:
yum -y installgccgcc-c++ autoconfautomake
yum -y installzlibzlib-developensslopenssl-develpcre-devel
4.配置动静分离
这里主要是配置 nginx 的nginx.conf 文件,nginx 的配置可以参考网上其他资料,这里不做详细描述。
进入 /usr/local/nginx/conf/ 目录,编辑 nginx.conf 文件
# cd /usr/local/nginx/conf/
# vi nginx.conf
这里我们主要修改的是http模块里面的server节点,其他配置不用改,配置如下:
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root html/java;
index index.html index.htm index.php index.jspx;
}
location ~ \.(jsp|jspx|do)$ {
proxy_redirect off;
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;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
proxy_pass http://www.tomcat.com:8080;
}
#注意:一般讲动态请求代理到tomcat即可实现基本的动静分离,但有时可能仍有静态内容被代理到tomcat,因而添加如下规则加强动静分离。
location ~ \.(gif|jpg|png|bmp|swf|html|js|css|htm)${
root /usr/local/nginx/html/java;
expires 10d; #在客户端浏览器存放的天数
}
}
其中 listen 表示nginx监听的端口,server_name是nginx对外提供访问的ip或者域名,root是nginx存放资源的路径。
下面的两个 location 节点就是动静分离的配置了,location有下面6种匹配方式:
=:精确匹配
空修饰符且精确匹配
^~:匹配前面
~:使用正则表达式匹配,大小写敏感
~*:使用正则表达式匹配,大小写不敏感,和4没有高低之分
空修饰符且前面匹配
这里我们用第4种 ~ ,使用正则表达式,并且大小写敏感,第一个 location 表示以 .jsp 结尾的请求,我们利用
反向代理的方式,把请求转发给tomcat进行处理,其中 proxy_pass 需要配置tomcat的ip。我们也可以配置restful api形式
的请求,例如我们想把请求接口的 url 里面带有字母 a 的请求转发给 tomcat 进行处理,我们可以配置 location ~ a 即可。
第二个location表示以 .gif .jpg .js 等结尾的请求,我们直接到nginx的root目录里面获取资源,这定义用户浏览器缓存的
时间为10天,如果静态页面不常更新,可以设置更长,这样可以节省带宽和缓解服务器的压力。
至此,我们已经配置好动静分离了,启动nginx和tomcat就可以了。
5.负载均衡的实现
配置好动静分离,那么负责负载也就很简单了。负载均衡就是将 tomcat 的动态请求分摊到多个 tomcat 执行,
这个在请求量很大的时候能缓解服务端的压力,主要的配置是在 nginx.conf 的配置文件的http节点里面添加 upstream 节点,如下:
upstream tomcats{
server 10.11.68.56:8080 weight=1;
server 10.11.68.57:8080 weight=1;
server 10.11.68.58:8080 weight=1;
}
server {
listen 80;
(责任编辑:liangzh) |