nginx+tomcat实现负载均衡

什么是动静分离

为了提高网站的响应速度,减轻程序服务器(Tomcat,Jboss等)的负载,对于静态资源比如图片,js,css等文件,我们可以在反向代理服务器中进行缓存,这样浏览器在请求一个静态资源时,代理服务器就可以直接处理,而不用将请求转发给后端服务器。用户请求的动态文件比如servlet,jsp则转发给Tomcat,Jboss服务器处理,这就是动静分离。这也是反向代理服务器的一个重要的作用。

本文的动静分离主要是通过nginx+tomcat来实现,其中nginx处理图片、html、JS、CSS等静态文件,tomcat处理jsp、servlet等动态请求。

基础知识了解完后,咱们来具体实践一下动静分离的感觉。负载均衡在这篇博客就不在介绍了,但是同样会配置出来,实现动静分离和负载均衡的效果。

环境

拓扑图

这里写图片描述

服务器名称系统版本预装软件IP地址
Nginx服务器CentOS6 最小安装Nginx192.168.93.3
Web服务器1CentOS6 最小安装tomcat+jdk192.168.93.5
Web服务器2CentOS6 最小安装tomcat+jdk192.168.93.7

1.安装配置nginx

完整的Nginx配置文件

user nobody;

worker_processes 2;

events{
        worker_connections 1024; 
}

http{
#设置默认类型为二进制流
        default_type    application/octet-stream;

        server_names_hash_bucket_size   128;
        #指定来自客户端请求头的headerbuffer大小,设置为32KB
        client_header_buffer_size   32k;
        #指定客户端请求中较大的消息头的缓存最大数量和大小,这里是4个32KB
        large_client_header_buffers 4 32k;
        #上传文件大小
        client_max_body_size 356m;
        #nginx的HttpLog模块指定,指定nginx日志的输出格式,输出格式为access
        log_format access '$remote_addr - $remote_user [$time_local] "$request" '
                '$status $body_bytes_sent "$http_referer" '
                '"$http_user_agent" "$http_x_forwarded_for"';
        #access日志存在未知
        access_log  /var/log/nginx/access.log   access;
        #开启高效模式文件传输模式,将tcp_nopush和tcp_nodelay两个指另设置为on,用于防止网络阻塞。
        sendfile    on;
        tcp_nopush  on;
        tcp_nodelay on;
        #设置客户端连接保持活动的超时时间
        keepalive_timeout   65;
        server_tokens   off;
        #客户端请求主体读取缓存
        client_body_buffer_size 512k;
        proxy_connect_timeout   5;
        proxy_send_timeout      60;
        proxy_read_timeout      5;
        proxy_buffer_size       16k;
        proxy_buffers           4 64k;
        proxy_busy_buffers_size 128k;
        proxy_temp_file_write_size 128k;

        #开启gzip
        gzip    on;
        #允许压缩的最小字节数
        gzip_min_length 1k;
        #4个单位为16k的内存作为压缩结果流缓存
        gzip_buffers 4 16k;
        #设置识别HTTP协议版本,默认是1.1
        gzip_http_version 1.1;
        #gzip压缩比,可在1~9中设置,1压缩比最小,速度最快,9压缩比最大,速度最慢,消耗CPU
        gzip_comp_level 2;
        #压缩的类型
        gzip_types text/plain application/x-javascript text/css application/xml;
        #让前端的缓存服务器混村经过的gzip压缩的页面
        gzip_vary   on;

        upstream mycluster{
                 server 192.168.22.229:8080 weight=1;
                 server 192.168.22.230:8080 weight=1;
                }

        server{
                listen 8088;
                server_name 192.168.22.228;
                charset    utf-8; #设置编码为utf-8;

        #location / {
        #    root   html;
        #    index  index.html index.htm;
        #}

        #location ~ .*\.(jsp|do|action)$
        location / {
                proxy_next_upstream http_502 http_504 error timeout invalid_header;
                proxy_pass http://mycluster;
                # 真实的客户端IP
                proxy_set_header   X-Real-IP        $remote_addr; 
                # 请求头中Host信息
                proxy_set_header   Host             $host; 
                # 代理路由信息,此处取IP有安全隐患
                proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
                # 真实的用户访问协议
                proxy_set_header   X-Forwarded-Proto $scheme;
        }
        #静态文件交给nginx处理
        location ~ .*\.(htm|html|gif|jpg|jpeg|png|bmp|swf|ioc|rar|zip|txt|flv|mid|doc|ppt|pdf|xls|mp3|wma)$
        {
                root  /usr/local/webapps;
                expires 30d;
        }
        #静态文件交给nginx处理
        location ~ .*\.(js|css)?$
        {
                root /usr/local/webapps;
                expires 1h;
        }
        error_page   500 502 503 504  /50x.html;  

        location = /50x.html {
            root   html;
        }

    }
}

