Nginx负载均衡tomcat集群

本文介绍如何使用Nginx解决高并发下的负载均衡问题,包括配置文件上传、下载及多Tomcat间Session共享,通过Nginx实现请求分发,解决404错误和Session频繁登录问题。
  1. 概述
  2. 解决的问题
  3. 环境搭建以及思路
  4. 配置
  5. 小结

一、概述

  使用Nginx主要是来解决高并发情况下的负载均衡问题。

二、要解决的问题

  1、最主要是负载均衡请求分发。

  2、文件上传功能,只能上传到一个Tomcat上,下载文件或者图片的时候就有可能发生404错误。

  3、多个Tomcat之间Session共享问题,否则会出现不断要求登录的情况。

三、环境准备以及问题解决思路

  1、第一个问题肯定就是使用Nginx来做负载均衡。安装Nginx,请参考:Linux Centos 6.5_x86安装Nginx

  2、第二个问题思路有两个:

    a)在Linux上搭建NFS服务器来实现文件共享,参考:Tomcat 集群 文件上传下载的共享问题 NFS配置

    b)利用Nginx的负载均衡,请求转发功能,将关于图片的上传和下载请求全部转到一台Tomcat上。具体配置参考下边配置一节。本文使用的是这种方式。

  3、上述提到的第三个问题即Session共享问题选择是Tomcat-Redis-Session_manager来解决的,具体请参考:使用Tomcat-redis-session-manager来实现Tomcat集群部署中的Session共享

  3、一台Linux安装多个Tomcat请参考:linux系统下安装两个或多个tomcat

  本文使用的是三台Tomcat,两台处理除文件以外的请求,一台专门处理文件上传和下载的请求。

  分别为:Tomcat1:192.168.1.96:7070

      Tomcat2:192.168.1.96:8081

      Tomcat3:192.168.1.96:9090

四、配置

  


# 使用的用户和组
user root root;
# 指定工作衍生进程数(一般等于CPU的总核数或总核数的两倍,例如两个四核CPU,则综合数为8.通过命令ps -ef|grep nginx可以看出来设置的是几个)
worker_processes  8;
#指定错误日志存放的路径,错误日志记录级别可选项为:[debug|info|notice|warn|error|crit],默认是crit,记录的日志数量从crit到debug,由少到多。
error_log  /usr/local/nginx/logs/nginx_error.log crit;

#指定pid存放的路径
pid       /usr/local/nginx/nginx.pid;

# 指定文件描述符数量??
worker_rlimit_nofile 51200;

#events settings
events {
    # 使用的网络I/O模型,Linux系统推荐采用epoll模型,FreeeBSD系统推荐采用kqueue模型
    use epoll;
    # 允许的连接数
    worker_connections  51200;
}


