nginx反向代理tomcat集群达到负载均衡,同时使用proxy_cache做web缓存

nginx反向代理tomcat集群达到负载均衡,同时使用proxy_cache做web缓存,第1张

nginx反向代理tomcat集群达到负载均衡,同时使用proxy_cache做web缓存

NGX作为一款优秀的反向代理软件,凭借其在高并发下的出色表现,首先被越来越多的用户使用。丹尼尔的博客地址张艳是国内最早研究Nginx的人。但是随着需求的发展,nginx的功能不再只是一个反向代理,现在更倾向于做一个web容器。

Nginx从0.7.48版本开始支持类似Squid的缓存。Nginx的Web缓存服务主要由proxy_cache相关指令集和FastCGI_cache相关指令集组成。前者用于使用反向代理时缓存后端内容源服务器,后者主要用于缓存fastcgi的动态程序。两者功能基本相同。从Nginx0.8.32版本开始,proxy_cache和fastcgi_cache进行了改进,配合第三方ngx_cache_purge模块(用于清除指定URL的缓存),性能不亚于squid的。更重要的是,你可以同时拥有高性能的web缓存服务器反向代理服务器,两全其美的快感自然不言而喻!


先看环境:

hadoop1.updb.comnginx服务器

hadoop2.updb.com192.168.0.102Tomcat服务器

hadoop3.updb.com192.168.0.103Tomcat服务器

hadoop4.updb.com192.168.0.104Tomcat服务器

hadoop5.updb.com192.168.0.105Tomcat服务器

*** 作系统:

摘录

Nginx版本:

Nginx-1.7.6.tar.gz,编译安装用源代码。

X_cache_purge版本:

ngx_cache_purge-2.1.tar.gz

Tomcat版本:

apache-tomcat-7.0.56.tar.gz

JDK版本:

jdk-7u60-linux-x64.rpm


最终架构:


在弄清楚架构之后,我们开始一步一步地实现它:

1.安装jdk+tomcat

2.在hadoop3、hadoop4和hadoop5上安装jdk

rpm -ivh jdk-7u60-linux-x64.rpm

配置环境变量

[root@hadoop2 ~]# cat  .bash_profile  # .bash_profile # Get the aliases and functions if [ -f ~/.bashrc ]; then         . ~/.bashrc fi # User specific environment and startup programs PATH=$PATH:$HOME/bin export JAVA_HOME=/usr/java/jdk1.7.0_60 export JRE_HOME=/usr/java/jdk1.7.0_60/jre export CLASSPATH=./:/usr/java/jdk1.7.0_60/lib:/usr/java/jdk1.7.0_60/jre/lib export PATH

使环境变量生效,并验证java环境已成功安装。

[root@hadoop2 ~]# . .bash_profile  [root@hadoop2 ~]# java -version java version "1.7.0_60" Java(TM) SE Runtime Environment (build 1.7.0_60-b19) Java HotSpot(TM) 64-Bit Server VM (build 24.60-b09, mixed mode)

2.在hadoop3、hadoop4和hadoop5上安装tomcat,在webapps下创建测试目录shop和测试文件hadoop.html和test.jsp。测试文件的内容是每个tomcat节点的主机名和IP地址,方便以后测试负载均衡

[root@hadoop2 ~]# tar xf  apache-tomcat-7.0.56.tar.gz -C /opt/ [root@hadoop2 ~]# cd /opt/apache-tomcat-7.0.56/webapps/ [root@hadoop2 webapps]# mkdir shop [root@hadoop2 webapps]# vi shop/hadoop.html  hadoop2.updb.com 192.168.0.102 [root@hadoop2 webapps]# vi shop/test.jsp this is hadoop2 root`s jsp!

将tomcat的bin目录配置为环境变量,使更改生效,并启动tomcat。

## 设置环境变量 [root@hadoop2 ~]# cat .bash_profile  # .bash_profile # Get the aliases and functions if [ -f ~/.bashrc ]; then         . ~/.bashrc fi # User specific environment and startup programs PATH=$PATH:$HOME/bin:/opt/apache-tomcat-7.0.56/bin export JAVA_HOME=/usr/java/jdk1.7.0_60 export JRE_HOME=/usr/java/jdk1.7.0_60/jre export CLASSPATH=./:/usr/java/jdk1.7.0_60/lib:/usr/java/jdk1.7.0_60/jre/lib export PATH ## 使设置生效 [root@hadoop2 ~]# . .bash_profile ## 启动tomcat [root@hadoop2 ~]# startup.sh  Using CATALINA_BASE:   /opt/apache-tomcat-7.0.56 Using CATALINA_HOME:   /opt/apache-tomcat-7.0.56 Using CATALINA_TMPDIR: /opt/apache-tomcat-7.0.56/temp Using JRE_HOME:        /usr/java/jdk1.7.0_60/jre Using CLASSPATH:       /opt/apache-tomcat-7.0.56/bin/bootstrap.jar:/opt/apache-tomcat-7.0.56/bin/tomcat-juli.jar Tomcat started.

