发布新日志

  • Redis服务器学习笔记(一)

    2015-06-23 13:23:50

    一、Redis的安装

    wget http://download.redis.io/redis-stable.tar.gz

    tar xzfredis-stable.tar.gz

    cd redis-stable

    make

    make install

    二、Redis的简单介绍:

    1. Redis可执行文件说明:

    文件名

    说明

    redis-server

    redis服务器

    redis-cli

    redis命令行客户端

    redis-benchmark

    redis性能测试工具

    redis-check-aof

    AOF文件修复工具

    redis-check-dump

    RDB文件检查工具

    2. Redis服务器启动的两种方式:

    i. 直接运行命令行:

    ii. 使用初始化脚本来启动Redis。

    脚本路径:redis源代码目录的utils文件夹有一个名为redis_init_script的初始化脚本

    脚本内容

    #!/bin/sh

    #

    # Simple Redis init.d script. conceived towork on Linux systems

    # as it does use of the /proc filesystem.

    REDISPORT=6379

    EXEC=/usr/local/bin/redis-server

    CLIEXEC=/usr/local/bin/redis-cli

    PIDFILE=/var/run/redis_${REDISPORT}.pid

    CONF="/etc/redis/${REDISPORT}.conf"

    case "$1" in

    start)

    if [ -f $PIDFILE ]

    then

    echo "$PIDFILE exists, process isalready running or crashed"

    else

    echo "Starting Redis server..."

    $EXEC $CONF

    fi

    ;;

    stop)

    if [ ! -f $PIDFILE ]

    then

    echo "$PIDFILE does not exist, processis not running"

    else

    PID=$(cat $PIDFILE)

    echo "Stopping ..."

    $CLIEXEC -p $REDISPORT shutdown

    while [ -x /proc/${PID} ]

    do

    echo "Waiting for Redis to shutdown..."

    sleep 1

    done

    echo "Redis stopped"

    fi

    ;;

    *)

    echo "Please use start or stop asfirst argument"

    ;;

    esac

    配置方法:

    i. 拷贝初始化脚本。

    cp /{redis源码路径}/utils/redis_init_script/etc/init.d/redis_{端口号}

    ii. 编辑初始化脚本。编辑脚本第6行,修改REDISPORT变量值,使得与上例中的端口号一致,例如:7777

    iii. 建立必要的文件夹。

    目录名

    说明

    /etc/redis

    存放Redis的配置文件

    /search/redis/端口号

    存放Redis的持久化文件

    iv. 复制redis源代码下redis.conf配置文件模板到/etc/redis目录下,以端口号命名。例如:7777.conf。

    v. 编辑.conf配置文件。

    参数

    说明

    daemonize

    yes

    使Redis以守护进程模式运行

    pidfile

    /search/redis/redis_端口号.pid

    设置pid的PID文件位置

    port

    端口号

    设置redis监听的端口号

    dir

    /search/redis/端口号

    设置持久化文件存放位置

    vi. 启动Redis。

    1. Redis命令行使用命令方式:

    方式一:

    方式二:

    三、Redis命令总结

    官网命令列表:http://redis.io/commands (英文)

    1、连接操作相关的命令

    · quit:关闭连接(connection)

    · auth:简单密码认证

    2、对value操作的命令

    · exists(key):确认一个key是否存在

     

    · del(key):删除一个key

    Note:DEL命令的参数不支持通配符,但是可以结合Linux的管道和xargs命令自己使用删除所有符合规则的键。

    例如:删除所有以"user:"开头的键,就可以执行

    redis-cli KEYS"user:*" | xargs redis-cli DEL

    或者

    redis-cli DEL'redis-cli KEYS "user:*"'

    · type(key):返回值的类型

    · keys(pattern):返回满足给定pattern的所有key

    pattern通配符类型:

    符号

    含义

    ?

    匹配一个字符

    *

    匹配任意个(包括0个)字符

    [ ]

    匹配括号间的任一字符,可以使用"-"符号表示一个范围,如a[b-d]可以匹配ab、ac、ad

    \x

    匹配字符x,用于转义符号。

    · randomkey:随机返回key空间的一个key

    · rename(oldname,newname):将key由oldname重命名为newname,若newname存在则删除newname表示的key

    · dbsize:返回当前数据库中key的数目

    · expire:设定一个key的活动时间(s)

    · ttl:获得一个key的活动时间

    · select(index):按索引查询

    · move(key, dbindex):将当前数据库中的key转移到有dbindex索引的数据库

    · flushdb:删除当前选择数据库中的所有key

    · flushall:删除所有数据库中的所有key

    3、对String操作的命令

    · set(key, value):给数据库中名称为key的string赋予值value

    · get(key):返回数据库中名称为key的string的value

    · getset(key, value):给名称为key的string赋予上一次的value

    · mget(key1, key2,…,key N):返回库中多个string(它们的名称为key1,key2…)的value

    · setnx(key, value):如果不存在名称为key的string,则向库中添加string,名称为key,值为value

    · setex(key, time,value):向库中添加string(名称为key,值为value)同时,设定过期时间time

    · mset(key1, value1,key2, value2,…key N, value N):同时给多个string赋值,名称为key i的string赋值value i

    · msetnx(key1,value1, key2, value2,…key N, value N):如果所有名称为key i的string都不存在,则向库中添加string,名称key i赋值为value i

    · incr(key):名称为key的string增1操作

    · incrby(key,integer):名称为key的string增加integer

    · decr(key):名称为key的string减1操作

    · decrby(key,integer):名称为key的string减少integer

    · append(key, value):名称为key的string的值附加value

    · substr(key, start,end):返回名称为key的string的value的子串

    4、对List操作的命令

    · rpush(key, value):在名称为key的list尾添加一个值为value的元素

    · lpush(key, value):在名称为key的list头添加一个值为value的 元素

    · llen(key):返回名称为key的list的长度

    · lrange(key, start,end):返回名称为key的list中start至end之间的元素(下标从0开始,下同)

    · ltrim(key, start,end):截取名称为key的list,保留start至end之间的元素

    · lindex(key, index):返回名称为key的list中index位置的元素

    · lset(key, index,value):给名称为key的list中index位置的元素赋值为value

    · lrem(key, count,value):删除count个名称为key的list中值为value的元素。count为0,删除所有值为value的元素,count>0从头至尾删除count个值为value的元素,count<0从尾到头删除|count|个值为value的元素。 lpop(key):返回并删除名称为key的list中的首元素 rpop(key):返回并删除名称为key的list中的尾元素 blpop(key1, key2,… key N, timeout):lpop命令的block版本。即当timeout为0时,若遇到名称为key i的list不存在或该list为空,则命令结束。如果timeout>0,则遇到上述情况时,等待timeout秒,如果问题没有解决,则对keyi+1开始的list执行pop操作。

    · brpop(key1, key2,…key N, timeout):rpop的block版本。参考上一命令。

    · rpoplpush(srckey,dstkey):返回并删除名称为srckey的list的尾元素,并将该元素添加到名称为dstkey的list的头部

    5、对Set操作的命令

    · sadd(key, member):向名称为key的set中添加元素member

    · srem(key,member) :删除名称为key的set中的元素member

    · spop(key) :随机返回并删除名称为key的set中一个元素

    · smove(srckey,dstkey, member) :将member元素从名称为srckey的集合移到名称为dstkey的集合

    · scard(key) :返回名称为key的set的基数

    · sismember(key,member) :测试member是否是名称为key的set的元素

    · sinter(key1,key2,…key N) :求交集

    · sinterstore(dstkey,key1, key2,…key N) :求交集并将交集保存到dstkey的集合

    · sunion(key1,key2,…key N) :求并集

    · sunionstore(dstkey,key1, key2,…key N) :求并集并将并集保存到dstkey的集合

    · sdiff(key1,key2,…key N) :求差集

    · sdiffstore(dstkey,key1, key2,…key N) :求差集并将差集保存到dstkey的集合

    · smembers(key) :返回名称为key的set的所有元素

    · srandmember(key) :随机返回名称为key的set的一个元素

    6、对zset(sorted set)操作的命令

    · zadd(key, score,member):向名称为key的zset中添加元素member,score用于排序。如果该元素已经存在,则根据score更新该元素的顺序。

    · zrem(key,member) :删除名称为key的zset中的元素member

    · zincrby(key,increment, member) :如果在名称为key的zset中已经存在元素member,则该元素的score增加increment;否则向集合中添加该元素,其score的值为increment

    · zrank(key,member) :返回名称为key的zset(元素已按score从小到大排序)中member元素的rank(即index,从0开始),若没有member元素,返回“nil”

    · zrevrank(key,member) :返回名称为key的zset(元素已按score从大到小排序)中member元素的rank(即index,从0开始),若没有member元素,返回“nil”

    · zrange(key, start,end):返回名称为key的zset(元素已按score从小到大排序)中的index从start到end的所有元素

    · zrevrange(key,start, end):返回名称为key的zset(元素已按score从大到小排序)中的index从start到end的所有元素

    · zrangebyscore(key,min, max):返回名称为key的zset中score >= min且score <= max的所有元素 zcard(key):返回名称为key的zset的基数 zscore(key, element):返回名称为key的zset中元素element的scorezremrangebyrank(key, min, max):删除名称为key的zset中rank >= min且rank <= max的所有元素 zremrangebyscore(key, min, max) :删除名称为key的zset中score >= min且score <= max的所有元素

    · zunionstore /zinterstore(dstkeyN, key1,…,keyN, WEIGHTS w1,…wN, AGGREGATE SUM|MIN|MAX):对N个zset求并集和交集,并将最后的集合保存在dstkeyN中。对于集合中每一个元素的score,在进行AGGREGATE运算前,都要乘以对于的WEIGHT参数。如果没有提供WEIGHT,默认为1。默认的AGGREGATE是SUM,即结果集合中元素的score是所有集合对应元素进行SUM运算的值,而MIN和MAX是指,结果集合中元素的score是所有集合对应元素中最小值和最大值。

    7、对Hash操作的命令

    · hset(key, field,value):向名称为key的hash中添加元素field<—>value

    · hget(key, field):返回名称为key的hash中field对应的value

    · hmget(key, field1,…,field N):返回名称为key的hash中field i对应的value

    · hmset(key, field1,value1,…,field N, value N):向名称为key的hash中添加元素fieldi<—>value i

    · hincrby(key,field, integer):将名称为key的hash中field的value增加integer

    · hexists(key,field):名称为key的hash中是否存在键为field的域

    · hdel(key, field):删除名称为key的hash中键为field的域

    · hlen(key):返回名称为key的hash中元素个数

    · hkeys(key):返回名称为key的hash中所有键

    · hvals(key):返回名称为key的hash中所有键对应的value

    · hgetall(key):返回名称为key的hash中所有的键(field)及其对应的value

    8、持久化

    · save:将数据同步保存到磁盘

    · bgsave:将数据异步保存到磁盘

    · lastsave:返回上次成功将数据保存到磁盘的Unix时戳

    · shundown:将数据同步保存到磁盘,然后关闭服务

    9、远程服务控制

    · info:提供服务器的信息和统计

    · monitor:实时转储收到的请求

    · slaveof:改变复制策略设置

    · config:在运行时配置Redis服务器

  • Nginx反向代理与负载均衡

    2015-06-23 13:22:30

    一、简介

    反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个服务器。  

    反向代理负载均衡技术是把将来自internet上的连接请求以反向代理的方式动态地转发给内部网络上的多台服务器进行处理,从而达到负载均衡的目的。

    二、常见使用场景

    1. 反向代理:(如图2-3所示)

    a. Web浏览器向前端Nginx发送HTTP请求

    b. 如果请求的资源是静态资源,则前端Nginx服务器直接将静态资源返回给Web浏览器;

    c. 如果请求的资源是动态页面,则前端Nginx服务器通过反向代理,将请求转发给上游服务器(Tomcat\Apache等),上游服务器处理完毕动态请求后返回给前端Nginx服务器,前端Nginx服务器再转发动态页面应答给Web浏览器

    2. 负载均衡使用场景

    当Nginx前端接收到大量的HTTP请求后,通过一定的策略,尽量把请求平均地分布到每台上游服务器上,以避免单个服务器被压爆。

    三、配置说明:

    1. 负载均衡的基本配置

    1)upstream块

    语法:upstream name{...}

    配置块:http

    upstream块定义了一个上游服务器的集群,便于反向代理中的proxy_pass使用。例如:

    Upstream backend{

                Server backend1.example.com;

                Server backend2.example.com;

                Server backend3.example.com;

          }

          Server {

                Location / {

                Proxy_pass http://backend

          }

    }

    2)server

    语法:server name[parameters];

    配置块:upstream

    server配置项制定了一台上游服务器的名字,这个名字可以是域名、IP地址端口、Unix句柄等,在其后还可以跟下列参数。

    · weight=number:设置向这台上游服务器转发的权值,默认为1.

    · max_fails=number:该选项与fail_timeout配合使用,指在fail_timeout时间段内,如果向当前的上游服务器转发失败次数超过number,则认为在当前的fail_timeout时间段内这台上游服务器不可用。Max_fails默认为1,如果设置为0,则表示不检查失败次数。

    · fail_timeout=time:表示该时间段内转发失败多少次后就认为上游服务器暂时不可用,用于优化反向代理功能。Fail_timeout默认为10秒。

    · down:表示所在的上游服务器永久下线,只在使用ip_hash配置项时才有用。

    · backup:在使用ip_hash配置项时它是无效的。它表示所在的上游服务器只是备份服务器,只有在所有的非备份上游服务器都失效后,才会向其转发请求。

    例如:

    upstream backend{

          server backend1.example.com weight=5;

          server 127.0.0.1:8080 max_fails=3 fail_timeout=30s;

          server unix:/tmp/backend3

    }

    3)ip_hash

    语法:ip_hash

    配置块:upstream

    在有些场景下,我们可能会希望来自某一个用户的请求始终落到固定的一台上游服务器上。例如:假设上游服务器会缓存一些信息,如果同一个用户的请求任意地转发到集群中的任一台上游服务器上,那么每一台上游服务器都有可能会缓存同一份信息,这既会造成资源浪费,也会难以有效地管理缓存信息。ip_hash就是用以解决上述问题的。

    ip_hash与weight配置不可同时使用。如果upstream集群中有一台上游服务器暂时不可用,不能直接删除该配置,而是要down参数标识,确保转发策略的一贯性。例如:

    upstream backend{

          ip_hash;

          server backend1.example.com;

          server backend2.example.com;

          server backend3.example.com down;

          server backend4.example.com;

    }

    4)记录日志时支持的变量

    如果需要将负载均衡时的一些信息记录到access_log日志中,那么在定义日志格式时可以使用负载均衡功能提供的变量,如下表

    变量名

    意义

    $upstream_addr

    处理请求的上游服务器地址

    $upstream_cache_status

    表示是否命中缓存,取值范围:MISS、EXPIRED、UPDATING、STALE、HIT

    $upstream_status

    上游服务器返回的响应中的HTTP响应码

    $upstream_response_time

    上游服务器的响应时间,精确到毫秒

    $upstream_http_$HEADER

    HTTP的头部,如upstream_http_host

    2.反向代理的基本配置

    1)proxy_pass

    语法:proxy_pass URL;

    配置块:location、if

    此配置项将当前的请求反向代理到URL参数指定的服务器上,URL可以是主机名或IP地址端口形式,例如:

    proxy_pass http://localhost:8000/uri/;

    还可以直接使用upstream块,例如:

    upstream backend{

                ……

          }

          server {

                location / {

                proxy_pass http://bakend

          }

    }

    默认情况下反向代理是不会转发请求中的host头部的。如果需要转发,那么必须加上配置:

    proxy_set_headerHost $host;

    2)proxy_method

    语法:proxy_methodmethod

    配置块:http、server、location

    此配置项表示转发时的协议方法名。例如设置为:

    proxy_method POST;

    那么客户端发来的GET请求在转发时方法名也会改为POST。

    3)proxy_hide_header

    语法:proxy_hide_header the_header;

    配置块:http、server、location

    Nginx会将上游服务器的响应转发给客户端,但默认不会转发一下HTTP头部字段:Date、Server、X-Pad和X-Accel-*。使用proxy_hide_header后可以任意指定哪些HTTP头部字段不能被转发,例如:

    proxy_hide_headerCache-Control;

    proxy_hide_headerMicrosoftOfficeWebServer;

    3)proxy_pass_header

    语法:proxy_pass_headerthe_header;

    配置块:http、server、location

    与proxy_hide_header功能相反,proxy_pass_header会将原来禁止转发的header设置为允许转发。

    4)proxy_pass_request_body

    语法:proxy_pass_request_bodyon|off;

    配置块:http、server、location

    作用为确定是否向上游服务器转发HTTP包体部分。

    5)proxy_pass_requst_headers

    语法:proxy_pass_requst_headerson|off;

    配置块:http、server、location

    作用为确定是否向上游服务器转发HTTP头部。

    6)proxy_redirect

    语法:proxy_redirect[default|off|redirect replacement];

    配置块:http、server、location

    当上游服务器返回的响应是重定向或者刷新请求(如301或302),proxy_direct可以重设HTTP头部的location或refresh字段。例如:

    proxy_direct http://localhost:8000/two http://frontend/one;

    如果上游服务器发出的响应是302重定向请求,location字段的URL是http://localhost:8000/two/some/uri/,那么经过以上配置,实际转发给客户端的locationhttp://frontend/one/some/uri/

    3.反向代理和负载均衡的配置实例文件

    负载均衡:

     

    worker_processes 1;

        events {

        worker_connections 1024;

        }

        http{

              upstream lxx {//默认是80端口

              server 192.168.0.62 weight=2;

              server 192.168.0.161 weight=3;

              }

              server {

                     listen 80;

                     location / {

                     proxy_pass http://lxx;

               }

         }

    }

     

    反向代理:

     

    worker_processes 1;

          events {

          worker_connections 1024;

          }

          http{

                upstream lxx {//默认是80端口

                server 192.168.0.62 weight=2;

                server 192.168.0.161 weight=3;

          }

          server {

                listen 80;

                location / {

                      proxy_pass http://lxx;

                      #Proxy Settings

                      proxy_redirect off;

                      proxy_set_header Host $host;

                      proxy_set_header X-Real-IP $remote_addr;

                      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

                      proxy_next_upstream errortimeout invalid_header http_500 http_502 http_503 http_504;

                      proxy_max_temp_file_size 0;

                      proxy_connect_timeout 90;

                      proxy_send_timeout90;

                      proxy_read_timeout 90;

                      proxy_buffer_size 4k;

                      proxy_buffers 4 32k;

                      proxy_busy_buffers_size 64k;

                      proxy_temp_file_write_size 64k;

                }

          }

    }

  • Linux下使用Squid搭建代理服务器

    2015-04-27 20:47:41

    背景介绍

    一般情况下大家会使用CCProxy搭建代理服务器,这种方法简单易用,但是也存在较多问题: 
    1.软件受注册限制只能允许3人使用; 
    2.CCProxy的代理请求仅支持常见的GET和POST等,对于SVN通过代理去update等请求就不支持了; 
    3.代理的认证方式仅有基本的Basic方式,其他的ntlm等认证方式不支持等。

    为了能够解决以上问题,尝试使用Squid在Linux上搭建了代理服务器,分享其中的搭建方法:

    一、安装Squid:

    如果系统中还没有装squid,按以下顺序输入命令后即可完成安装

    1. 下载Squid安装包

    # wget http://www.squid-cache.org/Versi ... 3.0.STABLE18.tar.gz 
    • 1

    2. 解压Squid安装包

    # tar -zxvf squid-3.0.STABLE18.tar.gz  
    • 1

    3. 配置Squid

    # cd squid-3.0.STABLE18 
    //配置Squid代理安装路径之类的
    # ./configure --prefix=/usr/local/squid --sysconfdir=/usr/local/squid/etc --bindir=/usr/local/squid/bin --sbindir=/usr/local/squid/sbin --mandir=/usr/local/squid/share/man --enable-gnuregex --enable-carp --enable-async-io=80 --enable-removal-policies=heap,lru --enable-icmp --enable-delay-pools --enable-useragent-log --enable-referer-log --enable-kill-parent-hack --enable-snmp --enable-arp-acl --enable-htcp --enable-cache-digests --enable-default-err-language=Simplify_Chinese --enable-err-languages="Simplify_Chinese" --enable-poll --enable-linux-netfilter --disable-ident-lookups --enable-underscores --enable-auth="basic" --enable-basic-auth-helpers="NCSA" --enable-external-acl-helpers="ip_user" --enable-x-accelerator-vary 
    • 1
    • 2
    • 3

    4. 编译

    # make 
    • 1

    5. 安装

    # make install //安装Squid代理软件 
    • 1

    二、配置Squid


    1. Squid的配置文件保存在/usr/local/squid/etc的squid.conf文件中

    2. 配置Squid项:

    a. 启动squid时如果不在squid.conf中设置主机名将无法启动,必须要设置visible_hostname这个参数值,本文中,设置的主机名是服务器的真实机器名powersite,在squid.conf中找到该项并修改:

    #visible_hostname linuxserver
    • 1

    b. 开启http_access的访问权限

    #http_access allow all
    • 1

    三、配置Squid的密码验证功能

    1. 创建密码文件。

    密码和用户名存放在/etc/squid/squid_passwd文件中,并需要将这个文件的权限设置为其它用户只读。

    # touch /etc/squid/squid_passwd
    # chmod o+r /etc/squid/squid_passwd
    • 1
    • 2

    2. 使用htpasswd添加用户,并设置密码。

    添加用户不需要对squid进行重启操作,我创建的用户名是setest

    # htpasswd /etc/squid/squid_passwd setest
    New password:
    Re-type password for user setest
    • 1
    • 2
    • 3

    3. 找到ncsa_auth命令的具体位置,后面的配置需要用到绝对路径

    # which ncsa_auth
    /usr/sbin/ncsa_auth
    • 1
    • 2

    如果找不到ncs_auth的话,可以直接去squid的压缩包解压目录中拷贝一份到/usr/sbin/ncsa_auth,例如:

    cp helpers/basic_auth/NCSA/ncsa_auth /usr/sbin/ncsa_auth 
    • 1

    4. 在squid.conf文件中定义验证程序了,创建名为ncsa_users的ACL并加入关键字REQUIRED来强制让Squid使用NCSA验证方法。

    #
    # 在squid.conf的auth_param部分添加下列内容 
    #
    auth_param basic program /usr/sbin/ncsa_auth /etc/squid/squid_passwd
    
    #
    # 将以下ACL添加到squid.conf的ACL配置部分 
    #
    acl ncsa_users proxy_auth REQUIRED
    
    #
    # 将这些内容添加到squid.conf的http_access配置部分 
    #
    http_access allow ncsa_users
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    四、启动Squid

        1. /usr/local/squid/sbin目录下的squid为运行文件。 
        2. 第一次运行时,先运行squid -z创建缓存文件夹。缓存文件夹在/usr/local/squid/var下创建,因此创建缓存前还需运行chmod 777 /usr/local/squid/var给该文件夹权限。 
        再运行squid -d 1开启squid即可。 
        3. 如果要关闭squid,运行squid -k shutdown则是安全关闭。
诸葛东明

诸葛东明

搜狗公司搜狗浏览器测试经理。2008年加入搜狗公司,负责搜狗浏览器的相关测试工作,见证了搜狗浏览器从无到有的过程。

数据统计

  • 访问量: 31461
  • 日志数: 19
  • 建立时间: 2008-06-03
  • 更新时间: 2015-06-23

RSS订阅

Open Toolbar