官网下载:http://nginx.org/en/download.html
版本号: nginx-1.6.3.tar.gz

① 解压文件

[root@localhost ~]# cd /usr/local/software/
[root@localhost software]# tar -zxvf  nginx-1.6.3.tar.gz

② 进步Nginx目录进行编译安装

[root@localhost local]# cd /usr/local/software/nginx-1.6.3
[root@localhost nginx-1.6.3]# ./configure --prefix=/usr/local/nginx
[root@localhost nginx-1.6.3]# make & make install

③ 启动Nginx

[root@localhost local]#  /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf

常见错误

在进行./configure 命令的时候经常会因为缺少库文件而报错,如下:

错误一:缺少gc++库文件

解决方式:在线安装gcc gcc-++

yum -y install gcc  gcc-++ autoconf automake

错误二:缺少PCRE库
./configure: error: the HTTP rewrite module requires the PCRE library.

解决方式:安装pcre-devel解决问题

yum -y install pcre-devel

错误三:
错误提示:./configure: error: the HTTP cache module requires md5 functions
from OpenSSL library. You can either disable the module by using
–without-http-cache option, or install the OpenSSL library into the system,
or build the OpenSSL library statically from the source with nginx by using
–with-http_ssl_module –with-openssl= options.

解决方式:

yum  -y install openssl openssl-devel

安装后继续执行configure命令,即可完成Nginx的安装

./configure –prefix=/usr/local/nginx

Nginx的启动、停止、重启

首先介绍如何查看Nginx的进程号:
用命令:ps -ef|grep nginx 查看

[root@localhost local]# ps -ef|grep nginx
root 13421 1 0 02:55 ? 00:00:00 nginx: master process /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
nobody 13422 13421 0 02:55 ? 00:00:00 nginx: worker process
root 13448 7858 0 03:04 pts/0 00:00:00 grep –color=auto nginx

① 启动方式

【Nginx启动文件地址】 -c 【Nginx配置文件地址】

例如:

/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf

② 三种关闭方式

从容停止 : Kill -QUIT 13421
快速停止 : kill -TERM 13421 或 kill -INT 13421
强制停止 : pkill -9 nginx

③ 重启

第一种reload命令:

[root@localhost local]# cd /usr/local/nginx/sbin/
[root@localhost sbin]# ./nginx -s reload

第二种发送信号方式:

kill -HUP 13421

至此Linux环境下 Nginx的安装配置以及启动停止都已经讲解完成了,这些过程最好自己动手实践一下哦。

这里写图片描述

2.tomcat安装部署

下载地址: http://tomcat.apache.org/
软件版本: apache-tomcat-7.0.82.tar.gz

① 进入软件包所在目录

[root@localhost local]# cd /usr/local/software/
[root@localhost software]# ls
apache-tomcat-7.0.32.tar.gz jdk-8u45-linux-x64.rpm redis-3.0.5.tar.gz

② 解压tomcat

[root@localhost software]# tar -zxvf apache-tomcat-7.0.32.tar.gz
apache-tomcat-7.0.32/bin/catalina.sh
apache-tomcat-7.0.32/bin/configtest.sh
apache-tomcat-7.0.32/bin/daemon.sh
apache-tomcat-7.0.32/bin/digest.sh
apache-tomcat-7.0.32/bin/setclasspath.sh
apache-tomcat-7.0.32/bin/shutdown.sh
apache-tomcat-7.0.32/bin/startup.sh
apache-tomcat-7.0.32/bin/tool-wrapper.sh

③ 移动并更名

[root@localhost software]# mv apache-tomcat-7.0.32 /usr/local/tomcat

④ 启动tomcat

[root@localhost local]# cd /usr/local/tomcat/bin/
[root@localhost bin]# ./startup.sh
Using CATALINA_BASE: /usr/local/tomcat
Using CATALINA_HOME: /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME: /usr/local/jdk1.8
Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Tomcat started.
[root@localhost bin]#

⑤ 远程查看

这里写图片描述

3.tomcat自定义网页

两台tomcat都做

自定义网页内容

[root@tomcat-01 webapps]# cd /usr/local/tomcat/webapps
[root@tomcat-01 webapps]# mkdir drp
[root@tomcat-01 webapps]# cd drp
[root@tomcat-01 drp]# vi login.html 


<html>
    <head>
        <meta http-equiv="content-type" content="text/html;URIEncoding="utf-8" />
    </head>
    <body>
        <h1>您正在访问:192.168.93.5</h1>
    </body>
</html>

过程中会出现编码错误的情况,处理如下,修改成如下

[root@tomcat-01 conf]# vi /usr/local/tomcat/conf/web.xml

