Nginx配置Tomcat集群

Nginx

Nginx常用功能

  • Http代理,反向代理:作为web服务器最常用的功能之一,尤其是反向代理。
img_9dbeb7b8a8f046576257baecd2eba1d1.jpe
Nginx反向代理说明图

Nginx在做反向代理时,提供性能稳定,并且能够提供配置灵活的转发功能。Nginx可以根据不同的正则匹配,采取不同的转发策略,比如图片文件结尾的走文件服务器,动态页面走web服务器,只要你正则写的没问题,又有相对应的服务器解决方案,你就可以随心所欲的玩。并且Nginx对返回结果进行错误页跳转,异常判断等。如果被分发的服务器存在异常,他可以将请求重新转发给另外一台服务器,然后自动去除异常服务器。

  • 负载均衡
img_bdec9f249d82233fb0eca76552957702.jpe
负载均衡说明图1
img_7faf18e46c466ccf5ff4431a3c1d1174.jpe
负载均衡说明图2

Nginx提供的负载均衡策略有2种:内置策略和扩展策略。内置策略为轮询,加权轮询,Ip hash。扩展策略,就天马行空,只有你想不到的没有他做不到的啦,你可以参照所有的负载均衡算法,给他一一找出来做下实现。

Nginx配置文件结构

看一下nginx的默认配置

user www-data;
worker_processes auto;
pid /run/nginx.pid;

events {
    worker_connections 768;
    # multi_accept on;
}

http {

    ##
    # Basic Settings
    ##

    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    keepalive_timeout 65;
    types_hash_max_size 2048;
    # server_tokens off;

    # server_names_hash_bucket_size 64;
    # server_name_in_redirect off;

    include /etc/nginx/mime.types;
    default_type application/octet-stream;

    ##
    # SSL Settings
    ##

    ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
    ssl_prefer_server_ciphers on;

    ##
    # Logging Settings
    ##

    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;

    ##
    # Gzip Settings
    ##

    gzip on;
    gzip_disable "msie6";

    # gzip_vary on;
    # gzip_proxied any;
    # gzip_comp_level 6;
    # gzip_buffers 16 8k;
    # gzip_http_version 1.1;
    # gzip_types text/plain text/css application/json application/javascript text/xml application/xml     application/xml+rss text/javascript;

    ##
    # Virtual Host Configs
    ##



    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;


}
嵌入其他配置文件

这个点是我一开始掉坑的地方,因为需求来了直接上手看的nginx,但是一直在默认配置中找不到已经上线的应用配置,最后才了解到include嵌入其他的配置文件了,最后根据嵌入文件的路径成功地找到了引入的配置文件,正是我想要的

Nginx worker进程运行的用户及用户组

默认 user nobody nobody;
user用于设置master进程启动之后,fork出的worker进程运行在哪个用户和用户组下

Nginx worker进程个数

在master/worker运行方式下指定worker进程的个数
worker进程的数量会直接影响性能,每个worker进程都是单线程的进程,它们会调用各模块以实现多种多样的功能,如果这些模块确定不会出现阻塞时的调用,那么有多少CPU内核就应该配置多少个进程;反之,如果可能存在多个可能阻塞的调用,则需要多为worker分配一些进程

  • 例如磁盘IO一直是后端服务的一个瓶颈,如果分配的worker进程都是在执行阻塞式的IO服务,那么这个时候Nginx的效率可能会大大降低,这个时候就需要为Nginx多分配一点工作进程
  • 多worker进程可以充分利用多核的系统架构,但若worker进程的数量多于CPU内核数的话,这样同样会增大进程之间来回切换造成的消耗(Linux是抢占式内核),一般情况下与内核相等的worker进程,就可以绑定到CPU内核上

虚拟主机与请求分发

由于IP地址数量有限,一次你经常存在多个诸暨域名对应同一个IP地址情况,这时在nginx.conf中就可以按照server_name(对应用户请求中的主机域名)并通过server块来定义虚拟主机,每个server块就是个虚拟主机,他只处理与之相对应的主机域名请求