测试tomcat是否正常工作,在浏览器中访问,测试页面可以正常显示,说明工作正常。

3、4、5节点安装上述方法,注意将测试文件中的内容改为自己的主机名和IP地址。


2.安装nginx+ngx_cache_purge

首先下载nginx-1.7.6.tar.gz,ngx_cache_purge-2.1.tar.gz到hadoop1服务器。首先安装ngx-cache_purge,解压tar包即可。

[root@hadoop1 pub]# tar  xf ngx_cache_purge-2.1.tar.gz  -C /opt/

nginx安装过程中,需要编译ngx_cahce_purge模块。

[root@hadoop1 pub]# tar  xf nginx-1.7.6.tar.gz  -C /opt/ [root@hadoop1 pub]# cd  /opt/nginx-1.7.6/ [root@hadoop1 pub]# ./configure --user=www --group=www --add-module=/opt/ngx_cache_purge-2.1  --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module [root@hadoop1 pub]# make && make install

关于nginx的源代码安装,比较简单。如果在过程中遇到问题,可以去网上找找答案。也可以在下面留言,一起讨论。

为了便于管理,为nginx编写服务脚本。

[root@hadoop1 ~]# vi /etc/init.d/nginx  #!/bin/bash # #chkconfig: - 85 15 #description: this script use to manage nginx process. # #set -x . /etc/rc.d/init.d/functions procnum=`ps -ef |grep "/usr/local/nginx/sbin/nginx"|grep -v "grep"|wc -l` start () {         if [ "$procnum" -eq 1 -a -f /usr/local/nginx/logs/nginx.pid ]; then             echo -n "Starting nginx:"             success             echo         else             /usr/local/nginx/sbin/nginx             if [ "$?" -eq 0 ]; then                  echo -n "Starting nginx:"                 success                 echo             else                 echo -n "Starting nginx:"                 failure                 echo                 exit 4             fi         fi } stop () {         if [ "$procnum" -eq 1 -a -f /usr/local/nginx/logs/nginx.pid ]; then             /usr/local/nginx/sbin/nginx -s stop             if [ "$?" -eq 0 ]; then                     echo -n "Stopping nginx:"                     success                     echo             else                      echo -n "Stopping nginx:"                     failure                     echo                     exit 3             fi         else               echo -n "Stopping nginx:"             success             echo         fi } case $1 in     start)         start         ;;     stop)         stop         ;;     restart)         stop         sleep 1         start         ;;     reload)         if [ "$procnum" -eq 1 -a -f /usr/local/nginx/logs/nginx.pid ]; then             /usr/local/nginx/sbin/nginx -s reload         else              echo "nginx is not running!please start nginx first..."             exit 2         fi         ;;     status)         if [ "$procnum" -eq 1 -a -f /usr/local/nginx/logs/nginx.pid ]; then             echo "nginx is running..."         else              echo "nginx is not running..."         fi         ;;         *)         echo "Usage : nginx [ start|stop|reload|restart|status ]"         exit 1         ;; esac

然后授予脚本可执行权限,加入chkconfig引导自启动,测试。

[root@hadoop1 ~]# chmod +x /etc/init.d/nginx [root@hadoop1 ~]# chkconfig nginx on [root@hadoop1 ~]# /etc/init.d/nginx start Starting nginx:                                            [  OK  ] [root@hadoop1 ~]# /etc/init.d/nginx status nginx is running... [root@hadoop1 ~]# /etc/init.d/nginx stop Stopping nginx:                                            [  OK  ]

3.配置nginx实现反向代理和web缓存。

