前言

当自己的web网站访问的人越来越多,一台服务器无法满足现有的业务时,此时会想到多加几台服务器来实现负载均衡。

网站的访问量越来越大,服务器的服务模式也得进行相应的升级,怎样将同一个域名的访问分散到两台或更多的机器上呢?这就需要用nginx来配置负载均衡的环境了。

以多个tomcat服务为例,用nginx配置管理多个tomcat服务

什么是负载均衡

负载均衡建立在现有网络结构之上,它提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽、增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性。负载均衡,英文名称为Load Balance,其意思就是分摊到多个操作单元上进行执行,例如Web服务器、FTP服务器、企业关键应用服务器和其它关键任务服务器等,从而共同完成工作任务。

如果还是不懂的话,可以举个例子:

假设你是个妹子,你败家太厉害,以至于你的男友根本吃不消,于是乎你找了两个男朋友,一三五单号,二四六双号限行,从而减少一个男朋友所面临的压力,这叫负载均衡。

nginx的负载均衡策略有2种,第一种是轮询:也就是上面说的“两个男朋友,一三五单号,二四六双号限行”,看下图

另外一种是加权轮询:两个男友,一个是正牌的,权重比较大,一二四五;另外一个是备胎三六,权重比为2:1

如果是同一个用户,在服务器1上登录了,接着去连续访问页面时候,如果按上面的轮询策略就会到账一会在服务器1上访问,一会服务器2上访问,session不共享就会错乱了。

于是就有了Ip hash算法,对客户端请求的ip进行hash操作,然后根据hash结果将同一个客户端ip的请求分发给同一台服务器进行处理,可以解决session不共享的问题。

搭建多个tomcat环境

如果你有多台服务器的话,可以在多个服务器上搭建一样的tomcat环境,关于tomcat环境搭建可以参考这篇https://www.cnblogs.com/yoyoketang/p/10186513.html

