什么是动静分离

为了提高网站的响应速度,减轻程序服务器(Tomcat,Jboss等)的负载,对于静态资源比如图片,js,css等文件,我们可以在反向代理服务器中进行缓存,这样浏览器在请求一个静态资源时,代理服务器就可以直接处理,而不用将请求转发给后端服务器。用户请求的动态文件比如servlet,jsp则转发给Tomcat,Jboss服务器处理,这就是动静分离。这也是反向代理服务器的一个重要的作用。

本文的动静分离主要是通过nginx+tomcat来实现,其中nginx处理图片、html、JS、CSS等静态文件,tomcat处理jsp、servlet等动态请求。

基础知识了解完后,咱们来具体实践一下动静分离的感觉。负载均衡在这篇博客就不在介绍了,但是同样会配置出来,实现动静分离和负载均衡的效果。

拓扑环境

服务器名称

系统版本

预装软件

IP地址

Nginx服务器

CentOS 7 最小安装

Nginx

192.168.22.228

Web服务器A

CentOS 7 最小安装

tomcat+jdk

192.168.22.229

Web服务器B

CentOS 7 最小安装

tomcat+jdk

192.168.22.230

Nginx服务器做负载均衡和动静分离,服务器A,B做集群。

前置条件

Nginx安装:http://blog.csdn.net/u010028869/article/details/50444801 
Tomcat安装配置:http://blog.csdn.net/u010028869/article/details/50379304 
负载均衡实现:http://blog.csdn.net/u010028869/article/details/50485245

建立JSP动态页面

<%@ page language="java" contentType="text/html; charset=GB18030"

pageEncoding="GB18030"%>

<HTML>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=GB18030">

<title>Nginx动静分离测试</title>

</head>

<body>

<h1>您正在访问:192.168.22.229</h1>

<img src="/drp/img/girl.jpg"  alt="女孩" />

</body>

</html>

Jsp放到drp目录中,添加一个图片标签,加载Tomcat根目录下 webapps/drp/img/girl.jpg图片文件。启动Tomcat测试是否能够访问。

浏览器输入网址:http://192.168.22.229:8080/drp/index.jsp

在228服务器上同样建立上述文件和目录,不在叙述。

对Nginx进行配置

通过配置location,对访问的请求进行拦截,①②都需要配置。

全部的请求均转发给Tomcat进行处理

location / {

proxy_next_upstream http_502 http_504 error
timeout invalid_header;

proxy_pass http://mycluster;

# 真实的客户端IP

proxy_set_header   X-Real-IP        $remote_addr;

# 请求头中Host信息

proxy_set_header   Host             $host;

# 代理路由信息,此处取IP有安全隐患

proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;

# 真实的用户访问协议

proxy_set_header   X-Forwarded-Proto $scheme;

}

个别的请求比如:htmljscss等静态资源请求,由Nginx进行处理

#静态文件交给nginx处理

location ~ .*\.(htm|html|gif|jpg|jpeg|png|bmp|swf|ioc|rar|zip|txt|flv|mid|doc|ppt|pdf|xls|mp3|wma)$

{

root /usr/local/webapps;

expires 30d;

}

#静态文件交给nginx处理

location ~
.*\.(js|css)?$

{

root /usr/local/webapps;

expires 1h;

}

root
/usr/local/webapps;
 这段代码的意思是指定Nginx访问的目录,即静态资源所在的目录。

expires 30d; 指定这些资源文件在客户端浏览器的缓存时间。30d指的是30天,1h指的是1小时。

完整的Nginx配置文件

user nobody;

worker_processes 2;

events{

worker_connections 1024;

}

