一、简介

最近新上了一个营销项目(和微信结合),后台用的是Tomcat。开始上线的时候因为人数不多感觉没太多问题,随着正式环境的发布,开人有人反映服务器页面无法打开,连入tomcat查看时发现连接数已满且CPU也用到了极限,初始的架构如下图所示,其使用1台tomcat和一台数据库服务器。

该业务系统主要用于微信营销,顾客在微信上下单购买(抢)对应的商品,抢购成功后该商品(券)会自动生成条形码保存在该用户的注册信息中。用户凭券到实体店完成支付和取货操作。因为涉及券核销的问题(支付完成后即时核销),因此该业务无法放在云端(核销的数据和实体店销售数据需即时交互),最终只能通过本地的方案来解决。

首先考虑到的是将网上的连接通过负载均衡的方式分散来减轻服务器的压力,这方面可以使用nginx代理来实现;其次需要解决的问题是session,对比了几种方案发现nginx内置的ip_hash策略可以解决该问题,最终网络的架构变成了下图所示,在该方案中增加了4台服务器,其中一台nginx负载转发,另外四台为新增的tomcat服务。

  

二、安装Nginx

  Nginx的安装配置十分简单,我这里实际用的是tengine版本,具体的安装方法可以参考” nginx配置指南之一”。这里需要注意的是它的编译参数,记得它的配置文件和日志文件的存放位置。

三、优化系统资源

文件限制

  Linux系统中文件的打开个数及单用户最多拥有的进程数是有限制的,可以通过“ulimit -n”或“ulimit -u”来查看,详细的设置可以参考“ORACLE 11G在Linux下的标准安装方法(上)”。先修改/etc/security/limit.conf中的限制,如下图所示。

内核优化

  内核中涉及的TCP相关的选项在大并发连接的情况下也需要做相应的调整否则可以出“TCP: time wait bucket table overflow” 的错误提示。具体修改/etc/sysctl.conf文件,如有特殊要求请结合实际情况修改。具体如下所示:

tcp_max_tw_buckets    系统在同时所处理的最大 timewait sockets 数目。如果超过此数的话﹐time-waitsocket 会被立即删除并且显示警告信息。

ip_local_port_range    用于向外连接的端口范围。

netdev_max_backlog    每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许送到队列的数据包的最大数目,对重负载服务器而言,该值需要调高一点。

tcp_max_orphans    处理不属于任何进程的套接字数量,不属于任程进程的进程就是“孤儿(orphans)进程”,在快速、大量的连接中这种进程会很多因此要适当的设置该参数,也可以用来防御简单的DoS***。

tcp_max_syn_backlog    用于记录尚未收到客户端确认信息的连接请求的最大值。

四、优化Nginx

  epoll为linux下的必须模型,适用于2.6以后的内核版本,如下图所示:

优化代理配置

  需要注意的是“proxy_max_temp_file_size”,它主要用来设置临时文件的最大值。当被请求的文件内容大于代理缓存的大小时,该文件会被存储到这个临时文件,但是如果被请求文件的内容大于这个值的时候,那么将会从上游的服务器(被代理的服务器)上直接同步传递,而不再使用代理缓存。该指令的默认值为1GB,如果设置为0,那么意味着禁止使用临时文件。

五、配置Nginx

  Nginx配置如下所示,其中upstreambackend配置的是后端的tomcat应用,ip_hash表示启用该策略,用户的目的是为了解决后端session不一致的问题(在nginx前端还有CDN或是局域网的环境中须慎用)。

  server段配置的是转发的路径和端口,需要注意“proxy_set_header Host $host:8162;”的写法。如果该变量后没有加8162端口则实际的转发会导致页面无法正常显示。其后的两条语句可以参考nginx日志的记录内容,主要用来记录外网实际的访问请求。($HOST 在使用80端口的时候ok,非80端口可以使用$http_host。感谢ontheway2015指点)

  log_format字段用来生成指定的日志格式文件,相应的变量对应日志文件中的访问记录,可以对照下图来查看。

六、Nginx安全限制

  随着业务的增加,网络连接的流量越来越大,合理的控制访问请求及连接数非常重要,否则仍会出现失去响应的情况。

七、增加IP限制功能

  最简单也最容易实现的的方式是Nginx自带的IP访问控制,由模块ngx_http_limit_conn_module和来ngx_http_limit_req_module实现,通过它们可以实现对IP地址连接数及服务器访问请求数的控制。

要限制连接,必须先有一个容器对连接进行计数,在http段加入如下代码:"zone=" 给它一个名字,可以随便叫,这个名字要跟下面的limit_conn 一致,$binary_remote_addr = 用二进制来储存客户端的地址,1m 可以储存 32000 个并发会话。

  限制请求数的方式和限制连接数类似,其中“rate=10r/s”表示一秒中处理的请求为10个,如果需要限制为每分钟不超过30个则表示为“rate=30r/m”;一个具体的设定如下所示:

http {
limit_req_zone$binary_remote_addr zone=one:10m rate=10r/s;
limit_conn_zone$binary_remote_addr zone=two:10m;}

  在server段中加入以下内容,其中“burst=5”表示同时允许超过频率限制的请求数不多于5个;“limit_conn two 15”表示对于同一IP的连接数限制为15个。