<mime-mapping>
    <extension>htm</extension>
    <mime-type>text/html;charset=utf-8</mime-type>
</mime-mapping>
<mime-mapping>
    <extension>html</extension>
    <mime-type>text/html;charset=utf-8</mime-type>
</mime-mapping>

此外有朋友建议在/usr/local/tomcat/conf/server.xml修改如下配置(其中最后两行为新加的)

<Connector
        port="8080"
        redirectPort="8443"
        minSpareThreads="25"
        connectionTimeout="20000"
        maxSpareThreads="75"
        maxThreads="80"
        maxHttpHeaderSize="8192"
       disableUploadTimeout="true"
       useBodyEncodingForURI="true"
       URIncoding="UTF-8"
  >
    </Connector>

但该改动不起作用。

这里写图片描述

这里写图片描述

4.修改Nginx核心配置文件nginx.conf

下面配置文件中的几个关键点:

(1)进程数与每个进程的最大连接数

#工作进程个数,一般跟服务器cpu核数相等,或者核数的两倍
worker_processes 2;

#单个进程最大连接数
events{
    worker_connections 1024; 
}

① nginx进程数,建议设置为和服务器cup核数相等,或者是核数的两倍

② 单个进程最大连接数,该服务器的最大连接数=连接数*进程数;
服务器支持最大并发数=(连接数*进程数) /2 ,因为反向代理是双向的。

(2)Nginx的基本配置

#nginx基本配置
server{
    listen 8088;    #端口号
    server_name 192.168.93.3; #服务名
}

① 监听端口一般都为http端口:80;可以修改为其他,这里修改为8088。

② server_name :默认为localhost ,这里修改为服务器ip地址。

(3)负载均衡列表基本配置

#服务器集群
upstream mytomcat{
    #这里添加的是上面启动好的两台Tomcat服务器
     server 192.168.93.5:8080 weight=1;
     server 192.168.93.7:8080 weight=1;
}

location /{
        #将访问请求转向至服务器集群,mytomcat和上面upstream mytomcat 对应
        proxy_pass http://mytomcat;
        # 真实的客户端IP
        proxy_set_header   X-Real-IP        $remote_addr; 
        # 请求头中Host信息
        proxy_set_header   Host             $host; 
        # 代理路由信息,此处取IP有安全隐患
        proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
        # 真实的用户访问协议
        proxy_set_header   X-Forwarded-Proto $scheme;
    }

① location / {}:负载均衡访问的请求,可以添加筛选,假如我们要对所有的jsp后缀的文件进行负载均衡时,可以这样写:location ~ .*.jsp$ {}

② proxy_pass:请求转向自定义的服务器列表,这里我们将请求都转向标识为http://mytomcat 的负载均衡服务器列表;

③ 在负载均衡服务器列表的配置中,Server指令:指定服务器的ip地址,weight是权重,可以根据机器配置定义权重(如果某台服务器的硬件配置十分好,可以处理更多的请求,那么可以为其设置一个比较高的weight;而有一台的服务器的硬件配置比较差,那么可以将前一台的weight配置为weight=2,后一台差的配置为weight=1)。weigth参数表示权值,权值越高被访问到的几率越大;

(4)完整的配置文件示例

user nobody;
#工作进程个数,一般跟服务器cpu核数相等,或者核数的两倍
worker_processes 2;

#单个进程最大连接数
events{
    worker_connections 1024; 
}

http{

    keepalive_timeout 65;
    gzip on;
    #服务器集群
    upstream mycluster{
         #集群有几台服务器即可配置几台,weight表示权重,权重越大被访问到的几率越大
        #这里添加的是上面启动好的两台Tomcat服务器
         server 192.168.22.229:8080 weight=1;
         server 192.168.22.230:8080 weight=1;
    }

    #nginx基本配置
    server{
        listen 8088;    #端口号
        server_name 192.168.22.227; #服务名
        location /{
            #将访问请求转向至服务器集群,mycluster和上面upstream mycluster 对应
            proxy_pass http://mycluster;
            # 真实的客户端IP
            proxy_set_header   X-Real-IP        $remote_addr; 
            # 请求头中Host信息
            proxy_set_header   Host             $host; 
            # 代理路由信息,此处取IP有安全隐患
            proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
            # 真实的用户访问协议
            proxy_set_header   X-Forwarded-Proto $scheme;
        }

        error_page   500 502 503 504  /50x.html;  
        location = /50x.html {  
            root   html;  
        }  

    }
}

最基本的Nginx配置差不多就是上面这些内容,当然仅仅是最基础的配置。

在浏览器中进行负载均衡测试

在浏览器中输入 : http://192.168.93.3:8088/drp/login.html

先借用以下gif来演示一下,我做了一个gif,不知道为什么传不上来,正在想办法解决

这里写图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值