http{

#设置默认类型为二进制流

default_type   
application/octet-stream;

server_names_hash_bucket_size   128;

#指定来自客户端请求头的headerbuffer大小,设置为32KB

client_header_buffer_size   32k;

#指定客户端请求中较大的消息头的缓存最大数量和大小,这里是4个32KB

large_client_header_buffers 4 32k;

#上传文件大小

client_max_body_size 356m;

#nginx的HttpLog模块指定,指定nginx日志的输出格式,输出格式为access

log_format access '$remote_addr - $remote_user [$time_local] "$request" '

'$status $body_bytes_sent "$http_referer" '

'"$http_user_agent" "$http_x_forwarded_for"';

#access日志存在未知

access_log  /var/log/nginx/access.log   access;

#开启高效模式文件传输模式,将tcp_nopush和tcp_nodelay两个指另设置为on,用于防止网络阻塞。

sendfile    on;

tcp_nopush  on;

tcp_nodelay on;

#设置客户端连接保持活动的超时时间

keepalive_timeout   65;

server_tokens   off;

#客户端请求主体读取缓存

client_body_buffer_size 512k;

proxy_connect_timeout   5;

proxy_send_timeout      60;

proxy_read_timeout      5;

proxy_buffer_size       16k;

proxy_buffers           4 64k;

proxy_busy_buffers_size 128k;

proxy_temp_file_write_size 128k;

#开启gzip

gzip    on;

#允许压缩的最小字节数

gzip_min_length 1k;

#4个单位为16k的内存作为压缩结果流缓存

gzip_buffers 4 16k;

#设置识别HTTP协议版本,默认是1.1

gzip_http_version 1.1;

#gzip压缩比,可在1~9中设置,1压缩比最小,速度最快,9压缩比最大,速度最慢,消耗CPU

gzip_comp_level 2;

#压缩的类型

gzip_types text/plain
application/x-javascript text/css application/xml;

#让前端的缓存服务器混村经过的gzip压缩的页面

gzip_vary   on;

upstream mycluster{

server 192.168.22.229:8080 weight=1;

server 192.168.22.230:8080 weight=1;

}

server{

listen 8088;

server_name 192.168.22.228;

charset    utf-8; #设置编码为utf-8;

#location / {

#    root   html;

#    index  index.html index.htm;

#}

#location ~ .*\.(jsp|do|action)$

location / {

proxy_next_upstream
http_502 http_504 error timeout invalid_header;

proxy_pass
http://mycluster;

# 真实的客户端IP

proxy_set_header   X-Real-IP        $remote_addr;

# 请求头中Host信息

proxy_set_header   Host             $host;

# 代理路由信息,此处取IP有安全隐患

proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;

# 真实的用户访问协议

proxy_set_header   X-Forwarded-Proto $scheme;

}

#静态文件交给nginx处理

location ~ .*\.(htm|html|gif|jpg|jpeg|png|bmp|swf|ioc|rar|zip|txt|flv|mid|doc|ppt|pdf|xls|mp3|wma)$

{

root  /usr/local/webapps;

expires 30d;

}

#静态文件交给nginx处理

location ~ .*\.(js|css)?$

{

root /usr/local/webapps;

expires 1h;

}

error_page   500 502 503 504  /50x.html;

location = /50x.html {

root   html;

}

}

}

测试Nginx动静分离

根据上述配置文件,完成动静分离和负载均衡的配置,然后启动Nginx。 
访问网址:http://192.168.22.228:8088/drp/index.jsp

可以看到图片没有加载出来。这是因为静态资源访问请求已经被Nginx拦截,由Nginx进行处理。但是Nginx服务器的 /usr/local/webapps 目录下并没有图片资源,所以图片没有加载出来。index.jsp页面能够显示,说明动态的请求已经转发到了Tomcat,Tomcat对index.jsp进行了解析。

在Nginx服务器 /usr/local/webapps 目录下放置图片文件,将tomcat上drp整个目录拷贝到其中。

然后再次刷新浏览器,图片能够正常显示。

小结

从上述的实例可以看到已经初步实现了Nginx动静分离的功能,在配置动静分离后,用户请求你定义的静态资源,默认会去nginx的发布目录请求,而不会到后端请求,这样可以提高网站响应速度,减轻真实Web服务器的负载压力。

不过在开发环境下,为了便于开发,咱们的静态资源和代码还是放在一起的,等开发测试完成,才会将完成的完整程序部署到生成环境上,然而程序代码和静态资源是分别放置到不同的服务器上的。

重启Nginx

service nginx restart
/etc/init.d/nginx stop
/etc/init.d/nginx start

