Tengine和Nginx
Tengine简介
从2011年12月开始:Tengine是由淘宝网发起的Web服务器项目。它在Nginx的基础上,针对大访问量网站的需求,添加了很多高级功能和特性。Tengine的性能和稳定性已经在大型的网站如淘宝网,天猫商城等得到了很好的检验。它的最终目标是打造一个高效、稳定、安全、易用的Web平台。(来自于http://tengine.taobao.org/)
Nginx简介
Nginx是一个开源项目,是一个高性能的HTTP server 和 reverse proxy,也可以作为IMAP/POP的反向代理,通过简单的配置,就可以实现高性能,且占用系统资源较小。Nginx设计之初是为了解决C10K问题,其非常轻量级,仅支持event模型。
特性
Nginx的特性
模块化设计,较好的扩展性
高可靠性:master/worker
支持热部署:不停机更新配置文件、更换日志文件、更新服务器版本
低内存消耗:10000个keep-alive连接模式下的非活动连接仅消耗2.5M内存
event-driven,aio,mmap
DOS机制在 2016-04-26 nginx-1.10.0 版本中才支持
Tengine特性
继承Nginx-1.6.2的所有特性,兼容Nginx的配置;
动态模块加载(DSO)支持。加入一个模块不再需要重新编译整个Tengine;
支持SO_REUSEPORT选项,建连性能提升为官方nginx的三倍;
同时支持HTTP v2协议和SPDY v3协议,可同时使用两种协议;
流式上传到HTTP后端服务器或FastCGI服务器,大量减少机器的I/O压力;
更加强大的负载均衡能力,包括一致性hash模块、会话保持模块,还可以对后端的服务器进行主动健康检查,根据服务器状态自动上线下线,以及动态解析upstream中出现的域名;
输入过滤器机制支持。通过使用这种机制Web应用防火墙的编写更为方便;
支持设置proxy、memcached、fastcgi、scgi、uwsgi在后端失败时的重试次数
动态脚本语言Lua支持。扩展功能非常高效简单;
支持管道(pipe)和syslog(本地和远端)形式的日志以及日志抽样;
支持按指定关键字(域名,url等)收集Tengine运行状态;
组合多个CSS、JavaScript文件的访问请求变成一个请求;
自动去除空白字符和注释从而减小页面的体积
自动根据CPU数目设置进程个数和绑定CPU亲缘性;
监控系统的负载和资源占用从而对系统进行保护;
显示对运维人员更友好的出错信息,便于定位出错机器;
更强大的防***(访问速度限制)模块;
更方便的命令行参数,如列出编译的模块列表、支持的指令等;
可以根据访问文件类型设置过期时间;
(来自于http://tengine.taobao.org/)
Tengine安装
下载地址:http://tengine.taobao.org/
# yum -y install pcre-devel openssl-devel zlib-devel
# ./configure \
–prefix=/usr/local
–sbin-path=/usr/sbin/nginx
–conf-path=/etc/nginx/nginx.conf
–error-log-path=/var/log/nginx/error.log
–http-log-path=/var/log/nginx/access.log
–pid-path=/var/run/nginx.pid
–lock-path=/var/run/nginx.lock
–http-client-body-temp-path=/var/cache/nginx/client_temp
–http-proxy-temp-path=/var/cache/nginx/proxy_temp
–http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp
–http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp
–http-scgi-temp-path=/var/cache/nginx/scgi_temp
–user=nginx
–group=nginx
–with-http_ssl_module
–with-http_realip_module
–with-http_addition_module
–with-http_sub_module
–with-http_dav_module
–with-http_flv_module
–with-http_mp4_module
–with-http_gunzip_module
–with-http_gzip_static_module
–with-http_random_index_module
–with-http_secure_link_module
–with-http_stub_status_module
–with-http_auth_request_module
–with-threads
–with-stream
–with-stream_ssl_module
–with-http_slice_module
–with-file-aio
–with-http_v2_module
# make && make install
复制黏贴版:
./configure –prefix=/usr/local/nginx –error-log-path=/var/log/nginx/error.log –http-log-path=/var/log/nginx/access.log –pid-path=/var/run/nginx/nginx.pid –lock-path=/var/run/nginx/nginx.lock –http-client-body-temp-path=/var/cache/nginx/client_temp –http-proxy-temp-path=/var/cache/nginx/proxy_temp –http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp –http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp –http-scgi-temp-path=/var/cache/nginx/scgi_temp –user=nginx –with-http_ssl_module –with-http_gzip_static_module –with-http_auth_request_module –with-http_auth_request_module –with-http_stub_status_module && make && make install
启动前配置:
echo “export PATH=$PATH:/usr/local/nginx/sbin” >/etc/profile.d/nginx.sh useradd -r nginx -s /sbin/nologin mkdir /var/cache/nginx/client_temp -pv
一、核心模块
1、Main端配置
约定:
大部分模块使用方式,tengine与nginx相同,nginx模块使用可以参照nginx的官方站点,tengine。
Syntax: 表示功能或者选项,其后面有语法
Default: 默认值
Context: 可出现的上下文
参考文献:http://tengine.taobao.org/documentation.html
参考文献:http://nginx.org/en/docs/
A、必备常用配置
1、user 指定用于运行worker进程的用户和组
Syntax: user user [group];
Default: user nobody nobody;
Context: main
2、pid 指定nginx进程的pid文件路径
yntax: pid file;
Default:
pid nginx.pid;
Context: main
3、worker_rlimit_nofile number 单个worker进程所能够打开的最大文件数
Syntax: worker_rlimit_nofile number;
Default: —
Context: main
B、性能优化相关配置
1、 worker_processes number | auto worker的进程数;通常应该为CPU的核心数减1
Syntax: worker_processes number | auto;
Default:
worker_processes 1;
Context: main
2、worker_cpu_affinity cpumask … 将work进程绑定到cpu上
Syntax: worker_cpu_affinity cpumask …;
worker_cpu_affinity auto [cpumask];
Default: —
Context: main
For example:
2核cpu,开启八个进程 worker_processes 8; worker_cpu_affinity 01 10 01 10 01 10 01 10; 8核cpu,开启8个进程 worker_processes 8; worker_cpu_affinity 10000000 01000000 00100000 00010000 00001000 00000100 00000010 00000001; 8核cpu,开启2个进程 worker_processes 2; worker_cpu_affinity 10101010 01010101;
3、worker_priority nice 定义work进程的优先级,数字越小优先级越高
[-20,19]
对应的优先级是:100-139
Syntax: worker_priority number;
Default:
worker_priority 0;
Context: main
C、调试定位问题
1、daemon on | off 是否以守护进程方式启动nginx进程
Syntax: daemon on | off;
Default:
daemon on;
Context: main
2、master_process on | off 是否以master/worker模型启动nignx进程
Syntax: master_process on | off;
Default:
master_process on;
Context: main
3、error_log file | stderr | syslog:server=address[,parameter=value] | memory:size [debug | info | notice | warn | error | crit | alert | emerg] 错误日志记录方式,及其日志级别
Syntax: error_log file [level];
Default:
error_log logs/error.log error;
Context: main, http, mail, stream, server, location
方式:
file /PATH/TO/SOME_LOG_FILE;
stderr:发送到错误输出;
syslog:server=address[,parameter=value]:发送给syslog服务器;
memory:size:缓冲区大小
For example:
error_log logs/error.log notice
2、events段配置
1、worker_connections number 每个worker进程所能够并发打开的最大连接数
Syntax: worker_connections number;
Default:
worker_connections 512;
Context: events
最大并发数=最大连接数*worker_processes 4的数字
2、use method 指明并发连接请求处理时使用的方法
Syntax: use method;
Default: —
Context: events
3、accept_mutex on | off 启用时,表示用于让多个worker轮流地、序列化地响应新请求
Syntax: accept_mutex on | off;
Default:
accept_mutex on;
Context: events
3、server段常用配置
1、listen address[:port] [default_server] [ssl] [backlog=number] [rcvbuf=size] [sndbuf=size]
listen port [default_server] [ssl];
listen unix:path [default_server] [ssl]
default_server:默认虚拟主机
ssl:限制只能通过ssl连接提供服务
backlog:后缓队列的长度
rcvbuf:接收缓冲大小
sndbuf:发送缓冲区大小
2、server_name name … 主机名
Syntax: server_name name …;
Default:
server_name “”;
Context: server
指明当前server的主机名;后可跟一个或空白字符分隔的多个主机;
支持使用*任意长度的任意字符;
支持~起始的正则表达式模式字符串;
应用策略:
(1) 首先精确匹配;
(2) 左则*通配符匹配;
(3) 右侧*通配符匹配;
(4) 正则表达式模式匹配;
For example:
server_name www.example.com;
server_name *.example.com;
server_name www.example.*;
server_name ~^..example..$;
mail.example.com, www.example.com
3、tcp_nodelay on|off 对keepalived模式下的连接是否启用TCP_NODELAY选项
Syntax: tcp_nodelay on | off;
Default: tcp_nodelay on;
Context: http, server, location
4、sendfile on | off 是否启用sendfile功能
Syntax: sendfile on | off;
Default:
sendfile off;
Context: http, server, location, if in location
4、路径相关配置
1、root path 设置web资源路径映射
Syntax: root path;
Default:
root html;
Context: http, server, location, if in location
For example:
location /i/ { root /data/w3; }
2、location [ = | ~ | ~* | ^~ ] uri { … }
Syntax: location [ = | ~ | ~* | ^~ ] uri { … }
location @name { … }
Default: —
Context: server, location
根据用户请求的URI来匹配定义的location,匹配到时,此请求将被相应的location块中的指令所处理;
=:URI精确匹配;
~:做正则表达式模式匹配,区分字符大小写;
~*:做正则表达式模式匹配,不区分字符大小写;
^~:对URI的左半部分做匹配检查,不区分字符大小写;
匹配优先级:=、^~、~/~*、不带符号;
For example:
location = / { [ configuration A ]; }
location / { [ configuration B ]; }
location /documents/ { [ configuration C ]; }
location ^~ /p_w_picpaths/ { [ configuration D ]; }
location ~* .(gif|jpg|jpeg)$ { [ configuration E ]; }
2、alias path 定义路径别名
Syntax: alias path;
Default: —
Context: location
For example:
location /i/ { alias /data/w3/p_w_picpaths/; }
3、error_page code … [=[response]] uri
根据用户其你去的资源的http响应的状态码实现错误页面重定向
Syntax: error_page code … [=[response]] uri;
Default: —
Context: http, server, location, if in location
Tengine配置选项众多,此处就介绍到此,如果有兴趣可以参考nginx官方文档或者tengine的官方文档,此处不在过多介绍,下面介绍几个常见使用的模块,ssl、rewrite、gzip、fastcgi、防盗链、stasus等功能
官方文档:
http://tengine.taobao.org/documentation.html
http://nginx.org/en/docs/
二、Tengine常用模块
1、Module ngx_http_rewrite_module
ngx_http_rewrite_module 模块可以通过使用正则表达式,重定向请求url。
A、rewrite regex replacement [flag] 重定向请求
把用户请求的URI基于regex做检查,匹配到时将替换为replacement指定的字符串
在同一个location中存在的多个rewrite规则会自上而下逐个被检查(循环),可以使用flag控制此循环功能
如果replacement是以http://或https://开头,则替换结果会直接以重定向方式返回给客户端
[flag]:
last:重写完成后停止对当前uri在当前location中的后续其它重写操作,改为对新uri的新一轮处理;
break:重写完成后停止对当前uri在当前location中的后续其它重写操作;
redirect:重写完成后以临时重定向方式直接返回重写后生成的新URL给客户端,由客户对新URL进行请求;(302)
permanent:重写完成后以永久重定向方式直接返回重写后生成的新URL给客户端,由客户对新URL进行请求;(301)
B、rewrite_log on | off 是否启用重写日志
启用时,日志信息被发往错误日志
Syntax:rewrite_log on | off;
Default:rewrite_log off;
Context:http, server, location, if
C、if (condition) { ... } 条件判断机制
在条件满足时,执行配置块中的配置
condition:
比较表达式:
==, !=
~:模式匹配,区分字母大小写;
~*:模式匹配,不区分字符大小写;
!~:模式不匹配,区分字母大小写;
!~*:模式不匹配,不区分字母大小写;
文件及目录存在性判断:
-f, !-f:文件
-d, !-d:目录
-e, !-e:存在
-x, !-x:执行
For example:
if ($http_user_agent ~ MSIE) { rewrite ^(.*)$ /msie/$1 break; } if ($http_cookie ~* "id=([^;]+)(?:;|$)") { set $id $1; } if ($request_method = POST) { return 405; } if ($slow) { limit_rate 10k; } if ($invalid_referer) { return 403; }
D、return code [text
];停止处理并将指定的代码返回给客户端
Syntax:return code [text];
return code URL;
return URL;
Default:—
Context:server, location, if
E、set $variable value用户自定义变量
Syntax:set $variable value;
Default:—
Context:server, location, if
ngx_http_rewrite_module 示例:
# 将所有访问172.18.4.70下p_w_picpath都重定向到tupian目录下 # vim /usr/local/nginx/conf/nginx.conf location /p_w_picpath { rewrite ^/p_w_picpath/(.*) /tupian/$1 last; rewrite ^/p_w_picpath/(.*) /tupian/$1 last; return 403; index index.html; }
测试效果:
# 添加测试页面 # cat /usr/local/nginx/html/p_w_picpath/index.htmlp_w_picpath
# cat /usr/local/nginx/html/tupian/index.htmltupian
if (condition) { ... } 示例
if ($request_method = GET) { return 405; }
2、Module ngx_http_gzip_module
过滤器,对指定类型的资源压缩传输以节约带宽
gzip on | off;
启用或禁用gzip压缩响应报文;
Syntax:gzip on | off;
Default:gzip off;
Context:http, server, location, if in location
gzip_comp_level level;
指定压缩比,1-9,默认为1;
Syntax:gzip_comp_level level;
Default: gzip_comp_level 1;
Context:http, server, location
gzip_disable regex ...;
regex是匹配客户端浏览器类型的模式,表示对所有匹配到的浏览器不执行压缩响应;
Syntax:gzip_disable regex ...;
Default:—
Context:http, server, location
This directive appeared in version 0.6.23.
gzip_min_length length;
触发启用压缩功能的响应报文的最小长度;
Syntax:gzip_min_length length;
Default:gzip_min_length 20;
Context:http, server, location
gzip_http_version 1.0 | 1.1;
设定启用压缩响应功能时,协议的最小版本;
Syntax:gzip_http_version 1.0 | 1.1;
Default:gzip_http_version 1.1;
Context:http, server, location
gzip_types mime-type ...;
指定仅执行压缩的资源内容类型;默认为text/html;
Syntax:gzip_types mime-type ...;
Default:gzip_types text/html;
Context:http, server, location
gzip_proxied off | expired | no-cache | no-store | private | no_last_modified | no_etag | auth | any ...;
对代理的请求基于何种属性判断其是否应该启用压缩功能;
Syntax:gzip_proxied off | expired | no-cache | no-store | private | no_last_modified | no_etag | auth | any ...;
Default:gzip_proxied off;
Context:http, server, location
Example Configuration:
示例:
gzip on;
gzip_http_version 1.0;
gzip_comp_level 6;
gzip_disable msie6;
gzip_min_length 2;
gzip_types text/plain text/css text/xml application/x-javascript application/xml application/json application/java-script;
测试示例:
未配置之前:查看Response Headers报文中是否有gzip选项
配置之后:查看Response Headers报文中是否有gzip选项
3、Module ngx_http_fastcgi_module
fastcgi_pass address address是fpm服务器监听的地址和端口;
示例: fastcgi 127.0.0.1:9000;
fastcgi_index name fastcgi应用的主页名称
fastcgi_param parameter value [if_not_empty] 传递给fpm服务器的参数及其值
fastcgi_cache_path path [levels=levels] [use_temp_path=on|off] keys_zone=name:size [inactive=time] [max_size=size] [loader_files=number] [loader_sleep=time] [loader_threshold=time] [purger=on|off] [purger_files=number] [purger_sleep=time] [purger_threshold=time];
path:文件系统路径,用于存储缓存的文件数据;
max_size=size:定义此路径下的多大空间用于存储缓存数据;
levels=#[:#[:#]]:缓存目录层级定义;
levels=1:2
keys_zone=name:size 内存中用于缓存k/v映射关系的空间名称及大小;
inactive=time
注意:只能定义在http上下文
For example:
fastcgi_cache_path /var/cache/nginx/client_temp levels=1:2 keys_zone=one:10m;
存储格式:
/var/cache/nginx/client_temp/c/29/b7f54b2df7773722d382f4809d65029c
fastcgi_cache zone | off 是否启用cache,如果启用,数据缓存于哪个cache中
fastcgi_cache_key string 定义要使用的缓存键
例如: fastcgi_cache_key $request_uri;
fastcgi_cache_methods GET | HEAD | POST ... 缓存哪些类型的请求的相关数据
fastcgi_cache_valid [code ...] time 对不同响应码设定其可缓存时长
注意:调用缓存时,至少应该 指定三个参数
fastcgi_cache
fastcgi_cache_key
fastcgi_cache_valid
测试示例:
# vim /usr/local/nginx/conf/nginx.conf fastcgi_cache_path /var/data/nginx/cache levels=1:2 keys_zone=mycache:10m inactive=4m; # 上面选项必须在http上下文 location \.php$ { fastcgi_pass 127.0.0.1:9000; fastcgi_cache mycache; fastcgi_cache_key $request_uri; fastcgi_cache_valid any 10m; }
启用前查看:/var/data/nginx/cache目录
启动后查看:/var/data/nginx/cache目录
4、Module ngx_http_ssl_module
ssl on | off 是否启用当前虚拟主机的ssl功能
Syntax:ssl on | off;
Default:ssl off;
Context:http, server
ssl_certificate file 当前虚拟主机使用的PEM格式的证书文件
Syntax: ssl_certificate file;
Default:—
Context:http, server
ssl_certificate_key file 当前虚拟机使用的证书文件中的公钥配对儿的私钥文件路径 Syntax:ssl_certificate_key file;
Default:—
Context:http, server
ssl_protocols [SSLv2] [SSLv3] [TLSv1] [TLSv1.1] [TLSv1.2] SSL协议的版本
Syntax:ssl_protocols [SSLv2] [SSLv3] [TLSv1] [TLSv1.1] [TLSv1.2];
Default:ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
Context:http, server
ssl_session_cache off | none | [builtin[:size]] [shared:name:size] 指明ssl会话的缓存机制
Syntax:ssl_session_cache off | none | [builtin[:size]] [shared:name:size];
Default:ssl_session_cache none;
Context:http, server
builtin:使用openssl内建的缓存机制,此为各worker独有;
shared:由各worker共享的缓存;
name:缓存空间的名称;
size:字节为单位的缓存空间的大小;每1MB内存空间可缓存4000个会话
ssl_session_timeout time ssl会话超时时长,指ssl session cache中缓存条目有效时长
Syntax:ssl_session_timeout time;
Default:ssl_session_timeout 5m;
Context:http, server
示例:
配置文件:证书使用方式请查看我的另外一篇博客 http://xinzong.blog.51cto.com/10018904/1763615
# vim /etc/nginx/nginx.conf server { listen 443 ssl; server_name www.ops.com; ssl_certificate /usr/local/nginx/ssl/nginx.crt; ssl_certificate_key /usr/local/nginx/ssl/nginx.key; ssl_session_cache shared:SSL:1m; ssl_session_timeout 5m; location / { root html; index index.html index.htm; } } # nginx -s reload
访问查看:
4、Module ngx_http_referer_module
valid_referers none | blocked | server_names | string ...
referers:定义合法的数据,此模块用来定义哪些内容是合法的
Syntax:valid_referers none | blocked | server_names | string ...;
Default:—
Context:server, location
none表示请求报文首部没有referer首部
blocked表示请求报文的referer首部没有值
server_names表示其值是主机名
示例: 表示根据上面的定义,如果不合法就返回403
valid_referers none blocked server_names *.zx.com zx.* www.zx.org/galleries/ ~\.google\.; if ($invalid_referer) { return 403; }
5、Module ngx_http_stub_status_module
status_module:用于输出nginx的基本状态信息
示例:
# vim /etc/nginx/nginx.conf location /status { stub_status on; }
访问并测试:
各参数的意义:
Active connection:活跃连接数
accepts:已经接受的客户端请求的总数量
handled:已经处理的数量
request:客户端发来的总请求数量
Reading:处于读取客户端请求报文首部的连接数
Writing:处于向客户端发送响应报文过程的连接数
Waiting:处于等待客户端发出请求的空闲请求连接数
对于Tengine就写到这里了,还有很多需要补充,后期会继续更新此博客
作者:Ace
QQ1257465991
Linux运维攻城狮一只
Q/A:如有问题请慷慨提出