nginxs

运维博客

12-nginx限制文件下载速度

2016/05/22 21:54 于 web 0

微信 微博 豆瓣 人人

介绍

有些时候需要把一些文件放到nginx供用户下载,但是你又怕用户占用大量带宽,这时候就应该给客户端限制传输速度了。
limit_rate_after 5m; #前5M的下载内容不进行限速
limit_rate 1m; #限速1M

举例:

        location  /download/ {
limit_rate_after 5m;
limit_rate 1m;
alias /data/html/;
}

这里的“limit_rate 1m;”的“1m”就是限速1M的意思,“0”就算不限速,
limit_rate_after 5m; 是指传输5m不限速,完成后限速1M
这里的限制是给每个请求的,如果用户开两个连接就是限制的两倍带宽,

当你带宽有限情况下只能限制用户的连接数,来限制用户使用最大带宽
也可以根据连接连接数限制总带宽, 连接数超过限制直接返回“ 503 Service Temporarily Unavailable”

    http {
....
server {
.....
limit_conn_zone $server_name zone=servers:10m;
server {
    location /download/ {
        limit_conn servers 10;
        limit_rate_after 500k;
        limit_rate 50k;
    }
}
}}

这里限制本域名的的连接数10个,每个连接预先不限制速度下载500k,然后再限速50k下载,这样10个连接同时下载最小的带宽 50k*10 最大带宽5000k

nginx教程

第一章 nginx安装基本引导和进程信号

02-nginx IO模型

03-nginx负载均衡

04-nginx的root和alias区别

05-nginx limit_req和limit_conn_zone

06-nginx访问控制“限制ip”,“限制用户名”

07-nginx geo区域访问控制

08-nginx的if语句条件判断

10-nginx内部变量和自定义变量

11-nginx rewrite uri地址重写

12-nginx限制文件下载速度

nginxnginx限制网速nginx限制带宽nginx限制文件下载速度

11-nginx rewrite uri地址重写

2016/05/22 00:55 于 web 1

微信 微博 豆瓣 人人

介绍

大家经常会遇到这样需求,一个活动页面的URL地址很长,推广起来产品运营和用户反馈不容易记住
不美观,但是暂时没办法修改代码,这个时候就可以用到rewrite。或者你现在网站升级到https现在有些用户还在访问http你想统一用https,这些都可以用rewrite规则来实现。
rewrite会重写用户的请求地址,但是不会修改问号后面参数,返回给用户的httpcode为302。

语法:rewrite regex replacement [flag];
作用域:server, location, if
rewrite_log on | off; #rewrite日志开启和关闭
set $user_pro "false";定义区域“main”
uninitialized_variable_warn on | off; 控制是否记录警告未初始化的变量。默认开启;

nginx和apache的rewrite简单对比

以前大家在用apache做共享主机的时候在“.htaccess”文件写这些规则,但是nginx不是这样。
举例1:

    apache的rewrite规则
RewriteCond %{HTTP_HOST} example.org
RewriteRule (.*) http://www.example.org$1

