Nginx + Tomcat动静分离

1、什么是动静分离

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

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

2、服务器软件

服务器名称 系统版本 安装软件 IP地址
nginx  centos7.6 nginx 192.168.11.163
tomcat centos7.6 tomcat+jdk 192.168.11.165

3、配置tomcat服务器

# cd /usr/local/webapps/   #进入tomcat安装路径;
# mkdir -pv /webtest/img  #新建文件夹放静态图片;
# vim webtest/index.jsp  #新建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>
<script type="text/javascript">
function display(clock){
    var now=new Date();   //创建Date对象
    var year=now.getFullYear(); //获取年份
    var month=now.getMonth(); //获取月份
    var date=now.getDate();  //获取日期
    var day=now.getDay();  //获取星期
    var hour=now.getHours(); //获取小时
    var minu=now.getMinutes(); //获取分钟
    var sec=now.getSeconds(); //获取秒钟
    month=month+1;
    var arr_week=new Array("星期日","星期一","星期二","星期三","星期四","星期五","星期六");
    var week=arr_week[day];  //获取中文的星期
    var time=year+""+month+""+date+""+week+" "+hour+":"+minu+":"+sec; //组合系统时间
    clock.innerHTML="当前时间:"+time; //显示系统时间
}
window.onload=function(){
    window.setInterval("display(clock)", 1000);
}
</script>
<div id="clock" ></div>
</body>
<body>
<div>This is Testweb</div><br><img src="/webtest/img/abc.jpg">
</body>
</html>

4、启动Tomcat进行测试:http://192.168.11.165:8080/webtest/index.jsp

5、配置nginx服务器

user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;

# Load dynamic modules. See /usr/share/doc/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;

events {
    worker_connections 1024;
}

http {
    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;
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

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

    sendfile            on;
    tcp_nopush          on;
    tcp_nodelay         on;
    keepalive_timeout   65;
    types_hash_max_size 2048;
    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;

    include             /etc/nginx/mime.types;
    default_type        application/octet-stream;

    # Load modular configuration files from the /etc/nginx/conf.d directory.
    # See http://nginx.org/en/docs/ngx_core_module.html#include
    # for more information.
    include /etc/nginx/conf.d/*.conf;
    upstream mycluster {
             server 192.168.11.165:8080 weight=1;
             }

    server {
        listen       80;
        server_name  192.168.11.163;

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;
        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;
            }
        }
}

6、测试Nginx动静分离

测试地址:http://192.168.11.163/webtest/index.jsp,无法静态显示图片。

这是因为静态资源访问请求已经被Nginx拦截,由Nginx进行处理;但是Nginx服务器的 /usr/local/webapps 目录下并没有图片资源,所以图片没有加载出来。index.jsp页面能够显示,说明动态的请求已经转发到了Tomcat,Tomcat对index.jsp进行了解析。在Nginx服务器 /usr/local/webapps 目录下放置图片文件,将tomcat上testweb整个目录拷贝到其中;然后再次刷新浏览器,图片能够正常显示。

7、小结

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

 

posted @ 2020-08-01 15:11  区域管理员  阅读(287)  评论(0编辑  收藏  举报