[转]四、Nginx+Tomcat实现动静分离、负载均衡

【转载自】http://blog.csdn.net/u010028869/article/details/50522033

什么是动静分离


为了提高网站的响应速度,减轻程序 服务器(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做集群。


前置条件

负载均衡实现: http://blog.csdn.net/qq_34021712/article/details/68927676

建立JSP动态页面


  
  
  1. <%@ page language="java" contentType="text/html; charset=GB18030"
  2. pageEncoding= "GB18030"%>
  3. <HTML>
  4. <head>
  5. <meta http-equiv="Content-Type" content="text/html; charset=GB18030">
  6. <title>Nginx动静分离测试 </title>
  7. </head>
  8. <body>
  9. <h1>您正在访问:8955端口 </h1>
  10. <img src="/drp/img/girl.jpg" alt="女孩" />
  11. </body>
  12. </html>
Jsp放到drp目录中,添加一个图片标签,加载Tomcat根目录下 webapps/drp/img/girl.jpg图片文件。启动Tomcat测试是否能够访问。

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

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

对Nginx进行配置

通过配置location,对访问的请求进行拦截,①②都需要配置。
全部的请求均转发给Tomcat进行处理

  
  
  1. location / {
  2. proxy_next_upstream http_502 http_504 error timeout invalid_header;
  3. proxy_pass http://mycluster;
  4. # 真实的客户端IP
  5. proxy_set_header X-Real-IP $remote_addr;
  6. # 请求头中Host信息
  7. proxy_set_header Host $host;
  8. # 代理路由信息,此处取IP有安全隐患
  9. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  10. # 真实的用户访问协议
  11. proxy_set_header X-Forwarded-Proto $scheme;
  12. }

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

  
  
  1. #静态文件交给nginx处理
  2. location ~ .*\.(htm|html|gif|jpg|jpeg|png|bmp|swf|ioc|rar|zip|txt|flv|mid|doc|ppt|pdf|xls|mp3|wma)$
  3. {
  4. root /usr/local/webapps;
  5. expires 30d;
  6. }
  7. #静态文件交给nginx处理
  8. location ~ .*\.(js|css)?$
  9. {
  10. root /usr/local/webapps;
  11. expires 1h;
  12. }
r oot /usr/local/webapps; 这段代码的意思是指定Nginx访问的目录,即静态资源所在的目录。
expires 30d; 指定这些资源文件在客户端浏览器的缓存时间。30d指的是30天,1h指的是1小时。

完整的Nginx配置文件


  
  
  1. user nobody;
  2. worker_processes 2;
  3. events{
  4. worker_connections 1024;
  5. }
  6. http{
  7. #设置默认类型为二进制流
  8. default_type application/octet-stream;
  9. server_names_hash_bucket_size 128;
  10. #指定来自客户端请求头的headerbuffer大小,设置为32KB
  11. client_header_buffer_size 32k;
  12. #指定客户端请求中较大的消息头的缓存最大数量和大小,这里是4个32KB
  13. large_client_header_buffers 4 32k;
  14. #上传文件大小
  15. client_max_body_size 356m;
  16. #nginx的HttpLog模块指定,指定nginx日志的输出格式,输出格式为access
  17. log_format access '$remote_addr - $remote_user [$time_local] "$request" '
  18. '$status $body_bytes_sent "$http_referer" '
  19. '"$http_user_agent" "$http_x_forwarded_for"';
  20. #access日志存在未知
  21. access_log /var/log/nginx/access.log access;
  22. #开启高效模式文件传输模式,将tcp_nopush和tcp_nodelay两个指另设置为on,用于防止网络阻塞。
  23. sendfile on;
  24. tcp_nopush on;
  25. tcp_nodelay on;
  26. #设置客户端连接保持活动的超时时间
  27. keepalive_timeout 65;
  28. server_tokens off;
  29. #客户端请求主体读取缓存
  30. client_body_buffer_size 512k;
  31. proxy_connect_timeout 5;
  32. proxy_send_timeout 60;
  33. proxy_read_timeout 5;
  34. proxy_buffer_size 16k;
  35. proxy_buffers 4 64k;
  36. proxy_busy_buffers_size 128k;
  37. proxy_temp_file_write_size 128k;
  38. #开启gzip
  39. gzip on;
  40. #允许压缩的最小字节数
  41. gzip_min_length 1k;
  42. #4个单位为16k的内存作为压缩结果流缓存
  43. gzip_buffers 4 16k;
  44. #设置识别HTTP协议版本,默认是1.1
  45. gzip_http_version 1.1;
  46. #gzip压缩比,可在1~9中设置,1压缩比最小,速度最快,9压缩比最大,速度最慢,消耗CPU
  47. gzip_comp_level 2;
  48. #压缩的类型
  49. gzip_types text/plain application/x-javascript text/css application/xml;
  50. #让前端的缓存服务器混村经过的gzip压缩的页面
  51. gzip_vary on;
  52. upstream mycluster{
  53. server 192.168 .22 .229: 8080 weight= 1;
  54. server 192.168 .22 .230: 8080 weight= 1;
  55. }
  56. server{
  57. listen 8088;
  58. server_name 192.168 .22 .228;
  59. charset utf -8; #设置编码为utf-8;
  60. #location / {
  61. # root html;
  62. # index index.html index.htm;
  63. #}
  64. #location ~ .*\.(jsp|do|action)$
  65. location / {
  66. proxy_next_upstream http_502 http_504 error timeout invalid_header;
  67. proxy_pass http://mycluster;
  68. # 真实的客户端IP
  69. proxy_set_header X-Real-IP $remote_addr;
  70. # 请求头中Host信息
  71. proxy_set_header Host $host;
  72. # 代理路由信息,此处取IP有安全隐患
  73. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  74. # 真实的用户访问协议
  75. proxy_set_header X-Forwarded-Proto $scheme;
  76. }
  77. #静态文件交给nginx处理
  78. location ~ .*\.(htm|html|gif|jpg|jpeg|png|bmp|swf|ioc|rar|zip|txt|flv|mid|doc|ppt|pdf|xls|mp3|wma)$
  79. {
  80. root /usr/local/webapps;
  81. expires 30d;
  82. }
  83. #静态文件交给nginx处理
  84. location ~ .*\.(js|css)?$
  85. {
  86. root /usr/local/webapps;
  87. expires 1h;
  88. }
  89. error_page 500 502 503 504 / 50x.html;
  90. location = / 50x.html {
  91. root html;
  92. }
  93. }
  94. }

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

猜你喜欢

转载自blog.csdn.net/qq_43298012/article/details/87890322