• 利用nginx实现负载均衡和动静分离


    1、Nginx介绍

     

     

       Nginx ("engine x") 是一个高性能的 HTTP 和 反向代理 服务器,也是一个 IMAP/POP3/SMTP 代理服务器 。 Nginx 是由 Igor Sysoev 为俄罗斯访问量第二的Rambler.ru 站点开发的,它已经在该站点运行超过四年多了。Igor 将源代码以类BSD许可证的形式发布。自Nginx 发布四年来,Nginx 已经因为它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名了。目前国内各大门户网站已经部署了Nginx,如新浪、网易、腾讯等;国内几个重要的视频分享网站也部署了Nginx,如六房间、酷6等。新近发现Nginx 技术在国内日趋火热,越来越多的网站开始部署Nginx。

     

     

     

     

     

    2、为什么使用Nginx

     

     

       Nginx 是一个高性能Web和反向代理服务器, 它具有有很多非常优越的特性:

     

     

    在高连接并发的情况下,Nginx是Apache服务器不错的替代品: Nginx在美国是做虚拟主机生意的老板们经常选择的软件平台之一. 能够支持高达 50,000 个并发连接数的响应, 感谢Nginx为我们选择了 epoll and kqueue 作为开发模型.

     

     

    Nginx作为负载均衡服务器: Nginx 既可以在内部直接支持 Rails 和 PHP 程序对外进行服务, 也可以支持作为 HTTP代理 服务器对外进行服务. Nginx采用C进行编写, 不论是系统资源开销还是CPU使用效率都比 Perlbal 要好很多.

     

     

    作为邮件代理服务器: Nginx 同时也是一个非常优秀的邮件代理服务器(最早开发这个产品的目的之一也是作为邮件代理服务器), Last.fm 描述了成功并且美妙的使用经验.

     

     

    Nginx 是一个 [#installation 安装] 非常的简单 , 配置文件 非常简洁(还能够支持perl语法), Bugs 非常少的服务器: Nginx 启动特别容易, 并且几乎可以做到7*24不间断运行,即使运行数个月也不需要重新启动. 你还能够 不间断服务的情况下进行软件版本的升级 。

     

     

    以上都是官方的一些说法,看看网上的一些意见:“4GB内存的服务器+Apache(prefork模式)一般只能处理3000个并发连接,因为它们将占用3GB以上的内存,还得为系统预留1GB的内存。我曾经就有两台Apache服务器,因为在配置文件中设置的MaxClients为4000,当Apache并发连接数达到3800时,导致服务器内存和Swap空间用满而崩溃。而这台 Nginx 0.5.31 + PHP 5.2.4 (FastCGI) 服务器在3万并发连接下,开启的10个Nginx进程消耗100M内存(20MB*10=100M),开启的250个php-cgi进程消耗1G内存(4MB*250≈1GB),加上系统自身消耗的内存,总共才消耗2GB内存。如果服务器内存较小,完全可以只开启25个php-cgi进程,这样php-cgi消耗的总内存数才100M。在开启25个php-cgi进程的情况下,每分钟的处理能力只比开启250个php-cgi进程时低了不到一半。

     

     

     

     

     

    3、Nginx的安装

     

     

       基于李,杨家用的1台主机,操作系统是Win2003版本的,进行安装配置。

     

     

        Windows的安装比较简单,直接到http://wiki.nginx.org/NginxInstall下载需要的压缩包,解压到相应目录(假如是C:/nginx),点击目录下面的nginx.exe即可启动。

     

     

     

     

     

    4、动静分离和负载均衡的准备工作

     

     

    Host配置:

     

     

       127.0.0.1 yangli.com

     

     

    服务器:win2003  1台

     

     

    Web容器:Tomcat 6(8888端口)、Resin(8080端口)

     

     

                  Tomcat和resin都部署相同应用,getUsers.jsp作为测试页面。

     

     

    反向代理服务器:Nginx-0.8.34.zip

     

     

                        静态目录路径:e:/home/htmlfile/getUsers.html

     

     

    项目部署:普通web项目,例如:example

     

     

    Resin-3.0.26配置:

     

     

           <host id="yangli.com" root-directory=".">

     

     

           <web-app id="/" document-directory="E:/example/webapp"/>

     

     

           </host>

     

     

    Apache-tomcat-6.0.26 配置文件:

     

     

            D:apache-tomcat-6.0.26webappsexamples

     

     

            修改:D:apache-tomcat-6.0.26confserver.xml

     

     

            增加:

     

     

    <Host name="yangli.com"  appBase="D:apache-tomcat-6.0.26webappsexamples"

     

     

                unpackWARs="true" autoDeploy="true"

     

     

                xmlValidation="false" xmlNamespaceAware="false">

     

     

      <Context path="" docBase="D:apache-tomcat-6.0.26webappsexamples">

     

     

              </Context>

     

     

      </Host>

     

     

    主要是为了解决访问tomcat服务器的时候,

     

     

    不需要http://yangli.com:8888/examples/getUser.jsp

     

     

    可以直接访问:http://yangli.com:8888/getUser.jsp

     

     

    具体说明,可以上网搜搜。

     

     

    实现原理图:

     

     

     

     

     

     

     

     

     

     

     

    wps_clip_image1

     

     

    配置原理图

     

     

     

     

     

    5、动静分离

     

     

    假设后端只有一台web服务器,配置如下:

     

     

    upstream yangli.com {

     

     

       server 127.0.0.1:8888;

     

     

       #tomcat

     

     

    }

     

     

     

     

     

    server {

     

     

            listen       2010;

     

     

            server_name  yangli.com;

     

     

            access_log  off;

     

     

            location / {

     

     

                root   e:/home/htmlfile;           

     

     

                index index.html index.htm;        

     

     

                if (!-f $request_filename) {

     

     

        rewrite ^/([a-zA-Z]+).html   /$1.jsp last;

     

     

                    proxy_pass http://yangli.com;

     

     

                    break;

     

     

                }

     

     

            }

     

     

    }

     

     

    注明:如果是静态文件将定位到:e:/home/htmlfile;  目录

     

     

          如果e:/home/htmlfile不存在该文件,则请求到后端服务器:

     

     

          这里使用了rewrite规则rewrite ^/([a-zA-Z]+).html   /$1.jsp last;

     

     

         if (!-f $request_filename) {

     

     

        rewrite ^/([a-zA-Z]+).html   /$1.jsp last;

     

     

                    proxy_pass http://yangli.com;

     

     

                    break;

     

     

                }

     

     

     

     

     

    当我们请求:

     

     

    wps_clip_image2

     

     

     

     

     

     

     

     

     

     

     

    此时:访问的是E:homehtmlfile2010.html

     

     

    wps_clip_image3

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    当我们访问:

     

     

    wps_clip_image4

     

     

     

     

     

    根据rewrite规则,实际请求到了:127.0.0.1:8888上的tomcat进行处理,这样子就实现了动静分离,而对于用户来说,感觉只是仅仅访问了html页面。

     

     

    同样测试Resin,也是成功的。

     

     

     

     

     

    6、负载均衡

     

     

     

     

     

    1. Nginx 负载均衡基础知识

     

     

    nginx的upstream目前支持4种方式的分配

     

     

    1)、轮询(默认)

     

     

    每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。

     

     

    2)、weight

     

     

    指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。

     

     

    2)、ip_hash

     

     

    每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。

     

     

    3)、fair(第三方)

     

     

    按后端服务器的响应时间来分配请求,响应时间短的优先分配。

     

     

    4)、url_hash(第三方)

     

     

    在需要使用负载均衡的server中增加

     

     

    proxy_pass http://yangli.com;

     

     

     

     

     

    每个设备的状态设置为:

     

     

    a)        down 表示单前的server暂时不参与负载

     

     

    b)        weight 默认为1.weight越大,负载的权重就越大。

     

     

    c)        max_fails :允许请求失败的次数默认为1.当超过最大次数时,返回proxy_next_upstream 模块定义的错误

     

     

    d)        fail_timeout:max_fails次失败后,暂停的时间。

     

     

    e)        backup: 其它所有的非backup机器down或者忙的时候,请求backup机器。所以这台机器压力会最轻。

     

     

     

     

     

     修改配置如下:

     

     

        upstream yangli.com {

     

     

           server 127.0.0.1:8888;

     

     

           #tomcat

     

     

           server 127.0.0.1:8080 backup;

     

     

           #resin

     

     

        }

     

     

     

     

     

    下面来测试一下:

     

     

    wps_clip_image4

     

     

     

     

     

    实际上访问了:

     

     

    wps_clip_image5

     

     

    由于:resin设为backup,那么当tomcat宕机了,nginx会将请求发送到resin服务器,此时resin接管了tomcat,为外界提供服务。

     

     

     

     

     

    测试如下:

     

     

    1、关闭tomcat服务器

     

     

    执行:D:apache-tomcat-6.0.26inshutdown.bat

     

     

    wps_clip_image6

     

     

    表明tomcat已经被关闭

     

     

     

     

     

    2、访问http://yangli.com:2010/getUsers.html

     

     

     

     

     

    wps_clip_image7

     

     

    请求到resin服务器上了。

     

     

     

     

     

    3、启动tomcat服务器:

     

     

    D:apache-tomcat-6.0.26instartup.bat

     

     

    wps_clip_image8

     

     

    wps_clip_image9

     

     

    页面访问正常

     

     

    4、访问http://yangli.com:2010/getUsers.html

     

     

    wps_clip_image10

     

     

    由于tomcat工作正常,于是又接管,作为主服务器进行工作。

     

     

     

     

     

    7、总结

     

     

       本文主要阐述了利用Nginx实现动静分离和负载均衡,其中后端服务器使用了Resin和Tomcat,旨在表明Nginx并不关心后端服务器类型,只要后端服务器部署了相同的应用,访问正常即可。

  • 相关阅读:
    C#移动及改变控件大小
    flutter学习(状态组件,组件)
    dart学习1
    rn的优化
    git命令
    Immutable
    树形数据结构的搜索功能
    promise
    js出场率极高的代码
    js浮点数计算精度解决方案
  • 原文地址:https://www.cnblogs.com/ghjbk/p/6772583.html
Copyright © 2020-2023  润新知