Nginx和Apache的区别优点

1、Nginx与Apache比较的优点

对于这个问题,并不能说哪一个较好,本身他们都有优缺点,例如:Apache提供了几百个模块,模块就意味着功能,但作为一个Apache服务器最多只有2000多的并发量,Nginx提供的模块也就几十个,但他却可以提供20000的并放量。Apache的功能多,而Nginx的功能少,但有一句话可以很好的说明:

Apache就像Office一样,他有几十万的选项,但你只需要那么六个功能能选
项,Nginx只做了这六个功能,但是他做的这六件事中基本是Apache做的50倍。
                                --Chris Lea,ChrisLea.com

2、从Nginx接受客户端请求处理的角度,他与Apache的不同

Nginx采用的是事件驱动结构,它使用异步请求套接字来接受请求,是一种非阻塞结构,不适用单独的县城处理,目的是为了减少内存和CPU的开销。而Apache采用的同步套接字、线程和进程,每一个请求都是一个单独的进程和线城来进行处理。

Nginx服务器的功能模块

1、限制流量
对于提供的网站来说,肯定是要进行流量现值的,在Nginx中我们完全可以做到限制流量,由Core模块提供了limit_rate、limit_rate_after指令。

(a)指令limit_rate
指令名称:limit_rate
使用环境:http、server、location、if in location
默认值:no

该指令用于指定向客户端传输数据的速度,速度的单位是每秒传输的字节数。该指令只是针对一个连接的设定,也就是说,如果有两个连接同时,那么他们的速度将会是该指令设置的两倍,就像我们的宽带带宽是一样的。

如果需要在server级别对客户端连接进行限制,对于这种情况–这个指令可能并不适合,但是可设置$limit_rate变量,为该变量传递相应的值来实现,例如:

server{
    if($slow){
        set $limit_rate 4k;
    }
}

(b)指令limit_rate_after
指令名称:limit_rate_after
使用环境:http、server、location、if in location中的if字段
默认值:limit_rate_after 1m

该指令是“在。。。后在限制速度为。。。”,意思就是以最大的速度下载time时间后,在进行相应的操作,但在实际的使用中,limit_rate_after的参数是一个下载字节量的大小值,而不是时间值,例如:limit_rate_after 3m是指以最大的速度下载3MB之后。

例如:

location /download{
    limit_rate_after 3m;
    limit_rate 512k;
}

意思为:当一个客户端连接后,将以最快的速度下载3MB之后,然后在以512k的速度进行下载。

2、限制用户并发连接数
可以通过limit_zone模块来实现限制用户的连接数目,既限制同一个用户IP地址的并发连接数。
该模块提供两个命令:limit_zone和limit_conn,其中limit_zone只能在http区段,limit_conn可以使用在http、server、location区段。

示例:

http{
    limit_zone  one  $binary_remote_addr  10m;
    server{
        location /download/{
            limit_conn one 1;
        }
    }
}

(a)指令limit_zone
指令名称:limit_zone
语法:limit_zone zone_name $variable memory_max_size
使用环境:http
默认值:no

该指令用于定义一个zone,该zone将会被用于存储回话的状态。能够存储的会话数量是由分配交付的变量和memory_max_size的大小决定的。
例如:
limit_zone one $binary_remote_addr 10m;
客户端的IP地址将用作会话,注意:这里使用的是binaryremoteaddr而不是remote_addr,这是因为remote_addr的长度为7-15个字节,绘画信息的长度为32字节。当设置1MB的一个zone时,如果使用binary_remote_addr方式,该zone将会存放32000个会话。

(b)指令limit_conn
指令名称:limit_conn
语法:limit_conn zone_name max_clients_per_ip
使用环境:http、server、location
默认值:no

该指令用于为一个会话设定最大的并发连接数。如果并发起请求数超过这个限制,那么将会出现503错误。
例如:

limit_zone  one  $binary_remote_addr  10m;

server{
    location /download/{
        limit_conn one 1;
    }
}

这个设置将会使得俩字与同一个ip的并发连接数不能超过1个。

(b)指令limit_conn_log_level
指令名称:limit_conn_log_level
语法:limit_conn_log_level log_level info | notice | warn |error
使用环境:http、server、location
默认值:error
该指令用于设置错误级别,当连接达到限制之后,将会产生错误日志。

综合实例:

worker_progresses  4;

event{
    worker_connection 10240;
}

http{
    include  mime.types;
    default_type  application/octet-stream;
    sendfile  on;
    keepalive_timeout 65;
    limit_zone  flv_down  $binary_remote_addr  10m;

    server{
        listen 80;
        server_name flv.abc.com;
        ....
        location /download{
            limit_conn flv_down  1;
        }
    }
    error_page  500 502 503 504 /50x.;
        location =/50x.html{
            root html;
        }
}

1、使用limit_zone命令定义一个zone为flv_down

limit_zone  flv_down  $binary_remote_addr  10m;

flv_down:是一个zone的名字,无限制;
binaryremoteaddr:是一个变量,用来做客户端之间的区别,也可以选择其他的变量来区别,但是最典型的还是binary_remote_addr,这里选用的是二进制格式的IP地址,会比ASCII格式更高效。
10m:用于限制大小

2、使用limit_conn命令来实现limit_zone命令的定义的zone,1表示同时连接的数量

limit_conn flv_down  1;