最近开始研究Nginx配置,哎~现在出去面试机会都会问到,不学不行了,先从简单的开始吧,这两天研究张宴的博客,自己也做了一次配置,分享一下。

    概述:反向代理是指的,服务器代理网络上的客户机请求,将请求转达给内部真实服务器,然后在返回给Internet客户端,代理服务器上面没有任何网页资料。反向代理和正向代理没有冲突,可以在防火墙设备中同时使用这两种结合,正向代理可以进行过滤,保护内部网络安全。

               软件七层负载均衡大多是基于HTTP反向代理,Nginx反向代理能够支持虚拟主机,可以按照轮询,IP哈希,URL哈希,权重方式对后端服务器做负载均衡,还支持后端服务器健康检查。

   常见的Web负载均衡方法:

                                                     1、 DNS轮询:将同一个主机名添加多个A记录,DNS将解析请求安装A记录的顺序,随即分配到不同的IP上,使用dig baidu.com 就可以看到不同的A记录对应的IP地址。缺点:可靠性低,其中一台出现故障,就不会给予回应,就算从DNS去掉该服务器IP,但是也会保存在各地区的ISP众多的DNS缓存中。系统股灾不均衡,使用简单轮询,不能计算出服务器的负载差异,所以有可能客户集中请求到其中某一台服务器。

                                                   2、F5、LVS、DNS只能解析这里不做讲述

配置环境:

三台CentOS5.3,一台做nginx代理,2台apache做页面测试。apache端口改为:8080,nginx使用80口接收客户请求

yum -y install pcre-devel openssl openssl-devel                   //安装包,否则编译时候出错

#useradd  www

#groupadd  www

#usermod -g www www         //设置nginx的用户和组

#tar  xzvf  pcre-7.8.tar.gz

#./configure

#make ; make install                //安装pcre让nginx支持rewrite重写方便以后所需

[root@localhost tar]# cd nginx-0.7.16/

[root@localhost nginx-0.7.16]# ./configure  --user=www --group=www --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module

 --with-http_stub_status_module:这个模块用于获取nginx自上次启动以来的工作状态,非核心模块

--with-http_ssl_module               : 把ssl编译进去, 仅仅指定openssl库的源代码路径还是不够的

[root@localhost nginx-0.7.16]#make  ; meke install

#cd   /usr/local/nginx/conf/nginx.conf

#vi  nginx.conf

user  www www;                       //设置用户和组

worker_processes  4;             //生成进程数,等于CPU总核数两倍
 
error_log  /data1/logs/nginx_error.log crit;      //错误日志路径,错误日志可选项为:【debug  info  notice  warn  error   crit】
 
pid        /usr/local/nginx/logs/nginx.pid;              //PID路径
worker_rlimit_nofile 51200;                                 //指定文件描述符数量
 
