通过nginx实现7层负载均衡

nginx的概述

Nginx是一个高性能的HTTP和反向代理服务器。Nginx是由Igor Sysoev(伊戈尔.塞索耶夫)为俄罗斯访问量第二的rambler.ru站点开发的,第一个公开版本0.1.0发布于2004年10月4日。.
Nginx能够选择高效的epoll(Linux2.6内核)作为网络I/O模型,在高连接并发的情况下,Nginx是Apache服务器不错的替代品,它能够支持高达5000个并发连接数的响应,而内存、CPU等系统资源消耗却非常低,运行非常稳定。
nginx的官方网站:http://nginx.org/en/download.html
扩展:Tengine
Tengine 是由淘宝网发起的Web服务器项目。它在Nginx的基础上,针对大访问量网站的需求,添加了很多高级功能和特性。Tengine的性能和稳定性已经在大型的网站如淘宝网,天猫商城等得到了很好的检验。
官方网站:http://tengine.taobao.org/
Nginx和Apache的区别:
nginx或apache服务器本身是不能解析php文件
Nginx是通过php-fpm这个服务来处理php文件
Apache是通过libphp5.so这个模块来处理php文件
Nginx解析PHP的过程:

Apache解析PHP的过程:

总结:
Apache的libphp5.so是随着apache服务器一起运行,而Nginx和php-fpm是各自独立运行,所以在运行过程中,Nginx和php—fpm都需要分别启动!
nginx相对于apache的优点:
轻量级,同样起web服务,比apache占用更少的内存及资源;高并发,nginx处理请求是异步非阻塞的,而apache则是阻塞型的,在高并发下nginx 能保持低资源低消耗高性能;高度模块化的设计,编写模块相对简单;社区活跃,各种高性能模块出品迅速。
apache相对于nginx的优点:
apache超稳定,一般来说,需要并发性高的web服务,用nginx,如果不需要性能只求稳定,那就apache
nginx处理动态请求是鸡肋,一般动态请求要apache去做,nginx只适合静态和反向代理。

使用 nginx 实现动静分离的负载均衡集群。

LB负载均衡集群分两类: LVS(四层)和 nginx 或 haproxy (七层)+客户端通过访问分发器的 VIP 来访问网站
现在应用更复杂,比如现在网站页面有:.php .html ·png .jpeg .jsp 等,有动态页面有静态页面,静态页面一般是不变的,想访问更快些,前面学习过 SQUID
但是前面的LVS是四层的。基于IP的。现在需要在应用层基于不同的应用进行分发。
七层LB,Ngin /Haproxy都可以支持7层LB
现在实现以下功能,拓扑图:

生产环境中一般是这样:
静态文件处理:可以使用nginx或apache。
动态文件处理: apache、tomcat。
图片文件处理:squid。
使用nginx实现动静分离的负载均衡集群
Nginx 负载均衡基础知识.
Nginx的upstream(负载的5种方式,目前最常用前3种方式1)、
1、轮询(默认)
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器 down 掉,能自动剔除。
2、weight
指定轮询几率, weight和访问比率成正比,用于后端服务器性能不均的情况。
3、ip_hash
每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。(代码层,通过redis做缓存可以更好的解决session的问题)
4、fair (第三方)
按后端服务器的响应时间来分配请求,响应时间短的优先分配。
5、url_hash(第三方) 链接哈希
按访问url的hash结果来分配请求,使用同样url定向到同一个后端服务器,后端服务器为缓存时比较有效
分发器snowy201的配置

  • 安装nginx
    先将nginx源码包上传至服务器
[root@snowy201 ~]# useradd -s /sbin/nologin -M nginx #添加一个启动nginx的用户
[root@snowy201 ~]# yum install -y gcc gcc-c++ autoconf automake zlib zlib-devel openssl openssl-devel pcre pcre-devel make
[root@snowy201 ~]# rz
[root@snowy201 ~]# tar -zxf nginx-1.12.2.tar.gz
[root@snowy201 ~]# cd nginx-1.12.2/
[root@snowy201 nginx-1.12.2]# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_ssl_module --with-http_realip_module --with-http_gzip_static_module --with-http_dav_module --with-http_stub_status_module --with-http_addition_module --with-http_sub_module --with-http_flv_module --with-http_mp4_module --with-pcre

