AirJD 焦点
AirJD

没有录音文件
00:00/00:00
加收藏

使用Nginx轻松实现开源负载均衡 by 张宴

发布者 devops
发布于 1434594162144  浏览 10906 关键词 Nginx 
分享到

第1页

使用Nginx轻松实现开源负载均衡
张宴

(http://blog.s135.com)
    @北京

第2页

个人简介
张宴,曾在新浪等公司任系统工程师、系统架构师。工作内容主要涉及:服务器系统架构设计与部署、系统运维与调优、网络故障解决、网站后端以及接口类PHP程序开发、Unix开源软件二次开发、服务器监控系统开发等。具有CDN部署,跨IDC的数据传输,电信网通南北互通,以及门户类FLV视频分享网站──新浪播客架构设计经验。

第3页

什么是Nginx?
Nginx (“engine x”) 是俄罗斯人Igor Sysoev(塞索耶夫)编写的一款高性能的 HTTP 和反向代理服务器。
Nginx 已经在俄罗斯最大的门户网站── Rambler Media(www.rambler.ru)上运行了3年时间,同时俄罗斯超过20%的虚拟主机平台采用Nginx作为反向代理服务器。
在国内,已经有 新浪博客、新浪播客、网易新闻、六间房、56.com、Discuz!、水木社区、豆瓣、YUPOO、海内、迅雷在线 等多家网站使用 Nginx 作为Web服务器或反向代理服务器。

第4页

使用Nginx做七层负载均衡的理由
1、高并发连接:官方测试能够支撑5万并发连接,在实际生产环境中跑到2~3万并发连接数。
2、内存消耗少:在3万并发连接下,开启的10个Nginx 进程才消耗150M内存(15M*10=150M)。
3、配置文件非常简单:风格跟程序一样通俗易懂。
4、成本低廉:Nginx为开源软件,可以免费使用。而购买F5 BIG-IP、NetScaler等硬件负载均衡交换机则需要十多万至几十万人民币。

第5页

使用Nginx做七层负载均衡的理由
5、支持Rewrite重写规则:能够根据域名、URL的不同,将 HTTP 请求分到不同的后端服务器群组。
6、内置的健康检查功能:如果 Nginx Proxy 后端的某台 Web 服务器宕机了,不会影响前端访问。
7、节省带宽:支持 GZIP 压缩,可以添加浏览器本地缓存的 Header 头。
8、稳定性高:用于反向代理,宕机的概率微乎其微。

第6页

Nginx 负载均衡的典型应用 

第7页

硬件、软件七层负载均衡对比:
NetScaler

Nginx

第8页

硬件、软件七层负载均衡对比:
NetScaler

Nginx

第9页

五分钟搞定 Nginx 负载均衡

第10页

编译安装Nginx
1、创建供Nginx使用的组和帐号:
/usr/sbin/groupadd www -g 48
/usr/sbin/useradd -u 48 -g www www

2、编译安装rewrite模块支持包
wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-7.7.tar.gz
tar zxvf pcre-7.7.tar.gz
cd pcre-7.7/
./configure
make && make install
cd ../

第11页

编译安装Nginx
3、编译安装Nginx
wget http://sysoev.ru/nginx/nginx-0.7.17.tar.gz
tar zxvf nginx-0.7.17.tar.gz
cd nginx-0.7.17/
./configure --user=www --group=www --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module
make && make install
cd ../

4、备份默认nginx.conf配置文件
mv /usr/local/nginx/conf/nginx.conf  /usr/local/nginx/conf/nginx.old

第12页

创建nginx.conf配置文件(1)
1、创建Nginx配置文件
vi /usr/local/nginx/conf/nginx.conf 

2、输入配置文件内容
user  www www;
worker_processes 8;

error_log  /usr/local/nginx/logs/nginx_error.log  crit;
pid        /usr/local/nginx/logs/nginx.pid;

worker_rlimit_nofile 51200;
events 
{
    use epoll;
    worker_connections 51200;
}

第13页

创建nginx.conf配置文件(2)
http 
{
    include       mime.types;
    default_type  application/octet-stream;
    #charset  gb2312;
    
    server_names_hash_bucket_size 128;
    client_header_buffer_size 32k;
    large_client_header_buffers 4 32k;
     
    sendfile on;
    tcp_nopush     on;
    keepalive_timeout 60;

    tcp_nodelay on;

第14页

创建nginx.conf配置文件(3)
    #gzip on;
    #gzip_min_length  1k;
    #gzip_buffers     4 16k;
    #gzip_http_version 1.0;
    #gzip_comp_level 2;
    #gzip_types       text/plain application/x-javascript text/css application/xml;
    #gzip_vary on;

第15页

创建nginx.conf配置文件(4)
    upstream  web.abc.com  {
        server   192.168.1.10:80;
        server   192.168.1.11:80;
        server   192.168.1.12:80;
        server   192.168.1.13:81;
    }

    upstream  squid.abc.com  {
        server   192.168.1.20:80 weight=3;
        server   192.168.1.21:80;
        server   192.168.1.22:80;
    }

第16页

创建nginx.conf配置文件(5)
    server
    {
        listen  80;
        server_name www.abc.com *.abc.com;
        proxy_redirect off;

        #后端的Web服务器可以通过X-Forwarded-For获取用户真实IP
        proxy_set_header   X-Forwarded-For  $remote_addr;

        if ($request_uri   ~*   ".*\.(js|css|gif|jpg|jpeg|png|bmp|swf)$")
        {
                proxy_pass http://squid.abc.com;
        }
        if ($request_uri   ~*   "^/view/(.*)$")
        {
                proxy_pass http://squid.abc.com;
        }
        proxy_pass http://web.abc.com;

第17页

创建nginx.conf配置文件(6)
         #定义日志格式
        log_format  access  '$remote_addr - $remote_user [$time_local] $request '
                   '"$status" $body_bytes_sent "$http_referer" '
                   '"$http_user_agent" "$http_x_forwarded_for"';
        #打日志
        access_log  /usr/local/nginx/logs/access.log  access;

第18页

创建nginx.conf配置文件(7)
        #允许客户端请求的最大的单个文件字节数
        client_max_body_size     10m;

        #缓冲区代理缓冲用户端请求的最大字节数 可以理解为先保存到本地再传给用户
        client_body_buffer_size  128k;
              
        #跟后端服务器连接的超时时间_发起握手等候响应超时时间
        proxy_connect_timeout    600;
              
        #连接成功后_等候后端服务器响应时间_其实已经进入后端的排队之中等候处理
        proxy_read_timeout       600;
              
        #后端服务器数据回传时间_就是在规定时间之内后端服务器必须传完所有的数据
        proxy_send_timeout       600;

第19页

创建nginx.conf配置文件(8)
        #代理请求缓存区_这个缓存区间会保存用户的头信息以供Nginx进行规则处理_一般只要能保存下头信息即可
        proxy_buffer_size        8k;
              
        #同上 告诉Nginx保存单个用的几个Buffer 最大用多大空间
        proxy_buffers            4 32k;
              
        #如果系统很忙的时候可以申请更大的proxy_buffers 官方推荐*2
        proxy_busy_buffers_size 64k;
              
        #proxy缓存临时文件的大小
        proxy_temp_file_write_size 64k;
    }
}

配置文件编写完毕

第20页

启动Nginx
/usr/local/nginx/sbin/nginx –t

如果屏幕显示以下两行信息,说明配置文件正确:
the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
the configuration file /usr/local/nginx/conf/nginx.conf was tested successfully

那么,则可以启动Nginx服务:

ulimit -SHn 51200
/usr/local/nginx/sbin/nginx



第21页

不中断服务平滑修改Nginx配置
①、修改/usr/local/nginx/conf/nginx.conf配置文件后,请执行以下命令检查配置文件是否正确:
/usr/local/nginx/sbin/nginx -t
如果屏幕显示以下两行信息,说明配置文件正确:
the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
the configuration file /usr/local/nginx/conf/nginx.conf was tested successfully

②、这时,输入以下命令查看Nginx主进程号:
ps -ef | grep "nginx: master process" | grep -v "grep" | awk -F ' ' '{print $2}'
屏幕显示的即为Nginx主进程号,例如:
6302
这时,执行以下命令即可使修改过的Nginx配置文件生效:
kill -HUP 6302

或者用更简便的方法:
kill -HUP `cat /usr/local/nginx/logs/nginx.pid`


第22页

编写每天定时切割Nginx日志的脚本
1、创建脚本/usr/local/nginx/sbin/cut_nginx_log.sh,输入以下内容:
#!/bin/bash
# This script run at 00:00

# The Nginx logs path
logs_path="/usr/local/nginx/logs/"

mkdir -p ${logs_path}$(date -d "yesterday" +"%Y")/$(date -d "yesterday" +"%m")/
mv ${logs_path}access.log ${logs_path}$(date -d "yesterday" +"%Y")/$(date -d "yesterday" +"%m")/access_$(date -d "yesterday" +"%Y%m%d").log
kill -USR1 `cat /usr/local/nginx/logs/nginx.pid`

2、设置crontab,每天凌晨00:00切割nginx访问日志
crontab -e
输入以下内容:
00 00 * * * /bin/bash  /usr/local/nginx/sbin/cut_nginx_log.sh

第23页

总结
1、对于中、小型企业,如果没有资金去购买昂贵的四/七层负载均衡交换机,那么Nginx是不错的七层负载均衡选择,并且可以通过 Nginx + Keepalived 实现 Nginx 负载均衡器双机互备,任意一台机器发生故障,对方都能够将虚拟IP接管过去。







2、对于有资金购买四/七层负载均衡交换机的大型网站,Nginx也有其用武之地。以门户类网站为例, F5 BIG-IP等四/七层交换机由于负责了全站多个产品的服务,并发数非常高,而内容转发规则等七层交换业务,用不到F5 BIG-IP的四层硬件芯片,极大地消耗了F5的CPU和内存资源,成为高并发应用的制约条件。而Nginx的出现,成为了F5 BIG-IP七层交换的有力补充。

第24页

结束


谢谢各位!
支持文件格式:*.pdf
上传最后阶段需要进行在线转换,可能需要1~2分钟,请耐心等待。