events {
    use epoll;               //使用网络I/O模型
    worker_connections  51200;            //允许连接数,文件描述符
}
 
 
http
 {
    include       mime.types;           //文件类型
    default_type  application/octet-stream;         //默认文件类型
    charset  UTF-8                       //语言类型
    server_names_hash_bucket_size 128;               //根据CPU的cache来设定
    client_header_buffer_size 4;          //记录缓存4k
    large_client_header_buffers 4 8k;      //如果4k不够,用8k
 
    sendfile        on;         //指定nginx是否调用sendfile函数(zero copy方式)来输出文件,普通应用必须设为on,对于普通文件用on。如果进行下载I/O负载应用,设置为off,以平衡磁盘磁盘和网络I/O处理速度。
    #tcp_nopush     on;      //允许或禁止使用socket的TCP_NOPUSH(on freebsd或TCP_COR(on  linux),此选择仅仅在使用sendfile时候可用,
 
    keepalive_timeout  65;            //长连接超时时间
    tcp_nodelay on;
    fastcgi_connect_timeout 300;
    fastcgi_send_timeout 300;
    fastcgi_read_timeout 300;
    fastcgi_buffer_size 64k;
    fastcgi_buffers 4 64k;
    fastcgi_busy_buffers_size 128k;
    fastcgi_temp_file_write_size 128k;
 
   #开启gzip压缩,用于支持在线实时压缩输出数据流
    gzip on;                          //off关闭或者on开启gzip功能
    gzip_min_length 1k;  //设置允许压缩最小字节数,0表示多大都压,最好设置大于1k,小于1k越压越大
    gzip_buffers 4 16k;        //系统获取几个单位的缓存,用于存储gzip压缩结果数据流。4 4k 代表以4k为单位,按照原始数据大小以4k为单位的4倍申请内存。 4 8k 代表以8k为单位,按照原始数据大小以8k为单位的4倍申请内存,如果没有设置,默认值是申请跟原始数据相同大小的内存空间去存储gzip压缩结果。
    gzip_http_version 1.1;    //判断http协议版本,是否支持压缩,否则用户看到乱码。默认即可,大部分都得支持
    gzip_comp_level 2;     //gzip压缩比,1 压缩比最小处理速度最快,9 压缩比最大但处理最慢
    gzip_types text/plain application/x-javascript text/css application/xml;     //默认nginx是开启gzip压缩,但是只针对html文件押送  gzip_types       text/plain application/x-javascript text/css text/html application/xml text/javascript;  在nginx的gzip的gzip_types加上
    gzip_vary on;   //和http头有关系,加个vary头,给代理服务器用的,有的浏览器支持压缩,有的不支持,所以避免浪费不支持的也压缩,所以根据客户端的HTTP头来判断,是否需要压缩。
 
    client_max_body_size 50m;             //允许客户端请求的最大单个文件字节数
    client_body_buffer_size 128k;        //缓冲区代理用户端请求的最大字节数,可以理解先保存到本地在穿给用户
    proxy_connect_timeout 600;        //和后端服务器连接的超时时间,发起握手等候相应超时时间
    proxy_read_timeout 600;         //连接成功后,等待后端服务器相应时间,已经进入后端的排队之中等候处理
    proxy_send_timeout 600;        //后端服务器数据回传时间,在规定时间内服务器必须传完所有数据
    proxy_buffer_size 16k;        //只保存用户头信息一共nginx进行规则处理,用于缓存代理请求
    proxy_buffers    4 32k;     //告诉nginx保存单个用的几个Buffer最大用多大空间
    proxy_busy_buffers_size 64k;   //如果系统很忙可以申请更大的proxy_buffers,官方推荐 *2
    proxy_temp_file_write_size 64k;    //proxy缓存临时文件大小
 
    upstream http_server_pool {
        server 192.168.1.2:8080 weight=4 max_fails=2 fail_timeout=30s;
        server 192.168.1.3:8080 weight=2 max_fails=2 fail_timeout=30s;
     }          //设置地址池,后端2台服务器
 
    server          //第一个虚拟主机,反向代理http_server_pool这组服务器
      {
        listen       80;                                        //监听端口
        server_name  www.xiao.com;           //主机名称
 
        location /
        {
                proxy_next_upstream error timeout invalid_header http_500 http_503 http_404; //http://www.2tutu.com/post/2008/631.html         //后端服务器返回500 503 404错误,自动请求转发到upstream池中另一台服务器
                proxy_pass http://http_server_pool;
                proxy_set_header Host www.xiao.com;
                proxy_set_header X-Forwarded-For  $remote_addr;
        }
        access_log  logs/www.xiao.com.access.log  combined;
       }
       }
proxy_set_header Host www.xiao.com
proxy_set_header  Host  $host 首先说明 proxy_set_header 指令在向反向代理的后端Web服务器发起请求时添加指定的 Header头信息,后端web服务器有多个基于域名的虚拟主机时,通过头信息Host,用于指定请求的域名,这样后端web才能识别反向代理请求哪个虚拟主机处理。
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for :联系下面PS中所写,在后端web中就算加上$http_x_Forwarded_for这条,也得不到用户的IP,所以在nginx反向代理添加Header头信息 X-Forwarded-For在配合后端服务器日志文件的$http_x_Forwarded_for这条就可以获得用户的IP地址了。

 PS:假设Nginx作为Web服务器,nginx或Squid作为反向代理后,就不能获取客户端的真实IP地址了,由于在客户端和Web增加了中间层,web没有真实的IP,通过$remote_addr变量拿到是反向代理的IP,Web代理可以增加$http_x_Forwarded_for信息,用于记录客户端IP和原来客户请求的服务器地址,在日志格式中加上即可。

  log_format  main   '$http_x_Forwarded_for '
                       '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
    access_log  /tmp/Nginx.access.log  main;                                 //在后端Web里面加上这样就可以了

