nignx实现tomcat动静分离详解



1.为什么要实现动静分离


1)nginx的处理静态资源能力超强


主要是nginx处理静态页面的效率远高于tomcat的处理能力,如果tomcat的请求量为1000次,则nginx的请求量为6000次,tomcat每秒的吞吐量为0.6M,nginx的每秒吞吐量为3.6M,可以说,nginx处理静态资源的能力是tomcat处理能力的6倍,优势可见一斑。

2)动态资源和静态资源分开,使服务器结构更清晰。


2.动静分离原理


服务端接收来自客户端的请求中,有一部分是静态资源的请求,例如html,css,js和图片资源等等,有一部分是动态数据的请求。因为tomcat处理静态资源的速度比较慢,所以我们可以考虑把所有静态资源独立开来,交给处理静态资源更快的服务器例如nginx处理,而把动态请求交给tomcat处理。
如下图所示,我们在机器上同时安装了nginx和tomcat,把所有的静态资源都放置在nginx的webroot目录下面,把动态请求的程序都放在tomcat的webroot目录下面,当客户端访问服务端的时候,如果是静态资源的请求,就直接到nginx的webroot目录下面获取资源,如果是动态资源的请求,nginx利用反向代理的原理,把请求转发给tomcat进行处理,这样就实现了动静分离,提高了服务器处理请求的性能。



3.动静分离的详细配置


1)首先熟悉下nginx的重要配置文件nginx.conf


[plain]   view plain  copy
  1. user  nginx;  
  2. worker_processes  1;  
  3. error_log  logs/error.log;  
  4. pid       logs/nginx.pid;  
  5. events {  
  6.     worker_connections  1024;  
  7. }  
  8. http {  
  9.     include       mime.types;  
  10.     default_type  application/octet-stream;  
  11.     #日志格式定义  
  12.     log_format main  '$remote_addr - $remote_user[$time_local] "$request" '  
  13.                       '$status $body_bytes_sent"$http_referer" '  
  14.                      '"$http_user_agent" "$http_x_forwarded_for"';  
  15.     access_log logs/access.log  main;  
  16.     sendfile        on;  
  17.     keepalive_timeout  65;  
  18.     #gzip压缩功能设置  
  19.     gzip on;  
  20.     gzip_min_length 1k;  
  21.     gzip_buffers    4 16k;  
  22.     gzip_http_version 1.0;  
  23.     gzip_comp_level 2;  
  24.     gzip_types text/plain application/x-javascripttext/css application/xml;  
  25.     gzip_vary on;  
  26.     server {  
  27.         listen       80;  
  28.         server_name www.test.com;  
  29.         location / {  
  30.     #jsp网站程序根目录,一般nginx与tomcat在同一个目录  
  31.             root  /usr/local/tomcat/webapps/ROOT;  
  32.             index  index.html index.jsp index.html;  
  33.         }  
  34.         location ~ .*.jsp$ {  
  35.         index index.jsp;  
  36.         proxy_pass http://127.0.0.1:8080;   #来自jsp请求交给tomcat处理  
  37.         proxy_redirect off;  
  38.         proxy_set_header Host $host;    #后端的Web服务器可以通过X-Forwarded-For获取用户真实IP  
  39.         proxy_set_header X-Real-IP $remote_addr;  
  40.         proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;  
  41.         client_max_body_size 10m;   #允许客户端请求的最大单文件字节数  
  42.         client_body_buffer_size 128k; #缓冲区代理缓冲用户端请求的最大字节数  
  43.         proxy_connect_timeout 90;   #nginx跟后端服务器连接超时时间(代理连接超时)  
  44.         proxy_read_timeout 90;      #连接成功后,后端服务器响应时间(代理接收超时)  
  45.         proxy_buffer_size 4k;       #设置代理服务器(nginx)保存用户头信息的缓冲区大小  
  46.         proxy_buffers 6 32k;        #proxy_buffers缓冲区,网页平均在32k以下的话,这样设置  
  47.         proxy_busy_buffers_size 64k;#高负荷下缓冲大小(proxy_buffers*2)  
  48.         proxy_temp_file_write_size 64k; #设定缓存文件夹大小,大于这个值,将从upstream服务器传  
  49.         }  
  50.         location ~ .*\.(gif|jpg|png|bmp|swf)$   #由nginx处理静态页面  
  51.         {  
  52.         expires 30d;   #使用expires缓存模块,缓存到客户端30天  
  53.         }  
  54.         location ~ .*\.( jsp|js|css)?$  
  55.         {  
  56.         expires 1d;  
  57.         }  
  58.         error_page  404              /404.html;   #错误页面  
  59.         error_page   500 502 503 504  /50x.html;  
  60.         location = /50x.html {  
  61.             root   html;  
  62.         }  
  63.     }  

2)配置动静分离

[plain]   view plain  copy
  1.        #配置Nginx动静分离,定义的静态页面直接从Nginx发布目录读取。  
  2. location ~ .*\.(html|htm|gif|jpg|jpeg|bmp|png|ico|txt|js|css)$ {  
  3.     root /webapps/myproject/code/static-resource;  
  4.            #expires定义用户浏览器缓存的时间为7天,如果静态页面不常更新,可以设置更长,这样可以节省带宽和缓解服务器的压力  
  5.     expires 1d;  
  6. }  
  7. location ~ ^/(WEB-INF)/ {#这个很重要,不然用户就可以访问了  
  8.            deny all;    
  9.        }  

这里需要注意,外部静态文件的存放路径,应当与请求中路径一致,以免nginx拼接路径后,由于路径不存在而找不到文件。如果出现js、css等不加载的情况,可以查看nginx的errorlog进行调试修正,日志位于nginx目录下的logs目录内,如下截取一段错误的日志:

[plain]   view plain  copy
  1. [error] 7195#0: *1693 open() "/home/cms/include/dedeajax2.js" failed (2: No such file or directory), client: 101.226.35.225, server: localhost, request: "GET /cms/include/dedeajax2.js HTTP/1.1"    

可以看到,GET请求是 “ /cms/include/dedeajax2.js ”,这时nginx就会在配置中的 /home 下,寻找这一路径的文件,完整路径为:

[plain]   view plain  copy
  1. /home/cms/include/dedeajax2.js  

报错为 no such file or directory ,就可以在对应的 /home 目录下看文件路径的问题。 
配置成功后,就可以发现静态文件通过nginx处理了,静态文件的请求不再进入tomcat服务器,从而可以打包时,静态文件的目录如js、css等不再打进war包。 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值