[root@hadoop1 ~]# vi /usr/local/nginx/conf/nginx.conf user  www www; worker_processes  8; error_log  /usr/local/nginx/logs/error.log crit; pid        /usr/local/nginx/logs/nginx.pid; ##  events {     use epoll;     worker_connections  65535; } http {     include       mime.types;     default_type  application/octet-stream;     access_log  /usr/local/nginx/logs/access.log;     charset utf-8;     sendfile        on;     tcp_nopush     on;     keepalive_timeout  60;     client_body_buffer_size  512k;     proxy_connect_timeout    5;     proxy_read_timeout       60;     proxy_send_timeout       5;     proxy_buffer_size        16k;     proxy_buffers            4 64k;     proxy_busy_buffers_size 128k;     proxy_temp_file_write_size 128k;     gzip  on;     gzip_min_length  1k;     gzip_buffers     4 16k;     gzip_http_version 1.1;     gzip_comp_level 2;     gzip_types       text/plain application/x-javascript text/css application/xml;     gzip_vary on;          ## 设置缓存临时目录     proxy_temp_path /data/proxy_temp_dir;     ## 设置缓存目录,并设置Web缓存区名称为cache_one,内存缓存空间大小为200MB,1天没有被访问的内容自动清除,硬盘缓存空间大小为30GB。     proxy_cache_path /data/proxy_cache_dir levels=1:2 keys_zone=cache_one:200m inactive=1d max_size=30g;     ## 设置代理的后端tomcat集群     upstream web_server {         server 192.168.0.102:8080 weight=1 max_fails=2 fail_timeout=30s;         server 192.168.0.103:8080 weight=1 max_fails=2 fail_timeout=30s;         server 192.168.0.104:8080 weight=1 max_fails=2 fail_timeout=30s;         server 192.168.0.105:8080 weight=1 max_fails=2 fail_timeout=30s;     }     server {         listen       80;            ## nginx监听端口         server_name  192.168.0.101; ## 设置nginx的主机名或IP地址         root   html;                ## nginx站点的根目录         index  index.html index.htm index.jsp;         location / {             proxy_pass http://web_server;    ## 这里设置要代理的集群名称             proxy_set_header Host  $host;             proxy_set_header X-Forwarded-For  $proxy_add_x_forwarded_for;             proxy_set_header X-Real-IP  $remote_addr;             # 如果后端的服务器返回502、504、执行超时等错误,自动将请求转发到upstream负载均衡池中的另一台服务器,实现故障转移             proxy_next_upstream http_502 http_504 error timeout invalid_header;             proxy_cache cache_one;             # 对不同的HTTP状态码设置不同的缓存时间             proxy_cache_valid  200 304 12h;             # 以域名、URI、参数组合成Web缓存的Key值,Nginx根据Key值哈希,存储缓存内容到二级缓存目录内             proxy_cache_key $host$uri$is_args$args;         }         ## 用于清除缓存,访问http://192.168.0.101/purge/shop/hadoop.html来清除http://192.168.0.101/shop/hadoop.html的页面缓存         location ~ /purge(/.*) {             allow 127.0.0.1;             allow 192.168.0.0/16;             deny all;             proxy_cache_purge    cache_one   $host$1$is_args$args;         }         ## 扩展名以.php、.jsp、.cgi、.jhtml结尾的动态应用程序不缓存。         location ~ .*\.(php|jsp|cgi|jhtml)?$ {             proxy_pass http://web_server;             proxy_set_header Host  $host;             proxy_set_header X-Forwarded-For  $proxy_add_x_forwarded_for;             proxy_set_header X-Real-IP  $remote_addr;             proxy_cache cache_one;             proxy_cache_valid  200 304 12h;             proxy_cache_key $host$uri$is_args$args;         }         ## 关闭访问日志         access_log off;     } }

然后重启nginx。

[root@hadoop1 ~]# /etc/init.d/nginx   restart  Stopping nginx:                                            [  OK  ] Starting nginx:                                            [  OK  ]

4.效果测试

测试静态页面的负载均衡和缓存,第一次访问http://192.168.0.101/shop/Hadoop.html。

然后清空缓存,再次访问http://192.168.0.101/shop/Hadoop.html。


可以看到,在第一次访问时,请求是通过nginx的反向代理转发给hadoop2上的tomcat的。而且,对于这个请求,nginx已经成功缓存在静态页面中。当缓存清空后,请求会通过再次访问同一个地址转发给hadoop3上的tomcat,说明已经达到了负载均衡。


为了测试图片是否可以缓存,我第一次访问了http://192.168.0.101/shop/QQ.jpg


可以看出nginx的上述配置已经成功缓存到图片和静态页面。让我们测试一下动态页面是否可以缓存。


访问192.168.0.101/shop/test.jsp,发现页面内容每次刷新都会发生变化,说明请求是在后端tomcat集群上轮询的,没有缓存,说明动态程序没有未缓存。吹扫也可用于验证,如下所示:


说明nginx中没有缓存动态程序,验证了上面nginx的配置文件是正确的。目前为止,已经实现了nginx反向代理后端的tomcat集群实现负载均衡,同时使用proxy_cache缓存网站静态文件,一举两得!


5.摘要

从上面的配置可以看出,使用nginx作为反向代理和web缓存是如此的容易和强大。关键是在满足需求时,缓存层(如squid)不单独使用,降低了运维成本。此外,当系统出现故障时,可以快速定位故障点。当应用不可用时,只需要访问后端的tomcat和nginx,就可以确定问题发生在哪一层。而且在性能上,Nginx比Squid更好的利用了多核CPU。此外,Nginx在反向代理、负载均衡、健康检查、后端服务器故障转移、重写、易用性等方面比Squid强大得多 。考虑用nginx代替你的鱿鱼。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/784308.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-04
下一篇 2022-05-04

发表评论

登录后才能评论

评论列表(0条)

保存