Notice: Undefined index: 3 in /data/home/qxu1152200294/htdocs/inc/system.php on line 477 Notice: Undefined index: 10 in /data/home/qxu1152200294/htdocs/inc/system.php on line 477 Notice: Undefined index: default in /data/home/qxu1152200294/htdocs/inc/system.php on line 477 Notice: Undefined index: 3 in /data/home/qxu1152200294/htdocs/inc/system.php on line 477 Notice: Undefined index: 8 in /data/home/qxu1152200294/htdocs/inc/system.php on line 477 Notice: Undefined index: 8 in /data/home/qxu1152200294/htdocs/inc/system.php on line 477 Notice: Undefined index: default in /data/home/qxu1152200294/htdocs/inc/system.php on line 477 Notice: Undefined index: 8 in /data/home/qxu1152200294/htdocs/inc/system.php on line 477 Notice: Undefined index: 8 in /data/home/qxu1152200294/htdocs/inc/system.php on line 477 Notice: Undefined index: 8 in /data/home/qxu1152200294/htdocs/inc/system.php on line 477 Notice: Undefined index: default in /data/home/qxu1152200294/htdocs/inc/system.php on line 477 Notice: Undefined index: 2 in /data/home/qxu1152200294/htdocs/inc/system.php on line 477 Notice: Undefined index: 6 in /data/home/qxu1152200294/htdocs/inc/system.php on line 477 Notice: Undefined index: 8 in /data/home/qxu1152200294/htdocs/inc/system.php on line 477 Notice: Undefined index: 8 in /data/home/qxu1152200294/htdocs/inc/system.php on line 477 Notice: Undefined index: 8 in /data/home/qxu1152200294/htdocs/inc/system.php on line 477 Notice: Undefined index: 8 in /data/home/qxu1152200294/htdocs/inc/system.php on line 477 Notice: Undefined index: default in /data/home/qxu1152200294/htdocs/inc/system.php on line 477 Notice: Undefined index: 8 in /data/home/qxu1152200294/htdocs/inc/system.php on line 477 Notice: Undefined index: 2 in /data/home/qxu1152200294/htdocs/inc/system.php on line 477 IT博客 http://new.nginxs.net 运维博客 http://new.nginxs.net/conf/profile.pngnginxshttp://new.nginxs.net jenkins 日志爆满 http://new.nginxs.net/read.php/post-201612071024/ nginxs2016-12-07T10:25:11+08:00 http://new.nginxs.net/read.php/post-201612071024/ http://new.nginxs.net/read.php/post-201612071024/#comment-post-201612071024 **前一段时间公司的jenkins因为日志量太大把磁盘占满,仔细一看日志文件“/var/log/jenkins/jenkins.log”几分钟产生了20G的日志,

