新鲜生架构系列之Nginx+Tomcat负载均衡

负载均衡:多台服务器共同工作从而达到负载的均衡,同时避免因为某台服务器负载过高导致宕机而其他服务器资源闲置的情况。鉴于环境受限,这里我们使用VMware虚拟机安装Linux服务器来实现负载均衡。

Nginx概述
Nginx是俄罗斯人编写的十分轻量级的HTTP服务器。高性能的HTTP和反向代理服务器,同时也代理IMAP/POP3/SMTP服务器。Nginx发布以来,Nginx已经因为它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名。Nginx专为性能优化而开发,性能是其最重要的考量,实现上非常注重效率,其特点是占有内存少,并发能力强。能经受高负载的考验,有报告表明能支持高达50000个并发连接数,并且cpu,内存等资源消耗却非常低,运行非常稳定。Nginx具有很高的稳定性,其它HTTP服务器当遇到访问的峰值,或者有人恶意发起慢速连接时,也很可能会导致服务器物理内存耗尽频繁交换,失去响应只能重启服务器。成本低廉,购买F5,Big-IP,NetScaler硬件负载均衡交换机几十万,Nginx基于BSD开源协议,免费的,可商用。支持rewrite重写规则,能够根据域名,URL的不同将HTTP请求分发到不同的后端服务器群组。内置的健康检查功能,如果Nginx Proxy后端的某Web服务器宕机了,不会影响前端访问,节省带宽。支持GZIP压缩,可以添加浏览本地缓存的Header头。稳定性高,使用反向代理,几乎不会宕机。支持热部署,不断服务,进行更新。

Nginx的应用场景伦理片 http://www.dotdy.com/  

1.HTTP服务器。Nginx是一个http服务可以独立提供http服务。可以做网页静态服务器。

2.虚拟主机。可以实现在一台服务器虚拟出多个网站。例如个人网站使用的虚拟主机。

3.反向代理,负载均衡。当网站的访问量达到一定程度后,单台服务器不能满足用户的请求时,需要用多台服务器集群可以使用nginx做反向代理。并且多台服务器可以平均分担负载,不会因为某台服务器负载高宕机而某台服务器闲置的情况。

Nginx的安装

Nginx建议在linux上运行,而且要安装C语言的编译环境GCC。Nginx依赖的包如下所示:

1.GCC 安装:yum install gcc-c++
安装Nginx需要先将官网下载的源码进行编译,编译依赖GCC环境,如果没有GCC环境,则需要安装。

2.PCRE pcre-devel安装:yum install -y pcre pcre-devel
PCRE(Perl Compatible Regular Expressions)是一个Per库,包括perl兼容的正则表达式库。Nginx的http模块使用pcre来解析正则表达式,所以需要在linux上安装pcre库,pcre-devel是使用pcre开发的一个二次开发库。nginx也需要此库。

3.ZLIB安装:yum install -y zlib zlib-devel
ZLIB库提供了很多种压缩和解压缩的方式,Nginx使用zlib对http包的内容进行gzip,所以需要在CentOS 上安装zlib库。实际上我们都需要先装pcre,zlib。前者为了重写rewrite,后者为了gzip压缩。

4.OpenSSL 安装:yum install -y openssl openssl-devel
OpenSSL 是一个强大的安全套接字层密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及 SSL 协议,并提供丰富的应用程序供测试或其它目的使用。Nginx不仅支持http协议,还支持https(即在ssl协议上传输http),所以需要在CentOS安装OpenSSL库。

5.下载Nginx

wget -c https://nginx.org/download/nginx-1.10.1.tar.gz

6.安装步骤

 6.1把Nginx的源码上传到Linux系统,使用SecureCRT上传。

 6.2把压缩包解压缩tar -zxvf nginx-1.10.1.tar.gz。

 6.3配置Nginx:cd nginx-1.10.1,./configure,在nginx-1.10.1中使用默认配置即可。

 6.4编译,make。

 6.5安装,make install。

 6.6查找安装路径,whereis nginx。

 6.7 查看版本,nginx -v

防火墙相关知识简介

保存防火墙配置修改:/etc/rc.d/init.d/iptables save

重启防火墙:/etc/init.d/iptables restart

查看CentOS防火墙信息:/etc/init.d/iptables status

关闭CentOS防火墙服务:/etc/init.d/iptables stop

永久关闭防火墙:chkconfig -level 35 iptables off

CentOS 6

临时生效,开启service iptables start,关闭service iptables stop

永久性生效,开启chkconfig iptables on,关闭chkconfig iptables off

CentOS 7

启动一个服务:systemctl start firewalld.service

关闭一个服务:systemctl stop firewalld.service

