代理服务器Tengine的研究与测试
一、Tengine介绍
1.首先要知道什么Nginx
1)Nginx(发音同 engine x)是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行。由俄罗斯的程序设计师Igor Sysoev所开发,最初供俄国大型的入口网站及搜寻引擎Rambler(俄文:Рамблер)使用。 其特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页伺服器中表现较好.目前中国大陆使用nginx网站用户有:新浪、网易、 腾讯,另外知名的微网志Plurk也使用nginx
2.Nginx优点
1)Nginx 可以在大多数 Unix like OS 上编译运行,并有 Windows 移植版。 Nginx 的1.2.6稳定版已经于2012年12月11日发布,[1]1.3.10开发版已经于2012年12月25日发布,如果新建站点,建议使用最新稳定版作为生产版本,已有站点升级急迫性不高。Nginx 的源代码使用 2-clause BSD-like license
2)Nginx 是一个很强大的高性能Web和反向代理服务器,它具有很多非常优越的特性:在高连接并发的情况下,Nginx是Apache服务器不错的替代品:Nginx在美国是做虚拟主机生意的老板们经常选择的软件平台之一。能够支持高达 50,000 个并发连接数的响应,感谢Nginx为我们选择了 epoll and kqueue作为开发模型
3)Nginx作为负载均衡服务器:Nginx 既可以在内部直接支持 Rails 和 PHP 程序对外进行服务,也可以支持作为 HTTP代理服务器对外进行服务。Nginx采用C进行编写,不论是系统资源开销还是CPU使用效率都比 Perlbal 要好很多。
作为邮件代理服务器:Nginx 同时也是一个非常优秀的邮件代理服务器
4) Nginx 是一个安装非常的简单,配置文件非常简洁(还能够支持perl语法),Bugs非常少的服务器:Nginx 启动特别容易,并且几乎可以做到7*24不间断运行,即使运行数个月也不需要重新启动。你还能够不间断服务的情况下进行软件版本的升级
3.Tengine是在Nginx基础上二次开发而来
1)Tengine的性能和稳定性已经在大型的网站如淘宝网,天猫商城等得到了很好的检验。它的最终目标是打造一个高效、稳定、安全、易用的Web平台。从2011年12月开始,Tengine成为一个开源项目。现在,它由Tengine团队开发和维护。Tengine团队的核心成员来自于淘宝、搜狗等互联网企业。
二、Tengine的功能
1.继承Nginx-1.2.3 的所有特性,100%兼容Nginx的配置;
2.动态模块加载(DSO)支持。加入一个模块不再需要重新编译整个Tengine;
3.输入过滤器机制支持。通过使用这种机制Web应用防火墙的编写更为方便;
4.动态脚本语言Lua支持。扩展功能非常高效简单;
5.支持管道(pipe)和syslog(本地和远端)形式的日志以及日志抽样;
6.组合多个CSS、JavaScript文件的访问请求变成一个请求;
7.可以对后端的服务器进行主动健康检查,根据服务器状态自动上线下线;
8.自动根据CPU数目设置进程个数和绑定CPU亲缘性;
9.监控系统的负载和资源占用从而对系统进行保护;
10.显示对运维人员更友好的出错信息,便于定位出错机器;
11.更强大的防攻击(访问速度限制)模块;
12.更方便的命令行参数,如列出编译的模块列表、支持的指令等;
13.可以根据访问文件类型设置过期时间;
三、Tengine-2.1.0主要特性
1.继承Nginx-1.6.2的所有特性,兼容Nginx的配置;
2.动态模块加载(DSO)支持。加入一个模块不再需要重新编译整个Tengine;
3.支持SO_REUSEPORT选项,建连性能提升为官方nginx的三倍;
4.支持SPDY v3协议,自动检测同一端口的SPDY请求和HTTP请求;
5.流式上传到HTTP后端服务器或FastCGI服务器,大量减少机器的I/O压力;
6.更加强大的负载均衡能力,包括一致性hash模块、会话保持模块,还可以对后端的服务器进行主动健康检查,根据服务器状态自动上线下线,以及动态解析upstream中出现的域名;
7.输入过滤器机制支持。通过使用这种机制Web应用防火墙的编写更为方便;
8.支持设置proxy、memcached、fastcgi、scgi、uwsgi在后端失败时的重试次数
9.动态脚本语言Lua支持。扩展功能非常高效简单;
10.支持管道(pipe)和syslog(本地和远端)形式的日志以及日志抽样;
11.支持按指定关键字(域名,url等)收集Tengine运行状态;
12.组合多个CSS、JavaScript文件的访问请求变成一个请求;
13.自动去除空白字符和注释从而减小页面的体积
14.自动根据CPU数目设置进程个数和绑定CPU亲缘性;
15.监控系统的负载和资源占用从而对系统进行保护;
16.显示对运维人员更友好的出错信息,便于定位出错机器;
17.更强大的防攻击(访问速度限制)模块;
18.更方便的命令行参数,如列出编译的模块列表、支持的指令等;
19.可以根据访问文件类型设置过期时间;
四、Tengine版本变更表
1.[2014-03-28] Tengine-2.0.2 开发版正式发布
2.[2014-03-06] Tengine-2.0.1 开发版正式发布
3.[2014-01-08] Tengine-2.0.0 开发版正式发布
4.[2013-11-22] Tengine-1.5.2 稳定版正式发布
5.[2013-08-29] Tengine-1.5.1 稳定版正式发布
6.[2013-07-31] Tengine-1.5.0 稳定版正式发布
7.[2013-05-14] Tengine-1.4.6 开发版正式发布
8.[2013-05-01] Tengine-1.4.5 开发版正式发布
9.[2013-03-21] Tengine-1.4.4 开发版正式发布
10.[2013-01-21] Tengine-1.4.3 开发版正式发布
11.[2012-11-22] Tengine-1.4.2 开发版正式发布
12.[2012-10-10] Tengine-1.4.1 开发版正式发布
13.[2012-09-05] Tengine-1.4.0 开发版正式发布
14.[2012-05-25] Tengine-1.3.0 稳定版正式发布
15.[2012-05-09] Tengine-1.2.5 稳定版正式发布
16.[2012-03-30] Tengine-1.2.4 稳定版正式发布
17.[2012-02-27] Tengine-1.2.3 稳定版正式发布
18.[2012-01-11] Tengine-1.2.2 稳定版正式发布
19.[2011-12-06] Tengine-1.2.1 版本正式发布
20.[2011-12-02] Tengine宣布开源
五、安装部署Tengine-2.1.0
1.下载源码包,解压缩
wget http://Tengine.taobao.org/download/Tengine-2.1.0.tar.gz
tar zxvf Tengine-2.1.0.tar.gz
cd Tengine-2.1.0
2.看看源码包的目录结构
默认配置文件路径Tengine-2.1.0/conf
browsers fastcgi.conf fastcgi_params koi-utf koi-win mime.types nginx.conf scgi_params uwsgi_params win-utf
3.正式配置编译安装
1)./configure �Chelp 可以查看编译帮助选项,包括定义软件路径,加载模块,禁用模块等
2)这里默认配置
./configure
配置过程省略,此过程当中会检查系统的各种信息,包括软件依赖,如果提示缺少编译工具要提前安装yum groupinstall "Development Tools",由于默认安装需要加载rewrite重写模块和ssl安全套接层,所以还有安装pcre-devel,openssl-devel开发包。
配置过后会汇总默认安装文件的路径如下:
nginx path prefix: "/usr/local/nginx"
nginx binary file: "/usr/local/nginx/sbin/nginx"
nginx configuration prefix: "/usr/local/nginx/conf"
nginx configuration file: "/usr/local/nginx/conf/nginx.conf"
nginx pid file: "/usr/local/nginx/logs/nginx.pid"
nginx error log file: "/usr/local/nginx/logs/error.log"
nginx http access log file: "/usr/local/nginx/logs/access.log"
nginx http client request body temporary files: "client_body_temp"
nginx dso module path: "/usr/local/nginx/modules/"
nginx http proxy temporary files: "proxy_temp"
nginx http fastcgi temporary files: "fastcgi_temp"
nginx http uwsgi temporary files: "uwsgi_temp"
nginx http scgi temporary files: "scgi_temp"
3) 开始编译安装
make(make编译会把源码包编译成二进制可执行软件)
make install (会把编译好的二进制软件和配置文件复制到指定的位置)
4) 安装结果如下
安装后到/usr/local/nginx目录下(默认6个目录)
conf html include logs modules sbin
conf 该目录下放置了所有的重要配置文件,主要有:fastcgi.conf nginx.conf proxy.conf upstream.conf
html 目录默认放置的是index.html和50x.html错误页
include 目录下是模块文件头
logs目录默认放置的是访问日志和错误日志
modules 目录下可以放置第三方模块
sbin 目录放置的是nginx二进制命令和dso_tool
5)检查nginx命令的用法
A.显示版本数
nginx -v
Tengine version: Tengine/2.1.0 (nginx/1.6.2)
B.显示模块数
nginx -m
Tengine version: Tengine/2.1.0 (nginx/1.6.2)
loaded modules:
ngx_core_module (static)
ngx_errlog_module (static)
ngx_conf_module (static)
……
C.测试配置文件语法是否正确
nginx -t
the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
configuration file /usr/local/nginx/conf/nginx.conf test is successful
D.启动,停止,加载配置文件
-s signal : send signal to a master process: stop, quit, reopen, reload
六、默认配置测试
1.默认启动nginx(用的是nobody用户)
#/usr/local/nginx/sbin/nginx
#ps aux |grep nginx
root 24561 0.0 0.0 45280 1116 ? Ss 10:45 0:00 nginx: master process /usr/local/nginx/sbin/nginx
nobody 24562 0.0 0.0 45740 2112 ? S 10:45 0:00 nginx: worker process
#ls /usr/local/nginx (现在11个目录,新增了5个temp)
client_body_temp conf fastcgi_temp html include logs modules proxy_temp sbin scgi_temp uwsgi_temp
2.默认访问
3.404访问
4.Status状态访问
七、优化配置测试
1.添加www账号,默认使用nobody账户运行nginx,设置一个固定账户主进程还是root运行,worker进程是www运行
#groupadd -g 58 www
#useradd www -s /sbin/nologin -u 58 -g 58 -M
#id www
uid=58(www) gid=58(www) groups=58(www)
2.优化nginx配置
1)可以自动识别cpu进程数并且绑定worker_processes到每个进程上。
worker_processes auto;
为worker_processes增加参数auto。当设置成auto,Tengine将自动启动与cpu数量相同的worker进程。
worker_cpu_affinity on;
当设置成auto时,Tengine将根据worker的数量自动配置cpu绑定位图。绑定的顺序是按CPU编号从大到小。
2)修改events区域
use epoll;#linux系统使用
worker_connections 60000;#默认每个worker连接数是1024
3)header头优化
client_header_buffer_size 32k;#客户请求头缓冲大小
large_client_header_buffers 4 32k; #如果header过大,它会使用这个参数来读取
5)http模块优化
server_tokens off;#错误页面中隐藏Tengine的版本,提高安全性
sendfile on;#高效文件传输模式,将tcp_nopush和tcp_nodely设置为on
tcp_nopush on;#告诉nginx在一个数据包里发送所有头文件
keepalive_timeout 60;#给客户端分配keep-alive链接超时时间,这里是60s
tcp_nodelay on;#告诉nginx不要缓存数据,而是一段一段的发送--当需要及时发送数据时,就应该给应用设置这个属性
6)gzip压缩
gzip on;#开启gzip压缩 实时压缩输出数据流
gzip_min_length 1k;#最小1K才开始压缩
gzip_buffers 4 16k;#压缩缓存
gzip_http_version 1.1;#压缩版本
gzip_comp_level 2;#压缩级别
gzip_types text/plain application/x-javascript text/css application/xml image/png;#压缩类型
gzip_vary on;
7)log日志
A.日志格式
log_format access '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent $request_time "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for" $proxy_add_x_forwarded_for ';
产生的日志格式如下:
访问IP-用户时间-请求uri-状态-大小-请求时间-referer-代理IP-真实IP
61.145.164.198 - - [07/May/2015:13:39:37 +0800] "GET /manager/html HTTP/1.1" 404 590 0.000 "-" "Mozilla/3.0 (compatible; Indy Library)" "-" 61.145.164.198
B.日志分割
除了这个还得对Tengine产生的大量日志,得进行分割才好处理,下面是日志分割脚本:
#!/bin/bash
# This script run at 00:00 to cut nginx_log per day.
logs_path="/data/logs"
log_names=`cd ${logs_path};ls *.log`
year=`date -d "yesterday" +"%Y"`
month=`date -d "yesterday" +"%m"`
time=`date -d "yesterday" +"%Y%m%d"`
/usr/bin/find $logs_path -mtime +14 -exec rm -rf {} \;
for log in $log_names
do
mv ${logs_path}/$log ${logs_path}/$log.$time
kill -USR1 `cat /usr/local/nginx/nginx.pid`
done
这个日志脚本要结合cron任务每天凌晨运行,日志按天切割,如果需要按其他时间切割,只需要调整周期性计划任务即可 ,另外这里是保存二周的日志,注意kil �CUSR1比nginx �Cs reload更优雅,特别是精确到分钟时只能选择kill �CUSR1这个参数
8) 系统内核优化(这个需要结合实际服务器硬件和访问量来修改)
net.ipv4.ip_forward = 1 #开启路由功能
net.ipv4.conf.default.rp_filter = 1 #禁用所有IP源路由
net.ipv4.conf.default.accept_source_route = 0 #禁用icmp源路由选项
kernel.sysrq = 0 #关闭SysRq功能,SysRq代表的是Magic System Request Key
kernel.core_uses_pid = 1 #控制core文件的文件名是否添加pid作为扩展
net.ipv4.tcp_syncookies = 1 # tcp syncookie,默认关闭
kernel.msgmnb = 65536 #默认的每个消息队列的最大尺寸(byte),默认为16384
kernel.msgmax = 65536 #消息队列中单条消息的最大尺寸(byte),默认8192
kernel.shmmax = 68719476736 #共享内存中的最大内存块尺寸(byte),默认33554432(32M),这里是65536M
kernel.shmall = 4294967296 #kernel.shmall的单位是页面数,当前的x86体系上这个单位是4K,这里是2048G的共享内存总量,默认2097152
fs.file-max = 6553600 #系统级最大打开文件数,还要结合limits.conf的soft和hard限制
net.ipv4.tcp_max_tw_buckets = 5000 #1st低于此值,TCP没有内存压力,2nd进入内存压力阶段,3rdTCP拒绝分配socket(单位:内存页)
net.ipv4.tcp_sack = 1 #定义SYN重试次数
net.ipv4.tcp_window_scaling = 1 #开启窗口缩放功能
net.ipv4.tcp_rmem = 4096 87380 4194304 #接受缓冲的大小:MIN,DEFAULT,MAX
net.ipv4.tcp_wmem = 4096 16384 4194304 #socket的发送缓存区分配的MIN,DEFAULT,MAX
net.ipv4.tcp_max_syn_backlog = 8192 #syn队列,默认1024,> 1280可能工作不稳定,需要修改内核源码参数
net.core.netdev_max_backlog = 32768 #进入包的最大设备队列.默认是300,对重负载服务器而言,该值太低,可调整到2000.
net.core.somaxconn = 32768 #listen()的默认参数,挂起请求的最大数量.默认是128.对繁忙的服务器,增加该值有助于网络性能
net.core.wmem_default = 8388608 #表示套接字发送缓冲区大小的缺省值,会覆盖net.ipv4.tcp_wmem的DEFAUL值
net.core.rmem_default = 8388608 #表示套接字接收缓冲区大小的缺省值
net.core.rmem_max = 16777216 #表示套接字接收缓冲区大小的最大值
net.core.wmem_max = 16777216 #表示套接字发送缓冲区大小的最大值,会覆盖net.ipv4.tcp_wmem的MAX值
net.ipv4.tcp_timestamps = 0 #禁用时间戳,时间戳可以避免序列号的卷绕
net.ipv4.tcp_synack_retries = 2 #syn-ack握手状态重试次数,默认5,遭受syn-flood攻击时改为1或2
net.ipv4.tcp_syn_retries = 2 #外向syn握手重试次数,默认4
net.ipv4.tcp_tw_recycle = 1 #开启 TCP 连接中 TIME-WAIT sockets 的快速回收,默认为 0 ,表示关闭。
net.ipv4.tcp_tw_reuse = 1 #开启重用。允许将 TIME-WAIT sockets 重新用于新的 TCP 连接,默认为 0 ,表示关闭;
net.ipv4.tcp_mem = 94500000 915000000 927000000 #1低于此值,TCP没有内存压力,2在此值下,进入内存压力阶段,3高于此值,TCP拒绝分配socket.上述内存单位是页
net.ipv4.tcp_max_orphans = 3276800#选项用于设定系统中最多有多少个TCP套接字不被关联到任何一个用户文件句柄上,如果超过这个数字,孤立连接将立即被复位并打印出警告信息
net.ipv4.tcp_fin_timeout = 30 #修改系�y默认的 TIMEOUT 时间
net.ipv4.tcp_keepalive_time = 300 #表示当keepalive起用的时候,TCP发送keepalive消息的频度。缺省是2小时,改为5分钟。
net.ipv4.ip_local_port_range = 1024 65000 #表示用于向外连接的端口范围。缺省情况下过窄:32768到61000,改为1024到65535。
net.ipv4.ip_conntrack_max = 655360 #增大iptables状态跟踪表
net.ipv4.netfilter.ip_conntrack_tcp_timeout_established = 180 #设置默认 TCP 连接时长为180秒
9)为了安全还得开启iptables防火墙
Iptables防火墙策略如下:
cat /etc/sysconfig/iptables
*filter
:INPUT DROP [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:myinput - [0:0]
:syn-flood - [0:0]
-A INPUT -j myinput
-A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -j syn-flood
-A myinput -m state --state RELATED,ESTABLISHED -j ACCEPT
-A myinput -i lo -j ACCEPT
-A myinput -p tcp -m tcp --dport 80 -j ACCEPT
-A myinput -p tcp -m tcp --dport 443 -j ACCEPT
-A myinput -s 111.111.111.0/255.255.255.0 -j ACCEPT
……
-A myinput -i eth2 -j ACCEPT
-A syn-flood -p tcp -m limit --limit 3/sec --limit-burst 6 -j RETURN
-A syn-flood -j REJECT --reject-with icmp-port-unreachable
COMMIT
以上的意思是默认DROP所有进来的数据包,只允许80和443端口,这个是提供web服务的,另外eth2内网进来的所有数据包都通过,还加了一个防止小型DDOS攻击的自定义链sys-flood
3.总体配置文件如下
user www www;
worker_processes auto;
worker_cpu_affinity auto;
error_log logs/error.log info;
pid logs/nginx.pid;
events {
use epoll;
worker_connections 60000;
}
http {
server_names_hash_bucket_size 128;
client_header_buffer_size 32k;
large_client_header_buffers 4 32k;
sendfile on;
……
gzip on;
……
include mime.types;
default_type application/octet-stream;
log_format access
……
server {
listen 80;
server_name localhost;
……
location / {
root html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
include vhosts/*.conf;
include upstream.conf;
include proxy.conf;
}
八、结合线上功能测试
1.反向代理负载均衡
1)先了解一下反向代理负载均衡的概念
使用代理服务器可以将请求转发给内部的Web服务器,使用这种加速模式显然可以提升静态网页的访问速度。因此也可以考虑使用这种技术,让代理服务器将请求 均匀转发给多台内部Web服务器之一上,从而达到负载均衡的目的。这种代理方式与普通的代理方式有所不同,标准代理方式是客户使用代理访问多个外部Web 服务器,而这种代理方式是多个客户使用它访问内部Web服务器,因此也被称为反向代理模式。
2)Tenginx是怎样实现这个功能的
Tenginx使用这个功能需要2个模块ngx_http_proxy_module和ngx_http_upstream_module,ngx_http_proxy_module模块负责反向代理,ngx_http_upstream_module负载负载均衡,这两个模块在Tengine默认安装时就会
3)Proxy模块介绍
proxy_redirect off;
proxy_set_header Host $host;#设定header
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; #获取客户端真实IP
client_max_body_size 20m;#上传文件大小
client_body_buffer_size 256k;
proxy_connect_timeout 60;#代理连接超时
proxy_send_timeout 60;#代理发送超时
proxy_read_timeout 60;#代理接收超时
proxy_buffer_size 256k;#代理缓冲大小
proxy_buffers 4 256k;#代理缓冲
proxy_busy_buffers_size 256k;#高负荷下缓冲大小
proxy_temp_file_write_size 256k;
4)Upsteam模块介绍
主要是负载均衡算法包括:ip_hash、轮询、加权轮询、散列哈希、最短连接数附加功能有会话保持、动态域名解析、健康检查
轮询:每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除
Ip_hash:每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题,但是仅能用ip这个因子来分配后端,所以也有缺陷,在下列两种情况下不可以使用:
A.nginx不是最前端的服务器。ip_hash要求nginx一定是最前端的服务器,否则nginx得不到正确ip,就不能根据ip作hash。譬如使用 的是squid为最前端,那么nginx取ip时只能得到squid的服务器ip地址
B.nginx的后端还有其它方式的负载均衡。假如nginx后端又有其它负载均衡,将请求又通过另外的方式分流了,那么某个客户端的请求不能定位到同一 台session应用服务器上
示例如下:
upstream testcom {
Server 192.168.0.11:80 max_fails=2 fail_timeout=10s;
Server 192.168.0.22:80 max_fails=2 fail_timeout=10s;
Server 192.168.0.33:80 weight=3 max_fails=2 fail_timeout=10s;
Server 192.168.0.11:80 down;
Server 192.168.0.22:80 backup;
}
down 表示当前的server暂时不参与负载
weight 默认为1.weight越大,负载的权重就越大
max_fails :在fail_timeout时间内对后台服务器请求失败的次数
fail_timeout:max_fails次失败后,暂停的时间
backup: 其它所有的非backup机器down或者忙的时候,请求backup机器
5)大规模部署时注意事项
首先在/usr/local/nginx/conf/目录下新建proxy.conf文件,上传upstream.conf文件,新建目录vhosts,把反向代理server配置文件上传到vhosts目录下
然后nginx.conf配置文件下面添加增加保存服务器名字的hash表大小,否则太多vhosts多vhosts情况下会有nginx语法检测报错:
server_names_hash_bucket_size 128; 默认是64
2.域名重写
1)这个功能需要加载ngx_http_rewrite_module模块,默认就会安装
2)主要指令Break、If、Return、Rewrite、Set
3)Rewrite
rewrite指令
语法:rewrite regex replacement [flag];
作用域:server,location,if
该指令会按照相关的regex正则表达式和replacement替换字符串改变url,如果replacement替代字符串由http://开始,那么客户端会被重定向
flag可以是如下参数
last :在搜索到相应的URL和location之后完成rewrite指令
break: 本条规则匹配完成后,终止匹配,不再匹配后面的规则
redirect :返回302临时重定向,浏览器地址栏会显示跳转后的URL地址
permant: 返回301永久重定向,浏览器地址栏会显示跳转后的URL地址
最终完整的重定向URL包括请求scheme(http://,https://等),请求的 server_name_in_redirect和 port_in_redirec三部分 ,说白了也就是http协议 域名 端口三部分组成
4)If
默认值:无if指令
语法:if(condition)
作用域:server,location
对给定的条件condition进行判断。如果为真,大括号内的rewrite指令将被执行。
5)Set
set指令
语法:set variable value;
作用域:server,location,if
定义一个变量并赋值,值可以是文本,变量或者文本变量混合体
6)主要用到rewrite,下面是示例
if ($http_user_agent ~* "(android|iphone|UCWEB|ipod|windows[[:space:]]phone)") {
set $redirect Y;
}
if ($http_cookie ~* "userswitch") {
set $redirect N;
}
if ($redirect = Y) {
rewrite ^/(.*)$ http://m.test.com/$1 last;
}
以上就是先判断是不是移动端来访问,如果是移动端来访问,就重定向到移动站点,其中有set设置一个变变量方便下面判断
3.连接数请求数限制功能
1)要实现这两个功能需要安装ngx_http_limit_conn_module和ngx_http_limit_req_module模块,默认都会安装。
2)ngx_http_limit_conn_module 模块可以按照定义的键限定每个键值的连接数。特别的,可以设定单一 IP 来源的连接数。并不是所有的连接都会被模块计数;只有那些正在被处理的请求(这些请求的头信息已被完全读入)所在的连接才会被计数。指定一块已经设定的共享内存空间,以及每个给定键值的最大连接数。当连接数超过最大连接数时,服务器将会返回 503 (Service Temporarily Unavailable) 错误。比如,如下配置
3)ngx_http_limit_req_module,和nginx类似,不过支持多个变量,并且支持多个limit_req_zone的设置。比如:
limit_req_zone $binary_remote_addr zone=one:3m rate=1r/s;
limit_req_zone $binary_remote_addr $uri zone=two:3m rate=1r/s;
limit_req_zone $binary_remote_addr $request_uri zone=thre:3m rate=1r/s;
上面的第二个指令表示当相同的ip地址并且访问相同的uri,会导致进入limit req的限制(每秒1个请求
4)综合起来具体配置如下:
A.在http区域添加如下配置
geo $white_ip {
ranges;
default 0;
127.0.0.1-127.0.0.255 1;
}
limit_req_whitelist geo_var_name=white_ip geo_var_value=1;
以上是设置白名单,白名单里面的IP不受连接数和请求数限制
limit_conn_zone $binary_remote_addr zone=addr:10m;
limit_conn_log_level info;
limit_req_log_level info;
limit_req_zone $binary_remote_addr zone=one:3m rate=10r/s;
注意,这里使用的是$binary_remote_addr变量,而不是$remote_addr变量。$remote_addr变量的长度为7字节到15字节不等,而存储状态在32位平台中占用32字节或64字节,在64位平台中占用64字节。而$binary_remote_addr变量的长度是固定的4字节,存储状态在32位平台中占用32字节或64字节,在64位平台中占用64字节。一兆字节的共享内存空间可以保存3.2万个32位的状态,1.6万个64位的状态。如果共享内存空间被耗尽,服务器将会对后续所有的请求返回 503 (Service Temporarily Unavailable) 错误
B.在vhosts配置文件中location区域添加如下:
location / {
limit_req zone=one burst=5;#在全局请求数基础上可以多5个
limit_conn addr 3;#单个IP并发连接数为3
proxy_pass http://test_com;
access_log /data/wwwlogs/access_test_com.log access;
}
C.Webbench测试查看日志
/usr/loca/bin/webbench http://test.com/test.html -c 100 -t 20
可以选择2两个测试点测试,一个添加到白名单,一个没有,然后同时压力测试,通过Tengine的访问日志来观察,和webbench自身连接成功率进行判断:
白名单没有添加测试服务器IP前全是503错误
添加测试服务器IP后都是200正常访问
4.Nginx阻止用户代理
有些时候,需要阻止某些用户代理访问网站,比如ab,wget,curl等等,这就需要使用到$http_user_agent变量。
修改nginx.conf
if ($http_user_agent ~* (Wget|ab) ) {
return 403;
}
if ($http_user_agent ~* LWP::Simple|BBBike|wget) {
return 403;
}
重启nginx
# /usr/local/nginx-1.7.0/sbin/nginx -s reload
九、结果
1.本文主要介绍了Tengine,安装,配置,优化,并对其反向代理服务器功能这块做了详细的研究和测试,发现其能很好的满足高并发web服务器请求,另外Tengine功能上完全和nginx兼容,很适合从nginx向Tengine的转变,在nginx中所以的用法都可以在Tengine中使用,但是Tengine做了很多优化及性能的提高,更适合国内场景的使用
2.Tengine的用途比较多,比如web服务器,代理服务器,缓存服务器,反向代理服务器,邮件代理服务器,这里只是简单测试一下静态web服务器,重点放在了反向代理服务器这块,测试了反向代理服务器的域名重写和反向代理负载均衡功能,还有连接限制
3.Tengine增加了很多细节方面的调整,这个得在使用过程中慢慢体验,包括nginx对系统的监控,对源站的健康检查,多种负载算法,动态添加模块,和系统日志的结合,输入过滤机制的支持,动态脚本语言lua的支持等等
4.Tengine是的每一项功能都值得去深入了解,特别是ngx_http_rewrite_module模块,ngx_http_proxy_module模块,ngx_http_upstream_module模块三大模块支撑起了他在作为反向代理负载均衡服务器市场的重要地位,这里对这三大模块的了解算是九牛一毛,特别是各种符合实际场景的域名重写规则(需要对正则表达式有一定的了解),反向代理proxy对header头的把握和对日志格式的影响以及对后端源站的影响,不去深入研究很难弄清楚,这里upstream负载均衡模块还算简单点,但是Tengine版本还算多添加了几个算法例如散列和会话保持功能都没有来得及去研究,由于时间和篇幅有限,这里只了解这些。
本文出自 “jerrymin” 博客,谢绝转载!