nginx的rewrite规则:
server {
listen 80;
server_name www.example.org example.org;
if ($http_host = example.org) {
rewrite (.*) http://www.example.org$1;
}
但是这种写法是不建议的,最好每个不同域名不同server{}

举例2:

nginx会把所有匹配到以“/code/”目录开头的请求跳转到“http://192.168.1.128:8080/”但是不修改?后面参数

location ~ ^/code/
{
rewrite (.*) http://192.168.1.128:8080/;
}

举例3:

正则匹配内容“^(/download/.)/audio/(.)..$”,前面的每个“.”映射到目标地址里面都是$1,$2,$3…..

    rewrite ^(/download/.*)/audio/(.*)\..*$       $1/mp3/$2.ra  last;
return 403; #返回httpcode 403
rewrite ^(/media/.*)/audio/(.*)\..*$ http://new.nginxs.net/$1/mp3/$2.ra last;

rewrite标记

描 述:如果使用正则匹配一个请求地址,URI将更改为指定的地址,并顺序执行配置文件中依次出现的指令,
但是如果你想修改地址以后直接跳出则可以使用flag来处理下面介绍一下last,break,redirect,permanent四个标签

     last                  #在搜索到相应的URI和location之后完成rewrite指令;停止处理当前的ngx_http_rewrite_module指令集,开始寻找一个新的位置改变URI匹配;
break # 完成 rewrite指令处理直接break;
redirect #返回302临时重定向,如果replacement替换部分是由http://开始,它将被应用。
permanent #返回301代码永久重定向

nginx教程

第一章 nginx安装基本引导和进程信号

02-nginx IO模型

03-nginx负载均衡

04-nginx的root和alias区别

05-nginx limit_req和limit_conn_zone

06-nginx访问控制“限制ip”,“限制用户名”

07-nginx geo区域访问控制

08-nginx的if语句条件判断

10-nginx内部变量和自定义变量

11-nginx rewrite uri地址重写

uri地址重写nginxnginxrewrite地址重写nginxuri地址重写

08-nginx的if语句条件判断

2016/05/21 13:43 于 web 0

微信 微博 豆瓣 人人

介绍

语法:if(condition){………}
配置作用域:server,location

匹配条件

“=”和““!=”” 变量等于不等于条件
“~” 和“~” 匹配到指定内容是否区分大小写
“!~”和"!~
" 匹配到指定内容是否区分大小写
“-f”和“!-f” 检查一个文件是否存在
"-d" 和"!-d" 检查一个目录是否存在
"-e"和"!-e" 检查一个文件,目录,软连接是否存在
“-x”和“!-x” 检查一个是否有执行权限
匹配的内容可以是字符串也可以是一个正则表达式。
如果一个正则表达式包含“}”或者“;”就必须包含在单引号或双引号里面。

执行条件

    if(condition){………}
if($variable ~ '^/product' ){………}
举例:
if ($http_user_agent ~ MSIE) { #只要“$http_user_agent”配置MSIE的
rewrite ^(.*)$ /msie/$1 break; #URL地址前面加"/msie"
}

if ($http_cookie ~* "id=([^;]+)(?:;|$)") {
set $id $1;
}

if ($request_method = POST) {
return 405;
}

if ($slow) {
limit_rate 10k;
}

if ($request_uri ~) {
return 403;
}

if ($request_uri ~ "/test.html") { #根据访问地址跳转到目标地址
rewrite ^ http://new.ngins.net;
}

if (-x "/data/test.sh") { #根据文件是否有执行权限,跳转到目标
rewrite ^ http://new.ngins.net;
}

nginx教程

第一章 nginx安装基本引导和进程信号

02-nginx IO模型

03-nginx负载均衡

04-nginx的root和alias区别

05-nginx limit_req和limit_conn_zone

06-nginx访问控制“限制ip”,“限制用户名”

07-nginx geo区域访问控制

08-nginx的if语句条件判断

nginxnginx if条件判断if条件判断

09-nginx geo区域访问控制

2016/05/21 00:16 于 web 0

微信 微博 豆瓣 人人

介绍
geo是nginx的地域模块, 管理人员可以通过用户的ip信息查询到地理位置,再根据地理位置提供更好的服务。

由于免费的地理位置库往往不会太准确,所以没有准确地理位置库,不建议使用nginx geo模块进行精准投放用户类的行为