重启一个服务:systemctl restart firewalld.service

显示一个服务的状态:systemctl status firewalld.service

在开机时启用一个服务:systemctl enable firewalld.service

在开机时禁用一个服务:systemctl disable firewalld.service

查看服务是否开机启动:systemctl is-enabled firewalld.service;echo $?

查看已启动的服务列表:systemctl list-unit-files|grep enabled

echo $?:当一个进程执行完毕时,该进程会调用一个名为 _exit 的例程来通知内核它已经做好“消亡”的准备了。该进程会提供一个退出码(一个整数)表明它准备退出的原因。按照惯例,0用来表示正常的或者说“成功”的终止。也就是说我们在执行 echo $? 时反回的值就是进程的退出码。而且,这个退出码是由刚刚执行完的进程提供给系统内核的。

修改防火墙规则

修改Nginx所在主机的防火墙配置:vi /etc/sysconfig/iptables,将nginx使用的端口添加到允许列表中。例如:-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT (表示允许80端口通过)。保存后重启防火墙:service iptables restart。

Nginx的反向代理

正向代理:PC机通过代理服务器访问互联网。反向代理:PC机通过Nginx实现请求的转发后访问互联网。我们可以使用单个nginx服务器来部署多个应用服务器(tomcat),也可以使用多台服务器ABC(alone1,alone2,alone3)来部署多个应用服务器(tomcat)。简单的部署思路:A服务器做为主服务器,域名直接解析到A服务器(alone1)上,由A服务器负载均衡到B服务器(alone2)与C服务器(alone3)上。鉴于环境有限,新鲜生项目采取的是使用单个nginx服务器来部署多个tomcat应用服务器。

Nginx的启动,停止,重启,刷新配置,查看,访问

cd /usr/local/nginx/sbin/

1.启动:./nginx(service nginx restart,systemctl start nginx.service),如果访问不到,首先查看防火墙是否关闭。

2.停止:./nginx -s stop(service nginx stop)或./nginx -s quit。

  kill命令不推荐使用。

  ./nginx -s quit:此方式停止步骤是待nginx进程处理任务完毕进行停止。
  ./nginx -s stop:此方式相当于先查出nginx进程id再使用kill命令强制杀掉进程。

3.重启:对 nginx 进行重启相当于先停止再启动,即:./nginx -s quit和./nginx。

4.刷新配置:./nginx -s reload。

在/usr/local/nginx/conf目录下nginx.conf文件是nginx的配置文件。在配置文件中每个server是一个虚拟机,我们可以通过端口和域名区分虚拟机。当nginx的配置文件修改后,要想让配置生效需要重启nginx,使用-s reload不用先停止nginx再启动nginx即可将配置信息在nginx中生效。

5.查询Nginx进程:ps aux|grep nginx。

  查询TCP连接情况:netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'。

  查询端口占用情况:netstat -anp | grep portno(例如:netstat –apn | grep 80)。

  查看Nginx运行状态:service nginx status。

  检查Nginx配置文件:nginx -t。

  添加Nginx服务自启动:chkconfig nginx on。

6.访问nginx:通过公网ip查看nginx服务返回的信息,例如curl -i 192.168.0.168。

Nginx下自定义404页面

1.创建自己的404.html页面

2.更改nginx.conf在http定义区域加入:fastcgi_intercept_errors on

3.更改nginx.conf(单独网站配置文件,例如在nginx -> sites-enabled下的站点配置文件)中在server区域加入如下内容:

error_page 404=/404.html 或者error_page 404 = http://www.xxx.com/404.html

4.更改后重启nginx,测试nginx.conf正确性,./nginx –t

#502 等错误可以用同样的方法来配置。error_page  500 502 503 504 = /50x.html

注意事项

1.必须要添加:fastcgi_intercept_errors on。

如果这个选项没有设置,即使创建了404.html和配置了error_page也没有效果。

2.fastcgi_intercept_errors

语法: fastcgi_intercept_errors on|off ,默认: fastcgi_intercept_errors off

3.添加位置: http, server, location

默认情况下,nginx不支持自定义404错误页面,只有fastcgi_intercept_errors这个指令被设置为on,nginx才支持将404错误重定向。

4.不是设置了fastcgi_intercept_errors on,nginx就会将404错误重定向。在nginx中404错误重定向生效的前提是设置了fastcgi_intercept_errors on,并且正确的设置了error_page这个选项(包括语法和对应的404页面)

5.不要出于省事或者提高首页权重的目的将首页指定为404错误页面,也不要用其它方法跳转到首页。

6.自定义的404页面必须大于512字节,否则可能会出现IE默认的404页面。

