• Tengine/Nginx 安装


    原文出处:http://my.oschina.net/liuhuan0927/blog/604663

    一.Tengine是什么

    简介

    Tengine是由淘宝网发起的Web服务器项目。它在Nginx的基础上,针对大访问量网站的需求,添加了很多高级功能和特性。Tengine的性能和稳定性已经在大型的网站如淘宝网天猫商城等得到了很好的检验。它的最终目标是打造一个高效、稳定、安全、易用的Web平台。

    从2011年12月开始,Tengine成为一个开源项目,Tengine团队在积极地开发和维护着它。Tengine团队的核心成员来自于淘宝搜狗等互联网企业。Tengine是社区合作的成果,我们欢迎大家参与其中,贡献自己的力量。

    特性

    二. 安装 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开机启动

    centos版本
    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 <<EOF
    #!/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's not for everyone.
    # processname: nginx
    # pidfile: /var/run/nginx.pid
    # config: /usr/local/nginx/conf/nginx.conf
    nginxd=/usr/local/nginx/sbin/nginx
    nginx_config=/usr/local/nginx/conf/nginx.conf
    nginx_pid=/usr/local/nginx/logs/nginx.pid
    RETVAL=0
    prog="nginx"
    # Source function library.
    .  /etc/rc.d/init.d/functions
    # Source networking configuration.
    .  /etc/sysconfig/network
    # Check that networking is up.
    [ ${NETWORKING} = "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=$?
    echo
    [ $RETVAL = 0 ] && touch /var/lock/subsys/nginx
    return $RETVAL
    }
    # Stop nginx daemons functions.
    stop() {
    echo -n $"Stopping $prog: "
    killproc $nginxd
    RETVAL=$?
    echo
    [ $RETVAL = 0 ] && rm -f /var/lock/subsys/nginx /usr/local/nginx/logs/nginx.pid
    }
    reload() {
    echo -n $"Reloading $prog: "
    #kill -HUP `cat ${nginx_pid}`
    killproc $nginxd -HUP
    RETVAL=$?
    echo
    }
    # See how we were called.
    case "$1" in
    start)
    start
    ;;
    stop)
    stop
    ;;
    reload)
    reload
    ;;
    restart)
    stop
    start
    ;;
    status)
    status $prog
    RETVAL=$?
    ;;
    *)
    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's process state.
    #
    # processname: nginx
    # config:      /usr/local/nginx/conf/nginx.conf
    # pidfile:     /usr/local/nginx/logs/nginx.pid
    # Provides:    nginx
    #
    # Author:  Jason Giedymin
    #          <jason.giedymin AT gmail.com>.
    #
    # 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'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=/lib/lsb/init-functions
    
    # Test that init functions exists
    test -r $LSB_FUNC || {
        echo "$0: Cannot find $LSB_FUNC! Script exiting." 1>&2
        exit 5
    }
    
    . $LSB_FUNC
    
    #------------------------------------------------------------------------------
    #                               Consts
    #------------------------------------------------------------------------------
    PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin #更改此处
    DAEMON=/usr/local/nginx/sbin/nginx  #更改此处
    
    PS="nginx"
    PIDNAME="nginx"                     #lets you do $PS-slave
    PIDFILE=$PIDNAME.pid                #pid file
    PIDSPATH=/usr/local/nginx/logs      #default pid location, you should change it更改
    
    DESCRIPTION="Nginx Server..."
    
    RUNAS=root                          #user to run as
    
    SCRIPT_OK=0                         #ala error codes
    SCRIPT_ERROR=1                      #ala error codes
    TRUE=1                              #boolean
    FALSE=0                             #boolean
    
    lockfile=/var/lock/subsys/nginx
    NGINX_CONF_FILE="/usr/local/nginx/conf/nginx.conf"   #如有需要,更改此处
    
    #------------------------------------------------------------------------------
    #                               Simple Tests
    #------------------------------------------------------------------------------
    
    # Test if nginx is a file and executable
    test -x $DAEMON || {
        echo "$0: You don't have permissions to execute nginx." 1>&2
        exit 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 ]; then
            chmod 400 $PIDSPATH/$PIDFILE
        fi
    }
    
    configtest() {
        $DAEMON -t -c $NGINX_CONF_FILE
    }
    
    getPSCount() {
        return `pgrep -f $PS | wc -l`
    }
    
    isRunning() {
        if [ $1 ]; then
            pidof_daemon $1
            PID=$?
    
            if [ $PID -gt 0 ]; then
                return 1
            else
                return 0
            fi
        else
            pidof_daemon
            PID=$?
    
            if [ $PID -gt 0 ]; then
                return 1
            else
                return 0
            fi
        fi
    }
    
    #courtesy of php-fpm
    wait_for_pid () {
        try=0
    
        while test $try -lt 35 ; do
            case "$1" in
                'created')
                if [ -f "$2" ]; then
                    try=''
                    break
                fi
                ;;
    
                'removed')
                if [ ! -f "$2" ]; then
                    try=''
                    break
                fi
                ;;
            esac
    
            try=`expr $try + 1`
            sleep 1
        done
    }
    
    status(){
        isRunning
        isAlive=$?
    
        if [ "${isAlive}" -eq $TRUE ]; then
            log_warning_msg "$DESCRIPTION found running with processes:  `pidof $PS`"
            rc=0
        else
            log_warning_msg "$DESCRIPTION is NOT running."
            rc=3
        fi
    
        return
    }
    
    removePIDFile(){
        if [ $1 ]; then
            if [ -f $1 ]; then
                rm -f $1
            fi
        else
            #Do default removal
            if [ -f $PIDSPATH/$PIDFILE ]; then
                rm -f $PIDSPATH/$PIDFILE
            fi
        fi
    }
    
    start() {
        log_daemon_msg "Starting $DESCRIPTION"
        
        isRunning
        isAlive=$?
        
        if [ "${isAlive}" -eq $TRUE ]; then
            log_end_msg $SCRIPT_ERROR
            rc=0
        else
            start-stop-daemon --start --quiet --chuid 
            $RUNAS --pidfile $PIDSPATH/$PIDFILE --exec $DAEMON 
            -- -c $NGINX_CONF_FILE
            setFilePerms
            log_end_msg $SCRIPT_OK
            rc=0
        fi
    
        return
    }
    
    stop() {
        log_daemon_msg "Stopping $DESCRIPTION"
        
        isRunning
        isAlive=$?
        
        if [ "${isAlive}" -eq $TRUE ]; then
            start-stop-daemon --stop --quiet --pidfile $PIDSPATH/$PIDFILE
    
            wait_for_pid 'removed' $PIDSPATH/$PIDFILE
    
            if [ -n "$try" ]; then
                log_end_msg $SCRIPT_ERROR
                rc=0 # lsb states 1, but under status it is 2 (which is more prescriptive). Deferring to standard.
            else
                removePIDFile
                log_end_msg $SCRIPT_OK
                rc=0
            fi
        else
            log_end_msg $SCRIPT_ERROR
            rc=7
        fi
    
        return
    }
    
    reload() {
        configtest || return $?
    
        log_daemon_msg "Reloading (via HUP) $DESCRIPTION"
    
        isRunning
    
        if [ $? -eq $TRUE ]; then
            kill -HUP `cat $PIDSPATH/$PIDFILE`
            log_end_msg $SCRIPT_OK
            rc=0
        else
            log_end_msg $SCRIPT_ERROR
            rc=7
        fi
    
        return
    }
    
    quietupgrade() {
        log_daemon_msg "Peforming Quiet Upgrade $DESCRIPTION"
    
        isRunning
        isAlive=$?
        
        if [ "${isAlive}" -eq $TRUE ]; then
            kill -USR2 `cat $PIDSPATH/$PIDFILE`
            kill -WINCH `cat $PIDSPATH/$PIDFILE.oldbin`
            
            isRunning
            isAlive=$?
    
            if [ "${isAlive}" -eq $TRUE ]; then
                kill -QUIT `cat $PIDSPATH/$PIDFILE.oldbin`
                wait_for_pid 'removed' $PIDSPATH/$PIDFILE.oldbin
                removePIDFile $PIDSPATH/$PIDFILE.oldbin
    
                log_end_msg $SCRIPT_OK
                rc=0
            else
                log_end_msg $SCRIPT_ERROR
                
                log_daemon_msg "ERROR! Reverting back to original $DESCRIPTION"
    
                kill -HUP `cat $PIDSPATH/$PIDFILE`
                kill -TERM `cat $PIDSPATH/$PIDFILE.oldbin`
                kill -QUIT `cat $PIDSPATH/$PIDFILE.oldbin`
    
                wait_for_pid 'removed' $PIDSPATH/$PIDFILE.oldbin
                removePIDFile $PIDSPATH/$PIDFILE.oldbin
    
                log_end_msg $SCRIPT_OK
                rc=0
            fi
        else
            log_end_msg $SCRIPT_ERROR
            rc=7
        fi
    
        return
    }
    
    terminate() {
        log_daemon_msg "Force terminating (via KILL) $DESCRIPTION"
            
        PIDS=`pidof $PS` || true
    
        [ -e $PIDSPATH/$PIDFILE ] && PIDS2=`cat $PIDSPATH/$PIDFILE`
    
        for i in $PIDS; do
            if [ "$i" = "$PIDS2" ]; then
                kill $i
                wait_for_pid 'removed' $PIDSPATH/$PIDFILE
                removePIDFile
            fi
        done
    
        log_end_msg $SCRIPT_OK
        rc=0
    }
    
    destroy() {
        log_daemon_msg "Force terminating and may include self (via KILLALL) $DESCRIPTION"
        killall $PS -q >> /dev/null 2>&1
        log_end_msg $SCRIPT_OK
        rc=0
    }
    
    pidof_daemon() {
        PIDS=`pidof $PS` || true
    
        [ -e $PIDSPATH/$PIDFILE ] && PIDS2=`cat $PIDSPATH/$PIDFILE`
    
        for i in $PIDS; do
            if [ "$i" = "$PIDS2" ]; then
                return 1
            fi
        done
    
        return 0
    }
    
    action="$1"
    case "$1" in
        start)
            start
            ;;
        stop)
            stop
            ;;
        restart|force-reload)
            stop
            # if [ $rc -ne 0 ]; then
            #     script_exit
            # fi
            sleep 1
            start
            ;;
        reload)
            $1
            ;;
        status)
            status
            ;;
        configtest)
            $1
            ;;
        quietupgrade)
            $1
            ;;
        terminate)
            $1
            ;;
        destroy)
            $1
            ;;
        *)
            FULLPATH=/etc/init.d/$PS
            echo "Usage: $FULLPATH {start|stop|restart|force-reload|status|configtest|quietupgrade|terminate|destroy}"
            echo "       The 'destroy' command should only be used as a last resort." 
            exit 3
            ;;
    esac
    
    exit $rc

    授予执行权限

    1
    2
    chmod +x /etc/init.d/nginx
    chkconfig nginx --level 345 on

    添加开机启动( Ubuntu版本),service nginx start后

    sudo update-rc.d -f nginx defaults

    三.测试

    3.1 用浏览器访问主机80端口

    出现如图所示界面即表示Tengine安装完成!

    反向代理配置

    #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  '$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;
        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;
            # demo
            location ^~ /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/(.+)$ /$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 = /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's document root
            # concurs with nginx'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;
        #    }
        #}
    
    }
  • 相关阅读:
    Mybatis与Hibernate概述
    Linux命令中:rsync和scp之间的区别
    更改了ssh文件下,还没有权限
    karaf 控制台 常用linux指令(2)
    karaf 控制台 常用linux指令(1)
    POM文件详解(2)
    POM文件详解(1)
    maven配置parent pom查找策略
    排序算法性能比较
    Eclipse下用NDK编译生成so文件
  • 原文地址:https://www.cnblogs.com/liubei/p/Tengine.html
Copyright © 2020-2023  润新知