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

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,采用源码编译安装

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和测试文件test.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/test.html 
this is hadoop2 root`s html!
[[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是否正常工作,浏览器中访问,能够正常显示测试页面,表明工作正常。

2、安装nginx

[[email protected] ~]# tar  xf nginx-1.7.6.tar.gz  -C /opt/
[[email protected] ~]# cd  /opt/nginx-1.7.6/
[[email protected] ~]# ./configure --user=www --group=www --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module
[[email protected] ~]# 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,实现反向代理和动静分离

[[email protected] ~]# cat /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;
    
    ## 配置反向代理的后端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;
        server_name  192.168.0.100;
        root   html;
        index  index.html index.htm;
        
        ## 网页、视频、图片文件从本地读取,且定义在浏览器中缓存30天
        location ~ .*\.(htm|html|gif|jpg|jpeg|png|bmp|swf|ioc|rar|zip|txt|flv|mid|doc|ppt|pdf|xls|mp3|wma)$
        {       
            expires 30d;    
        }      
        ## js、css文件从本地读取,且定义在浏览器中缓存1小时
        location ~ .*\.(js|css)?$     
        {       
            expires 1h;
        }      
        
        ## 动态文件转发到后端的tomcat集群
        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;
        }
        ## 关闭访问日志
        access_log off;
    }
}

4、测试反向代理的负载均衡和动静分离

在nginx的html目录下创建测试目录shop、测试文件test.html和test.jsp

[[email protected] ~]# cd /usr/local/nginx/html/
[[email protected] html]# mkdir shop
[[email protected] html]# vi shop/test.jsp 
this is nginx root`s jsp!
[[email protected] html]# vi shop/test.html
this is nginx root`s html!

在浏览器中访问http://192.168.0.100/shop/test.html ,无论怎样刷新,页面都显示如下:

在浏览器中访问http://192.168.0.100/shop/test.jsp ,刷新几次,页面显示结果依次如下:

从结果来看,访问html静态文件时,返回的是nginx中的文件,而访问jsp动态页面时则是轮询后端的tomcat集群。至此,反向代理+动静分离已经实现。

5、接着我们来比较动静分离与单纯的反向代理的性能差异

首先安装模拟并发访问的压力测试工具

yum install httpd-tools -y

首先测试访问nginx代理

[[email protected] ~]# ab -n 20000 -c 3000 
Server Software:        nginx/1.7.6
Server Hostname:        192.168.0.100
Server Port:            80

Document Path:          /shop/test.html
Document Length:        192 bytes

Concurrency Level:      3000
Time taken for tests:   4.090 seconds
Complete requests:      20000
Failed requests:        10907
   (Connect: 0, Receive: 0, Length: 10907, Exceptions: 0)
Write errors:           0
Non-2xx responses:      9994
Total transferred:      7563616 bytes
HTML transferred:       2223840 bytes
Requests per second:    4890.27 [#/sec] (mean)
Time per request:       613.464 [ms] (mean)
Time per request:       0.204 [ms] (mean, across all concurrent requests)
Transfer rate:          1806.06 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:       64  303 338.8    172    3145
Processing:    98  241 131.0    211    1214
Waiting:       24  183 131.0    146    1203
Total:        201  544 381.9    403    3297

一共请求20000次,每次3000的并发访问,总共用的时间为4.090秒,吞吐量为1.806M/s,再看直接访问tomcat的结果:

[[email protected] ~]# ab -n 20000 -c 3000 http://192.168.0.105:8080/shop/test.html
Server Software:        Apache-Coyote/1.1
Server Hostname:        192.168.0.105
Server Port:            8080

Document Path:          /shop/test.html
Document Length:        29 bytes

Concurrency Level:      3000
Time taken for tests:   8.591 seconds
Complete requests:      20000
Failed requests:        0
Write errors:           0
Total transferred:      5900000 bytes
HTML transferred:       580000 bytes
Requests per second:    2328.12 [#/sec] (mean)
Time per request:       1288.594 [ms] (mean)
Time per request:       0.430 [ms] (mean, across all concurrent requests)
Transfer rate:          670.70 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0  256 824.9      0    7007
Processing:     1   70 148.9     38    3117
Waiting:        1   69 148.4     38    3117
Total:          4  327 866.9     40    8468

相同压力下,访问tomcat需要8.591秒,且吞吐量只有0.67M/s,可见nginx在处理静态页面上远优于tomcat。

结束语:我在实现了动静分离之后,想通过nginx自带的proxy_cache模块来实现nginx缓存自身代理的静态页面,发现无法成功缓存到,认为porxy_cache无法缓存作为静态服务器的nginx中的文件,但无法求证,如果您知道,拜托指点一二。拜谢!

时间: 2024-10-24 04:26:09

nginx反向代理tomcat集群实现动静分离的相关文章

使用nginx反向代理tomcat集群

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

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

Nginx最早是作为一款优秀的反向代理软件,以高并发下的卓越性能被越来越多的用户所用户,国内最早研究nginx的是张宴,该大牛的博客地址:http://zyan.cc/ .但是随着需求的发展,nginx的功能已经不再单单是反向代理,现在已经更倾向作为web容器. Nginx从0.7.48版本开始,支持了类似Squid的缓存功能.Nginx的Web缓存服务主要由proxy_cache相关指令集和fastcgi_cache相关指令集构成,前者用于反向代理时,对后端内容源服务器进行缓存,后者主要用于对

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

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

Nginx 反向代理、负载均衡与动静分离

1.环境: 前端Nginx服务器:主机名:node5.a.com IP:192.168.10.205  编译安装nginx 1.6.3 后端tomcat: Server1--ip:192.168.10.209  主机名:node9.a.com Server2--ip:192.168.10.210  主机名: node10.a.com 2.Ngginx配置: user  nginx; worker_processes  1; events { use epoll; worker_connectio

centos6.5搭建nginx反向代理Apache服务并实现动静分离

Nginx反向代理配置步骤: 一.规划网络拓扑 二.配置Apache服务器 三.配置nginx服务器 四.进行测试   一.规划网络拓扑 二.配置Apache服务器 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 安装Apache服务 [[email protected] ~]# yum -y install httpd php 注:由于我们的Apache服务器要负责动态页面的处理,所以要安装PHP.   编辑A

Nginx反向代理、负载均衡、动静分离、缓存、压缩、防盗链、跨域访问

一.反向代理 1.在192.168.189.130机器启动tomcat服务,http://192.168.189.130:8080/ 访问服务正常 2.在192.168.189.131机器配置nginx server { listen 80; server_name localhost; #charset koi8-r; #access_log logs/host.access.log main; location / { proxy_pass http://192.168.189.130:80

Docker Compose 一键部署Nginx代理Tomcat集群

Docker Compose 一键部署Nginx代理Tomcat集群 目录结构 [[email protected] ~]# tree compose_nginx_tomcat/ compose_nginx_tomcat/ ├── docker-compose.yml ├── mysql │   ├── conf │   │   └── my.cnf │   └── data ├── nginx │   ├── Dockerfile │   ├── nginx-1.12.1.tar.gz │  

nginx反向代理tomcat提示13 permission denied while connecting to upstream

nginx反向代理tomcat提示13 permission denied while connecting to upstream,网上很多都是说13 permission denied while reading to upstream,这是两个完全不同的错误,我遇到的如下截图: 查看selinux日志发现错误: 后来发现是selinux的问题,于是先关掉selinux:setenforce 0:然后再访问果然好使. 于是启用selinux,再执行下面的命令,修改selinux的值: set

Nginx反向代理Tomcat

系统环境:CentOS 生产环境:WDLINUX WEB引擎:nginx+apache 1.在tomcat中创建虚拟主机 修改tomcat\conf\server.xml,在<Engine>标签中加入<host>标签,如下所示: <Host name="www.abc.com" appBase="/www/webapps" unpackWARS="true" autoDeploy="true" x