参数说明:
--prefix=/usr/local/nginx 指定安装路径
--user=nginx --group=nginx 指定运行nginx进程的用户和组
--with-http_ssl_module 支持ssl加密
--with-http_realip_module 此模块支持显示真实来源IP地址,当NGINX做负载均衡服务器时,需要这个功能,这样能够使得后台服务器记录原始客户端的IP地址。
--with-http_gzip_static_module 开启nginx支持gunzip压缩静态文件功能,静态文件压缩后,可以节约带宽.
--with-http_dav_module #启用支持WebDAV功能.WebDAV一种基于HTTP1.1协议的通信协议。它扩展了HTTP1.1,在GET、POST、HEAD等几个HTTP标准方法以外添加了一些新的方法,使应用程序可直接对Web Server直接读写,并支持写文件锁定(Locking)及解锁(Unlock ),还可以支持文件的版本控制。
--with-http_stub_status_module #启用支持nginx 监控模块,后期通过调用此模块可以监控nginx状态。zabbix也可以通过此模块,来监控nginx的性能状态。
--with-http_addition_module #启用支持(开启此模块后,nginx可以在响应http请求之前或者之后追加文本内容,比如想在站点底部追加一个js或者css,可以使用这个模块来实现。)
--with-http_sub_module #启用支持(此模块为nginx替换响应内容的模块,比如当站点出现什么敏感字,需要批量修改所有 web 页面,且想修改很耗时间,可以使用这个模块进行替换。或者想临时在站点中加上一个通用js或者css之类的文件,也可以使用这个模块。)
--with-http_flv_module #启用支持(支持HTTP—FLV方式直播视频)。
--with-http_mp4_module #启用支持(此模块允许nginx为 H.264/AAC编译码的视频文件,如:.mp4、.m4v、和.m4a扩展名的文件,提供伪流媒体服务端支持。伪流媒体是与Flash播放器一起配合使用的。播放器向服务端发送HTTP请求,请求中的查询串是以开始时间为参数的,而服务端以流响应,这样流的开始位置就能于请求中的时间相对应。)
--with-pcre #启用perl正则表达式,perl的正则表达式一般使用在location指令和ngx_http_rewrite_module url重定向模块中。默认ngx_http_rewrite_module是就启用的。

[root@snowy201 nginx-1.12.2]# make -j 4 && make install
[root@snowy201 nginx-1.12.2]# echo $?
0
[root@snowy201 nginx-1.12.2]#cd
[root@snowy201 ~]# ln -s /usr/local/nginx/sbin/nginx /usr/sbin/
[root@snowy201 ~]# nginx
[root@snowy201 ~]# netstat -tulnp|grep 80
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      10562/nginx: master 
  • 修改nginx配置
[root@snowy201 ~]# vi /usr/local/nginx/conf/nginx.conf
第二行的user  nobody; 改为 user  nginx nginx;
......
    location / { 
            root   html;
            index  index.html index.htm;  #第45行之后增加以下7行内容
           if ($request_uri ~* \.html$) { 
                proxy_pass http://htmlservers;  #当用户访问静态页面则转发至htmlsevers服务器组
                }   
            if ($request_uri ~* \.php$) {
                proxy_pass http://phpservers;   #当用户访问动态页则面转发至phpsevers服务器组
                }   
                proxy_pass http://picservers;   #当用户访问图片则转发至picsevers服务器组
        }   

......    #文件末尾倒数第二行增加以下12行内容,定义服务器组后端的real server
    upstream htmlservers {
        server 172.20.77.202:80;
        server 172.20.77.203:80;
        }

    upstream phpservers {
        server 172.20.77.202:80;
        server 172.20.77.203:80;
        }

    upstream picservers {
        server 172.20.77.202:80;
        server 172.20.77.203:80;

        }
[root@snowy201 ~]# nginx -t  #检查配置文件是否有误
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
[root@snowy201 ~]# nginx -s reload  #重新加载配置文件

配置后端real server snowy202
注:生产环境中静态页面跟动态页面是在不同的服务器上的,我们这里因为资源有限,做实验测试,就放在同一个服务器上了

[root@snowy202 ~]# yum install -y httpd php
[root@snowy202 ~]# echo "snowy202" > /var/www/html/index.html
[root@snowy202 ~]# vi /var/www/html/test.php
<?php
        echo "snowy202";
        phpinfo();

?>
[root@snowy202 ~]# cd /var/www/html
[root@snowy202 html]# rz  #上传测试图片至服务器
[root@snowy202 html]# firewall-cmd --permanent --add-service=http
[root@snowy202 html]# firewall-cmd --reload
[root@snowy202 html]# systemctl enable httpd --now

配置后端real server snowy203
注:生产环境中静态页面跟动态页面是在不同的服务器上的,我们这里因为资源有限,做实验测试,就放在同一个服务器上了

[root@snowy203 ~]# yum install -y httpd php
[root@snowy203 ~]# echo "snowy203" > /var/www/html/index.html
[root@snowy203 ~]# vi /var/www/html/test.php
<?php
        echo "snowy203";
        phpinfo();

?>
[root@snowy203 ~]# cd /var/www/html
[root@snowy203 html]# rz  #上传测试图片至服务器
[root@snowy203 html]# firewall-cmd --permanent --add-service=http
[root@snowy203 html]# firewall-cmd --reload
[root@snowy203 html]# systemctl enable httpd --now

测试访问页面
访问静态页面

再次访问静态页面

访问动态页面

再次访问动态页面

访问图片页面

再次访问图片页面

nginx转发算法

  • 带权重的
upstream htmlservers {
        server 172.20.77.202:80 weight=20;  
        server 172.20.77.203:80 weight=10;
        }
  • ip_hash
upstream htmlservers {
        ip_hash;
        server 172.20.77.202:80;  
        server 172.20.77.203:80;
        }
  • fair(最小链接)
upstream htmlservers {
        fair;
        server 172.20.77.202:80;  
        server 172.20.77.203:80;
        }
  • url_hash(链接哈希)
upstream htmlservers {
        hash $request_uri;
        hash_method crc32;  #加密算法
        server 172.20.77.202:80;  
        server 172.20.77.203:80;
        }
posted @ 2021-09-28 16:30  乘风破浪的蜗牛  阅读(508)  评论(0)    收藏  举报