Nginx开机自启动,在rc.local增加启动代码,vi /etc/rc.local

添加内容:cd /usr/local/nginx/sbin/nginx并设置执行权限chmod 755 rc.local

域名解析

打开系统文件C:\Windows\System32\drivers\etc\hosts,在末尾添加192.168.0.168 nfs.com;或者下载使用SwitchHosts小程序。

Nginx负载均衡搭建

1.配置主服务器A的nginx.conf

编辑配置文件(vim /usr/local/nginx/conf/nginx.conf)在http段添加并修改相关代码

upstream nfs.com{

    server 192.168.0.169:80 weight=5;

    server 192.168.0.69:80 weight=1;

}

server {

    listen       80;

    server_name  192.168.0.168;

    location / {

        proxy_pass    http://192.168.0.168;

        proxy_set_header   Host             $host;

        proxy_set_header   X-Real-IP        $remote_addr;

        proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;

        root   html;

        index  index.html index.htm;

    }

}

nginx中的upstream支持下面几种方式:

a.轮询(默认,按照时间顺序对所有服务器一个一个的访问,如果有服务器宕机会自动剔除)

b.weight(服务器的访问几率与weight成正比,在服务器配置不均的时候进行配置)

c.ip_hash(对每个请求的ip进行hash计算,并按照一定的规则分配对应的服务器)

d.fair(按照每台服务器的响应时间(rt)来分配请求,rt晓得优先分配)

e.url_hash(按照访问url的hash值来分配请求),这里使用了默认的轮询方式

2.配置服务器B与C的nginx.conf

在http段修改相关代码

server {

    listen       80;

    server_name  192.168.0.168;

    location / {

        root   html;

        index  index.html index.htm;

    }

}

3. 测试负载均衡结果

分别修改nginx的index.html文件(vim /usr/local/nginx/html/index.html),在文件的末尾添加当前服务器的IP地址以作区分。

4.保存并重启服务器A,B,C的nginx

5.访问nfs.com

结果证明访问nfs.com(192.168.0.168)时请求会分配到B服务器(192.168.0.169)与C服务器(192.168.0.69)上,根据weight权重实现了负载均衡。

tomcat(alone1,alone2,alone3)的下载,安装与启动

下载:wget http://mirrors.cnnic.cn/apache/tomcat/tomcat-7/v7.0.73/bin/apache-tomcat-7.0.73.tar.gz

解压:tar -zxvf apache-tomcat-7.0.73.tar.gz

    mv apache-tomcat-7.0.73 /usr/local/tomcat-7.0.73

运行:cd /usr/local/tomcat-7.0.73/

    ./bin/startup.sh

设置Tomcat开机启动

vim /etc/rc.d/rc.local在底部加上:/usr/local/tomcat7/bin/startup.sh

Nginx+Tomcat的负载均衡

此处只需要简单修改nginx.conf配置文件即可:

upstream nfs.com {   

  server 192.168.0.169:80;   

  server 192.168.0.69:80;   

}   

upstream tomcats {

  server 192.168.0.168:8080;

  server 192.168.0.169:8080;

  server 192.168.0.69:8080;

}  

#当前的Tomcat的配置

server {

  listen 8081;#监听8080端口,可以改成其他端口

  server_name 192.168.0.168;#当前服务的域名

  #location ~* \.(jpg|gif|png|swf|flv|wma|wmv|asf|mp3|mmf|zip|rar)$ {  

      #root /web/www/html/;  

  #}

  location / {

    proxy_pass http://tomcats;

    proxy_redirect default;

  }

  error_page   500 502 503 504  /50x.html;

  location = /50x.html {

    root   html;

  }

}

#当前的Nginx的配置

server {

  listen       80;

  server_name  192.168.0.168;

  #charset koi8-r;

  #access_log  logs/host.access.log  main;

  location / {

     proxy_pass    http://nfs.com;

     proxy_set_header   Host             $host;   

     proxy_set_header   X-Real-IP        $remote_addr;   

     proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;   

     root   html;

     index  index.html index.htm;

  }

}

测试Nginx+Tomcat负载均衡结果

分别修改tomcat的index.jsp文件(vim /usr/local/tomcat-7.0.73/webapps/ROOT/index.jsp),在文件的末尾添加当前服务器的IP地址以作区分。

4.保存并重启服务器A,B,C的Tomcat与服务器A的nginx

5.访问http://192.168.0.168:8081/

结果证明访问http:192.168.0.168:8081/时请求根据weight权重实现了tomcat的负载均衡。

至此新鲜生Nginx+Tomcat负载均衡基本完成,后期会继续优化与功能添加,如有问题请联系作者QQ:369195314。

你可能感兴趣的:(架构设计)