原文出处:http://my.oschina.net/liuhuan0927/blog/604663
一.Tengine是什么
简介
Tengine是由淘宝网发起的Web服务器项目。它在Nginx的基础上,针对大访问量网站的需求,添加了很多高级功能和特性。Tengine的性能和稳定性已经在大型的网站如淘宝网,天猫商城等得到了很好的检验。它的最终目标是打造一个高效、稳定、安全、易用的Web平台。
从2011年12月开始,Tengine成为一个开源项目,Tengine团队在积极地开发和维护着它。Tengine团队的核心成员来自于淘宝、搜狗等互联网企业。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亲缘性;
-
监控系统的负载和资源占用从而对系统进行保护;
-
显示对运维人员更友好的出错信息,便于定位出错机器;
-
更强大的防攻击(访问速度限制)模块;
-
更方便的命令行参数,如列出编译的模块列表、支持的指令等;
-
可以根据访问文件类型设置过期时间;
-
……
二. 安装 Tengine
2.1 编译环境准备
1 2 3 4 | yum -y install gcc gcc -c++ autoconf automake wget yum -y install zlib zlib-devel openssl openssl-devel pcre-devel pcre gd-devel groupadd nginx useradd -g nginx -s /sbin/nologin -M nginx |
zlib:nginx提供gzip模块,需要zlib库支持
openssl:nginx提供ssl功能
pcre:支持地址重写rewrite功能
concat:支持js,CSS的样式文件合并,减少nginx服务器请求链接数
安装jemalloc,优化nginx内存管理
1 2 3 4 5 6 7 | wget http: //www .canonware.com /download/jemalloc/jemalloc-4 .0.4. tar .bz2 tar xjf jemalloc-4.0.4. tar .bz2 cd jemalloc-4.0.4 . /configure make && make install echo '/usr/local/lib' > /etc/ld .so.conf.d /local .conf ldconfig |
2.2编译安装
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | cd /opt/ wget http: //tengine .taobao.org /download/tengine-2 .1.2. tar .gz tar zxvf tengine-2.1.2. tar .gz cd tengine-2.1.2 . /configure \ --user=nginx \ --group=nginx \ --with-jemalloc \ --prefix= /usr/local/nginx \ --with-http_ssl_module \ --with-http_gzip_static_module \ --with-http_stub_status_module \ --with-http_concat_module \ --with-pcre \ --with-http_sysguard_module \ --with-http_realip_module \ --with-http_image_filter_module |
1 | make |
1 | make install |
2.3启动Tengine
1 | /usr/local/nginx/sbin/nginx |
2.4设置Tengine开机启动
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 | cat >> /etc/init .d /nginx < #!/bin/bash # nginx Startup script for the Nginx HTTP Server # it is v.0.0.2 version. # chkconfig: - 85 15 # description: Nginx is a high-performance web and proxy server. # It has a lot of features, but it&#39;s not for everyone. # processname: nginx # pidfile: /var/run/nginx.pid # config: /usr/local/nginx/conf/nginx.conf nginxd&#61; /usr/local/nginx/sbin/nginx nginx_config&#61; /usr/local/nginx/conf/nginx .conf nginx_pid&#61; /usr/local/nginx/logs/nginx .pid RETVAL&#61;0 prog&#61; "nginx" # Source function library. . /etc/rc .d /init .d /functions # Source networking configuration. . /etc/sysconfig/network # Check that networking is up. [ \${NETWORKING} &#61; "no" ] && exit 0 [ -x \$nginxd ] || exit 0 # Start nginx daemons functions. start() { if [ -e \$nginx_pid ]; then echo "nginx already running...." exit 1 fi echo -n $ "Starting \$prog: " daemon \$nginxd -c \${nginx_config} RETVAL&#61;$? echo [ \$RETVAL &#61; 0 ] && touch /var/lock/subsys/nginx return \$RETVAL } # Stop nginx daemons functions. stop() { echo -n $ "Stopping \$prog: " killproc \$nginxd RETVAL&#61;\$? echo [ \$RETVAL &#61; 0 ] && rm -f /var/lock/subsys/nginx /usr/local/nginx/logs/nginx .pid } reload() { echo -n $ "Reloading \$prog: " #kill -HUP &#96;cat \${nginx_pid}&#96; killproc \$nginxd -HUP RETVAL&#61;\$? echo } # See how we were called. case "\$1" in start) start ;; stop) stop ;; reload) reload ;; restart) stop start ;; status) status \$prog RETVAL&#61;\$? ;; *) echo $ "Usage: \$prog {start|stop|restart|reload|status|help}" exit 1 esac exit \$RETVAL EOF |
Ubuntu版本
#! /bin/sh
### BEGIN INIT INFO
# Provides: nginx
# Required-Start: $remote_fs $syslog
# Required-Stop: $remote_fs $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: nginx init.d dash script for Ubuntu or other *nix.
# Description: nginx init.d dash script for Ubuntu or other *nix.
### END INIT INFO
#------------------------------------------------------------------------------
# nginx - this Debian Almquist shell (dash) script, starts and stops the nginx
# daemon for Ubuntu and other *nix releases.
#
# description: Nginx is an HTTP(S) server, HTTP(S) reverse \
# proxy and IMAP/POP3 proxy server. This \
# script will manage the initiation of the \
# server and it&#39;s process state.
#
# processname: nginx
# config: /usr/local/nginx/conf/nginx.conf
# pidfile: /usr/local/nginx/logs/nginx.pid
# Provides: nginx
#
# Author: Jason Giedymin
#
#
# Version: 3.5.1 11-NOV-2013 jason.giedymin AT gmail.com
# Notes: nginx init.d dash script for Ubuntu.
# Tested with: Ubuntu 13.10, nginx-1.4.3
#
# This script&#39;s project home is:
# http://github.com/JasonGiedymin/nginx-init-ubuntu
#
#------------------------------------------------------------------------------
# MIT X11 License
#------------------------------------------------------------------------------
#
# Copyright (c) 2008-2013 Jason Giedymin, http://jasongiedymin.com
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
# "Software"), to deal in the Software without restriction, including
# without limitation the rights to use, copy, modify, merge, publish,
# distribute, sublicense, and/or sell copies of the Software, and to
# permit persons to whom the Software is furnished to do so, subject to
# the following conditions:
#
# The above copyright notice and this permission notice shall be
# included in all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#------------------------------------------------------------------------------#------------------------------------------------------------------------------
# Functions
#------------------------------------------------------------------------------
LSB_FUNC&#61;/lib/lsb/init-functions# Test that init functions exists
test -r $LSB_FUNC || {echo "$0: Cannot find $LSB_FUNC! Script exiting." 1>&2exit 5
}. $LSB_FUNC#------------------------------------------------------------------------------
# Consts
#------------------------------------------------------------------------------
PATH&#61;/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin #更改此处
DAEMON&#61;/usr/local/nginx/sbin/nginx #更改此处PS&#61;"nginx"
PIDNAME&#61;"nginx" #lets you do $PS-slave
PIDFILE&#61;$PIDNAME.pid #pid file
PIDSPATH&#61;/usr/local/nginx/logs #default pid location, you should change it更改DESCRIPTION&#61;"Nginx Server..."RUNAS&#61;root #user to run asSCRIPT_OK&#61;0 #ala error codes
SCRIPT_ERROR&#61;1 #ala error codes
TRUE&#61;1 #boolean
FALSE&#61;0 #booleanlockfile&#61;/var/lock/subsys/nginx
NGINX_CONF_FILE&#61;"/usr/local/nginx/conf/nginx.conf" #如有需要&#xff0c;更改此处#------------------------------------------------------------------------------
# Simple Tests
#------------------------------------------------------------------------------# Test if nginx is a file and executable
test -x $DAEMON || {echo "$0: You don&#39;t have permissions to execute nginx." 1>&2exit 4
}# Include nginx defaults if available
if [ -f /etc/default/nginx ]; then. /etc/default/nginx
fi#set exit condition
#set -e#------------------------------------------------------------------------------
# Functions
#------------------------------------------------------------------------------setFilePerms(){if [ -f $PIDSPATH/$PIDFILE ]; thenchmod 400 $PIDSPATH/$PIDFILEfi
}configtest() {$DAEMON -t -c $NGINX_CONF_FILE
}getPSCount() {return &#96;pgrep -f $PS | wc -l&#96;
}isRunning() {if [ $1 ]; thenpidof_daemon $1PID&#61;$?if [ $PID -gt 0 ]; thenreturn 1elsereturn 0fielsepidof_daemonPID&#61;$?if [ $PID -gt 0 ]; thenreturn 1elsereturn 0fifi
}#courtesy of php-fpm
wait_for_pid () {try&#61;0while test $try -lt 35 ; docase "$1" in&#39;created&#39;)if [ -f "$2" ]; thentry&#61;&#39;&#39;breakfi;;&#39;removed&#39;)if [ ! -f "$2" ]; thentry&#61;&#39;&#39;breakfi;;esactry&#61;&#96;expr $try &#43; 1&#96;sleep 1done
}status(){isRunningisAlive&#61;$?if [ "${isAlive}" -eq $TRUE ]; thenlog_warning_msg "$DESCRIPTION found running with processes: &#96;pidof $PS&#96;"rc&#61;0elselog_warning_msg "$DESCRIPTION is NOT running."rc&#61;3fireturn
}removePIDFile(){if [ $1 ]; thenif [ -f $1 ]; thenrm -f $1fielse#Do default removalif [ -f $PIDSPATH/$PIDFILE ]; thenrm -f $PIDSPATH/$PIDFILEfifi
}start() {log_daemon_msg "Starting $DESCRIPTION"isRunningisAlive&#61;$?if [ "${isAlive}" -eq $TRUE ]; thenlog_end_msg $SCRIPT_ERRORrc&#61;0elsestart-stop-daemon --start --quiet --chuid \$RUNAS --pidfile $PIDSPATH/$PIDFILE --exec $DAEMON \-- -c $NGINX_CONF_FILEsetFilePermslog_end_msg $SCRIPT_OKrc&#61;0fireturn
}stop() {log_daemon_msg "Stopping $DESCRIPTION"isRunningisAlive&#61;$?if [ "${isAlive}" -eq $TRUE ]; thenstart-stop-daemon --stop --quiet --pidfile $PIDSPATH/$PIDFILEwait_for_pid &#39;removed&#39; $PIDSPATH/$PIDFILEif [ -n "$try" ]; thenlog_end_msg $SCRIPT_ERRORrc&#61;0 # lsb states 1, but under status it is 2 (which is more prescriptive). Deferring to standard.elseremovePIDFilelog_end_msg $SCRIPT_OKrc&#61;0fielselog_end_msg $SCRIPT_ERRORrc&#61;7fireturn
}reload() {configtest || return $?log_daemon_msg "Reloading (via HUP) $DESCRIPTION"isRunningif [ $? -eq $TRUE ]; thenkill -HUP &#96;cat $PIDSPATH/$PIDFILE&#96;log_end_msg $SCRIPT_OKrc&#61;0elselog_end_msg $SCRIPT_ERRORrc&#61;7fireturn
}quietupgrade() {log_daemon_msg "Peforming Quiet Upgrade $DESCRIPTION"isRunningisAlive&#61;$?if [ "${isAlive}" -eq $TRUE ]; thenkill -USR2 &#96;cat $PIDSPATH/$PIDFILE&#96;kill -WINCH &#96;cat $PIDSPATH/$PIDFILE.oldbin&#96;isRunningisAlive&#61;$?if [ "${isAlive}" -eq $TRUE ]; thenkill -QUIT &#96;cat $PIDSPATH/$PIDFILE.oldbin&#96;wait_for_pid &#39;removed&#39; $PIDSPATH/$PIDFILE.oldbinremovePIDFile $PIDSPATH/$PIDFILE.oldbinlog_end_msg $SCRIPT_OKrc&#61;0elselog_end_msg $SCRIPT_ERRORlog_daemon_msg "ERROR! Reverting back to original $DESCRIPTION"kill -HUP &#96;cat $PIDSPATH/$PIDFILE&#96;kill -TERM &#96;cat $PIDSPATH/$PIDFILE.oldbin&#96;kill -QUIT &#96;cat $PIDSPATH/$PIDFILE.oldbin&#96;wait_for_pid &#39;removed&#39; $PIDSPATH/$PIDFILE.oldbinremovePIDFile $PIDSPATH/$PIDFILE.oldbinlog_end_msg $SCRIPT_OKrc&#61;0fielselog_end_msg $SCRIPT_ERRORrc&#61;7fireturn
}terminate() {log_daemon_msg "Force terminating (via KILL) $DESCRIPTION"PIDS&#61;&#96;pidof $PS&#96; || true[ -e $PIDSPATH/$PIDFILE ] && PIDS2&#61;&#96;cat $PIDSPATH/$PIDFILE&#96;for i in $PIDS; doif [ "$i" &#61; "$PIDS2" ]; thenkill $iwait_for_pid &#39;removed&#39; $PIDSPATH/$PIDFILEremovePIDFilefidonelog_end_msg $SCRIPT_OKrc&#61;0
}destroy() {log_daemon_msg "Force terminating and may include self (via KILLALL) $DESCRIPTION"killall $PS -q >> /dev/null 2>&1log_end_msg $SCRIPT_OKrc&#61;0
}pidof_daemon() {PIDS&#61;&#96;pidof $PS&#96; || true[ -e $PIDSPATH/$PIDFILE ] && PIDS2&#61;&#96;cat $PIDSPATH/$PIDFILE&#96;for i in $PIDS; doif [ "$i" &#61; "$PIDS2" ]; thenreturn 1fidonereturn 0
}action&#61;"$1"
case "$1" instart)start;;stop)stop;;restart|force-reload)stop# if [ $rc -ne 0 ]; then# script_exit# fisleep 1start;;reload)$1;;status)status;;configtest)$1;;quietupgrade)$1;;terminate)$1;;destroy)$1;;*)FULLPATH&#61;/etc/init.d/$PSecho "Usage: $FULLPATH {start|stop|restart|force-reload|status|configtest|quietupgrade|terminate|destroy}"echo " The &#39;destroy&#39; command should only be used as a last resort." exit 3;;
esacexit $rc
授予执行权限
1 2 | chmod &#43;x /etc/init .d /nginx chkconfig nginx --level 345 on |
添加开机启动&#xff08; Ubuntu版本&#xff09;,service nginx start后
sudo update-rc.d -f nginx defaults
三.测试
3.1 用浏览器访问主机80端口
出现如图所示界面即表示Tengine安装完成&#xff01;
反向代理配置
#user nobody;
worker_processes 2;#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;#pid logs/nginx.pid;events {worker_connections 1024;
}# load modules compiled as Dynamic Shared Object (DSO)
#
#dso {
# load ngx_http_fastcgi_module.so;
# load ngx_http_rewrite_module.so;
#}http {include mime.types;default_type application/octet-stream;#log_format main &#39;$remote_addr - $remote_user [$time_local] "$request" &#39;# &#39;$status $body_bytes_sent "$http_referer" &#39;# &#39;"$http_user_agent" "$http_x_forwarded_for"&#39;;#access_log logs/access.log main;sendfile on;#tcp_nopush on;#keepalive_timeout 0;keepalive_timeout 65;fastcgi_send_timeout 300;fastcgi_read_timeout 300;#gzip on;server {listen 80;server_name localhost;#charset koi8-r;#access_log logs/host.access.log main;access_log /data/logs/host.access.log;error_log /data/logs/host.error.log;# location / {# root html;# index index.html index.htm;# }location / {root /data/www/;index index.html index.htm;concat on;concat_max_files 20;}proxy_ignore_client_abort on;# demolocation ^~ /demo{proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header Host $http_host;proxy_set_header X-NginX-Proxy true;rewrite /demo/(.&#43;)$ /$1 break;proxy_pass http://localhost:8080;
access_log /data/logs/demo.access.log;}#error_page 404 /404.html;# redirect server error pages to the static page /50x.html#error_page 500 502 503 504 /50x.html;location &#61; /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;# include fastcgi_params;#}# deny access to .htaccess files, if Apache&#39;s document root# concurs with nginx&#39;s one
##location ~ /\.ht {# deny all;#}}# another virtual host using mix of IP-, name-, and port-based configuration##server {# listen 8000;# listen somename:8080;# server_name somename alias another.alias;# location / {# root html;# index index.html index.htm;# }#}# HTTPS server##server {# listen 443 ssl;# server_name localhost;# ssl_certificate cert.pem;# ssl_certificate_key cert.key;# ssl_session_cache shared:SSL:1m;# ssl_session_timeout 5m;# ssl_ciphers HIGH:!aNULL:!MD5;# ssl_prefer_server_ciphers on;# location / {# root html;# index index.html index.htm;# }#}}