#遵循http协议的服务器全局设置
http {
    include       mime.types;
    default_type  application/octet-stream;
    #设置使用的字符集,如果一个网站有多种字符集,请不要随便设置,应让程序员在HTML代码中通过Meta标签设置
    #charset utf-8;
    
    server_names_hash_bucket_size 128;
    client_header_buffer_size 32k;
    large_client_header_buffers 4  32k;
    
    # 设置客户端能够上传的文件大小,注意要与应用程序中的文件大小限制兼容。
    client_max_body_size 300m;
    
    sendfile on;
    tcp_nopush on;
    keepalive_timeout 60;
    tcp_nodelay on;
    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;
    
    #log_format 自定义日志记录格式设置,main为名字,在access_log命令中引用
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    # access_log 访问日志文件设置
    #关闭日志记录
    #access_log off;
    #指定日志存放路径,如果想使用默认的combined格式记录日志,可以使用access_log logs/access.log combined; 以下是使用log_format自定义的格式记录日志的。
    access_log  logs/access.log  main;

    # 开启gzip压缩设置(只能在http模块中设置)
    gzip  on;
    gzip_min_length 1k;
    gzip_buffers  4 16k;
    gzip_http_version 1.1;
    gzip_comp_level 2;
    gzip_types application/x-javascript text/css application/xml;
    gzip_vary on;
    
    # 用于设置如果出现指定的HTTP错误状态码,则返回指定的url页面
    error_page  404              /404.html;
    error_page  500 502 503 504  /50x.html;
   
    #upstream设置,设置代理服务器(负载均衡池),默认的负载均衡方式是轮询,另外一种是ip_hash
    upstream tomcat_server {
        #ip_hash; 
        server 192.168.1.96:7070 weight=1;
        server 192.168.1.96:8081 weight=1;
    }

    #处理上传和下载的图片文件服务器,设置代理服务器(负载均衡池),默认的负载均衡方式是轮训,另外一种是ip_hash
    upstream image_server{
        server 192.168.1.96:9090 weight=1;
    }
 
    #server虚拟主机设置,可以设置多个:基于IP的虚拟主机,基于域名的虚拟主机
    # 第一个虚拟主机(基于域名的虚拟主机),反向代理tomcat_server和image_server这两组服务器
    server {
        # 监听的端口
        listen       8000;
        # 主机名称
        server_name  localhost;
        # 设置Nginx的默认首页文件
        index index.html index.htm index.jsp index.do;
        #root /home/oracle/dev_tools/server/apache-tomcat-6.0.44/webapps/examples;
        
        # 配置该虚拟机的字符设置,如果不配置继承自http中的charset设置
        #charset koi8-r;

        #access_log 访问日志文件设置,如果server虚拟机中不设置,则继承http模块中的access_log的设置
        #access_log  logs/access.log  main;

        #rewrite settings
        if (-d $request_filename)
        {
            rewrite ^/(.*)([^/])$ http://$host/$1$2/ permanent;
        }

        # location模块说明
        # 使用环境:server模块

        # iamge 服务器location
        location ~*/NginxTest/image/ {
            proxy_pass http://image_server;
        }

        location ~*/NginxTest/ {
            # root /home/oracle/dev_tools/server/apache-tomcat-6.0.44/webapps/;
            
            # HTTP代理模块 proxy,主要是用来转发请求到其他服务器
            # 如果后端服务器返回502,504,执行超时等错误,自动将请求转发到upstream负载均衡池中的另一台服务器,实现failover。
            proxy_next_upstream http_502 http_504 error timeout invalid_header;
            # 变量$host等于客户端请求头中的Host值。
            proxy_set_header Host $host;
            #后端的web服务器可以通过X-Forwarded-For获取真实的IP地址,$remote_addr客户端的ip地址
            proxy_set_header X-Forwarded-For $remote_addr;
            proxy_pass http://tomcat_server;
        }

        #image expires settings
        # expires 属于http Header模块,主要用来Nginx返回给用户网页添加附件的header信息,可以在http,server,location中使用
        location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
        {
            expires 30d;
        }

        #css&js expires settings
        # expires 属于http Header模块,主要用来Nginx返回给用户网页添加附件的header信息,可以在http,server,location中使用
        location ~ .*\.(js|css|html)?$
        {
            expires 2h;
        }

        # 如果http模块设置了,则继承。此处设置了则覆盖。
        #error_page  404              /404.html;
        #error_page   500 502 503 504  /50x.html;

    }

}

 

   以下代码配置了两组负载均衡服务器。

 

  
#upstream设置,设置代理服务器(负载均衡池),默认的负载均衡方式是轮询,另外一种是ip_hash
    upstream tomcat_server {
        #ip_hash; 
        server 192.168.1.96:7070 weight=1;
        server 192.168.1.96:8081 weight=1;
    }

    #处理上传和下载的图片文件服务器,设置代理服务器(负载均衡池),默认的负载均衡方式是轮询,另外一种是ip_hash
    upstream image_server{
        server 192.168.1.96:9090 weight=1;
    }

 

  第一组就tomcat_server是用来处理普通请求的。第二组image_server主要是用来处理图片文件的上传和下载的,可以理解为一个文件服务器,所有文件相关的上传和下载都通过这组服务器。那怎么配置才能让Nginx实现这种目的呢?看以下配置:

 

    
# iamge 服务器location
        location ~*/NginxTest/image/ {
            proxy_pass http://image_server;
        }

        location ~*/NginxTest/ {
            # root /home/oracle/dev_tools/server/apache-tomcat-6.0.44/webapps/;
            
            # HTTP代理模块 proxy,主要是用来转发请求到其他服务器
            # 如果后端服务器返回502,504,执行超时等错误,自动将请求转发到upstream负载均衡池中的另一台服务器,实现failover。
            proxy_next_upstream http_502 http_504 error timeout invalid_header;
            # 变量$host等于客户端请求头中的Host值。
            proxy_set_header Host $host;
            #后端的web服务器可以通过X-Forwarded-For获取真实的IP地址,$remote_addr客户端的ip地址
            proxy_set_header X-Forwarded-For $remote_addr;
            proxy_pass http://tomcat_server;
        }

 

  其中location ~*/NginxTest/image/ 符合这种url路径(这种路径是根据自己的应用需求约定的)的请求转发到 proxy_pass属性指定的 image_server服务器,其他请求转发到tomcat_server这组服务器。具体的路径规则请按照自己项目需求约定。Nginx配置参数请参考书籍:《实战Nginx:取代Apache的高性能Web服务器》。

