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

Nginx最早是作为一款优秀的反向代理软件,以高并发下的卓越性能被越来越多的用户所用户,国内最早研究nginx的是张宴,该大牛的博客地址:http://zyan.cc/ 。但是随着需求的发展,nginx的功能已经不再单单是反向代理,现在已经更倾向作为web容器。

Nginx从0.7.48版本开始,支持了类似Squid的缓存功能。Nginx的Web缓存服务主要由proxy_cache相关指令集和fastcgi_cache相关指令集构成,前者用于反向代理时,对后端内容源服务器进行缓存,后者主要用于对FastCGI的动态程序进行缓存。两者的功能基本上一样。自Nginx 0.8.32版本,proxy_cache和fastcgi_cache已经比较完善,加上第三方的ngx_cache_purge模块(用于清除指定URL的缓存),性能不亚于squid,更为关键的是,您在拥有一个反向代理服务器的同时,还可以同时拥有一个高性能的web缓存服务器,鱼与熊掌兼得的快感自然不言而喻!

先看环境:

hadoop1.updb.com    192.168.0.101    nginx server

hadoop2.updb.com    192.168.0.102    tomcat server

hadoop3.updb.com    192.168.0.103    tomcat server

hadoop4.updb.com    192.168.0.104    tomcat server

hadoop5.updb.com    192.168.0.105    tomcat server

操作系统:

centos

Nginx版本:

nginx-1.7.6.tar.gz,采用源码编译安装

Ngx_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

hadoop2、hadoop3、hadoop4、hadoop5上安装jdk

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

配置环境变量

[[email protected] ~]# 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环境是否安装成功

[[email protected] ~]# . .bash_profile 
[[email protected] ~]# 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)

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

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

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

## 设置环境变量
[[email protected] ~]# 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

## 使设置生效
[[email protected] ~]# . .bash_profile

## 启动tomcat
[[email protected] ~]# 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.gzngx_cache_purge-2.1.tar.gz到hadoop1服务器上,首先安装ngx-cache_purge,只需要解压tar包就可以了

[[email protected] pub]# tar  xf ngx_cache_purge-2.1.tar.gz  -C /opt/

安装nginx,过程中需要将ngx_cahce_purge模块编译进来

