centos httpd nginx 下载限制连接 限速 反向代理
nginx限制连接数ngx_http_limit_conn_module模块
2014-08-20 22:06 admin
一. 前言
我们经常会遇到这种情况,服务器流量异常,负载过大等等。对于大流量恶意的攻击访问,会带来带宽的浪费,服务器压力,影响业务,往往考虑对同一个ip的连接数,并发数进行限制。下面说说ngx_http_limit_conn_module 模块来实现该需求。该模块可以根据定义的键来限制每个键值的连接数,如同一个IP来源的连接数。并不是所有的连接都会被该模块计数,只有那些正在被处理的请求(这些请求的头信息已被完全读入)所在的连接才会被计数。
二. ngx_http_limit_conn_module指令解释
limit_conn_zone
语法: limit_conn_zone $variable zone=name:size;
默认值: none
配置段: http
该指令描述会话状态存储区域。键的状态中保存了当前连接数,键的值可以是特定变量的任何非空值(空值将不会被考虑)。$variable定义键,zone=name定义区域名称,后面的limit_conn指令会用到的。size定义各个键共享内存空间大小。如:
limit_conn_zone $binary_remote_addr zone=addr:10m; |
注释:客户端的IP地址作为键。注意,这里使用的是$binary_remote_addr变量,而不是$remote_addr变量。
$remote_addr变量的长度为7字节到15字节,而存储状态在32位平台中占用32字节或64字节,在64位平台中占用64字节。
$binary_remote_addr变量的长度是固定的4字节,存储状态在32位平台中占用32字节或64字节,在64位平台中占用64字节。
1M共享空间可以保存3.2万个32位的状态,1.6万个64位的状态。
如果共享内存空间被耗尽,服务器将会对后续所有的请求返回 503 (Service Temporarily Unavailable) 错误。
limit_zone 指令和limit_conn_zone指令同等意思,已经被弃用,就不再做说明了。
limit_conn_log_level
语法:limit_conn_log_level info | notice | warn | error
默认值:error
配置段:http, server, location
当达到最大限制连接数后,记录日志的等级。
limit_conn
语法:limit_conn zone_name number
默认值:none
配置段:http, server, location
指定每个给定键值的最大同时连接数,当超过这个数字时被返回503 (Service Temporarily Unavailable)错误。如:
limit_conn_zone $binary_remote_addr zone=addr:10m; |
server { |
location /www.ttlsa.com/ { |
limit_conn addr 1; |
} |
} |
同一IP同一时间只允许有一个连接。
当多个 limit_conn 指令被配置时,所有的连接数限制都会生效。比如,下面配置不仅会限制单一IP来源的连接数,同时也会限制单一虚拟服务器的总连接数:
limit_conn_zone $binary_remote_addr zone=perip:10m; |
limit_conn_zone $server_name zone=perserver:10m; |
server { |
limit_conn perip 10; |
limit_conn perserver 100; |
} |
limit_conn_status
语法: limit_conn_status code;
默认值: limit_conn_status 503;
配置段: http, server, location
该指定在1.3.15版本引入的。指定当超过限制时,返回的状态码。默认是503。
limit_rate
语法:limit_rate rate
默认值:0
配置段:http, server, location, if in location
对每个连接的速率限制。参数rate的单位是字节/秒,设置为0将关闭限速。 按连接限速而不是按IP限制,因此如果某个客户端同时开启了两个连接,那么客户端的整体速率是这条指令设置值的2倍。
三. 完整实例配置
http { |
limit_conn_zone $binary_remote_addr zone=limit:10m; |
limit_conn_log_level info; |
server { |
location ^~ /download/ { |
limit_conn limit 4; |
limit_rate 200k; |
alias /data/www.ttlsa.com/download/; |
} |
} |
} |
四. 使用注意事项
事务都具有两面性的。ngx_http_limit_conn_module 模块虽说可以解决当前面临的并发问题,但是会引入另外一些问题的。如前端如果有做LVS或反代,而我们后端启用了该模块功能,那不是非常多503错误了?这样的话,可以在前端启用该模块,要么就是设置白名单,白名单设置参见后续的文档,我会整理一份以供读者参考。
可以与ngx_http_limit_req_module 模块结合起来使用,以达到最好效果。《nginx限制请求数ngx_http_limit_req_module模块》。
如需转载请注明出处:http://www.ttlsa.com/html/3180.html
二、配置反向代理功能
加载完模块后可以建立一个虚拟主机来作为反向代理
vi /etc/apache2/sites_available/proxy
配置如下
Listen 202.xxx.xxx.xxx:80 (别人访问的IP和端口)
<VirtualHost 202.xxx.xxx.xxx:80> (同上)
ServerAdmin admin@bit.net
ProxyRequests Off (说明开启的是反向代理)
ProxyMaxForwards 100
ProxyPreserveHost On
ProxyPass / http://10.x.xx.xxx/ (转发到url上的请求)
ProxyPassReverse / http://10.x.xx.xxx/
<Proxy *> (这段是访问的控制)
Order Deny,Allow
Allow from all
</Proxy>
</VirtualHost>
然后再在/etc/apache2/sites_enabled/里面建立ln链接
ln -s /etc/apache2/sites_available/proxy /etc/apache2/sites_enabled/proxy
重启apache
/etc/init.d/apache2 restart
然后反向代理就开启了
当别人输入http://202.xxx.xxx.xxx时 就会通过反向代理转到http://10.x.xx.xxx上,这样简单的反向代理功能就开启了
相关配置
apache:【apache不走80端口】
##################################################################
Listen 8008
<VirtualHost *:8008>
ServerName 123
DocumentRoot "/root/workspace/server/gameserver/passport"
WSGIScriptAlias / /root/workspace/server/gameserver/passport/passport/aly_wsgi.py
<Location />
Order deny,allow
Allow from all
</Location>
Alias "/static" "/root/workspace/server/gameserver/passport/passport/static_root"
<Location "/static">
SetHandler None
</Location>
#BrowserMatch "NetAnt" badguy
#BrowserMatch "GetRight" badguy
#BrowserMatch "JetCar" badguy
#BrowserMatch "MassDownloader" badguy
#BrowserMatch "ReGet" badguy
#BrowserMatch "DLExpert" badguy
#BrowserMatch "FlashGet" badguy
#BrowserMatch "OfflineExplorer" badguy
#BrowserMatch "Teleport" badguy
ProxyRequests Off
ProxyMaxForwards 100
ProxyPreserveHost On
ProxyPass /media http://115.28.217.128:80/media #反向代理到nginx的80端口,由nginx全权管理下载
ProxyPassReverse /media http://115.28.217.128:80/media #反向代理到nginx的80端口,由nginx全权管理下载
Alias "/media" "/root/workspace/server/gameserver/passport/passport/media"
<Location "/media">
SetHandler None
</Location>
ErrorLog /var/log/httpd/passport_error.log
# Possible values include: debug, info, notice, warn, error, crit,
# alert, emerg.
LogLevel error
CustomLog /var/log/httpd/passport_access.log combined
#这是apache的限速,其实在这里没多大用,限速都做在nginx里面
BandwidthModule On
ForceBandWidthModule On
Bandwidth all 300000
MaxConnection all 100000
LargeFileLimit .apk 500 20000
LargeFileLimit .zip 500 20000
#MinBandwidth all -1
</VirtualHost>
########################################################################
nginx的配置 [记住nginx的重启,用service nginx stop,然后用service nginx start,不要用service nginx restart,这是个教训]
########################################################################
http {
include mime.types;
default_type application/octet-stream;
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
#access_log logs/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
limit_zone one $binary_remote_addr 1m; #限制IP连接数, 1m==(1024*1024/32=32786)这么多IP连接数
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root html;
index index.html index.htm;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
location /media/ {
limit_conn one 8; #限制每个ip的连接数,每个ip8个连接
limit_rate 7k; #每个连接允许7K的下载速度
alias /root/workspace/server/gameserver/passport/passport/media/;
index index.html index.htm;
}
}
#########################################################################