limit_req zone=one burst=5;
limit_conn two 15;


  后续WAF模块的添加以及nginx相关的监控待整理。

生产环境下的负载均衡配置相关推荐

  1. nginx下TCP负载均衡配置

    负载均衡基础与nginx下TCP负载均衡配置 安装nginx 在服务器快速集群环境搭建中,都迫切需要一个能拿来即用的负载均衡器,nginx在1.9版本之前,只支持http协议web服务器的负载均衡,从 ...

  2. Nginx + Tomcat Windows下的负载均衡配置

    一.为什么需要对Tomcat服务器做负载均衡?     Tomcat服务器作为一个Web服务器,其并发数在300-500之间,如果超过500的并发数会出现Tomcat不能响应新的请求的情况,严重影响网 ...

  3. Dapper--Google生产环境下的分布式跟踪系统

    Dapper--Google生产环境下的分布式跟踪系统 概述 当代的互联网的服务,通常都是用复杂的.大规模分布式集群来实现的.互联网应用构建在不同的软件模块集上,这些软件模块,有可能是由不同的团队开发 ...

  4. 下pg负载均衡_SAE 场景下,应用流量的负载均衡及路由策略配置实践

    流量管理从面向实例到面向应用 在 Serverless 场景下,由于弹性能力以及底层计算实例易变的特性,后端应用实例需要频繁上下线,传统的 ECS 场景下的负载均衡管理方式不再适用. SAE 产品提供 ...

  5. SQL Server大负载的生产环境下的性能优化:初识元数据优化

    相信朋友对SQL Server性能调优相关的知识或多或少都有一些了解.虽然说现在NOSQL相关的技术非常的火热,但是RMDB(关系型数据库)与NOSQL是并存的,并且适用在各种的项目中.在一般的企业级 ...

  6. 一篇读懂分布式架构下的负载均衡技术:分类、原理、算法、常见方案等

    1.引言 关于"负载均衡"的解释,百度词条里:负载均衡,英文叫Load Balance,意思就是将请求或者数据分摊到多个操作单元上进行执行,共同完成工作任务. 负载均衡(Load ...

  7. Nginx负载均衡配置实例详解

    负载均衡是我们大流量网站要做的一个东西,下面我来给大家介绍在Nginx服务器上进行负载均衡配置方法,希望对有需要的同学有所帮助哦. 负载均衡 先来简单了解一下什么是负载均衡,单从字面上的意思来理解就可 ...

  8. 地址设置nginx负载均衡_nginx负载均衡配置实例

    什么是负载均衡? 负载均衡主要通过专门的硬件设备或者通过软件算法实现.通过硬件设备实现的负载均衡效果好.效率高.性能稳定,但是成本比较高.通过软件实现的负载均衡主要依赖于均衡算法的选择和程序的健壮性. ...

  9. Nginx负载均衡配置实例详解(转)

    | 时间:2013-09-05 20:19:17 | 阅读数:810738 [导读] 负载均衡是我们大流量网站要做的一个东西,下面我来给大家介绍在Nginx服务器上进行负载均衡配置方法,希望对有需要的 ...

最新文章

  1. 美国商务部工业和安全局(BIS)发布《关于拟制定脑机接口技术出口管制规则的通知》...
  2. JDK5.0 特性-线程任务执行架构 ScheduledExecutorService
  3. getchar、scanf以及缓冲区的概念
  4. C#操作项目配置文件
  5. UVA 116——Unidirectional TSP
  6. Java中List和Map接口之间的区别
  7. mysql 主主忽略错误_MySQL 主主报错: Fatal error: The slave I/O thread stops because master and slave have...
  8. 【SAP HANA】关于SAP HANA中带层次结构的Attribute View创建、激活状况下在系统中生成对象的研究...
  9. 360驱动大师要怎么操作安装打印机驱动
  10. 数据分析新手小白入门学习指南,这五大知识清单值得收藏
  11. 有符号数的二进制表示方式
  12. 在Windows x64中加载驱动
  13. Hardhat快速上手
  14. 如何用python群发工资条
  15. 拓嘉辰丰电商:拼多多视频如何制作
  16. 通过浏览器响应实现excel导出
  17. 涠洲岛日出日落时间表_在涠洲岛看日出日落
  18. Python 练习实例03:一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?
  19. 大学该不该开python教学_孩子该不该学编程?
  20. 三星 苹果手表_苹果和三星濒临新事物

热门文章

  1. Datepicker-for-Bootstrap 日期选择插件
  2. Spring Cloud Sleuth 原理简介和使用
  3. Dubbo学习笔记(二)
  4. 利用Kubernetes搭建便携式开发环境之MySQL和Redis
  5. Python入门8_方法,属性,迭代器
  6. mysql中常用的时间工具
  7. 再聊Spring Bean的生命周期
  8. 镜像的查看,获取,推送和构建
  9. Gradle学习之使用java plugin
  10. 修改完/etc/fstab后重新挂载方法