主机名称

server_name后可以跟多个主机名称,在开始处理一个HTTP请求时,Nginx会取出header中的Host,与每个server中的server_name进行匹配,决定到哪个server块来处理这个请求,匹配规则也是有优先级的①首先选择所有字符串都完全匹配的server_name②其次选择通配符在前的③选择通配符在后的④最后选择正则表达式匹配的

location

location会尝试根据用户请求中的URI来匹配/uri表达式,如果可以匹配,就会选择这个location块中的配置来处理用户请求

文件路径的定义

以root方式设置资源路径比如说一条HTPP请求是一条请求资源的请求,这个时候就可以使用server和location匹配到这一条资源请求,并且使用root指定这条资源请求的目录,实现资源访问,同样实现资源文件的访问还可以在location匹配到url请求之后使用alias,这两者间的配置有一些小的差别

一个用户如果通过一条HTTP请求需要访问到/user/local/nginx/conf/nginx.conf文件可使用如下两种配置

location /conf {
    alias /usr/local/nginx/conf/;
}
location /conf {
    root /usr/local/nginx/;
}

使用alias时,在URI向实际文件路径的映射过程中,已经把location后的部分字符串丢弃掉了,因此,/conf/nginx.conf请求将根据alias path映射为path/nginx.conf
root则不一样,他会根据完整的URI请求进行映射,因此/conf/nginx.conf将会被映射未root path/conf/nginx.conf,这也是为什么root可以放置到http、server、location中而alias只能存在于location中的原因

使用HTTP proxy module配置一个反向代理服务器

反向代理(reverse proxy)方式是指用代理服务器来接受Internet上的连接请求,然后根据请求转发给内网中的上游服务器,并将从上有服务器上得到的结果返回Internet上请求连接的客户端,此时代理服务器对外的表现就是一个web服务器,充当反向代理服务器也是nginx的通常用法

一般来说如果nginx作为反向代理服务器,接收到的请求若是针对静态文件,则直接通过nginx将请求映射到本地的静态资源上,如果需要动态的结果,即发出的是一条动态的请求,则需要继续反向代理到真正的web服务器

当客户端发来HTTP请求的时候,Nginx并不会立刻转发到上游服务器,而是先把用户的请求(包括HTTP包体)完整地接收到Nginx所在服务器的硬盘或者内存中,然后再向上游服务器发起连接,把缓存的客户端请求转发到上游服务器,而其余的一些反向代理服务器采用的策略是边接收客户端的请求,边进行转发到上游服务器

Nginx这中工作方式存在一个明显的缺点,很明显,这种缓存策略相当于是延长了一个HTTP请求的时间,并增加了用于缓存请求内容的内存和磁盘空间,而优点是降低了上游服务器的负担,将负担更多的放在了自己身上

但是Nginx的这个策略同时也大大提高了效率更降低了上游服务器的负担,比如一个场景是一个客户端想要上传1G的文件,这个时候如果是别的一些反向代理服务器,则在刚与客户端建立连接还没有开始接收包体的时候,就开始向上游服务器进行发起连接,因为客户端和反向代理服务器之间基本都是走外网,这个时间加上自身网络情况,上传1G大小的文件通常是一个很耗时的操作,这个时候,这些反向代理服务器就要一直保持着和客户端的关系,又要保持着和上游服务器的关系,这样一个上传文件操作就成了一个既耗时又耗资源的一个操作,而这个时候Nginx和客户端建立连接之后完整地接收包体之后,通过内网与上游服务器之间建立连接,这个速度和资源损耗就远远小于其余一些反向代理服务器了

在介绍nginx反向代理之前,搭了一个小型的tomcat集群,这样的话就可以通过nginx做反向代理服务器,并且使用负载均衡策略,向上游的两台服务器按照指定的权重策略进行分发请求