upstream : nginx支持4种算法,下面一一介绍

1、 轮询

每个请求按时间顺序分配到不同的后端服务器了,后端服务器down掉,自动切除。

2、weight

设定服务器权值: weight=2

                                  weight=4          服务器性能不均时候使用

3、 ip_hash

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

4、 fair(第三方)

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

5、url_hash (第三方)

按访问的url的hash结果分配,使每个url定向到同一个后端服务器,后端为缓存服务器比较有效。

以往的架构lvs或者dns轮询,这样虽然squid里面的均衡的,但是忽略了一点就是数据量,虽然每台squid是均匀但是都是满载的,重复的请求,会占用很多空间,在前面换上nginx在配上 url_hash,根据url分流后,每一个url会只存在一个squid上,每台squid数据完全不同。http://edu.codepub.com/2010/0202/20282.php

upstream http_server {             //定义负载均衡设备的Ip及设备状态
  ip_hash;
   server 127.0.0.1:9090 down;
   server 127.0.0.1:8080 weight=2;
   server 127.0.0.1:6060;
   server 127.0.0.1:7070 backup;
  }

down : 当前的IP server暂时不参与负载,不进行反向代理

weight: 默认为1,weight越大,负载的权重越大

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

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

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

PS: nginx支持同时设置多组负载均衡,给不同的server使用

location:设置对URL进行匹配,比如 location  /  ,  location  /data 这两个设置优先级,/ 下也可以,但是不如 /data下搜索更快,定位更准。

 

posted @ 2011-09-08 01:38 小马歌 阅读(12165) | 评论 (2)编辑 收藏
 

SYN_RECV概述

  TCP SYN Flood是一种常见,而且有效的远端(远程)拒绝服务(Denial of Service)攻击方式,它透过一定的操作破坏TCP三次握手建立正常连接,占用并耗费系统资源,使得提供TCP服务的主机系统无法正常工作。由于TCP SYN Flood是透过网路底层对服务器Server进行攻击的,它可以在任意改变自己的网路IP地址的同时,不被网路上的其他设备所识别,这样就给防范网路犯罪部门追查犯罪来源造成很大的困难。在国内内外的网站中,这种攻击屡见不鲜。在一个拍卖网站上,曾经有犯罪分子利用这种手段,在低价位时阻止其他用户继续对商品拍卖,干扰拍卖过程的正常运作。

编辑本段如何判断

  一般情况下,可以一些简单步骤进行检查,来判断系统是否正在遭受TCP SYN Flood攻击。
  1、 服务端无法提供正常的TCP服务。连接请求被拒绝或超时。
  2、透过 netstat -an 命令检查系统,发现有大量的SYN_RECV连接状态。
  检查服务器链接,SYN_RECV状态最高时有200多个,访问服务器网页特别慢,甚至超时,所以基本判定是SYN_RECV攻击。

编辑本段解决方法

  这个攻击的解决方法如下:
  1,增加未完成连接队列(q0)的最大长度。
  echo 1280>/proc/sys/net/ipv4/tcp_max_syn_backlog
  2, 启动SYN_cookie。
  echo 1>/proc/sys/net/ipv4/tcp_syncookies
  这些是被动的方法,治标不治本。而且加大了服务器的负担,但是可以避免被拒绝攻击(只是减缓)
  治本的方法是在防火墙上做手脚。但是现在能在一定程度上防住syn flood攻击的防火墙都不便宜。并且把这个命令加入"/etc/rc.d/rc.local"文件中
  如果对 /proc/sys/net/ipv4 下的配置文件进行解释,可以参阅 LinuxAid技术站的文章。查看本文全文也可以参阅。
  关于 syn cookies, 请参阅 <> http://cr.yp.to/syncookies.html
  也许 使用mod_limitipconn.c来限制apache的并发数 也会有一定的帮助。
  2. iptables的设置,引用自CU
  防止同步包洪水(Sync Flood)
  # iptables -A FORWARD -p tcp --syn -m limit --limit 1/s -j ACCEPT
  也有人写作
  #iptables -A INPUT -p tcp --syn -m limit --limit 1/s -j ACCEPT
  --limit 1/s 限制syn并发数每秒1次,可以根据自己的需要修改
  防止各种端口扫描
  # iptables -A FORWARD -p tcp --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit 1/s -j ACCEPT
  Ping洪水攻击(Ping of Death)
  # iptables -A FORWARD -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT


posted @ 2011-09-06 16:26 小马歌 阅读(320) | 评论 (0)编辑 收藏
 

标签:nginx ddos 攻击
 FreeBSD, network card: Intel fxp, port: 100Мбит, polling, http accept-filter.
in sysctl:
sysctl kern.maxfiles=90000
           sysctl kern.maxfilesperproc=80000
           sysctl net.inet.tcp.blackhole=2
           sysctl net.inet.udp.blackhole=1
           sysctl kern.polling.burst_max=1000
           sysctl kern.polling.each_burst=50
           sysctl kern.ipc.somaxconn=32768
           sysctl net.inet.tcp.msl=3000
           sysctl net.inet.tcp.maxtcptw=40960
           sysctl net.inet.tcp.nolocaltimewait=1
           sysctl net.inet.ip.portrange.first=1024
           sysctl net.inet.ip.portrange.last=65535
           sysctl net.inet.ip.portrange.randomized=0
in nginx configuration:
  worker_processes 1;
           worker_rlimit_nofile 80000;
           events {
               worker_connections 50000;
           }

           server_tokens off;
           log_format IP `$remote_addr';
           reset_timedout_connection on;

           listen  xx.xx.xx.xx:80  default rcvbuf=8192 sndbuf=16384 backlog=32000 accept_filter=httpready;
 
In the following way it is possible to realize filtration of url, in example for POST
index.php?action=login which is with empty referral.
   set $add 1;
           location /index.php {
                   limit_except GET POST {
                        deny all;
               }
               set $ban "";
               if ($http_referer = "" ) {set $ban $ban$add;}
               if ($request_method = POST ) {set $ban $ban$add;}
               if ($query_string = "action=login" ){set $ban $ban$add;}
               if ($ban = 111 ) {
                   access_log /var/log/[133]nginx/ban IP;
                   return 404;
               }
               proxy_pass http://127.0.0.1:8000; #here is a patch
           }
 
Further we cut it at pf level – loaded into IP table, hosts from which came too many hits.
PF with tables works very quickly. Sources for parsing of logs (ddetect) you can find on http://www.comsys.com.ua/files
Then Cron used once in a minute, to add into ip tables new IPs from a log.
25 Mbyte DDoS, which cuts IPs, the rests fall on nginx which by it is criterion pass IPs and the rests passed on the apache – LA 0, site works.

posted @ 2011-09-06 16:26 小马歌 阅读(718) | 评论 (0)编辑 收藏
 
2010-12-05 19:36 zetsin newbyter.com 我要评论(2) 字号:T | T
一键收藏,随时查看,分享好友!

有谁还记得大概几年前突然出现了验证码这东西,许多网站甚至桌面应用程序都陆续实现了验证码技术,主要作用无非就是防止用户利用程序进行自动提交,避免暴力破解,避免服务器遭受恶意攻击。

AD:

首先我想讨论一下验证码这玩意儿。

有谁还记得大概几年前突然出现了验证码这东西,许多网站甚至桌面应用程序都陆续实现了验证码技术,主要作用无非就是防止用户利用程序进行自动提交,避免暴力破解,避免服务器遭受恶意攻击。

那么,验证码机制又该如何实现。

目前主流的实现技术主要有session和cookie两种方式,而这两种方式可以说技术是一样的,区别在于将验证码字符串存储在服务器还是客户端。

前者工作流程:服务器发送验证码图片到客户端并在服务器保存验证码字符串到session,用户辨认图片并提交验证码字符串到服务器,服务器将用户提交的验证码字符串与session中保存的字符串进行比较。

后者工作流程:服务器发送验证码图片以及验证码字符串(可能会进行加密)到客户端,客户端将验证码字符串存储到本地cookie,用户辨认图片并提交验证码字符串以及cookie中所存储的字符串到服务器,服务器将用户提交的两个字符串(进行解密后)进行比较。

相对而言,存放在服务器的session更为安全,只不过消耗服务器内存,程序员除了使用模式识别辨认出验证码,没有其他办法。而对于使用cookie方式的验证码,不增加服务器内存消耗,但我们可以通过对传输数据进行分析轻易破解验证码。

这种传统的验证码方式,其框架非常简单。

  

看上图,我们从大的框架分析问题,这里面说的“提供验证码服务”已经不区分session还是cookie了。

接下来从图中我们可以看出什么了呢,对于有多台服务器的大企业是十分平常的,那么,假如每一个服务程序都使用验证码技术,那么每一个服务程序就需要独自实现验证码服务,这样做不是不可以,只是增加了程序员的负担而已。

好吧,现在我们正式进入今天的主题,也是接着上面的话题,腾讯的验证码框架有何不同。

我们随便进入一个需要验证码的腾讯页面:

http://web2.qq.com

登录webQQ的时候需要输入验证码,我们通过抓包或者看源代码,可以知道点击“换一张”时其实是访问了这个URL:http://captcha.qq.com/getimage,来自tencent http server。多尝试几个需要验证码的页面,发现其验证码依然是是通过访问http://captcha.qq.com/getimage获得。当然也有例外的情况,不过总体看来腾讯的验证码机制的框架与上面讨论的又有些不一样。

看到了吗,在这种框架体系下,验证码成了一个单独的组件,不同服务器不同应用程序都可使用它提供的验证码服务接口。

具体流程

好吧,我们继续进一步研究腾讯验证码的具体流程。

访问http://captcha.qq.com/getimage,看到“zqcu”验证码图片,抓包,查看响应标头:

键 值

响应 HTTP/1.1 200 OK

Server tencent http server

Accept-Ranges bytes

Pragma No-cache

Content-Length 2559

Set-Cookie verifysession=h0052f5e46e7ca7d3f1bbb1cfa3bbb2a9ea86bded65adbf78e575c50e0d361145fcd232015653790eb

4;PATH=/; DOMAIN=qq.com;

Connection close

Content-Type image/jpeg

以上就是HTTP协议中的header内容,请注意其中Set-Cookie的部分,其实这就是验证码“zqcu”字符串经过加密后的密文。当我们提交验证码时,正是将我们输入的“zqcu”和密文同时提交,然后服务器A/B再通过服务器C的验证接口判断是否正确。这时候,一切浮云都是神马了,原来腾讯验证码居然采用cookie方式。

那么,接下来高手通常会有两种做法:

第一,通过模式识别辨认出图片所承载的验证码字符串,然后提交的时候直接发送识别的字符串。

第二,通过解密破译出verifysession的明文。

很抱歉,我不是高手,以上两种方法我都无能为力。所以,以下的内容高手可绕过,到此结束了。

利用cookie欺骗绕过验证码

到这里,有人可能会骂,你这不是标题党么,什么cookie欺骗,什么漏洞,啥都没。

好吧,接下来讲讲我的方法,就是利用cookie欺骗绕过验证码。

刚才我们访问http://captcha.qq.com/getimage的时候已经获得一个验证码图片,利用人眼识别技术,知道它的验证码字符串为“zqcu”,并且截获了其密文verifysession。

于是,我便开始尝试每次提交都提交“zqcu”并且将cookie设为已知的verifysession。嘿嘿,我可以把入哥的介绍信多复印好几份嘛。

如果真的那么简单的话,腾讯也太二了。

第一次提交的时候,我十分惊喜,居然成功欺骗了服务器。

可是当我再次使用这一组验证码及其密文,却返回验证码错误的提示。我的猜想是,某个验证码用过之后,不能马上再次使用,也许要过1分钟或者1个小时之后才能使用,这是一个我称之为过期机制的坎。也就是说,当洪哥问入哥,这是你写的介绍信么,入哥看了看,说是,然后给这封信添了一个标志。

发现了这个坎,那么悲剧了。

现在我能做的事只有:提前获得几组甚至几百几千组验证码(需要人眼识别,人手输入)及其密文。而且所获得的验证码还不能闲置太长时间,入哥可能将同一份介绍信发给两个人,当别人先用了它,那么我要过一段时间才能再用。

注意上面提到了提前两字,但是同样需要人工识别并输入,这到底有什么用呢。

在做什么事情的时候我们是带着这样一个目的的:提前输入好几组验证码,在特定时间连续并快速的提交。

好吧,我不多说了,看看标题,我们开始暴力秒杀吧。

拍拍秒杀流程如下:商品有一个秒杀时间,当到了这个时间,成千上万的玩家开始填写验证码并点击提交,先到先得。

于是,有了cookie欺骗,我可以提前输入验证码,当时间一到,只要提交即可。

今天就讲到这里吧,大家可以畅所欲言,提出疑问或者指出错误的地方。最后附上我做的拍拍秒杀助手,为了图个方便用的c#编程,所以需要.net farmework环境,有兴趣的同学可以将其改写成c++。

PS:修改本地cookie非常简单,但是,腾讯这里的Set-Cookie并不是保存到本地的cookie,它是一个标志为httponly的cookie,只存储在标头。

我提供一个函数:InternetSetCookieEx(),其msdn如下:

http://msdn.microsoft.com/zh-cn/library/aa385108.aspx

附下载链接:http://d.namipan.com/d/efb4375ee41afae5932279334313c00442c995d2ee600800

posted @ 2011-08-16 19:30 小马歌 阅读(572) | 评论 (0)编辑 收藏
 

朋友讲,nginx比Apache居有灵活的user-agent控制,特找来记录,确实如此。

一般通过User-Agent来判断,从网上抄一抄,那些列出的都不错,我的配置里加上了Java、curl和Wget,方便调试和其它内部项目的抓取。

因为现在很多手机网关没有发送User-Agent,所以大部分手机发送的User-Agent到了网关就被过滤掉了,相当于是空值。经过抽样调查,User-Agent为空且为手机用户比例比较大。有部分User-Agent为空的是一些蜘蛛或垃圾程序的造访,这些垃圾流量并不那么重要。希望手机网关将来有相应的标准,不要发送空的User-Agent,就是发送一个字母也好啊。
如果应用有一个独立域名,也未必要做手机判断。譬如新浪有独立域名且深入人心,那它做不做跳转无关紧要。

nginx配置用穷举方式罗列各类手机User-Agent并把空User-Agent也转到手机应用里,非这些情况,则跳到帮助页面。

set $ismob 0;
if ( $http_user_agent ~ “^((.*MIDP.*)|(.*WAP.*)|(.*UP.Browser.*)|(.*Smartphone.*)|(.*Obigo.*)|(.*Mobile.*)|(.*AU.Browser.*)|(.*wxd.Mms.*)|(.*WxdB.Browser.*)|(.*CLDC.*)|(.*UP.Link.*)|(.*KM.Browser.*)|(.*UCWEB.*)|(.*SEMC\-Browser.*)|(.*Mini.*)|(.*Symbian.*)|(.*Palm.*)|(.*Nokia.*)|(.*Panasonic.*)|(.*MOT\-.*)|(.*SonyEricsson.*)|(.*NEC\-.*)|(.*Alcatel.*)|(.*Ericsson.*)|(.*BENQ.*)|(.*BenQ.*)|(.*Amoisonic.*)|(.*Amoi\-.*)|(.*Capitel.*)|(.*PHILIPS.*)|(.*SAMSUNG.*)|(.*Lenovo.*)|(.*Mitsu.*)|(.*Motorola.*)|(.*SHARP.*)|(.*WAPPER.*)|(.*LG\-.*)|(.*LG/.*)|(.*EG900.*)|(.*CECT.*)|(.*Compal.*)|(.*kejian.*)|(.*Bird.*)|(.*BIRD.*)|(.*G900/V1.0.*)|(.*Arima.*)|(.*CTL.*)|(.*TDG.*)|(.*Daxian.*)|(.*DAXIAN.*)|(.*DBTEL.*)|(.*Eastcom.*)|(.*EASTCOM.*)|(.*PANTECH.*)|(.*Dopod.*)|(.*Haier.*)|(.*HAIER.*)|(.*KONKA.*)|(.*KEJIAN.*)|(.*LENOVO.*)|(.*Soutec.*)|(.*SOUTEC.*)|(.*SAGEM.*)|(.*SEC\-.*)|(.*SED\-.*)|(.*EMOL\-.*)|(.*INNO55.*)|(.*ZTE.*)|(.*iPhone.*)|(.*Android.*)|(.*Windows CE.*)|(Wget.*)|(Java.*)|(curl.*)|(Opera.*))$” )
{
set $ismob 1;
proxy_pass http://m.sudone.com;
}
if ( $http_user_agent ~ ^$ )
{
set $ismob 1;
proxy_pass http://m.sudone.com;
}
if ( $ismob = 0 )
{
<a href=”/tag/rewrite/” onclick=”tagshow(‘rewrite’);return false;”>rewrite</a> “^.*$” http://help.m.sudone.com/ permanent;
}

posted @ 2011-08-15 16:58 小马歌 阅读(482) | 评论 (0)编辑 收藏
 

为什么要使用rpm来管理软件包?相比使用shell脚本,从源码编译安装的方式,排除规模引出的效率因素不讲,脚本的可维护性比起rpm要糟糕一些,当然使用rpm就需要深入了解rpmbuild以及spec文档,似乎也并不简单。但从长远来看,rpm、yum源的可维护性,要比“脚本”可靠一些。在本文中,花开分享了创建yum源的操作步骤,用于管理系统上“定制”的软件包。以下为正文。

  创建yum源需要一个ftp或者http服务,鉴于ftp烦人的防火墙策略(防火墙配制不当,ftp的模式——主动/初动使用不当,服务会变得不可用),建议使用http服务。

  管理yum源需要一个工具createrepo,使用yum安装:

  
yum -y install createrepo

  然后就可以开始了:

  1. 规划、创建yum源目录。

  比如在http://www.bsdmap.com的根目录下创建一个yum目录,来保存 yum 源数据。

  观察官方yum源的目录规划,像是yum并不能自己维护arch,即并不能自己区分i386还是x86_64,所以是单独放在不同的目录下。

  我维护的是基于CentOS Linux 5的包,规划目录如下:

  
$mkdir -p yum/centos/5/{i386,x86_64}

  2. 初始化repodata信息:

  
$createrepo -p -d -o yum/centos/5/i386 yum/centos/5/i386 $createrepo -p -d -o yum/centos/5/x86_64 yum/centos/5/x86_64

  这个时候,会在yum/centos/5/i386和yum/centos/5/x86_64目录下,分别看到一个repodata目录,这个就是yum源的Meta数据,有了这个,yum就可以和这个“源”进行“数据信息”了。

    当然这个时候,这个源是空的,没有任何包可以安装。后面再说如何在yum源中提供安装包。

  3. 配置本地的yum,使之使用自建的yum源。

  简单的来说,就是在本地的/etc/yum.repos.d目录下新建一个配置文件文件(也可配置语句添加到已经存在文件中),以.repo为文件名后缀,比如bsdmap.repo,然后内容大概如下:

  
[bsdmap-yum] name=bsdmap-yum baseurl=http://www.bsdmap.com/yum/centos/$releasever/$basearch/ enabled=1 gpgcheck=0 gpgkey=

  解释:

  [....] 代表这个库的名字,必须是唯一的,不可以重复。

  name= 是这个库的说明,没有太大的实际意义,只是一个字段说明。

  baseurl= 说明采取什么方式传输,具体路径在哪里,可以使用的方式有,file://,ftp://,http://等,关于baseurl中的变量,可以查看yum.conf 的手册:man yum.conf ,在手册的最后一段有详细描述。

  enabled=1 说明启用这个更新库,0表示不启用。

  gpgcheck=1 表示使用gpg文件来检查软件包的签名

  gpgkey= 表示gpg文件所存放的位置,此处也可以有http方式的位置。

  这时,当我们yum repolist 时,就可以看到bsdmap-yum 源了。

posted @ 2011-08-13 17:07 小马歌 阅读(322) | 评论 (0)编辑 收藏
 
1、下载 CentOS 这个就不多说了

CentOS-6.0-i386-bin-DVD.iso
MD5: 081C77749170C512D25DA3A7459E3336
SHA1: 9A8DFA2B68937372F89BD1CA46FBA7EE71C5262C

2、安装 CentOS 6 这个也不多说了

     禁用 iptables 和 SELinux
     shell> chkconfig iptables off && sed -i 's/SELINUX=.*/SELINUX=disabled/' /etc/sysconfig/selinux && reboot

3、上传 CentOS-6.0-i386-bin-DVD.iso 到安装了CentOS 6 的主机上去

     我放在了下面的位置
     /home/iso/CentOS-6.0-i386-bin-DVD.iso

4、挂载

     shell> mkdir /media/CentOS && mount -o loop /home/iso/CentOS-6.0-i386-bin-DVD.iso /media/CentOS

5、备份 YUM 配置

     shell> cp -a /etc/yum.repos.d /etc/yum.repos.d.bak

6、重命名 CentOS-Base.repo

     shell> mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak

7、编辑 CentOS-Media.repo

     shell> sed -i 's/^ /#/g' /etc/yum.repos.d/CentOS-Media.repo
     shell> sed -i 's/gpgcheck=1/gpgcheck=0/' /etc/yum.repos.d/CentOS-Media.repo
     shell> sed -i 's/enabled=0/enabled=1/' /etc/yum.repos.d/CentOS-Media.repo

8、安装 wget

     shell> yum -y install wget

9、安装第三方源

     shell> wget http://packages.sw.be/rpmforge-r ... 2-2.el6.rf.i686.rpm
     shell> rpm --import http://apt.sw.be/RPM-GPG-KEY.dag.txt
     shell> rpm -K rpmforge-release-0.5.2-2.el6.rf.*.rpm
     shell> rpm -i rpmforge-release-0.5.2-2.el6.rf.*.rpm

10、至此,就完成了,你可以尝试安装一下ntfs-3g

     shell> yum -y install ntfs-3g

等官方的源出来了,只需把备份的YUM配置还原回去就可以了!

上一张图
20110710141046.jpg
posted @ 2011-08-03 16:49 小马歌 阅读(1061) | 评论 (0)编辑 收藏
 
     摘要: 很多人认为编程语言只是用于工作,没有什么乐趣,其实,只要我们发挥奇思妙想,再死板的东西也有有趣的一面。这篇文章告诉大家:使用JavaScript,可以做很多很多有趣的事情。以下代码拷贝到地址栏回车即可运行,赶紧试试吧。  1. 网页射击游戏  这个游戏可以在任何网页里面玩,把下面代码粘贴到地址栏回车,按空格键进行射击,W键可前进,A、D键或者方向键可改变射击方向。javascript:var%20...  阅读全文
posted @ 2011-08-03 12:04 小马歌 阅读(356) | 评论 (0)编辑 收藏
 
     摘要: 1. 准备工作开发工具本例使用的是visual studio 2008 英文版,下图是关于信息 Windows SDK本例使用Windows7操作系统 这里下载SDKNPAPISDK本例使用的是Firefox4.0.1提供的SDK。首先,从这里下载mozilla源码。然后,解压firefox-4.0.1.source.tar.bz2文件。将 \firefox-4.0.1.sou...  阅读全文
posted @ 2011-08-03 12:01 小马歌 阅读(2071) | 评论 (1)编辑 收藏
 
jQuery EasyUI是一组基于jQuery的UI插件集合,而jQuery EasyUI的目标就是帮助Web开发者更轻松的打造出功能丰富并且美观的UI界面。开发者不需要编写复杂的Javascript,也不需要对CSS样式有深入的了解,只需要了解一些简单的HTML标签。 

该版本的改进: 
  • 菜单:允许用户启用或者禁用菜单项。
  • 组合框:新增了"延迟"属性来设置搜索输入内容的延迟时间。
  • Treegrid:支持 getEditors 和 getEditor 方法。
  • messager:在状态栏中新增 progress 方法,用来显示消息框。
  • panel: 新增了“extractor”选项,允许用户从Ajax响应中提取面板的内容。
新增的插件: 
  • 搜索框:允许用户键入关键字,执行搜索操作。
  • 进度条:显示任务的进度。
修复的bug: 
  • 菜单:当出现滚动条时,菜单的位置错误。
  • accordion:无法正常显示jQuery 1.6.2版本中默认选择的面板。
  • tabs:无法正常显示jQuery 1.6.2版本中默认选择的Tab面板。
官方网站:http://www.jeasyui.com/ 

下载地址:http://www.jeasyui.com/download/v124.php 
posted @ 2011-08-03 12:00 小马歌 阅读(293) | 评论 (0)编辑 收藏
仅列出标题
共95页: First 上一页 48 49 50 51 52 53 54 55 56 下一页 Last