高性能Http服务器nginx

Nginx介绍:

Nginx是一款采用Linux 2.6内核epoll新机制开发的Web服务器软件,能极大地提高Web访问特别是小文件访问的I/O性能,是c10k问题的一个解决方案。在高并发连接的情况下,Nginx是Apache服务器不错的替代品。Nginx同时也可以作为7层负载均衡服务器来使用。

高并发连接:官方测试能够支撑5万并发连接,在实际生产环境中跑到2~3万并发连接数。
内存消耗少:在3万并发连接下,开启的10个Nginx 进程才消耗150M内存(15M*10=150M)。
配置文件非常简单:风格跟程序一样通俗易懂。
成本低廉:Nginx为开源软件,可以免费使用。而购买F5 BIG-IP、NetScaler等硬件负载均衡交换机则需要十多万至几十万人民币。
支持Rewrite重写规则:能够根据域名、URL的不同,将 HTTP 请求分到不同的后端服务器群组。
内置的健康检查功能:如果 Nginx Proxy 后端的某台 Web 服务器宕机了,不会影响前端访问。
节省带宽:支持 GZIP 压缩,可以添加浏览器本地缓存的 Header 头。
稳定性高:用于反向代理,宕机的概率微乎其微。
安装Nginx:

http://blog.s135.com/nginx_php_v5/

rewrite设置:  

        if ($http_user_agent ~ MSIE) {
                rewrite ^/star(.*)$ http://www.xxx.com/star/$1 break;
        }
反向代理设置:

location /star {
                proxy_pass http://www.xxx.com/star;
        }
负载均衡设置:

#设定负载均衡的服务器列表
        upstream mysvr {
                #weigth参数表示权值,权值越高被分配到的几率越大
                #本机上的Squid开启3128端口
                server 192.168.8.1:3128 weight=5;
                server 192.168.8.2:80   weight=1;
                server 192.168.8.3:80   weight=6;
        }
#对 "/" 启用负载均衡
        location / {
                        proxy_pass      http://mysvr;

                        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;
                        client_max_body_size    10m;
                        client_body_buffer_size 128k;
                        proxy_connect_timeout   90;
                        proxy_send_timeout      90;
                        proxy_read_timeout      90;
                        proxy_buffer_size       4k;
                        proxy_buffers           4 32k;
                        proxy_busy_buffers_size 64k;
                        proxy_temp_file_write_size 64k;
       }
另参考:

upstream bakend{#定义负载均衡设备的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;
}
在需要使用负载均衡的server中增加
proxy_pass http://bakend/;
每个设备的状态设置为:
1.down 表示单前的server暂时不参与负载
2.weight 默认为1.weight越大,负载的权重就越大。
3.max_fails :允许请求失败的次数默认为1.当超过最大次数时,返回proxy_next_upstream 模块定义的错误
4.fail_timeout:max_fails次失败后,暂停的时间。
5.backup: 其它所有的非backup机器down或者忙的时候,请求backup机器。所以这台机器压力会最轻。
URL hash设置:

1、轮询(默认)
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。
2、weight
指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。
例如:
    upstream tomcats {
         server 10.1.1.107:88 weight=10;
         server 10.1.1.132:80 weight=10;
    }
3、ip_hash
每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。
例如:
    upstream tomcats {
         ip_hash;
         server 10.1.1.107:88;
         server 10.1.1.132:80;
    }

4、fair(第三方)
按后端服务器的响应时间来分配请求,响应时间短的优先分配。
5、url_hash(第三方)
按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。
nginx 开启SSI:

nginx 也有内置的SSI 模块 ngx_http_ssi_module
配置文件开启

ssi on;
ssi_silent_errors on;
ssi_types text/shtml;

这样就可以支持shtml了
利用proxy_store实现高效的静态文件缓存服务器:

location /star {
                proxy_pass http://www.xxx.com/star;

                proxy_store on;
                proxy_temp_path /opt/cache;
                proxy_set_header Host $host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header Via "s9/nginx";
                proxy_store_access user:rw group:rw all:rw;
                if ( !-e $store_file ) {
                        proxy_pass http://www.xxx.com;
                }
        }
注意需要一个定时删除缓存的脚本:

find /opt/Cache/ -type -atime 30 |xargs rm -rf {}

使用Nginx的proxy_cache缓存功能取代Squid

网上已有介绍使用Nginx的proxy_cache缓存功能取代Squid的文章,如:http://blog.s135.com/nginx_cache/

查看nginx的状态:

location /nginx_status {
    stub_status on;
    access_log   off;
    allow SOME.IP.ADD.RESS;
    deny all;
}
防盗链设置:

1 简单的通过referer判断
location ~ .*\.(gif|jpg|jpeg|png|bmp|wma|mp3|swf)$ {
      valid_referers none blocked server_names *.163.com 163.com baidu.com;
      if ($invalid_referer) {return 403;}
    expires      30d;
}
2 Nginx_HttpAccessKey_Module 插件
下载 http://wiki.nginx.org/images/5/51/Nginx-accesskey-2.0.3.tar.gz
这个需要安装额外的模块,下载模块源码,然后按照说明文档,将下载来的源码中"$HTTP_ACCESSKEY_MODULE" 替换成 "ngx_http_accesskey_module",再
1. ./configure --add-module=path/to/nginx-accesskey
完了以后再重新编译一次nginx,然后就可以在配置文件中使了。
location /download {
  accesskey             on;
  accesskey_hashmethod  md5;
  accesskey_arg         "key";
  accesskey_signature   "mypass$remote_addr";
}
这样一个下载的文件就需要 http://example.com/download/file.zip?key=09093abeac094 这样的形式进行下载
其中 key的值为 mypass和下载客户端ip 进行md5运算获得。比如在 php 中可以向如下方式输出针对客户ip的下载链接地址
1. <?
2. $ipkeyvalue = md5("mypass".$_SERVER['REMOTE_ADDR']);
3. $out_keyfile_link="<a href=http://example.com/download/testfile.rar?key=".$ipkeyvalue.">防盗链文件下载</a><br />";
4. echo $out_keyfile_link;
5. ?>
这样当一个用户将访问地址拷贝给别人时,因为访问ip不同,就造成 md5("mypass".ipaddr) 值不同,达到防盗链目的。

注意:这里accesskey_signature后面的mypass是干扰码,你可以改为自己需要的密码。
nginx限速处理:

限速使用 limit_zone, limit_conn 以及 limit_rate 进行配置
首先在 http 段配置一个 limit_zone,然后在需要的地方使用 limit_conn 和 limit_rate 进行限速设置,如下一个简单的例子
http {
  limit_zone   one  $binary_remote_addr  10m;
  server {
    location /files/ {
      limit_conn   one  1;
      limit_rate 20k;
    }
  }
}
说明:
limit_zone,是针对每个IP定义一个存储session状态的容器。这个示例中定义了一个名叫one的10m大小的容器,这个名字会在后面的limit_conn中使用。
limit_conn one 1;
限制在one中记录状态的每个IP只能发起一个并发连接。
limit_rate 20k;
对每个连接限速20k. 注意,这里是对连接限速,而不是对IP限速。如果一个IP允许三个并发连接,那么这个IP就是限速为limit_rate×3,在设置的时候要根据自己的需要做设置调整,要不然会达不到自己希望的目的。

猜你喜欢

转载自iegyiy.iteye.com/blog/1725423