[[email protected] pub]# tar  xf nginx-1.7.6.tar.gz  -C /opt/
[[email protected] pub]# cd  /opt/nginx-1.7.6/
[[email protected] 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
[[email protected] pub]# make && make install

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

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

[[email protected] ~]# 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开机自启动,并测试

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

3、配置nginx,实现反向代理和web缓存

[[email protected] ~]# 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

[[email protected] ~]# /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集群上轮询,并不是去的缓存,说明动态程序并没有没被缓存,也可以使用purge来验证,如下:

说明动态程序并没有被缓存到nginx中来,验证了上面nginx的配置文件是正确的,至此,已经实现了nginx反向代理后端tomcat集群实现负载均衡,同时使用proxy_cache来缓存网站的静态文件,一箭双雕!

5、总结

从上面的配置中可以看到使用nginx来做为反向代理和web缓存是如此的轻松,而且功能是如此的强大。比较关键的是,在满足需求的情况下,不用单独的使用缓存层(比如用squid实现),降低了运维的成本,而且在系统出现故障的时候,可以快速的定位故障点,当应用不可用时,只需要分别访问后端的tomcat和nginx就可以判断问题出现在哪一层上。而且在性能上,Nginx对多核CPU的利用,胜过Squid不少。另外,在反向代理、负载均衡、健康检查、后端服务器故障转移、Rewrite重写、易用
性上,Nginx也比Squid强大得多,可以考虑使用nginx来替换你的squid。

时间: 2024-10-25 11:11:00

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

使用nginx反向代理tomcat集群

一.反向代理的概念 正向代理是一个位于客户端和目标服务器之间的代理服务器(中间服务器).为了从原始服务器取得内容,客户端向代理服务器发送一个请求,并且指定目标服务器,之后代理向目标服务器转交并且将获得的内容返回给客户端.正向代理的情况下客户端必须要进行一些特别的设置才能使用. 反向代理正好相反.对于客户端来说,反向代理就好像目标服务器.并且客户端不需要进行任何设置.客户端向反向代理发送请求,接着反向代理判断请求走向何处,并将请求转交给客户端,使得这些内容就好似他自己一样,一次客户端并不会感知到反

nginx反向代理tomcat集群实现动静分离

我们都知道,nginx作为一个轻量级的web服务器,其在高并发下处理静态页面的优越性能是tomcat这样的web容器所无法媲美的,tomcat更倾向于处理动态文件,所以一个web应用可以通过nginx反向代理来实现动静分离,静态文件由nginx处理,动态文件由tomcat处理. 环境: hadoop0.updb.com    192.168.0.100    nginx server hadoop2.updb.com    192.168.0.102    tomcat server hadoo

Nginx实现tomcat集群进行负载均衡

一.背景 随着业务量和用户数量的激增,单一的tomcat部署应用已经无法满足性能需求,而且对于每次发布项目期间服务不可用的问题也凸显,既然出现了这个问题,那么我们本文就借助nginx来完美的解决这个问题. 二.基本概念 1.说明:关于Nginx的概念和介绍以及Centos7下安装步骤,请移步:Centos7安装Nginx实战 2.正向代理和反向代理 假设我们给定客户端A.代理服务器B.以及最终服务器C 正向代理:代理服务器B来代替客户端A来访问最终服务器C并将最终结果转发给客户端A,站在客户端A

Web服务器Tomcat集群与负载均衡技术

我们曾经介绍过三种Tomcat集群方式的优缺点分析.本文将介绍Tomcat集群与负载均衡技术具体实施过程. 在进入集群系统架构探讨之前,先定义一些专门术语: 1. 集群(Cluster):是一组独立的计算机系统构成一个松耦合的多处理器系统,它们之间通过网络实现进程间的通信.应用程序可以通过网络共享内存进行消息传送,实现分布式计算机. 2. 负载均衡(Load Balance):先得从集群讲起,集群就是一组连在一起的计算机,从外部看它是一个系统,各节点可以是不同的操作系统或不同硬件构成的计算机.如

Nginx反向代理、动静分离、负载均衡及rewrite隐藏路径详解(Nginx Apache MySQL Redis)–第三部分

Nginx反向代理.动静分离.负载均衡及rewrite隐藏路径详解 (Nginx Apache MySQL Redis) 楓城浪子原创,转载请标明出处! 更多技术博文请见个人博客:https://fengchenglangzi.000webhostapp.com 微信bh19890922 QQ445718526.490425557 三.Nginx动静分离及负载均衡 3.1 Nginx安装 请参考:https://fengchenglangzi.000webhostapp.com/?p=511 亦

通过Apache+mod_JK+Tomcat集群实现负载均衡

通过Apache+mod_JK+Tomcat集群实现负载均衡 1.概念 通过Apache+mod_JK+Tomcat集群搭建起来的环境主要用来实现负载均衡和高可用性.使用apache作为反向代理服务器实现负载均衡,使用mod_jk可以实现节点的故障恢复功能,达到高可用性.使用tomcat集群功能实现sessionID共享复制.用户访问数据在到达apache后,如果是静态内容,直接由apache处理,如果是动态请求,就通过mod_jk调用后端的一台tomcat服务器去处理请求,可以通过黏性Sess

使用Apache + mod_jk + tomcat来实现tomcat集群的负载均衡出现的无法加载mod_jk.conf文件的问题

用Apache + mod_jk + tomcat来实现tomcat集群的负载均衡的 如果出现了问题,可以用cmd  cd到Apache安装文件的bin下,运行httpd文件,错误信息就会打印出来. 我这里出现的问题是  Include conf/mod_jk.conf无法加载该配置文件(英文翻译过来就是这个问题) 为什么呢? 经过反复的检查发现是我建立的关于mode_jk.conf文件跟work.properties文件格式不对, 经过检查,用文本文件创建了这两个文件之后,文件的后缀名都是.c

.net core 跨平台开发 微服务架构 基于Nginx反向代理 服务集群负载均衡

1.概述 反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个服务器. 服务器集群就是指将很多服务器集中起来一起进行同一种服务,在客户端看来就像是只有一个服务器.集群可以利用多个计算机进行并行计算从而获得很高的计算速度,也可以用多个计算机做备份,从而使得任何一个机器坏了整个系统还是能正常运行. 负载均衡,英文名称为Load

tengine反向代理tomcat多实例实现负载均衡

目录 1.引语 2.jdk与tomcat的安装 3.tomcat多实例配置与测试 4.tengine安装与负载均衡配置 5.整体测试 6.思考和优化tomcat配置流程 7.总结 1.引语 有没有这样一种情况,你在一台服务器跑了一个tomcat实例,当有一天你发现不管你怎么优化tomcat,它的并发能力处理能力始终上不去了,而你服务器的硬件资源还有一部份剩余时,这时你就得采用tomcat启用多实例的方式,让剩下的硬件资源也一起利用起来,让用户的请求分摊到多个实例上来处理,这样只要硬件资源允许能大