而且日志还在一直增长,内容如下**
Dec 07, 2016 1:38:14 AM javax.jmdns.impl.constants.DNSRecordClass classForIndex
WARNING: Could not find record class for index: -1
Dec 07, 2016 1:38:14 AM javax.jmdns.impl.DNSIncoming$MessageInputStream readName
SEVERE: bad domain name: possible circular name detected. Bad offset: 0xffffffff at 0x192
Dec 07, 2016 1:38:14 AM javax.jmdns.impl.constants.DNSRecordType typeForIndex
SEVERE: Could not find record type for index: -1
Dec 07, 2016 1:38:14 AM javax.jmdns.impl.DNSIncoming readQuestion
SEVERE: Could not find record type: dns[query,62.210.149.68:6037, length=404, id=0x4f50, flags=0x5449:aa, questions=4688
questions:
[DNSQuestion@2088037402 type: TYPE_IGNORE index 0, class: CLASS_UNKNOWN index 0, name: 00@123.56.20.160 SIP/2.0
Via: SIP/2.0/UDP 127.0...1:6037;branch=z9hG4bK-1103786718;rport
Content.Length: 0
From: "sipvicious"<sip:100@1.1.1.1.;tag=37623338313461303134653901353434343930393731
Accept: app.sdp
User-Agent: friendly-scanner
To: "sipvici.sip:100@1.1.1.1Contact: sip:10.@127.0.0.1:6037
CSeq: 1 OPTIONS
Call-ID: 76029.546128695368835116
Max-Forwards: 70

ϿϿϿϿϿϿ.]
[DNSQuestion@1398141921 type: TYPE_IGNORE index 0, class: CLASS_UNKNOWN index 0, name: ]
[DNSQuestion@752862545 type: TYPE_IGNORE index 0, class: CLASS_UNKNOWN index 0, name: ]
[DNSQuestion@2077034887 type: TYPE_IGNORE index 0, class: CLASS_UNKNOWN index 0, name: ]
[DNSQuestion@545402584 type: TYPE_IGNORE index 0, class: CLASS_UNKNOWN index 0, name: ]
[DNSQuestion@1546918866 type: TYPE_IGNORE index 0, class: CLASS_UNKNOWN index 0, name: ]
[DNSQuestion@236169288 type: TYPE_IGNORE index 0, class: CLASS_UNKNOWN index 0, name: ]
[DNSQuestion@494995772 type: TYPE_IGNORE index 0, class: CLASS_UNKNOWN index 0, name: ]
[DNSQuestion@742654138 type: TYPE_IGNORE index 0, class: CLASS_UNKNOWN index 0, name: ]
[DNSQuestion@1347581035 type: TYPE_IGNORE index 0, class: CLASS_UNKNOWN index 0, name: ]
[DNSQuestion@1125173185 type: TYPE_IGNORE index 0, class: CLASS_UNKNOWN index 0, name: ]
[DNSQuestion@1447947894 type: TYPE_IGNORE index 0, class: CLASS_UNKNOWN index 0, name: ]
[DNSQuestion@1518364117 type: TYPE_IGNORE index 0, class: CLASS_UNKNOWN index 0, name: ]
[DNSQuestion@431141826 type: TYPE_IGNORE index 0, class: CLASS_UNKNOWN index 0, name: ]
[DNSQuestion@1549353466 type: TYPE_IGNORE index 0, class: CLASS_UNKNOWN index 0, name: ]

上面内容主要是因为DNS查询错误,返回了所有的日志数据,解决方法:
【系统管理】=》【system log】=>【日志级别】=》【Name: javax.jmdns,Level: off】

]]>
01-python读写文件 http://new.nginxs.net/read.php/post-201611201300/ nginxs2016-11-20T13:30:00+08:00 http://new.nginxs.net/read.php/post-201611201300/ http://new.nginxs.net/read.php/post-201611201300/#comment-post-201611201300

  • 介绍
    文件的处理主要包括读,写下面进行形象介绍


  • 初始化输入输出流
    下面文件就相当于一个房子,“f”就相当于一把钥匙,“mode”就是钥匙权限,如果你的钥匙只是院子门(r)的,那你就只能站在房子外面看里面东西,
    如果你的钥匙不仅有院子门还有屋门(w),那你就可以进到屋子里面动东西了。
    f = open('/PATH/filename',mode='r',buffering=-1)
    上面打开句柄需要三部分'文件','访问模式','缓存',buffering的
    值代表的缓存行数。
    访问mode参数 描述
    r 文件只读模式
    w 只写模式
    a 追加写模式
    rU或U 只读并支持通用换行符模式( \n,\r )


    • 加号不单独使用,代表可读写
      例:r+
      w+ 可读写同w,覆盖写
      a+ 可读写同a,追加
      b 二进制模式,添加对应读写模式即可
      (rb,wb,ab,rb+,wb+,ab+)

  • 文件读取
    读取方法 描述
    f.read() 默认读取全部文件
    f.readline() 读取打开文件的第一行
    f.readlines() 读取文件并返回一个列表
    每行为列表一个参数

  • 文件写入
    写入方法 描述
    f.write() 写入
    f.writelines() 把整个字符串列表写入文件
    f.flush() 未关闭文件下提前刷新内容到文件
  • 关闭文件
    关闭文件 描述
    f.close() 关闭初始化输入输出时打开文件

    例子1:读取文件按行处理
    递归读取一个文件每行并输出

    f = open('/tmp/data.log',access_mode='r',buffering=-1) #初始化文件的输入输出流
    for i in f.readlines(): #以字符串列表的形式读取文件后,每次赋值一行给“i”进行print输出
    print i
    f.close() #关闭打开的文件

    ]]>
    glusterfs安装使用 http://new.nginxs.net/read.php/post-201607142023/ nginxs2016-07-14T20:17:11+08:00 http://new.nginxs.net/read.php/post-201607142023/ http://new.nginxs.net/read.php/post-201607142023/#comment-post-201607142023 **介绍

    glusterfs文件系统是:


    1. 一个分布式可伸缩,最大可超过PB,可插拔的集群I / O调度器
    2. 非停止性存储,非元数据存储
    3. 可以通过mount挂载到本地,向本地磁盘一样读写
    4. 简单易于管理

    查看各个节点状态
    gluster peer status

    1.安装


    1. 1 配置epel源

    wget -P /etc/yum.repos.d http://download.gluster.org/pub/gluster/glusterfs/LATEST/CentOS/glusterfs-epel.repo

    1.2 安装软件
    yum install glusterfs glusterfs-server glusterfs-fuse


    1. 3 添加hosts

    [root@docker ~]# cat /etc/hosts
    127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
    ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
    10.1.1.134 docker
    192.168.199.253 i2p.nginxs.net

    1.4 注册并查看主机列表(不显示当前主机)

    [root@cloud yum.repos.d]# gluster peer probe 192.168.199.222
    peer probe: success.
    [root@cloud yum.repos.d]# gluster peer status
    Number of Peers: 1

    Hostname: 192.168.199.222
    Uuid: 67511194-333c-4919-88df-ccb5e10d9568
    State: Peer in Cluster (Connected)
    [root@cloud yum.repos.d]# gluster peer probe 192.168.199.8
    peer probe: success. Probe on localhost not needed

    1.5 创建逻辑卷

    [root@cloud yum.repos.d]# gluster volume create dianjoygfs 192.168.199.{8,222}:/data1/gfs-data/
    volume create: dianjoygfs: success: please start the volume to access data

    1.6 启动存储逻辑卷

    [root@docker ~]# gluster volume start dianjoygfs
    volume start: dianjoytest: success

    1.7 挂载glusterfs存储卷

    [root@ntest1 ~]# mount.glusterfs 192.168.199.8:/dianjoygfs /mnt/gluster-mount/
    [root@ntest1 ~]# df -hT
    Filesystem Type Size Used Avail Use% Mounted on
    /dev/vda1 ext4 20G 8.8G 9.8G 48% /
    tmpfs tmpfs 1.9G 16K 1.9G 1% /dev/shm
    /dev/vdb1 ext4 50G 20G 28G 42% /data
    192.168.199.8:/dianjoygfs
    fuse.glusterfs 2.7T 861G 1.8T 33% /mnt/gluster-mount

    这个存储卷的大小是,每个节点挂载“/data1/gfs-data/”的磁盘大小,其它信息同是如此。

    ]]>
    RabbitMQ server 3.6安装介绍 http://new.nginxs.net/read.php/post-201605272221/ nginxs2016-05-27T22:39:11+08:00 http://new.nginxs.net/read.php/post-201605272221/ http://new.nginxs.net/read.php/post-201605272221/#comment-post-201605272221 介绍

    RabbitMQ是一个消息传输队列,简单点说就是一个用来接收和转发消息的工具。
    你可以把它想象成一个邮局,当你把信件到你的邮箱,邮差肯定会把信件发送到收件人手中。

    这里把RabbitMQ比喻成邮箱,邮局和邮差,与真实的邮局差别只是一个发送纸质消息另外一个是二进制数据罢了。


    下面是RabbitMQ一个简单的入门操作,首先RabbitMQ使用的erlang实现的所以先要安装erlang

    安装Erlang

        yum -y install gcc gcc-devel glibc-devel  ncurses-devel
    下载最新的erlang
    wget http://erlang.org/download/otp_src_18.3.tar.gz
    tar zxf otp_src_18.3.tar.gz
    cd otp_src_18.3
    ./configure && make && make install

    安装RabbitMQ

    安装解压后直接可以使用
    wget http://www.rabbitmq.com/releases/rabbitmq-server/v3.6.1/rabbitmq-server-generic-unix-3.6.1.tar.xzxz -d rabbitmq-server-generic-unix-3.6.1.tar.xz
    tar xf rabbitmq-server-generic-unix-3.6.1.tar

    把集群里所有的主机名必须在/etc/hosts文件解析

        192.168.199.232  api-node1.nginxs.net api-node1
    192.168.199.233 api-node1.nginxs.net api-node1

    当启动api-node1节点的rabbitmq服务以后把内容放到其他节点的相同位置,文件权限400

    [root@api-node1 ~]# cat .erlang.cookie
    GTZKLOKVHNYLXUSJDORN

    查看插件管理

        ./sbin/rabbitmq-plugins list  #查看插件列表
    ./sbin/rabbitmq-plugins enable rabbitmq_management #开启插件
    ./sbin/rabbitmq-plugins disable rabbitmq_management #关闭插件

    举例:开启web管理
    ./sbin/rabbitmq-plugins enable rabbitmq_management

    访问地址:http://IP/15672

    启动RabbitMQ

    ./sbin/rabbitmq-server -detached

    加入集群


    1. 加入集群之前rabbitmq必须关闭app以免消息冲突(为了保证数据正常在形成集群的时候没有数据写入新节点)
    2. 集群的启动顺序,必须先启动硬盘节点然后然能启动内存节点(否则无法启动)

    3. 当集群所有节点都停止运行的时候应该按照后停的服务先启动的顺序启动,否则将导致个别节点消息时空错乱
      语法:./sbin/rabbitmqctl join_cluster rabbit@hostname --{ram|disc}

       ./sbin/rabbitmqctl stop_app
      ./sbin/rabbitmqctl join_cluster rabbit@api-node1

      [root@api-node2 RMQ]# ./sbin/rabbitmqctl cluster_status
      Cluster status of node 'rabbit@api-node2' ...
      [{nodes,[{disc,['rabbit@api-node1','rabbit@api-node2']}]}]
      ./sbin/rabbitmqctl start_app

    查看用户

    [root@api-node1 rabbitmq_server-3.5.4]# ./sbin/rabbitmqctl list_users
    Listing users ...
    guest [administrator]

    创建用户

    [root@api-node1 rabbitmq_server-3.5.4]# ./sbin/rabbitmqctl add_user nginxs myscript
    Creating user "nginxs" ...

    设置角色

    语法:set_user_tags

    角色:administrator,monitoring,policymaker,management

    [root@api-node1 rabbitmq_server-3.5.4]# ./sbin/rabbitmqctl set_user_tags nginxs administrator
    Setting tags for user "administrator" to [] ...
    Segmentation fault (core dumped)

    设置权限

    语法:set_permissions [-p ]

        [root@api-node1 rabbitmq]# ./sbin/rabbitmqctl    set_permissions -p logstore "logstash" ".*" ".*" ".*"
    Setting permissions for user "logstash" in vhost "logstore" ...

    删除用户

        [root@api-node1 rabbitmq_server-3.5.4]# ./sbin/rabbitmqctl delete_user guest
    Deleting user "guest" ...

    设置镜像队列策略

    语法: set_policy [-p ] [--priority ] [--apply-to ]

        [root@api-node1 rabbitmq_server-3.5.4]# ./sbin/rabbitmqctl set_policy sync-all "^" '{"ha-mode":"all"}'
    Setting policy "ha-all" for pattern "^" to "{\"ha-mode\":\"all\"}" with priority "0" …

    手动同步队列

    rabbitmqctl sync_queue name

    停止服务

    ./sbin/rabbitmqctl stop PID
    ./sbin/rabbitmqctl stop 52641

    ]]>
    12-nginx限制文件下载速度 http://new.nginxs.net/read.php/post-201605222127/ nginxs2016-05-22T21:54:11+08:00 http://new.nginxs.net/read.php/post-201605222127/ http://new.nginxs.net/read.php/post-201605222127/#comment-post-201605222127 介绍

    有些时候需要把一些文件放到nginx供用户下载,但是你又怕用户占用大量带宽,这时候就应该给客户端限制传输速度了。
    limit_rate_after 5m; #前5M的下载内容不进行限速
    limit_rate 1m; #限速1M

    举例:

            location  /download/ {
    limit_rate_after 5m;
    limit_rate 1m;
    alias /data/html/;
    }

    这里的“limit_rate 1m;”的“1m”就是限速1M的意思,“0”就算不限速,
    limit_rate_after 5m; 是指传输5m不限速,完成后限速1M
    这里的限制是给每个请求的,如果用户开两个连接就是限制的两倍带宽,

    当你带宽有限情况下只能限制用户的连接数,来限制用户使用最大带宽
    也可以根据连接连接数限制总带宽, 连接数超过限制直接返回“ 503 Service Temporarily Unavailable”

        http {
    ....
    server {
    .....
    limit_conn_zone $server_name zone=servers:10m;
    server {
        location /download/ {
            limit_conn servers 10;
            limit_rate_after 500k;
            limit_rate 50k;
        }
    }
    }}

    这里限制本域名的的连接数10个,每个连接预先不限制速度下载500k,然后再限速50k下载,这样10个连接同时下载最小的带宽 50k*10 最大带宽5000k

    nginx教程

    第一章 nginx安装基本引导和进程信号

    02-nginx IO模型

    03-nginx负载均衡

    04-nginx的root和alias区别

    05-nginx limit_req和limit_conn_zone

    06-nginx访问控制“限制ip”,“限制用户名”

    07-nginx geo区域访问控制

    08-nginx的if语句条件判断

    10-nginx内部变量和自定义变量

    11-nginx rewrite uri地址重写

    12-nginx限制文件下载速度

    ]]>
    11-nginx rewrite uri地址重写 http://new.nginxs.net/read.php/post-201605220051/ nginxs2016-05-22T00:55:11+08:00 http://new.nginxs.net/read.php/post-201605220051/ http://new.nginxs.net/read.php/post-201605220051/#comment-post-201605220051 介绍

    大家经常会遇到这样需求,一个活动页面的URL地址很长,推广起来产品运营和用户反馈不容易记住
    不美观,但是暂时没办法修改代码,这个时候就可以用到rewrite。或者你现在网站升级到https现在有些用户还在访问http你想统一用https,这些都可以用rewrite规则来实现。
    rewrite会重写用户的请求地址,但是不会修改问号后面参数,返回给用户的httpcode为302。

    语法:rewrite regex replacement [flag];
    作用域:server, location, if
    rewrite_log on | off; #rewrite日志开启和关闭
    set $user_pro "false";定义区域“main”
    uninitialized_variable_warn on | off; 控制是否记录警告未初始化的变量。默认开启;

    nginx和apache的rewrite简单对比

    以前大家在用apache做共享主机的时候在“.htaccess”文件写这些规则,但是nginx不是这样。
    举例1:

        apache的rewrite规则
    RewriteCond %{HTTP_HOST} example.org
    RewriteRule (.*) http://www.example.org$1

    nginx的rewrite规则:
    server {
    listen 80;
    server_name www.example.org example.org;
    if ($http_host = example.org) {
    rewrite (.*) http://www.example.org$1;
    }
    但是这种写法是不建议的,最好每个不同域名不同server{}

    举例2:

    nginx会把所有匹配到以“/code/”目录开头的请求跳转到“http://192.168.1.128:8080/”但是不修改?后面参数

    location ~ ^/code/
    {
    rewrite (.*) http://192.168.1.128:8080/;
    }

    举例3:

    正则匹配内容“^(/download/.)/audio/(.)..$”,前面的每个“.”映射到目标地址里面都是$1,$2,$3…..

        rewrite ^(/download/.*)/audio/(.*)\..*$       $1/mp3/$2.ra  last;
    return 403; #返回httpcode 403
    rewrite ^(/media/.*)/audio/(.*)\..*$ http://new.nginxs.net/$1/mp3/$2.ra last;

    rewrite标记

    描 述:如果使用正则匹配一个请求地址,URI将更改为指定的地址,并顺序执行配置文件中依次出现的指令,
    但是如果你想修改地址以后直接跳出则可以使用flag来处理下面介绍一下last,break,redirect,permanent四个标签

         last                  #在搜索到相应的URI和location之后完成rewrite指令;停止处理当前的ngx_http_rewrite_module指令集,开始寻找一个新的位置改变URI匹配;
    break # 完成 rewrite指令处理直接break;
    redirect #返回302临时重定向,如果replacement替换部分是由http://开始,它将被应用。
    permanent #返回301代码永久重定向

    nginx教程

    第一章 nginx安装基本引导和进程信号

    02-nginx IO模型

    03-nginx负载均衡

    04-nginx的root和alias区别

    05-nginx limit_req和limit_conn_zone

    06-nginx访问控制“限制ip”,“限制用户名”

    07-nginx geo区域访问控制

    08-nginx的if语句条件判断

    10-nginx内部变量和自定义变量

    11-nginx rewrite uri地址重写

    ]]>
    10-nginx内部变量和自定义变量 http://new.nginxs.net/read.php/post-201605211355/ nginxs2016-05-21T14:04:11+08:00 http://new.nginxs.net/read.php/post-201605211355/ http://new.nginxs.net/read.php/post-201605211355/#comment-post-201605211355 自定义nginx变量

    set $user_pro "false";定义区域“main”

    公有变量

    $arg_ 请求中的参数名称
    $args 请求中的参数
    $binary_remote_addr 客户地址在一个二进制形式、价值的长度总是4字节
    $body_bytes_sent
    $bytes_sent (ngx_http_core_module)发送到客户端字节数
    $bytes_sent (ngx_http_log_module)
    $connection 连接序列号
    $connection_requests (ngx_http_core_module)
    $connection_requests (ngx_http_log_module)
    $connections_active #活跃连接数
    $connections_reading #只读连接
    $connections_waiting #等待连接
    $connections_writing #写连接
    $content_length Header里面内容长度”
    $contenttype Header里面内容格式”
    $cookie
    cookie的名字
    $date_local
    $document_root 当前请求的root或者alias
    $document_uri $url一样
    $fastcgi_path_info
    $fastcgi_script_name
    $geoip_area_code
    $geoip_city
    $gzip_ratio
    $host 主机或主机名”请求头字段,或服务器名称匹配的请求
    $hostname 主机名
    $https
    $invalid_referer
    $is_args ?
    $limit_rate
    $memcached_key
    $modern_browser
    $msec (ngx_http_core_module)
    $msec (ngx_http_log_module)
    $msie
    $nginx_version
    $pid worker进程的PID
    $pipe (ngx_http_core_module)
    $proxy_add_x_forwarded_for
    $proxy_host
    $proxy_port
    $proxy_protocol_addr
    $query_string
    $realip_remote_addr
    $realpath_root
    $remote_addr 远程IP
    $remote_port 远程端口
    $remote_user 进行基本用户验证时候的用户名
    $request 完整的原始请求
    $request_body 请求主体
    $request_body_file
    $request_completion
    $request_filename
    $request_id
    $request_length (ngx_http_core_module)
    $request_length (ngx_http_log_module)
    $request_method
    $request_time (ngx_http_core_module)
    $request_time (ngx_http_log_module)
    $request_uri 则是请求的整个字符串,包含了后面的query_string的。
    $scheme
    $secure_link
    $secure_link_expires
    $senthttp$server_addr
    $server_name 接受请求的服务器的名称
    $server_port
    $server_protocol
    $session_log_binary_id
    $session_log_id
    $slice_range
    $spdy
    $spdy_request_priority
    $status (ngx_http_core_module) 请求服务状态
    $status (ngx_http_log_module)
    $tcpinfo_rtt
    $tcpinfo_rttvar
    $tcpinfo_snd_cwnd
    $tcpinfo_rcv_space
    $time_iso8601 (ngx_http_core_module)
    $time_iso8601 (ngx_http_log_module) #iso8601标准的时间
    $time_local (ngx_http_core_module) #本地时间
    $time_local (ngx_http_log_module) 当地时间在常见的日志格式
    $uid_got
    $uid_reset
    $uid_set
    $upstream_addr
    $upstream_cache_status
    $upstream_connect_time
    $upstreamcookie$upstream_header_time
    $upstreamhttp$upstream_response_length
    $upstream_response_time
    $upstream_status
    $uri 指的是请求的文件和路径,不包括“?”或者“#”之后的东西

    nginx教程

    第一章 nginx安装基本引导和进程信号

    02-nginx IO模型

    03-nginx负载均衡

    04-nginx的root和alias区别

    05-nginx limit_req和limit_conn_zone

    06-nginx访问控制“限制ip”,“限制用户名”

    07-nginx geo区域访问控制

    08-nginx的if语句条件判断

    10-nginx内部变量和自定义变量

    ]]>
    08-nginx的if语句条件判断 http://new.nginxs.net/read.php/post-201605211340/ nginxs2016-05-21T13:43:11+08:00 http://new.nginxs.net/read.php/post-201605211340/ http://new.nginxs.net/read.php/post-201605211340/#comment-post-201605211340 介绍

    语法:if(condition){………}
    配置作用域:server,location

    匹配条件

    “=”和““!=”” 变量等于不等于条件
    “~” 和“~” 匹配到指定内容是否区分大小写
    “!~”和"!~
    " 匹配到指定内容是否区分大小写
    “-f”和“!-f” 检查一个文件是否存在
    "-d" 和"!-d" 检查一个目录是否存在
    "-e"和"!-e" 检查一个文件,目录,软连接是否存在
    “-x”和“!-x” 检查一个是否有执行权限
    匹配的内容可以是字符串也可以是一个正则表达式。
    如果一个正则表达式包含“}”或者“;”就必须包含在单引号或双引号里面。

    执行条件

        if(condition){………}
    if($variable ~ '^/product' ){………}
    举例:
    if ($http_user_agent ~ MSIE) { #只要“$http_user_agent”配置MSIE的
    rewrite ^(.*)$ /msie/$1 break; #URL地址前面加"/msie"
    }

    if ($http_cookie ~* "id=([^;]+)(?:;|$)") {
    set $id $1;
    }

    if ($request_method = POST) {
    return 405;
    }

    if ($slow) {
    limit_rate 10k;
    }

    if ($request_uri ~) {
    return 403;
    }

    if ($request_uri ~ "/test.html") { #根据访问地址跳转到目标地址
    rewrite ^ http://new.ngins.net;
    }

    if (-x "/data/test.sh") { #根据文件是否有执行权限,跳转到目标
    rewrite ^ http://new.ngins.net;
    }

    nginx教程

    第一章 nginx安装基本引导和进程信号

    02-nginx IO模型

    03-nginx负载均衡

    04-nginx的root和alias区别

    05-nginx limit_req和limit_conn_zone

    06-nginx访问控制“限制ip”,“限制用户名”

    07-nginx geo区域访问控制

    08-nginx的if语句条件判断

    ]]>
    09-nginx geo区域访问控制 http://new.nginxs.net/read.php/post-201605210009/ nginxs2016-05-21T00:16:11+08:00 http://new.nginxs.net/read.php/post-201605210009/ http://new.nginxs.net/read.php/post-201605210009/#comment-post-201605210009 介绍
    geo是nginx的地域模块, 管理人员可以通过用户的ip信息查询到地理位置,再根据地理位置提供更好的服务。

    由于免费的地理位置库往往不会太准确,所以没有准确地理位置库,不建议使用nginx geo模块进行精准投放用户类的行为

    举例1:
    geo $geo {
    default 0;
    192.168.1.159 1;
    192.168.1.128 2;
    }
    server {
    listen 80;
    server_name localhost;
    root /usr/local/kafka/html;
    if ($geo = 1) {
    rewrite ^ http://new.nginxs.net;
    }
    if ($geo = 2) {
    rewrite ^ http://www.nginxs.net;
    }
    描述:geo模块会把
    192.168.1.159的 $geo=1最终跳转到new.nginxs.net
    192.168.1.128的 $geo=2最终跳转到www.nginxs.net
    其它的都是default $geo=0最终默认的正常访问

    根据geo的值
    语法: geo [$address] $variable { ... }
    作用域: http
    描述指定变量的值的依赖在客户端IP地址。默认情况下,地址是取自$ remote_addr变量,

    介绍
    geo是nginx的地域模块, 管理人员可以通过用户的ip信息查询到地理位置,再根据地理位置提供更好的服务。

    举例1:

        geo  $geo {
    default 0;
    192.168.1.159 1;
    192.168.1.128 2;
    }
    server {
    listen 80;
    server_name localhost;
    root /usr/local/kafka/html;
    if ($geo = 1) {
    rewrite ^ http://new.nginxs.net;
    }
    if ($geo = 2) {
    rewrite ^ http://www.nginxs.net;
    }

    描述:geo模块会把
    192.168.1.159的 $geo=1最终跳转到new.nginxs.net
    192.168.1.128的 $geo=2最终跳转到www.nginxs.net
    其它的都是default $geo=0最终默认的正常访问

    根据geo的值
    语法: geo [$address] $variable { ... }
    作用域: http
    描述指定变量的值的依赖在客户端IP地址。默认情况下,地址是取自$ remote_addr变量,

    举例2:

    geo根据地域负载

        http{
    updtream BJ {
    server 10.10.1.10:8080;
    }
    updtream SH {
    server 10.10.2.10:8080;
    }
    updtream GZ {
    server 10.10.3.10:8080;
    }
    updtream LO {
    server 10.10.4.10:8080;
    }

    geo $country {
    default BJ; # $country的默认值BJ
    include conf/geo.conf; #包含conf/geo.conf配置
    delete 127.0.0.0/16; #删除指定网络
    proxy 192.168.100.0/24;
    proxy 2001:0db8::/32;

    127.0.0.0/24 SH; #设置 $country=SH
    127.0.0.1/32 GZ; #设置 $country=GZ
    10.1.0.0/16 BJ; #设置 $country=BJ
    192.168.1.0/24 LO; #设置 $country=LO
    }

    location / {
    proxy_redirect off;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_pass http://$country;
    access_log log/new.nginx.net.log main;
    }
    }

    根据不同区域的用户访问不同服务器进行负载

    range的用法

    geoip_country  /usr/local/nginx-new/GeoIP.dat;      #读取IP位置库
    geoip_city /usr/local/nginx-new/GeoLiteCity.dat;
    geo $country {
    ranges;
    default ZZ;
    127.0.0.0-127.0.0.0 US;
    127.0.0.1-127.0.0.1 RU;
    127.0.0.1-127.0.0.255 US;
    10.1.0.0-10.1.255.255 RU;
    192.168.1.0-192.168.1.255 UK;
    }

    nginx教程

    第一章 nginx安装基本引导和进程信号

    02-nginx IO模型

    03-nginx负载均衡

    04-nginx的root和alias区别

    05-nginx limit_req和limit_conn_zone

    06-nginx访问控制“限制ip”,“限制用户名”

    09-nginx geo区域访问控制

    ]]>
    06-nginx访问控制“限制ip”,“限制用户名” http://new.nginxs.net/read.php/post-201605182309/ nginxs2016-05-18T23:14:11+08:00 http://new.nginxs.net/read.php/post-201605182309/ http://new.nginxs.net/read.php/post-201605182309/#comment-post-201605182309 介绍在一些特定的情况下nginx需要限制用户的访问例如根据一下条件:根据IP,根据用户,根据请求方法等。

    方式1:通过location里面IP限制请求,被限制请求返回403,如果要ipv6的限制编译安装的时候需要编译“ --with-ipv6”语法:(allow|deny) address | CIDR | unix: | all;
    作用域: http, server, location, limit_except

    举例:限制ip:除去192.168.1.158不可以访问,“192.168.1.0/24”网段其他用户可以访问,除此之外的其它ip不可以访问。

        server {
    ...
    deny 192.168.1.158;
    allow 192.168.1.0/24;
    deny all;
    }

    根据用户名密码限制

    创建密码文件

        [root@localhost nginx-new]# htpasswd -c ./passwdfile  admin  #添加用户名为admin
    New password: #此处输入密码
    Re-type new password: #再次输入密码
    Adding password for user admin
    [root@localhost nginx-new]# cat passwdfile
    admin:tKAyBpIh8xdyk
    [root@localhost nginx-new]# mv passwdfile conf/
    location /images/
    {
    auth_basic "Test login";
    auth_basic_user_file passwdfile;
    root /usr/local/kafka/html;
    }

    请求地址http://new.nginxs.net/images/aaa.jpg

    satisfy 让你更加灵活使用多种验证方式

    允许访问如果所有(all)或至少一个(any)模块通过验证才可以访问。( ngx_http_access_module, ngx_http_auth_basic_module or ngx_http_auth_request_module)
    默认是: satisfy all;必须通过所有验证

    语法: satisfy [ all | any ]
    使用字段:http, server, location
    在下面配置里面使用了access模块和auth basic模块验证, satisfy any;就是说只要匹配到两种模块中的一种便可以正常访问

                location /images/
    {
    satisfy any;
    deny 192.168.1.1;
    deny all;
    auth_basic "Test login";
    auth_basic_user_file passwdfile;
    root /usr/local/kafka/html;
    }

    nginx教程

    第一章 nginx安装基本引导和进程信号

    02-nginx IO模型

    03-nginx负载均衡

    04-nginx的root和alias区别

    05-nginx limit_req和limit_conn_zone

    06-nginx访问控制“限制ip”,“限制用户名”

    ]]>
    02-zookeeper集群搭建 http://new.nginxs.net/read.php/post-201605141300/ nginxs2016-05-14T13:16:19+08:00 http://new.nginxs.net/read.php/post-201605141300/ http://new.nginxs.net/read.php/post-201605141300/#comment-post-201605141300 首先准备三个节点
    192.168.1.127
    192.168.1.128
    192.168.1.129

    先安装zookeeper
    cd /usr/local/src/
    wget http://apache.fayea.com/zookeeper/zookeeper-3.5.1-alpha/zookeeper-3.5.1-alpha.tar.gztar zxf zookeeper-3.5.1-alpha.tar.gz
    mv zookeeper-3.5.1-alpha /usr/local/zookeeper

    更改三个节点配置
    server.1=192.168.1.127:2008:6008
    server.服务器编号=服务器地址:LF通信端口:选举端口

    cd /usr/local/zookeeper && mkdir -p /data/zookeeper
    vim conf/zoo.cfg

        tickTime=2000
    initLimit=10
    syncLimit=5
    dataDir=/data/zookeeper
    clientPort=2181
    server.1=192.168.1.127:2008:6008
    server.2=192.168.1.128:2008:6008
    server.3=192.168.1.129:2008:6008

    启动前两个节点

         ./bin/zkServer.sh start
    ZooKeeper JMX enabled by default
    /usr/bin/java
    Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
    Starting zookeeper ... STARTED

    你会发现有报错是因为其他节点没有起来

        2016-05-14 12:05:18,540 [myid:3] - WARN  [QuorumPeer[myid=3](plain=/0:0:0:0:0:0:0:0:2181)(secure=disabled):QuorumCnxManager@459] - Cannot open channel to 2 at election address /192.168.199.22
    2:6008
    java.net.ConnectException: Connection refused
    at java.net.PlainSocketImpl.socketConnect(Native Method)
    at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
    at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
    at java.net.Socket.connect(Socket.java:589)
    at org.apache.zookeeper.server.quorum.QuorumCnxManager.connectOne(QuorumCnxManager.java:444)
    at org.apache.zookeeper.server.quorum.QuorumCnxManager.connectOne(QuorumCnxManager.java:485)
    at org.apache.zookeeper.server.quorum.QuorumCnxManager.connectAll(QuorumCnxManager.java:513)
    at org.apache.zookeeper.server.quorum.FastLeaderElection.lookForLeader(FastLeaderElection.java:919)
    at org.apache.zookeeper.server.quorum.QuorumPeer.run(QuorumPeer.java:1040)

    查看集群状态

    echo 'stat'|nc 192.168.1.128 2181

    Zookeeper version: 3.5.1-alpha-1693007, built on 07/28/2015 07:19 GMT
    Clients:
    /192.168.1.128:182810

    Latency min/avg/max: 0/0/0
    Received: 1

    Sent: 0
    Connections: 1
    Outstanding: 0
    Zxid: 0x100000000
    Mode: follower
    Node count: 5

    查看节点角色[root@test-node4 zookeeper]# ./bin/zkServer.sh status
    ZooKeeper JMX enabled by default
    /usr/bin/java
    Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
    Client port found: 2181. Client address: localhost.
    Mode: leader
    zookeeper

    zookeeper源码安装

    00-zookeeper启动报错: myid file is missing 和 Problem starting AdminServer

    02-zookeeper集群搭建

    ]]>
    00-zookeeper启动报错: myid file is missing 和 Problem starting AdminServer http://new.nginxs.net/read.php/post-201605141231/ nginxs2016-05-14T08:00:00+08:00 http://new.nginxs.net/read.php/post-201605141231/ http://new.nginxs.net/read.php/post-201605141231/#comment-post-201605141231 zookeeper集群节点启动时候会读取“dataDir”目录下的id,所以必须在对应节点的“dataDir”目录下创建“myid”文件,里面填写serverid
    举例:
    vim conf/zoo.cfg

        tickTime=2000
    initLimit=10
    syncLimit=5
    dataDir=/data/zookeeper
    clientPort=2181
    server.1=192.168.1.128:2008:6008
    server.2=192.168.1.128:2008:6008
    server.3=192.168.1.129:2008:6008

    我在这里就需要在
    “192.168.1.127”节点echo "1" >/data/zookeeper/myid
    “192.168.1.128”节点echo "2" >/data/zookeeper/myid
    “192.168.1.129”节点echo "3" >/data/zookeeper/myid

        2016-05-14 12:01:01,079 [myid:] - INFO  [main:QuorumPeerConfig@114] - Reading configuration from: /usr/local/zookeeper/bin/../conf/zoo.cfg
    2016-05-14 12:01:01,085 [myid:] - INFO [main:QuorumPeerConfig@316] - clientPortAddress is 0.0.0.0/0.0.0.0:2181
    2016-05-14 12:01:01,085 [myid:] - INFO [main:QuorumPeerConfig@320] - secureClientPort is not set
    2016-05-14 12:01:01,089 [myid:] - ERROR [main:QuorumPeerMain@86] - Invalid config, exiting abnormally
    org.apache.zookeeper.server.quorum.QuorumPeerConfig$ConfigException: Error processing /usr/local/zookeeper/bin/../conf/zoo.cfg
    at org.apache.zookeeper.server.quorum.QuorumPeerConfig.parse(QuorumPeerConfig.java:135)
    at org.apache.zookeeper.server.quorum.QuorumPeerMain.initializeAndRun(QuorumPeerMain.java:110)
    at org.apache.zookeeper.server.quorum.QuorumPeerMain.main(QuorumPeerMain.java:79)
    Caused by: java.lang.IllegalArgumentException: myid file is missing
    at org.apache.zookeeper.server.quorum.QuorumPeerConfig.checkValidity(QuorumPeerConfig.java:637)
    at org.apache.zookeeper.server.quorum.QuorumPeerConfig.setupQuorumPeerConfig(QuorumPeerConfig.java:508)
    at org.apache.zookeeper.server.quorum.QuorumPeerConfig.parseProperties(QuorumPeerConfig.java:348)
    at org.apache.zookeeper.server.quorum.QuorumPeerConfig.parse(QuorumPeerConfig.java:131)
    ... 2 more
    Invalid config, exiting abnormally

    zookeeper的管理员端口被占用,需要修改配置里的“zookeeper.admin.serverPort=8080”,默认8080没有写出来,只要改为一个没使用端口即可

        2016-05-14 12:17:36,385 [myid:1] - WARN  [main:QuorumPeer@723] - Problem starting AdminServer
    org.apache.zookeeper.server.admin.AdminServer$AdminServerException: Problem starting AdminServer on address 0.0.0.0, port 8080 and command URL /commands
    at org.apache.zookeeper.server.admin.JettyAdminServer.start(JettyAdminServer.java:100)
    at org.apache.zookeeper.server.quorum.QuorumPeer.start(QuorumPeer.java:721)
    at org.apache.zookeeper.server.quorum.QuorumPeerMain.runFromConfig(QuorumPeerMain.java:183)
    at org.apache.zookeeper.server.quorum.QuorumPeerMain.initializeAndRun(QuorumPeerMain.java:120)
    at org.apache.zookeeper.server.quorum.QuorumPeerMain.main(QuorumPeerMain.java:79)
    Caused by: java.net.BindException: Address already in use
    at sun.nio.ch.Net.bind0(Native Method)
    at sun.nio.ch.Net.bind(Net.java:444)
    at sun.nio.ch.Net.bind(Net.java:436)
    at sun.nio.ch.ServerSocketChannelImpl.bind(ServerSocketChannelImpl.java:214)
    at sun.nio.ch.ServerSocketAdaptor.bind(ServerSocketAdaptor.java:74)
    at org.mortbay.jetty.nio.SelectChannelConnector.open(SelectChannelConnector.java:216)
    at org.mortbay.jetty.nio.SelectChannelConnector.doStart(SelectChannelConnector.java:315)
    at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
    at org.mortbay.jetty.Server.doStart(Server.java:235)
    at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
    at org.apache.zookeeper.server.admin.JettyAdminServer.start(JettyAdminServer.java:96)
    ... 4 more
    org.apache.zookeeper.server.admin.AdminServer$AdminServerException: Problem starting AdminServer on address 0.0.0.0, port 8080 and command URL /commands

    zookeeper

    zookeeper源码安装

    00-zookeeper启动报错: myid file is missing 和 Problem starting AdminServer

    ]]>
    阿里云基础架构使用分享 http://new.nginxs.net/read.php/post-201605132355/ nginxs2016-05-14T00:06:11+08:00 http://new.nginxs.net/read.php/post-201605132355/ http://new.nginxs.net/read.php/post-201605132355/#comment-post-201605132355 介绍随着公有云发展,电商大户亚马逊公有云盈利快速上升,使得公有云市场得到了很大估值。国内也掀起一片”云热潮“。
    阿里云算是国内推广和发展的佼佼者,用户量也比较多,整个服务架构现在也慢慢完善。到今年终于凑够了一个基础架构分享给大家

    ECS优惠活动连接,一般人找不到啊
    http://tb.cn/sI3Hw6x

    解释

    ]]>
    09-nginx limit_req和limit_conn_zone http://new.nginxs.net/read.php/post-201605132217/ nginxs2016-05-13T23:29:11+08:00 http://new.nginxs.net/read.php/post-201605132217/ http://new.nginxs.net/read.php/post-201605132217/#comment-post-201605132217 介绍

    nginx limit_req和limit_conn_zone两个模块可以有效的帮助你屏蔽一部分恶意请求。

    nginx限制请求频率
    nginx limit_req用于每个IP的请求频率
    超出阈值的请求默认将返回503 (Service Temporarily Unavailable)
    rate的单位分为"r/s","r/m"
    域声明语法: limit_req_zone key zone=name:size rate=rate;
    域调用语法:limit_req zone=name [burst=number] [nodelay];

    例1:
    limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s; #以”$binary_remote_addr“为辨识获取钥匙,定义one为限值域,10m为钥匙桶大小(10兆),1r/s为1次每秒
    server { #上面定义就是同一IP的用户每秒仅能请求一次失败返回503
    location /search/ {
    limit_req_status 599; #指定受限后请求返回httpcode 599
    limit_req zone=one burst=5 nodelay; #调用one域,burst=5是5个特权令牌(特权令牌拥有者可以直接请求服务) 超过503,nodelay超过令牌数不等待令牌发送
    } #如果不调用nodelay用户会一直等到服务正常相应

    例2:
    limit_req_zone $server_name zone=perserver:10m rate=10r/s; #这次就是根据用户访问域名限制访问频率
    server {
    limit_req_log_level error; #指定受限制请求日志级别error
    limit_req zone=perip burst=5 nodelay; #如果访问域名$server_name超过10+5次/s就会直接503
    }

    限制连接数

        limit_conn_zone key zone=name:size; #必须在http级别配置
    limit_conn_status code; #限制报错httpcode
    limit_conn_log_level info | notice | warn | error; 首先请求日志级别
    limit_zone name $variable size; #必须在http级别配置

    http {
    limit_conn_zone $binary_remote_addr zone=addr:10m; #根据用户ip限制连接数
    limit_conn_zone $server_name zone=perserver:10m; #根据用户请求域名限制连接数
    ...
    server {
    ...
    location /download/ {
    limit_conn addr 1; #限制同时请求”/download/“目录的连接只有一个
    }

    nginx教程

    第一章 nginx安装基本引导和进程信号

    02-nginx IO模型

    03-nginx负载均衡

    04-nginx的root和alias区别

    05-nginx limit_req和limit_conn_zone

    ]]>
    04-nginx的root和alias区别 http://new.nginxs.net/read.php/post-201605122203/ nginxs2016-05-12T22:05:00+08:00 http://new.nginxs.net/read.php/post-201605122203/ http://new.nginxs.net/read.php/post-201605122203/#comment-post-201605122203 介绍

    nginx配置文件中常用root指定当前项目根目录
    alias也是用来替换用户指定的项目目录的
    接下来说一下他们的差别

    项目配置文件
    [root@localhost webroot]# tree
    .
    ├── code
    │   └── test2.html
    └── test.html

    1 directory, 2 files
    [root@localhost webroot]# cat test.html
    aaa
    [root@localhost webroot]# cat code/test2.html
    bbb

    nginx配置
    alias重定向项目目录
    location /code/
    {
    alias /data/webroot/;
    }
    访问结果
    [root@localhost webroot]# curl http://192.168.1.128/html/test.htmlaaa
    访问到文件:/data/webroot/tesst.html

    root重定向项目目录

    location /code/
    {
    root /data/webroot/;
    }
    访问同样结果
    [root@localhost webroot]# curl http://192.168.1.128/code/test2.htmlbbb
    访问到的文件:/data/webroot/code/tesst2.html

    总结
    nginx使用root来指定“$document_root”变量,请求访问到的文件是“$document_root”+URL
    使用alias访问的就是“$document_root”+"匹配的后面一部分"

    绝对路径名对应的当前请求的root或alias指定的路径时,所有的符号链接解析为真正的路径

    nginx教程

    第一章 nginx安装基本引导和进程信号

    02-nginx IO模型

    03-nginx负载均衡

    04-nginx的root和alias区别

    05-nginx limit_req和limit_conn_zone

    ]]>
    03-nginx负载均衡 http://new.nginxs.net/read.php/post-201605072039/ nginxs2016-05-07T20:49:11+08:00 http://new.nginxs.net/read.php/post-201605072039/ http://new.nginxs.net/read.php/post-201605072039/#comment-post-201605072039 介绍
    负载均衡是 跨多个应用程序实例优化资源利用率,最大限度地提高吞吐量,降低延迟,并确保容错配置的一个常用的技术。
    nginx支持 以下三种算法
    round-robin:请求循环发放到每台机器
    Least connected :下一个请求将发送给最少活跃连接数的服务器
    Session persistence: 散列函数被用于确定应该为下一请求(基于客户端的IP地址)来选择什么样的服务器。



    1. 默认负载算法 round-robin

      http {
      ……
      upstream web1 {
      server 192.168.1.128:9200;
      server 192.168.1.128:3000;
      }
      server {
      listen 80;
      server_name localhost;
      location /
      {
      proxy_pass http://web1;
      }
      }}

    在下面面实例中有两个应用,分别是9200端口和3000端口,如果没指定权重默认轮询。将所有的http请求代理到web1

    nginx的反向代理包括:http负载均衡,https,fastcgi,uwsgi,SCGI,memcached
    假如要给https做负载均衡和代理的话,只要使用“HTTPS”作为协议就可以了。
    举例子:
    proxy_pass https://web1;

    当设置FastCGI,uwsgi,SCGI或memcached的负载均衡时,也需要分别使用fastcgi_pass,uwsgi_pass,scgi_pass和memcached_pass指令。


    1. 最少连接数算法 Least connected

    如果想要更加平衡各个应用程序的负载,最少连接算法应该应用在连接和请求时间更长的场合。
    使用最少连接数负载算法,nginx将尝试避免单个应用过多的请求导致负载,发送新的请求到请求更少的机器。
    要想使用最少连接数负载算法可进行以下配置:
    upstream web1 {
    least_conn;
    server 192.168.1.128:9200;
    server 192.168.1.128:3000;
    }


    1. 会话保持 Session persistence

    大家会发现“round-robin”和“ Least connected ”两种算法之后的请求都可能分布到不通的节点,因此不能保证用户的一直请求到指定服务器。假如你现在每个用户访问都会在nginx服务保存一个session,这样你就需要这个用户之后的访问一直到保存session的机器,这样这个客户端就需要对这个服务器产生“粘性”和“持久性”,在这里我们需要使用 ip hash的算法实现负载。

    使用ip-hash,客户端的IP地址被用作散列键来确定应客户的要求进行选择什么样的服务器。此方法确保来自同一客户端的请求将总是被定向到在同一台服务器不可用时除外。
    要想使用保持session的持久负载,需要进行一下设置:

            upstream web1 {
    ip_hash;
    server 192.168.1.128:9200;
    server 192.168.1.128:3000;
    }

    1. 权重

    我们也可以使用权重来影响服务器节点的负载,之前的例子没有指定,所以权重都一样,
    当使用“round-robin”算法的时候应用或多或少,这样才可以提供足够请求,并且当请求以均匀的方式进行处理,并完成够快。
    权重高的节点分配的请求将比低的节点多,举例子:

        upstream web1 {
    server 192.168.1.128:9200 weight=3;
    server 192.168.1.128:3000;
    }

    加入有4个请求将有三个请求到“9200”端口,1个到“3000”端口
    同样也可以在最近的版本nginx使用权重在“Least connected”和“ip-hash”负载算法


    1. 健康检查

    nginx的健康检查是为了一个检测失败的服务不再分到新的请求。当max_fails设置为0时候关闭健康检查
    nginx支持以下健康参数:
    max_fails=3 检查到失败3次,判定失败
    fail_timeout=2 服务判定失败后等待2秒进行重试此期间服务视为不可用,默认为10秒


    1. 拓展

    down 标记服务器为宕机
    backup 标记这台服务器为备份服务器,当主服务器不可用是请求此服务器
    例子:

        upstream web1 {
    server 192.168.1.128:9200 weight=3;
    server 192.168.1.129:9200 backup;
    server 192.168.1.128:3000;
    keepalive 32;
    }

    keepalive 32; 保持连接数32个
    max_conns=333; 限制最大连接数333个

    resolver 指定DNS解析域名

        http {
    resolver 10.0.0.1;
    upstream u {
    zone ...;
    ...
    server example.com resolve;
    }
    }

    slow_start=10 设置服务将在规定的10秒内权重0恢复到正常

    nginx的upstream模块
    http://nginx.org/en/docs/http/ngx_http_upstream_module.html#server

    nginx教程

    第一章 nginx安装基本引导和进程信号

    02-nginx IO模型

    03-nginx负载均衡

    04-nginx的root和alias区别

    05-nginx limit_req和limit_conn_zone

    ]]>
    02-nginx IO模型 http://new.nginxs.net/read.php/post-201605070009/ nginxs2016-05-07T00:11:00+08:00 http://new.nginxs.net/read.php/post-201605070009/ http://new.nginxs.net/read.php/post-201605070009/#comment-post-201605070009 介绍

    nginx的分为epoll和select两种多路复用IO接口。

    select模型

    因为select使用了遍历非阻塞式IO,这样就会导致web服务器大量并发情况下遍历量增加,导致文件描述符使用增加,会产生很多的TCP TIME_WAIT, ‘TIME_WAIT’数一旦这个超出系统设置web服务将无法提供服务。
    因为select模型是遍历方式所以对于连接数少却异常活跃的客户端很实用,恰巧减少了服务等待,提高效率。

    epoll模型

    epoll支持linux2.6+的内核,是使用非阻塞式IO,更加有利于对文件描述符利用率

    nginx教程

    第一章 nginx安装基本引导和进程信号

    02-nginx IO模型

    03-nginx负载均衡

    04-nginx的root和alias区别

    05-nginx limit_req和limit_conn_zone

    ]]>
    web服务ab性能测试 http://new.nginxs.net/read.php/post-201604252206/ nginxs2016-04-25T22:08:11+08:00 http://new.nginxs.net/read.php/post-201604252206/ http://new.nginxs.net/read.php/post-201604252206/#comment-post-201604252206 介绍ab是apche自带的一个web服务测试工具,很方便使用。

    案例说明

    -t 测试时长
    -c 请求的并发客户端
    -n 请求的次数



    • 10个连接,每次100请求执行5秒
      ab -c 10 -n 100 -t 5 http://192.168.1.128/

      [root@localhost nginx-new]# wc -l logs/access.log 
      101 logs/access.log
      [root@localhost nginx-new]# ab -c 10 -n 100 -t 5 http://192.168.1.128/
      This is ApacheBench, Version 2.3 <$Revision: 655654 $>
      Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
      Licensed to The Apache Software Foundation, http://www.apache.org/

      Benchmarking 192.168.1.128 (be patient)
      Completed 5000 requests
      Completed 10000 requests
      Completed 15000 requests
      Completed 20000 requests
      Completed 25000 requests
      Completed 30000 requests
      Completed 35000 requests
      Completed 40000 requests
      Completed 45000 requests
      Completed 50000 requests
      Finished 50000 requests

      Server Software: nginx/1.9.15
      Server Hostname: 192.168.1.128
      Server Port: 80

      Document Path: /
      Document Length: 612 bytes

      Concurrency Level: 10
      Time taken for tests: 4.527 seconds
      Complete requests: 50000
      Failed requests: 0
      Write errors: 0
      Total transferred: 42250000 bytes
      HTML transferred: 30600000 bytes
      Requests per second: 11045.80 [#/sec] (mean)
      Time per request: 0.905 [ms] (mean)
      Time per request: 0.091 [ms] (mean, across all concurrent requests)
      Transfer rate: 9114.94 [Kbytes/sec] received

      Connection Times (ms)
      min mean[+/-sd] median max
      Connect: 0 0 0.1 0 2
      Processing: 0 1 0.3 1 8
      Waiting: 0 1 0.3 1 8
      Total: 0 1 0.3 1 9

      Percentage of the requests served within a certain time (ms)
      50% 1 #1ms完成99%请求
      66% 1
      75% 1
      80% 1
      90% 1
      95% 1
      98% 2
      99% 2
      100% 9 (longest request)
    ]]>
    第一章 nginx安装基本引导和进程信号 http://new.nginxs.net/read.php/post-201604241128/ nginxs2016-04-24T11:34:11+08:00 http://new.nginxs.net/read.php/post-201604241128/ http://new.nginxs.net/read.php/post-201604241128/#comment-post-201604241128 介绍


    nginx是一款轻量级的http服务,它可以坐高并发的web服务,也可以做负载均衡,现在进行 nginx基础教程

    快速源码安装

        wget http://nginx.org/download/nginx-1.9.15.tar.gz
    tar zxf nginx-1.9.15.tar.gz
    cd nginx-1.9.15
    ./configure --prefix=/usr/local/nginx-new --user=www --group=www --with-poll_module\
    --with-threads --with-file-aio --with-http_ssl_module --with-http_v2_module \
    --with-http_gzip_static_module --with-pcre --with-stream \
    --with-http_gunzip_module --with-http_dav_module \
    --with-http_geoip_module --with-file-aio
    make && make install

    进程方式

    nginx服务分为master进程和worker进程,master会对worker进程进行配置管理和维护。
    nginx采用基于失误的管理模型有效的把请求分配给各个进程,可以使用固定配置也可以自动的调整可用的CPU数量。

    默认的nginx配置文件目录"/usr/local/nginx-new/etc/nginx.conf"

    启动、停止、重启

        [root@localhost nginx-1.9.15]# /usr/local/nginx-new/sbin/nginx -h
    nginx version: nginx/1.9.15
    Usage: nginx [-?hvVtTq] [-s signal] [-c filename] [-p prefix] [-g directives]

    Options:
    -?,-h : help
    -v : version
    -V : show version and configure options then exit
    -t : 测试配置并退出
    -T : 测试配置并dump出来退出
    -q : 在配置和测试期间不输出错误日志
    -s signal :发送一个消息给 master process:进行 stop, quit, reopen, reload
    -p prefix : 设置nginx安装目录
    -c filename : 指定配置文件(default: conf/nginx.conf)
    -g directives :配置文件的指定指令

    ./sbin/nginx -s { stop|quit | reopen | reload}
    stop 快速停止服务(强制停止当前服务)
    quit 优雅停止服务(等worker进程任务完成,再退出)
    reload reload服务
    reopen 重新打开日志文件

    nginx进程信号

    nginx可以使用进程信号控制,主进程把进程ID写入“xx/nginx.pid"
    信号对照表:
    TERM,INT 快速关闭
    QUIT 优雅关闭
    USER1 重新打开日志文件
    USER2 升级或者执行文件
    WINCH 优雅关闭worker进程

    nginx教程

    第一章 nginx安装基本引导和进程信号

    02-nginx IO模型

    03-nginx负载均衡

    04-nginx的root和alias区别

    05-nginx limit_req和limit_conn_zone

    ]]>
    zookeeper源码安装 http://new.nginxs.net/read.php/post-201604152243/ nginxs2016-04-15T22:56:11+08:00 http://new.nginxs.net/read.php/post-201604152243/ http://new.nginxs.net/read.php/post-201604152243/#comment-post-201604152243
    介绍

    zookeeper是一个管理分布式服务协调的开源服务,它本身亦是分布式服务。
    是hadoop,Hbase,codis服务的重要组件,为分布式应用提供一致性服务:配置维护,域名服务,分布式同步,组服务等。

    下载安装包

        yum -y install openjdk
    wget http://apache.fayea.com/zookeeper/zookeeper-3.5.1-alpha/zookeeper-3.5.1-alpha.tar.gz
    tar zxf zookeeper-3.5.1-alpha.tar.gz
    cd zookeeper-3.5.1-alpha

    配置文件

    这里先使用默认设置

    cat ./conf/zoo.cfg

    tickTime=2000                           单位毫秒,用来做两次心跳最低超时时间间隔
    initLimit=10 集群中的follower服务器(F)与leader服务器(L)之间初始连接时能容忍的最多心跳数(tickTime的数量)。
    syncLimit=5 F节点和L节点最多心跳失败5次。
    dataDir=/data/zookeeper 内存数据快照到本地的数据,除非特别说明,否则将是更新事物日志。
    clientPort=2181 客户端端口

    启动服务

    zookeeper默认会占用2181,8080,55144三个端口

        [root@salt-master zookeeper-3.5.1-alpha]# ./bin/zkServer.sh 
    ZooKeeper JMX enabled by default
    Using config: /usr/local/src/zookeeper-3.5.1-alpha/bin/../conf/zoo.cfg
    Usage: ./bin/zkServer.sh [--config <conf-dir>] {start|start-foreground|stop|restart|status|print-cmd}

    [root@salt-master zookeeper-3.5.1-alpha]# ./bin/zkServer.sh start
    ZooKeeper JMX enabled by default
    Using config: /usr/local/src/zookeeper-3.5.1-alpha/bin/../conf/zoo.cfg
    Starting zookeeper ... STARTED

    连接测试

     ./bin/zkCli.sh -server 192.168.1.115:2181
    Connecting to 192.168.1.115:2181
    WATCHER::
    WatchedEvent state:SyncConnected type:None path:null
    [zk: 192.168.1.115:2181(CONNECTED) 1] ls /
    [zookeeper]
    [zk: 192.168.1.115:2181(CONNECTED) 4] ls2 /zookeeper
    'ls2' has been deprecated. Please use 'ls [-s] path' instead.
    [config, quota]
    cZxid = 0x0
    ctime = Thu Jan 01 08:00:00 CST 1970
    mZxid = 0x0
    mtime = Thu Jan 01 08:00:00 CST 1970
    pZxid = 0x0
    cversion = -2
    dataVersion = 0
    aclVersion = 0
    ephemeralOwner = 0x0
    dataLength = 0
    numChildren = 2

    查看zookeeper服务信息

        [root@salt-master codis]# echo stat | nc 192.168.1.115 2181 
    Zookeeper version: 3.5.1-alpha-1693007, built on 07/28/2015 07:19 GMT
    Clients:
    /192.168.1.115:56637[0](queued=0,recved=1,sent=0)
    /192.168.1.115:56608[1](queued=0,recved=160,sent=160)

    Latency min/avg/max: 0/0/22
    Received: 162
    Sent: 161
    Connections: 2
    Outstanding: 0
    Zxid: 0x1
    Mode: standalone
    Node count: 5
    ]]>