举例1:
geo $geo {
default 0;
192.168.1.159 1;
192.168.1.128 2;
}
server {
listen 80;
server_name localhost;
root /usr/local/kafka/html;
if ($geo = 1) {
rewrite ^ http://new.nginxs.net;
}
if ($geo = 2) {
rewrite ^ http://www.nginxs.net;
}
描述:geo模块会把
192.168.1.159的 $geo=1最终跳转到new.nginxs.net
192.168.1.128的 $geo=2最终跳转到www.nginxs.net
其它的都是default $geo=0最终默认的正常访问

根据geo的值
语法: geo [$address] $variable { ... }
作用域: http
描述指定变量的值的依赖在客户端IP地址。默认情况下,地址是取自$ remote_addr变量,

介绍
geo是nginx的地域模块, 管理人员可以通过用户的ip信息查询到地理位置,再根据地理位置提供更好的服务。

举例1:

    geo  $geo {
default 0;
192.168.1.159 1;
192.168.1.128 2;
}
server {
listen 80;
server_name localhost;
root /usr/local/kafka/html;
if ($geo = 1) {
rewrite ^ http://new.nginxs.net;
}
if ($geo = 2) {
rewrite ^ http://www.nginxs.net;
}

描述:geo模块会把
192.168.1.159的 $geo=1最终跳转到new.nginxs.net
192.168.1.128的 $geo=2最终跳转到www.nginxs.net
其它的都是default $geo=0最终默认的正常访问

根据geo的值
语法: geo [$address] $variable { ... }
作用域: http
描述指定变量的值的依赖在客户端IP地址。默认情况下,地址是取自$ remote_addr变量,

举例2:

geo根据地域负载

    http{
updtream BJ {
server 10.10.1.10:8080;
}
updtream SH {
server 10.10.2.10:8080;
}
updtream GZ {
server 10.10.3.10:8080;
}
updtream LO {
server 10.10.4.10:8080;
}

geo $country {
default BJ; # $country的默认值BJ
include conf/geo.conf; #包含conf/geo.conf配置
delete 127.0.0.0/16; #删除指定网络
proxy 192.168.100.0/24;
proxy 2001:0db8::/32;

127.0.0.0/24 SH; #设置 $country=SH
127.0.0.1/32 GZ; #设置 $country=GZ
10.1.0.0/16 BJ; #设置 $country=BJ
192.168.1.0/24 LO; #设置 $country=LO
}

location / {
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_pass http://$country;
access_log log/new.nginx.net.log main;
}
}

根据不同区域的用户访问不同服务器进行负载

range的用法

geoip_country  /usr/local/nginx-new/GeoIP.dat;      #读取IP位置库
geoip_city /usr/local/nginx-new/GeoLiteCity.dat;
geo $country {
ranges;
default ZZ;
127.0.0.0-127.0.0.0 US;
127.0.0.1-127.0.0.1 RU;
127.0.0.1-127.0.0.255 US;
10.1.0.0-10.1.255.255 RU;
192.168.1.0-192.168.1.255 UK;
}

nginx教程

第一章 nginx安装基本引导和进程信号

02-nginx IO模型

03-nginx负载均衡

04-nginx的root和alias区别

05-nginx limit_req和limit_conn_zone

06-nginx访问控制“限制ip”,“限制用户名”

09-nginx geo区域访问控制

nginxnginx geo模块nginx geo地域区分用户nginx geo模块访问控制geo模块访问模块

06-nginx访问控制“限制ip”,“限制用户名”

2016/05/18 23:14 于 web 0

微信 微博 豆瓣 人人

介绍在一些特定的情况下nginx需要限制用户的访问例如根据一下条件:根据IP,根据用户,根据请求方法等。

方式1:通过location里面IP限制请求,被限制请求返回403,如果要ipv6的限制编译安装的时候需要编译“ --with-ipv6”语法:(allow|deny) address | CIDR | unix: | all;
作用域: http, server, location, limit_except

举例:限制ip:除去192.168.1.158不可以访问,“192.168.1.0/24”网段其他用户可以访问,除此之外的其它ip不可以访问。

    server {
...
deny 192.168.1.158;
allow 192.168.1.0/24;
deny all;
}

根据用户名密码限制

创建密码文件

    [root@localhost nginx-new]# htpasswd -c ./passwdfile  admin  #添加用户名为admin
New password: #此处输入密码
Re-type new password: #再次输入密码
Adding password for user admin
[root@localhost nginx-new]# cat passwdfile
admin:tKAyBpIh8xdyk
[root@localhost nginx-new]# mv passwdfile conf/
location /images/
{
auth_basic "Test login";
auth_basic_user_file passwdfile;
root /usr/local/kafka/html;
}

请求地址http://new.nginxs.net/images/aaa.jpg

satisfy 让你更加灵活使用多种验证方式

允许访问如果所有(all)或至少一个(any)模块通过验证才可以访问。( ngx_http_access_module, ngx_http_auth_basic_module or ngx_http_auth_request_module)
默认是: satisfy all;必须通过所有验证

语法: satisfy [ all | any ]
使用字段:http, server, location
在下面配置里面使用了access模块和auth basic模块验证, satisfy any;就是说只要匹配到两种模块中的一种便可以正常访问

            location /images/
{
satisfy any;
deny 192.168.1.1;
deny all;
auth_basic "Test login";
auth_basic_user_file passwdfile;
root /usr/local/kafka/html;
}

nginx教程

第一章 nginx安装基本引导和进程信号

02-nginx IO模型

03-nginx负载均衡

04-nginx的root和alias区别

05-nginx limit_req和limit_conn_zone

06-nginx访问控制“限制ip”,“限制用户名”

nginxnginx用户密码限制nginx限制ip访问nginx ip白名单nginx ip黑名单

09-nginx limit_req和limit_conn_zone

2016/05/13 23:29 于 web 0

微信 微博 豆瓣 人人

介绍

nginx limit_req和limit_conn_zone两个模块可以有效的帮助你屏蔽一部分恶意请求。

nginx限制请求频率
nginx limit_req用于每个IP的请求频率
超出阈值的请求默认将返回503 (Service Temporarily Unavailable)
rate的单位分为"r/s","r/m"
域声明语法: limit_req_zone key zone=name:size rate=rate;
域调用语法:limit_req zone=name [burst=number] [nodelay];

例1:
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s; #以”$binary_remote_addr“为辨识获取钥匙,定义one为限值域,10m为钥匙桶大小(10兆),1r/s为1次每秒
server { #上面定义就是同一IP的用户每秒仅能请求一次失败返回503
location /search/ {
limit_req_status 599; #指定受限后请求返回httpcode 599
limit_req zone=one burst=5 nodelay; #调用one域,burst=5是5个特权令牌(特权令牌拥有者可以直接请求服务) 超过503,nodelay超过令牌数不等待令牌发送
} #如果不调用nodelay用户会一直等到服务正常相应

例2:
limit_req_zone $server_name zone=perserver:10m rate=10r/s; #这次就是根据用户访问域名限制访问频率
server {
limit_req_log_level error; #指定受限制请求日志级别error
limit_req zone=perip burst=5 nodelay; #如果访问域名$server_name超过10+5次/s就会直接503
}

限制连接数

    limit_conn_zone key zone=name:size; #必须在http级别配置
limit_conn_status code; #限制报错httpcode
limit_conn_log_level info | notice | warn | error; 首先请求日志级别
limit_zone name $variable size; #必须在http级别配置

http {
limit_conn_zone $binary_remote_addr zone=addr:10m; #根据用户ip限制连接数
limit_conn_zone $server_name zone=perserver:10m; #根据用户请求域名限制连接数
...
server {
...
location /download/ {
limit_conn addr 1; #限制同时请求”/download/“目录的连接只有一个
}

nginx教程

第一章 nginx安装基本引导和进程信号

02-nginx IO模型

03-nginx负载均衡

04-nginx的root和alias区别

05-nginx limit_req和limit_conn_zone

nginx limit_req和limit_conn_zonenginx limit_reqnginx limit_conn_zonenginxnginx限制ip请求频率nginx限制ip连接数

04-nginx的root和alias区别

2016/05/12 22:05 于 web 1

微信 微博 豆瓣 人人

介绍

nginx配置文件中常用root指定当前项目根目录
alias也是用来替换用户指定的项目目录的
接下来说一下他们的差别

项目配置文件
[root@localhost webroot]# tree
.
├── code
│   └── test2.html
└── test.html

1 directory, 2 files
[root@localhost webroot]# cat test.html
aaa
[root@localhost webroot]# cat code/test2.html
bbb

nginx配置
alias重定向项目目录
location /code/
{
alias /data/webroot/;
}
访问结果
[root@localhost webroot]# curl http://192.168.1.128/html/test.htmlaaa
访问到文件:/data/webroot/tesst.html

root重定向项目目录

location /code/
{
root /data/webroot/;
}
访问同样结果
[root@localhost webroot]# curl http://192.168.1.128/code/test2.htmlbbb
访问到的文件:/data/webroot/code/tesst2.html

总结
nginx使用root来指定“$document_root”变量,请求访问到的文件是“$document_root”+URL
使用alias访问的就是“$document_root”+"匹配的后面一部分"

绝对路径名对应的当前请求的root或alias指定的路径时,所有的符号链接解析为真正的路径

nginx教程

第一章 nginx安装基本引导和进程信号

02-nginx IO模型

03-nginx负载均衡

04-nginx的root和alias区别

05-nginx limit_req和limit_conn_zone

nginx的root和alias区别root和alias区别nginx的rootnginx的aliasnginx

03-nginx负载均衡

2016/05/07 20:49 于 web 0

微信 微博 豆瓣 人人

介绍
负载均衡是 跨多个应用程序实例优化资源利用率,最大限度地提高吞吐量,降低延迟,并确保容错配置的一个常用的技术。
nginx支持 以下三种算法
round-robin:请求循环发放到每台机器
Least connected :下一个请求将发送给最少活跃连接数的服务器
Session persistence: 散列函数被用于确定应该为下一请求(基于客户端的IP地址)来选择什么样的服务器。



  1. 默认负载算法 round-robin

    http {
    ……
    upstream web1 {
    server 192.168.1.128:9200;
    server 192.168.1.128:3000;
    }
    server {
    listen 80;
    server_name localhost;
    location /
    {
    proxy_pass http://web1;
    }
    }}

在下面面实例中有两个应用,分别是9200端口和3000端口,如果没指定权重默认轮询。将所有的http请求代理到web1

nginx的反向代理包括:http负载均衡,https,fastcgi,uwsgi,SCGI,memcached
假如要给https做负载均衡和代理的话,只要使用“HTTPS”作为协议就可以了。
举例子:
proxy_pass https://web1;

当设置FastCGI,uwsgi,SCGI或memcached的负载均衡时,也需要分别使用fastcgi_pass,uwsgi_pass,scgi_pass和memcached_pass指令。


  1. 最少连接数算法 Least connected

如果想要更加平衡各个应用程序的负载,最少连接算法应该应用在连接和请求时间更长的场合。
使用最少连接数负载算法,nginx将尝试避免单个应用过多的请求导致负载,发送新的请求到请求更少的机器。
要想使用最少连接数负载算法可进行以下配置:
upstream web1 {
least_conn;
server 192.168.1.128:9200;
server 192.168.1.128:3000;
}


  1. 会话保持 Session persistence

大家会发现“round-robin”和“ Least connected ”两种算法之后的请求都可能分布到不通的节点,因此不能保证用户的一直请求到指定服务器。假如你现在每个用户访问都会在nginx服务保存一个session,这样你就需要这个用户之后的访问一直到保存session的机器,这样这个客户端就需要对这个服务器产生“粘性”和“持久性”,在这里我们需要使用 ip hash的算法实现负载。

使用ip-hash,客户端的IP地址被用作散列键来确定应客户的要求进行选择什么样的服务器。此方法确保来自同一客户端的请求将总是被定向到在同一台服务器不可用时除外。
要想使用保持session的持久负载,需要进行一下设置:

        upstream web1 {
ip_hash;
server 192.168.1.128:9200;
server 192.168.1.128:3000;
}

  1. 权重

我们也可以使用权重来影响服务器节点的负载,之前的例子没有指定,所以权重都一样,
当使用“round-robin”算法的时候应用或多或少,这样才可以提供足够请求,并且当请求以均匀的方式进行处理,并完成够快。
权重高的节点分配的请求将比低的节点多,举例子:

    upstream web1 {
server 192.168.1.128:9200 weight=3;
server 192.168.1.128:3000;
}

加入有4个请求将有三个请求到“9200”端口,1个到“3000”端口
同样也可以在最近的版本nginx使用权重在“Least connected”和“ip-hash”负载算法


  1. 健康检查

nginx的健康检查是为了一个检测失败的服务不再分到新的请求。当max_fails设置为0时候关闭健康检查
nginx支持以下健康参数:
max_fails=3 检查到失败3次,判定失败
fail_timeout=2 服务判定失败后等待2秒进行重试此期间服务视为不可用,默认为10秒


  1. 拓展

down 标记服务器为宕机
backup 标记这台服务器为备份服务器,当主服务器不可用是请求此服务器
例子:

    upstream web1 {
server 192.168.1.128:9200 weight=3;
server 192.168.1.129:9200 backup;
server 192.168.1.128:3000;
keepalive 32;
}

keepalive 32; 保持连接数32个
max_conns=333; 限制最大连接数333个

resolver 指定DNS解析域名

    http {
resolver 10.0.0.1;
upstream u {
zone ...;
...
server example.com resolve;
}
}

slow_start=10 设置服务将在规定的10秒内权重0恢复到正常

nginx的upstream模块
http://nginx.org/en/docs/http/ngx_http_upstream_module.html#server

nginx教程

第一章 nginx安装基本引导和进程信号

02-nginx IO模型

03-nginx负载均衡

04-nginx的root和alias区别

05-nginx limit_req和limit_conn_zone

nginx负载均衡nginx健康检查nginx负载均衡权重nginx负载算法nginx的upstream模块nginx

02-nginx IO模型

2016/05/07 00:11 于 web 0

微信 微博 豆瓣 人人

介绍

nginx的分为epoll和select两种多路复用IO接口。

select模型

因为select使用了遍历非阻塞式IO,这样就会导致web服务器大量并发情况下遍历量增加,导致文件描述符使用增加,会产生很多的TCP TIME_WAIT, ‘TIME_WAIT’数一旦这个超出系统设置web服务将无法提供服务。
因为select模型是遍历方式所以对于连接数少却异常活跃的客户端很实用,恰巧减少了服务等待,提高效率。

epoll模型

epoll支持linux2.6+的内核,是使用非阻塞式IO,更加有利于对文件描述符利用率

nginx教程

第一章 nginx安装基本引导和进程信号

02-nginx IO模型

03-nginx负载均衡

04-nginx的root和alias区别

05-nginx limit_req和limit_conn_zone

nginx IO模型nginx安装nginx安装基本引导和进程信号nginxnginx教程

第一章 nginx安装基本引导和进程信号

2016/04/24 11:34 于 web 0

微信 微博 豆瓣 人人

介绍


nginx是一款轻量级的http服务,它可以坐高并发的web服务,也可以做负载均衡,现在进行 nginx基础教程

快速源码安装

    wget http://nginx.org/download/nginx-1.9.15.tar.gz
tar zxf nginx-1.9.15.tar.gz
cd nginx-1.9.15
./configure --prefix=/usr/local/nginx-new --user=www --group=www --with-poll_module\
--with-threads --with-file-aio --with-http_ssl_module --with-http_v2_module \
--with-http_gzip_static_module --with-pcre --with-stream \
--with-http_gunzip_module --with-http_dav_module \
--with-http_geoip_module --with-file-aio
make && make install

进程方式

nginx服务分为master进程和worker进程,master会对worker进程进行配置管理和维护。
nginx采用基于失误的管理模型有效的把请求分配给各个进程,可以使用固定配置也可以自动的调整可用的CPU数量。

默认的nginx配置文件目录"/usr/local/nginx-new/etc/nginx.conf"

启动、停止、重启

    [root@localhost nginx-1.9.15]# /usr/local/nginx-new/sbin/nginx -h
nginx version: nginx/1.9.15
Usage: nginx [-?hvVtTq] [-s signal] [-c filename] [-p prefix] [-g directives]

Options:
-?,-h : help
-v : version
-V : show version and configure options then exit
-t : 测试配置并退出
-T : 测试配置并dump出来退出
-q : 在配置和测试期间不输出错误日志
-s signal :发送一个消息给 master process:进行 stop, quit, reopen, reload
-p prefix : 设置nginx安装目录
-c filename : 指定配置文件(default: conf/nginx.conf)
-g directives :配置文件的指定指令

./sbin/nginx -s { stop|quit | reopen | reload}
stop 快速停止服务(强制停止当前服务)
quit 优雅停止服务(等worker进程任务完成,再退出)
reload reload服务
reopen 重新打开日志文件

nginx进程信号

nginx可以使用进程信号控制,主进程把进程ID写入“xx/nginx.pid"
信号对照表:
TERM,INT 快速关闭
QUIT 优雅关闭
USER1 重新打开日志文件
USER2 升级或者执行文件
WINCH 优雅关闭worker进程

nginx教程

第一章 nginx安装基本引导和进程信号

02-nginx IO模型

03-nginx负载均衡

04-nginx的root和alias区别

05-nginx limit_req和limit_conn_zone

nginx源码安装 nginx安装基本引导nginx进程信号nginxnginx教程

管理