五、测试

  说明:

  解压后有三个文件:NginxTest.war,NginxTest2.war,NginxImageTest.war,

  其中NginxTestImage必须放到Tomcat3中,三个应用程序名字在放入Tomcat之后必须都改为NginxTest。

  只用NginxTestImage应用有图片文件,NginxTest和NginxTest2中无图片文件。

  访问:http://ip:port/NginxTest/whichTomcat,如下图:

  

   不断刷新该页面,SessionId如果是不变化的说明,Session是从Redis中取到的,解决了Session共享问题。

   不断刷新页面,这是“Tomcat服务器1“文字应该和“Tomcat服务器2”不断变化,说明请求访问的不是相同的Tomcat。因为只有Tomcat3中的应用有图片文件,所以图片的获取是从Tomat3中获取的,也就解决了第二个问题。

六、小结

  1、此时Nginx只有一台,如果这台Nginx访问不了了,整个集群就无法提供服务,所以为了实现Nginx的高可用,需要实现Nginx的failover,实现方式参考:Nginx+Keepalived实现站点高可用

  2、Redis的问题同上,参考:keepalived+redis 高可用redis主从解决方案

欧姆龙FINS(工厂集成网络系统)协议是专为该公司自动化设备间数据交互而设计的网络通信标准。该协议构建于TCP/IP基础之上,允许用户借助常规网络接口执行远程监控、程序编写及信息传输任务。本文档所附的“欧ronFins.zip”压缩包提供了基于C与C++语言开发的FINS协议实现代码库,旨在协助开发人员便捷地建立与欧姆龙可编程逻辑控制器的通信连接。 FINS协议的消息框架由指令头部、地址字段、操作代码及数据区段构成。指令头部用于声明消息类别与长度信息;地址字段明确目标设备所处的网络位置与节点标识;操作代码定义了具体的通信行为,例如数据读取、写入或控制器指令执行;数据区段则承载实际交互的信息内容。 在采用C或C++语言实施FINS协议时,需重点关注以下技术环节: 1. **网络参数设置**:建立与欧姆龙可编程逻辑控制器的通信前,必须获取控制器的网络地址、子网划分参数及路由网关地址,这些配置信息通常记载于设备技术手册或系统设置界面。 2. **通信链路建立**:通过套接字编程技术创建TCP连接至控制器。该过程涉及初始化套接字实例、绑定本地通信端口,并向控制器网络地址发起连接请求。 3. **协议报文构建**:依据操作代码与目标功能构造符合规范的FINS协议数据单元。例如执行输入寄存器读取操作时,需准确配置对应的操作代码与存储器地址参数。 4. **数据格式转换**:协议通信过程中需进行二进制数据的编码与解码处理,包括将控制器的位状态信息或数值参数转换为字节序列进行传输,并在接收端执行逆向解析。 5. **异常状况处理**:完善应对通信过程中可能出现的各类异常情况,包括连接建立失败、响应超时及错误状态码返回等问题的处理机制。 6. **数据传输管理**:运用数据发送与接收函数完成信息交换。需注意FINS协议可能涉及数据包的分割传输与重组机制,因单个协议报文可能被拆分为多个TCP数据段进行传送。 7. **响应信息解析**:接收到控制器返回的数据后,需对FINS响应报文进行结构化解析,以确认操作执行状态并提取有效返回数据。 在代码资源包中,通常包含以下组成部分:展示连接建立与数据读写操作的示范程序;实现协议报文构建、传输接收及解析功能的源代码文件;说明库函数调用方式与接口规范的指导文档;用于验证功能完整性的测试案例。开发人员可通过研究这些材料掌握如何将FINS协议集成至实际项目中,从而实现与欧姆龙可编程逻辑控制器的高效可靠通信。在工程实践中,还需综合考虑网络环境稳定性、通信速率优化及故障恢复机制等要素,以确保整个控制系统的持续可靠运行。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值