搭建Tomcat服务器集群

首先,熟悉基于J2EE规范以及使用Spring框架开发的开发者应该都接触过Tomcat这种并发量适中的小型web应用服务器,可是,如果有一天,你的项目访问量,甚至说并发量到达了一定的级别,你会如何处理这种情况,原始的架构只是单Tomcat服务器,但是这种结构肯定不足以支撑对整个后端服务的运营,这个时候怎么办,首先要想到的就是在有限的一台服务器上鼓捣一个Tomcat集群,让多台Tomcat同时工作,并且使用nginx作为反向代理服务器,配置负载均衡策略,这样去解决单台Tomcat负担过大访问量的单台服务器瓶颈

简易搭建Tomcat集群
  • 首先需要确保自己的电脑或者服务器上有安装过后的两台Tomcat服务器

    我为这两台服务器分别起名为main以及secoundary便于区分,并且修改了webapps中ROOT文件夹下的图标,这样的话一会儿在测试的环节上就能区分出nginx分发请求到了哪一台上游服务器

    img_8bbdf2a270f530e8a1604d1ccfe71927.png
    解压后的两台Tomcat服务器
  • 修改/etc/profile

    添加如下字段

    img_b01e54ad701b1bc9a2ee52f61a39757d.png
    /etc/profile
  • 修改secondary中/bin/catalina.sh文件,注意这里不要修改main中的catalina.sh

    在OS结点下添加如下信息,使secondary开启的时候使用/ect/profile中配置的第二条配置启动

    img_a96ca180c37cdc76416a05f666bcebe2.png
    修改catalina.sh
  • 修改secondary中conf/server.xml

    找到Server结点修改为,main中Server结点端口为8005


    img_7205b950ff087cd953aa62de4ba61a7d.png
    修改Server结点
  • 修改Connector结点,并且为了防止乱码增加URIEncoding属性,main为8080默认端口

    img_9adcf8da3b0d7ce7361f60b49cf2a82a.png
    修改Connector结点
  • 修改AJP端口

    img_db7c59cd73d1104f66a0a65760d43860.png
    修改AJP端口

    AJP Connector
    The AJP Connector element represents a Connector component that communicates with a web connector via the AJP protocol.
    AJP连接器可以通过AJP协议和一个web容器进行交互

    当你想让Apache和Tomcat结合并且你想让Apache处理静态内容的时候用AJP,或者你想利用Apache的SSL处理能力时

    特殊于HTTP Connector,AJP还可以与engine元素上的jvmRoute结合使用来实现负载均衡功能

配置nginx.conf

img_63a5635db7844d20fe44b77680d2e124.png
修改nginx.conf
  • 简单说一下这一段的配置

  • upstream结点

    upstream结点用来配置上游服务器ip以及端口,用于nginx转发使用,在这里这个www.dzjissz.com域名是在本地hosts中配置指向127.0.0.1的域名,所以就相当于指向本地服务器ip

  • server结点中的server_name

    简单地来说,location块需要结合server_name和location后的uri进行匹配,并且根据location块中的proxy_pass配置确定转发的upstream结点

  • 这一段nginx的配置主要就是当用户通过www.dzjissz.com这个域名作为url访问服务的时候,nginx匹配到了这个请求,并且向上游两个开启的8080和9080的tomcat服务器进行转发,因为没有指定权重,所以两台服务器的权重weight默认都为1, 我们来看一下效果

img_fab2efbadf46af2ca54f2402eaa32e85.png
main
img_d87f8c1c3439c82f6ecd814e03749c1a.png
secondary

可以看出当使用localhost访问服务的时候,相当于www.dzjissz.com作为url进行请求,可以看到nginx将请求转发到了两台开启在不同端口的tomcat服务器。

到这里简单的tomcat集群也就搭建完成了,修改完配置文件和环境变量文件记得使其生效,否则等于啥都没干

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值