Nginx+Tomcat 实现动态分离,负载均衡的更多相关文章

  1. 图文解说:Nginx+tomcat配置集群负载均衡

    图文解说:Nginx+tomcat配置集群负载均衡 博客分类: appserver nginxTomcatUbuntuLinux网络应用  作者:niumd Blog:http://ari.iteye ...

  2. Nginx + Tomcat Windows下的负载均衡配置

     Nginx + Tomcat Windows下的负载均衡配置 一.为什么需要对Tomcat服务器做负载均衡?    Tomcat服务器作为一个Web服务器,其并发数在300-500之间,如果超过50 ...

  3. 搭建 Keepalived + Nginx + Tomcat 的高可用负载均衡架构

    1 概述 初期的互联网企业由于业务量较小,所以一般单机部署,实现单点访问即可满足业务的需求,这也是最简单的部署方式,但是随着业务的不断扩大,系统的访问量逐渐的上升,单机部署的模式已无法承载现有的业务量 ...

  4. Keepalived + Nginx + Tomcat 的高可用负载均衡架构搭建

    Keepalived + Nginx + Tomcat 的高可用负载均衡架构搭建 Nginx 是一个高性能的 HTTP反向代理服务器 Keepalived 是一个基于VRRP协议来实现的LVS服务高可 ...

  5. 搭建Keepalived + Nginx + Tomcat的高可用负载均衡架构

    1 概述 初期的互联网企业由于业务量较小,所以一般单机部署,实现单点访问即可满足业务的需求,这也是最简单的部署方式,但是随着业务的不断扩大,系统的访问量逐渐的上升,单机部署的模式已无法承载现有的业务量 ...

  6. Nginx+Tomcat多实例及负载均衡配置

    Nginx+Tomcat多实例及负载均衡配置 采用nginx的反向代理负载均衡功能,配合后端的tomcat多实例来实现tomcat WEB服务的负载均衡 01 安装nginx服务 安装所需的pcre库 ...

  7. Nginx+tomcat配置集群负载均衡

    开发的应用采用F5负载均衡交换机,F5将请求转发给5台hp unix服务器,每台服务器有多个webserver实例,对外提供web服务和socket等接口服务.之初,曾有个小小的疑问为何不采用开源的a ...

  8. 转】Nginx+tomcat配置集群负载均衡

    原博文出自于:http://blog.csdn.net/bruce_6/article/details/38228299         感谢! 相信很多人都听过nginx,这个小巧的东西慢慢地在吞食 ...

  9. Keepalived+Nginx+Tomcat配置高可用负载均衡系统示例

    前言 此示例为keepalived+nginx+tomcat的基础配置示例,某些特定配置此例中不会出现,在示例中会用到三个虚拟机:两个纯命令行用于模拟服务端配置,一个带桌面环境的用于模拟客户端访问,这 ...

随机推荐

  1. ORM 的基本操作

    https://www.cnblogs.com/sss4/p/7070942.html

  2. css:清楚浮动

    这个清楚浮动的方法最常用,给浮动字元素的父盒子,也就是不浮动元素,添加一个lhearfix的类,其类的css样式为: .clearfix:after{ /*必须要写这三句话*/ content:''; ...

  3. CSS TYPOGRAPHY

    CSS TYPOGRAPHY Review Great job! You learned how to style an important aspect of the user experience ...

  4. Delphi FrieDAC 大数据处理

    Delphi FrieDAC 大数据处理 大数据处理, 要用到Array DML 插入数据 先要设置插入的数据量 FQuery1.Params.ArraySize := 1000; for index ...

  5. Redis进阶实践之一VMWare Pro虚拟机安装和Linux系统的安装(转载)(1)

    Redis进阶实践之一VMWare Pro虚拟机安装和Linux系统的安装 一.引言 设计模式写完了,相当于重新学了一遍,每次学习都会有不同的感受,对设计模式的理解又加深了,理解的更加透彻了.还差一篇 ...

  6. 【370】Python列表生成式(for 写入一行)

    参考: python用列表生成式写嵌套循环的方法_python_脚本之家 参考: python之列表生成式 - 旷野足迹 - 博客园 对于读取Twitter数据最终会得到一个超级复杂的json文件, ...

  7. [ SHELL编程 ] 远程服务器传输文件

    在shell编程中经常需要获取远程服务器文件.手工操作中使用scp命令完成.为避免脚本执行scp输入密码进行交互,需先建立本机服务器当前用户和远程服务器指定用户的信任关系.具体代码见操作实例,重点关注 ...

  8. ORACLE问题定位基本方法

    在使用ORACLE过程中经常会碰到启动或者访问失败的问题.碰到这些问题该如何解决? 1.仔细阅读报错提示信息,不要扫一眼感觉似曾相识,凭经验就开始上手解决.因为相同的现象可能是不同的原因引发的. 2. ...

  9. Node稳定性的研究心得

    目前大部分Web服务器,如Apache,都使用多线程的方式响应多用户请求,即一个线程服务一个用户请求.这种模式其中一个好处是,当某个请求的线程上抛出的异常没被捕获,只会影响当前这个线程,不会影响其他请 ...

  10. ios instancetype 和 id 的异同

    1.0 相同点:都可以作为方法的返回类型 2.0 不同点: a.instancetype 可以返回和方法所在类相同类型的对象   id 只能返回未知类型的对象 b. instancetype 只能作为 ...