Nginx+Tomcat实现动静分离、负载均衡

什么是动静分离

为了提高网站的响应速度,减轻程序服务器(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+Tomcat实现Web服务器的负载均衡

建立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;
}

② 个别的请求比如:html,js,css等静态资源请求,由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服务器的负载压力。

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏FreeBuf

爬虫代理搭建与批量安装

代理对于搞爬虫的都不会陌生。公司有一批阿里云服务器用于分布式增量抓取,但对于一些封ip且只需进行一次全量抓取的数据源,或数据量级较小时,如果部署到爬虫集群上又太...

55850
来自专栏北京马哥教育

利用TCMalloc优化Nginx的性能

TCMalloc的全称为Thread-Caching Malloc,是谷歌开发的开源工具google-perftools中的一个成员。与标准的glibc库的Ma...

26350
来自专栏决胜机器学习

数据库专题(四) ——各类缓存技术

数据库专题(四) ——各类缓存技术 (原创内容,转载请注明来源,谢谢) 一、概述 缓存(Cache)技术原指高速数据,当CPU处理数据的时候,会先去缓存里面找...

39370
来自专栏数据和云

浅谈TimesTen内存数据库的结构

作者介绍 ? 朱亮 云和恩墨技术专家,6年专职oracle dba生涯先后服务于保险、金融、电信、百货等客户 Oracle TimesTen In-Memor...

42580
来自专栏前端正义联盟

jsonp-反向代理-CORS解决JS跨域问题的个人总结(更新 v2.0)

各个方法都有各自的优缺点,但是目前前端开发方面比较常用的是 jsonp,反向代理,CORS:

21420
来自专栏Java后端技术栈

浅谈Nginx服务器的内部核心架构设计!

Nginx---Ngine X,是一款免费的、自由的、开源的、高性能HTTP服务器和反向代理服务器;也是一个IMAP、POP3、SMTP代理服务器;Nginx以...

17720
来自专栏LIN_ZONE

Linux各目录及每个目录的详细介绍(转载)

Linux目录和Windows目录有着很大的不同,Linux目录类似一个树,最顶层是其根目录,如下图:

15020
来自专栏Java技术交流群809340374

分布式锁的3种实现(数据库、缓存、Zookeeper)

目前几乎很多大型网站及应用都是分布式部署的,分布式场景中的数据一致性问题一直是一个比较重要的话题。

17200
来自专栏康怀帅的专栏

Nginx 配置

本文详细介绍了 nginx 常用配置。 修改主配置文件 /etc/nginx/nginx.conf worker_processes auto; http...

64350
来自专栏程序员宝库

从 0 到 1 优雅的实现PHP多进程管理

_ | | _ __ __ _ _ __ _ _| |_ ___ | '_...

487110

扫码关注云+社区

领取腾讯云代金券