前面是用的yum直接安装的,本篇介绍用wget下载安装apache-tomcat-8.5.35,下载地址[wget http://mirrors.hust.edu.cn/apache/tomcat/tomcat-8/v8.5.35/bin/apache-tomcat-8.5.35.tar.gz](wget http://mirrors.hust.edu.cn/apache/tomcat/tomcat-8/v8.5.35/bin/apache-tomcat-8.5.35.tar.gz)

由于我这边只有一台服务器,为了方便练习,可以在一个服务器上搭建3个tomcat环境

  • 先在/usr/local目录下新建一个tomcat目录
  • wget下载apache-tomcat-8.5.35.tar.gz
  • tar -zxf解压
  • 解压后重命名apache-tomcat-1
  • 同一目录下复制2个一样的apache-tomcat-2、apache-tomcat-3
[root@yoyo ~]# cd ..
[root@yoyo local]# cd /usr/local
[root@yoyo local]# mkdir tomcat
[root@yoyo local]# cd tomcat/
[root@yoyo tomcat]# wget http://mirrors.hust.edu.cn/apache/tomcat/tomcat-8/v8.5.35/bin/apache-tomcat-8.5.35.tar.gz
[root@yoyo tomcat]# tar -zxf apache-tomcat-8.5.35.tar.gz # 下载解压后,复制三个一样的文件apache-tomcat-1、apache-tomcat-2、apache-tomcat-3
[root@yoyo tomcat]# mv apache-tomcat-8.5.35 apache-tomcat-1
[root@yoyo tomcat]# cp -r apache-tomcat-1 apache-tomcat-2
[root@yoyo tomcat]# cp -r apache-tomcat-1 apache-tomcat-3

tomcat默认都是在8080端口启动的,为了能让3个服务都能启动,就需要改启动端口,打开apache-tomcat-1/conf/server.xml目录编辑

vim /usr/local/tomcat/apache-tomcat-1/conf/server.xml

找到以下三个地方,把端口改成跟之前不一样的,如下

//8011远程停服务端口
<Server port="8011" shutdown="SHUTDOWN">
//8081为http端口 <Connector port="8081" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
//8021为AJP端口,Apache能通过AJP协议访问Tomcat的8006端口
<Connector port="8021" protocol="AJP/1.3" redirectPort="8443" />

打开apache-tomcat-2/conf/server.xml目录编辑

//8012远程停服务端口
<Server port="8012" shutdown="SHUTDOWN">
//8082为http端口 <Connector port="8082" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
//8022为AJP端口,Apache能通过AJP协议访问Tomcat的8006端口
<Connector port="8022" protocol="AJP/1.3" redirectPort="8443" />

打开apache-tomcat-3/conf/server.xml目录编辑

//8013远程停服务端口
<Server port="8013" shutdown="SHUTDOWN">
//8083为http端口 <Connector port="8083" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
//8023为AJP端口,Apache能通过AJP协议访问Tomcat的8006端口
<Connector port="8023" protocol="AJP/1.3" redirectPort="8443" />

改完之后,去阿里云ECS后台管理-安全组-配置规则-新增8081、8082、8083三个端口访问权限

接着去启动3个tomcat, 看到如下提示,说明正常启动了

[root@yoyo tomcat]# cd /usr/local/tomcat/apache-tomcat-1/bin/
[root@yoyo bin]# ./startup.sh
Using CATALINA_BASE: /usr/local/tomcat/apache-tomcat-1
Using CATALINA_HOME: /usr/local/tomcat/apache-tomcat-1
Using CATALINA_TMPDIR: /usr/local/tomcat/apache-tomcat-1/temp
Using JRE_HOME: /usr
Using CLASSPATH: /usr/local/tomcat/apache-tomcat-1/bin/bootstrap.jar:/usr/local/tomcat/apache-tomcat-1/bin/tomcat-juli.jar
Tomcat started.
[root@yoyo bin]# [root@yoyo tomcat]# cd /usr/local/tomcat/apache-tomcat-2/bin/
[root@yoyo bin]# ./startup.sh [root@yoyo tomcat]# cd /usr/local/tomcat/apache-tomcat-3/bin/
[root@yoyo bin]# ./startup.sh

停掉tomcat服务是在bin下执行./shutdown.sh

[root@yoyo bin]# ll
total 844
-rw-r----- 1 root root 35051 Nov 4 01:39 bootstrap.jar
-rw-r----- 1 root root 15900 Nov 4 01:39 catalina.bat
-rwxr-x--- 1 root root 23463 Nov 4 01:39 catalina.sh
-rw-r----- 1 root root 1664 Nov 4 01:42 catalina-tasks.xml
-rw-r----- 1 root root 25145 Nov 4 01:39 commons-daemon.jar
-rw-r----- 1 root root 207125 Nov 4 01:39 commons-daemon-native.tar.gz
-rw-r----- 1 root root 2040 Nov 4 01:39 configtest.bat
-rwxr-x--- 1 root root 1922 Nov 4 01:39 configtest.sh
-rwxr-x--- 1 root root 8508 Nov 4 01:39 daemon.sh
-rw-r----- 1 root root 2091 Nov 4 01:39 digest.bat
-rwxr-x--- 1 root root 1965 Nov 4 01:39 digest.sh
-rw-r----- 1 root root 3460 Nov 4 01:39 setclasspath.bat
-rwxr-x--- 1 root root 3680 Nov 4 01:39 setclasspath.sh
-rw-r----- 1 root root 2020 Nov 4 01:39 shutdown.bat
-rwxr-x--- 1 root root 1902 Nov 4 01:39 shutdown.sh
-rw-r----- 1 root root 2022 Nov 4 01:39 startup.bat
-rwxr-x--- 1 root root 1904 Nov 4 01:39 startup.sh
-rw-r----- 1 root root 49336 Nov 4 01:39 tomcat-juli.jar
-rw-r----- 1 root root 411789 Nov 4 01:39 tomcat-native.tar.gz
-rw-r----- 1 root root 4574 Nov 4 01:39 tool-wrapper.bat
-rwxr-x--- 1 root root 5483 Nov 4 01:39 tool-wrapper.sh
-rw-r----- 1 root root 2026 Nov 4 01:39 version.bat
-rwxr-x--- 1 root root 1908 Nov 4 01:39 version.sh
[root@yoyo bin]# ./shutdown.sh

启动完成后,在浏览器上分别然后访问http://47.104.x.x:8081/http://47.104.x.x:8082/http://47.104.x.x:8082/。会发现都可以访问到了。

首次访问会比较慢,如果不能访问就执行reboot重启

为了验证方便,修改tomcat首页/usr/local/tomcat/apache-tomcat-1/webapps/ROOT,打开index.jsp文件,把Home 分别改成Home8081,Home8082,Home8083

改完之后刷新页面就能访问了

nginx配置

前面一篇https://www.cnblogs.com/yoyoketang/p/10239179.html在/usr/local/nginx/conf目录在nginx.conf配置里面把默认监听端口改成了81

先配置一个tomcat环境,当访问http://47.104.x.x:81/端口时,让nginx把服务指向http://47.104.x.x:8081/

vim打开/usr/local/nginx/conf/nginx.conf先配置server

vim /usr/local/nginx/conf/nginx.conf

把location 这项改成proxy_pass http://47.104.x.x:8081;注意后面有个分号

    server {
listen 81;
server_name localhost; #charset koi8-r; #access_log logs/host.access.log main; location / {
proxy_pass http://47.104.x.x:8081;
# root html;
# index index.html index.htm;
} #error_page 404 /404.html; # redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}

编辑完成后:wq保存退出,执行reload,重新加载nginx文件

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

接着在浏览器输入 http://47.104.x.x:81 就能访问到8081的tomcat首页了,之前是访问的nginx页面,说明监听成功

负载均衡

轮询访问

一台服务配置好了,接着把三个tomcat服务全部放到一块,让访问 http://47.104.x.x:81能自动分配到8081、8082、8083这三个服务器上,实现负载均衡

vim打开/usr/local/nginx/conf/nginx.conf在server上方加个upstream标签,把多个服务器server地址配置进去就可以了

upstream tomcats {
server 47.104.x.x:8081;
server 47.104.x.x:8082;
server 47.104.x.x:8083;
} server {
listen 81;
server_name localhost; #charset koi8-r; #access_log logs/host.access.log main; location / {
proxy_pass http://tomcats;
# root html;
# index index.html index.htm;
}

编辑完成后:wq保存退出,执行reload,重新加载nginx文件

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

接着在浏览器输入http://47.104.x.x:81,多次刷新,会发现tomcat首页轮询显示Home8081、Home8082、Home8083

加权轮询

如果3台服务器的性能和配置不一样,我们希望访问某台服务器的权重加大,只需加一个参数就可以

upstream tomcats {
server 47.104.x.x:8081 weight=1;
server 47.104.x.x:8082 weight=2;
server 47.104.x.x:8083 weight=3;
}

跟上面步骤一样,改完之后./nginx -s reload,访问6次,会有3次出现Home8083

ip_hash解决session共享问题

涉及到不同的ip访问多个服务器会出现session不共享的问题,可以加个参数:ip_hash,就可以解决了

upstream tomcats {
ip_hash;
server 47.104.x.x:8081 weight=1;
server 47.104.x.x:8082 weight=2;
server 47.104.x.x:8083 weight=3;
}

设置链接超时

location里面可以配置链接服务超时时间

    location / {
proxy_pass http://tomcats;
proxy_connect_timeout 36000s;
proxy_send_timeout 36000s;
proxy_read_timeout 36000s;
}

proxy_connect_timeout 为连接应用服务器的超时时间,单位为秒

proxy_send_timeout 为发送请求到应用服务器的超时时间,单位为秒

proxy_read_timeout 为等待应用服务器响应的超时时间,单位为秒

upstream模块

upstream模块主要负责负载均衡的配置,通过默认的轮询调度方式来分发请求到后端服务器,配置参数

  • ip_hash:指定请求调度算法,默认是weight权重轮询调度,可以指定

  • server host:port:分发服务器的列表配置

  • down:表示该主机暂停服务

  • max_fails:表示失败最大次数,超过失败最大次数暂停服务

  • fail_timeout:表示如果请求受理失败,暂停指定的时间之后重新发起请求

upstream name {

ip_hash;

server 192.168.x.xx:8080;

server 192.168.x.xx:8081 down;

server 192.168.x.xx:8082 max_fails=3;

server 192.168.x.xx:8083 fail_timeout=20s;

server 192.168.x.xx:8084 max_fails=3 fail_timeout=20s;

}

到此为止负载均衡环境就脚本搭建完成,那么对外只需开放81端口,就可以了,8081,8082,8083这三个服务端口可以关掉,这样用户就感知到是只访问一个服务。

当然这个不是完美的,当81端口这个主机服务挂掉时候,那整个服务就挂了,所以需要有备机服务,在多个机器上搭建备机服务(和主机服务环境一致),同样可以设置权重

这样多个机器,其中某个服务机器挂了也不影响。

交流QQ群:779429633

Linux学习10-CentOS搭建nginx负载均衡环境的更多相关文章

  1. Net分布式系统之二:CentOS系统搭建Nginx负载均衡

    一.关于CentOS系统介绍 CentOS(Community Enterprise Operating System,中文意思是:社区企业操作系统)是Linux发行版之一,它是来自于Red Hat ...

  2. CentOS中nginx负载均衡和反向代理的搭建

    1: 修改centos命令行启动(减少内存占用): vim /etc/inittab :initdefault: --> 修改5为3 若要界面启动使用 startx 2:安装jdk )解压:jd ...

  3. Nginx系列一:正向代理和反向代理、Nginx工作原理、Nginx常用命令和升级、搭建Nginx负载均衡

    转自https://www.cnblogs.com/leeSmall/p/9351343.html 仅供个人学习 一.什么是正向代理.什么是反向代理 1. 正向代理,意思是一个位于客户端和原始服务器( ...

  4. Linux 集群概念 , wsgi , Nginx负载均衡实验 , 部署CRM(Django+uwsgi+nginx), 部署学城项目(vue+uwsgi+nginx)

    Linux 集群概念 , wsgi , Nginx负载均衡实验 , 部署CRM(Django+uwsgi+nginx), 部署学城项目(vue+uwsgi+nginx) 一丶集群和Nginx反向代理 ...

  5. docker 搭建 nginx负载均衡

    本文描述如何在一台机器上搭建nginx负载均衡,我将会启动3个nginx的docker,分别是1台前置nginx负责分发,后面2台负责处理请求. 首先我切换到/usr/local/docker/文件夹 ...

  6. Nginx系列篇二:linux搭建Nginx负载均衡

    建议先搭建好Nginx环境 可阅读--->Linux中搭建Nginx 1.准备好三台服务器[标配] 一.nginx负载均衡服务器:192.168.102.110,配置好Nginx 二.tomca ...

  7. Net分布式系统之二:CentOS系统搭建Nginx负载均衡(下)

    上一篇文章介绍了VMWare12虚拟机.Linux(CentOS7)系统安装.部署Nginx1.6.3代理服务做负载均衡.接下来介绍通过Nginx将请求分发到各web应用处理服务. 一.Web应用开发 ...

  8. Linux搭建nginx负载均衡(两台服务器之间)

    负载均衡种类 第一种:通过硬件负载解决,常见的有NetScaler.F5.Radware和Array等商用的负载均衡器,价格比较昂贵 第二种:通过软件负载解决,常见的软件有LVS.Nginx.apac ...

  9. Centos 7搭建Nginx负载均衡,最简单。

    1.安装Nginx 1.1.下载Nginx安装包 Nginx 官网(https://nginx.org) 本次选择的是nginx-1.6.3.tar.gz版本,安装环境是centos7. 然后把下载好 ...

随机推荐

  1. POJ 3281 Dining(最大流+拆点)

    题目链接:http://poj.org/problem?id=3281 题目大意:农夫为他的 N (1 ≤ N ≤ 100) 牛准备了 F (1 ≤ F ≤ 100)种食物和 D (1 ≤ D ≤ 1 ...

  2. SqlServer中查看索引的使用情况

    --查看数据库索引的使用情况 select db_name(database_id) as N'TOPK_TO_DEV', --库名 object_name(a.object_id) as N'Top ...

  3. 第四届CCF软件能力认证

    1.图像旋转 问题描述 旋转是图像处理的基本操作,在这个问题中,你需要将一个图像逆时针旋转90度. 计算机中的图像表示可以用一个矩阵来表示,为了旋转一个图像,只需要将对应的矩阵旋转即可. 输入格式 输 ...

  4. Git(四)Git的分支管理

    一. 创建合并分支原理 在我们每次的提交,Git都把它们串成一条时间线,这条时间线就是一个分支.截止到目前,只有一条时间线,在Git里,这个分支叫主分支,即master分支.HEAD指针严格来说不是指 ...

  5. Web安全之跨站脚本攻击(XSS)

    XSS 简介 跨站脚本攻击,英文全称是 Cross Site Script,本来缩写是CSS,但是为了和层叠样式表(Cascading Style Sheet,CSS)有所区别,所以在安全领域叫做&q ...

  6. Windows下CRF++进行中文人名识别的初次尝试

    语料来自1998年1月份人民日报语料 1 语料处理 1.1 原始语料数据格式 语料中,句子已经被分词好,并且在人名后以“/”标注了“nr”表示是人名,其他非人名的分词没有进行标注 1.2 CRF++要 ...

  7. Nodejs新手村指引——30分钟上手

    概要 #准备工作 #开启简单的服务 #路由 #获取参数的三种方式 #静态文件 #数据库集成 #async解决多重嵌套问题 本文适合没有nodejs项目开发经验而又想对nodejs有个大概了解的你阅读, ...

  8. JavaWeb快速入门

    孙卫琴老师的javaweb一书已经买了很多年,由于很厚一直也没有去好好阅读下, 项目发布后有闲暇时间,决定快速学习了,毕竟很多概念和知识主要还是复习. 对于互联网,我们可以简单认为浏览器就是会人类语言 ...

  9. com.jcraft.jsch.JSchException: Auth fail

    背景 服务器信息: 服务器A:10.102.110.1 服务器B:10.102.110.2 需要从服务器A通过Sftp传输文件到服务器B. 应用项目中有一个功能,要通个关Sftp进行日志文件的传输,在 ...

  10. codevs 水过 骑马修栅栏

    [问题描述] 农民John每年有很多栅栏要修理.他总是骑着马穿过每一个栅栏并修复它破损的地方. John是一个与其他农民一样懒的人.他讨厌骑马,因此从来不两次经过一个一个栅栏.你必须编一个程序,读入栅 ...