• Lnmmp


    简介

    LNMMP=Linux+Nginx+MySQL+Memcache+PHP;

    利用Nginx的高性能特点做前端反向代理服务器,分发用户请求,并在能够利用缓存的地方使用Memcache缓存服务,以加速缓存效率,具体架构图如下;

    wKiom1NeTSHyGn4AAAbBM4rsOoU282.jpg

     

    具体部署

    代理层:Nginx

    编译安装Nginx

    yum install gcc openssl-devel pcre-devel zlib-devel
    groupadd -r nginx
    useradd -r -g nginx -M nginx
    ./configure \
      --prefix=/usr/local/nginx \
      --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/nginx.pid  \
      --lock-path=/var/lock/nginx.lock \
      --user=nginx \
      --group=nginx \
      --with-http_ssl_module \
      --with-http_flv_module \
      --with-http_stub_status_module \
      --with-http_gzip_static_module \
      --http-client-body-temp-path=/var/tmp/nginx/client/ \
      --http-proxy-temp-path=/var/tmp/nginx/proxy/ \
      --http-fastcgi-temp-path=/var/tmp/nginx/fcgi/ \
      --http-uwsgi-temp-path=/var/tmp/nginx/uwsgi \
      --http-scgi-temp-path=/var/tmp/nginx/scgi \
      --with-pcre
    make && make install
    vi /etc/init.d/nginx # 编辑服务脚本
    #!/bin/sh
    #
    # nginx - this script starts and stops the nginx daemon
    #
    # chkconfig:   - 85 15
    # description:  Nginx is an HTTP(S) server, HTTP(S) reverse \
    #               proxy and IMAP/POP3 proxy server
    # processname: nginx
    # config:      /etc/nginx/nginx.conf
    # config:      /etc/sysconfig/nginx
    # pidfile:     /var/run/nginx.pid
    # Source function library.
    . /etc/rc.d/init.d/functions
    # Source networking configuration.
    . /etc/sysconfig/network
    # Check that networking is up.
    [ "$NETWORKING" = "no" ] && exit 0
    nginx="/usr/sbin/nginx"
    prog=$(basename $nginx)
    NGINX_CONF_FILE="/etc/nginx/nginx.conf"
    [ -f /etc/sysconfig/nginx ] && . /etc/sysconfig/nginx
    lockfile=/var/lock/subsys/nginx
    make_dirs() {
       # make required directories
       user=`nginx -V 2>&1 | grep "configure arguments:" | sed 's/[^*]*--user=\([^ ]*\).*/\1/g' -`
       options=`$nginx -V 2>&1 | grep 'configure arguments:'`
       for opt in $options; do
           if [ `echo $opt | grep '.*-temp-path'` ]; then
               value=`echo $opt | cut -d "=" -f 2`
               if [ ! -d "$value" ]; then
                   # echo "creating" $value
                   mkdir -p $value && chown -R $user $value
               fi
           fi
       done
    }
    start() {
        [ -x $nginx ] || exit 5
        [ -f $NGINX_CONF_FILE ] || exit 6
        make_dirs
        echo -n $"Starting $prog: "
        daemon $nginx -c $NGINX_CONF_FILE
        retval=$?
        echo
        [ $retval -eq 0 ] && touch $lockfile
        return $retval
    }
    stop() {
        echo -n $"Stopping $prog: "
        killproc $prog -QUIT
        retval=$?
        echo
        [ $retval -eq 0 ] && rm -f $lockfile
        return $retval
    }
    restart() {
        configtest || return $?
        stop
        sleep 1
        start
    }
    reload() {
        configtest || return $?
        echo -n $"Reloading $prog: "
        killproc $nginx -HUP
        RETVAL=$?
        echo
    }
    force_reload() {
        restart
    }
    configtest() {
      $nginx -t -c $NGINX_CONF_FILE
    }
    rh_status() {
        status $prog
    }
    rh_status_q() {
        rh_status >/dev/null 2>&1
    }
    case "$1" in
        start)
            rh_status_q && exit 0
            $1
            ;;
        stop)
            rh_status_q || exit 0
            $1
            ;;
        restart|configtest)
            $1
            ;;
        reload)
            rh_status_q || exit 7
            $1
            ;;
        force-reload)
            force_reload
            ;;
        status)
            rh_status
            ;;
        condrestart|try-restart)
            rh_status_q || exit 0
                ;;
        *)
            echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}"
            exit 2
    esac

    配置Nginx

    upstream memcached {
            server    172.16.25.111:11211;
            keepalive 1024;
        }
        upstream webserver {
            server    172.16.25.112:80;
            server    172.16.25.113:80;
        }
        upstream phpserver {
            server    172.16.25.112:9000;
            server    172.16.25.113:9000;
        }
        server {
            listen       80;
            server_name  xxrenzhe.lnmmp.com;
        access_log      /var/log/nginx/lnmmp.access.log;
        error_log       /var/log/nginx/lnmmp.errors.log notice;
        root              /www/lnmmp.com;
        index       index.php index.html;
        location / {
            set $memcached_key $request_uri;
            add_header X-mem-key $memcached_key;
            memcached_pass memcached;
            default_type test/html;
            error_page 404 500 502 504 = @webnocache;
        }
        location @webnocache {
            rewrite ^(\/)?$ /index.php last; # 配置直接访问域名或IP地址时,重定向至index.php文件
            rewrite ^/.*$ /set_mem.php?$request_uri last; # 将静态访问重定向至后端set_mem.php,以实现set memcache的功能
            proxy_pass http://webserver;
        }
        location ~* \.php(\?.*)?$ {
            fastcgi_pass phpserver;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            include fastcgi_params;
        }

    启动服务

    chmod +x /etc/init.d/nginx
    chkconfig --add nginx
    chkconfig nginx on
    service nginx start

    缓存层:Memcache+NFS

    安装配置memcache

    # 安装libevent
    tar xf libevent-2.0.21-stable.tar.gz
    cd libevent-2.0.21
    ./configure --prefix=/usr/local/libevent
    make && make install
    echo "/usr/local/libevent/lib" > /etc/ld.so.conf.d/libevent.conf
    ldconfig
    # 安装memcache
    tar xf memcached-1.4.15.tar.gz
    cd memcached-1.4.15
    ./configure --prefix=/usr/local/memcached --with-libevent=/usr/local/libevent
    make && make install
    # 编辑服务脚本 # 一次启动了2个memcache实例,一个用于Nginx,一个用于后端PHP服务
    vi /etc/init.d/memcached
    #!/bin/bash
    #
    # Init file for memcached
    #
    # chkconfig: - 86 14
    # description: Distributed memory caching daemon
    #
    # processname: memcached
    # config: /etc/sysconfig/memcached
    . /etc/rc.d/init.d/functions
    ## Default variables
    PORT1="11211"
    PORT2="11311"
    USER="nobody"
    MAXCONN="1024"
    CACHESIZE="64"
    OPTIONS=""
    RETVAL=0
    prog="/usr/local/memcached/bin/memcached"
    desc="Distributed memory caching"
    lockfile1="/var/lock/subsys/memcached_$PORT1"
    lockfile2="/var/lock/subsys/memcached_$PORT2"
    start() {
            echo -n $"Starting $desc (memcached): "
            daemon $prog -d -p $PORT1 -u $USER -c $MAXCONN -m $CACHESIZE -o "$OPTIONS"
    daemon $prog -d -p $PORT2 -u $USER -c $MAXCONN -m $CACHESIZE -o "$OPTIONS"
            RETVAL=$?
            [ $RETVAL -eq 0 ] && success && touch $lockfile1 && touch $lockfile2 || failure
            echo
            return $RETVAL
    }
    stop() {
            echo -n $"Shutting down $desc (memcached): "
            killproc $prog
            RETVAL=$?
            [ $RETVAL -eq 0 ] && success && rm -f $lockfile1 && rm -f $lockfile2 | failure
            echo
            return $RETVAL
    }
    restart() {
            stop
            start
    }
    reload() {
            echo -n $"Reloading $desc ($prog): "
            killproc $prog -HUP
            RETVAL=$?
            [ $RETVAL -eq 0 ] && success || failure
            echo
            return $RETVAL
    }
    case "$1" in
      start)
            start
            ;;
      stop)
            stop
            ;;
      restart)
            restart
            ;;
      condrestart)
            [ -e $lockfile1 ] && [ -e $lockfile1 ] && restart
            RETVAL=$?
            ;;
      reload)
            reload
            ;;
      status)
            status $prog
            RETVAL=$?
            ;;
       *)
            echo $"Usage: $0 {start|stop|restart|condrestart|status}"
            RETVAL=1
    esac
    exit $RETVAL

    启动memcache服务

    # 安装libevent
    tar xf libevent-2.0.21-stable.tar.gz
    cd libevent-2.0.21
    ./configure --prefix=/usr/local/libevent
    make && make install
    echo "/usr/local/libevent/lib" > /etc/ld.so.conf.d/libevent.conf
    ldconfig
    # 安装memcache
    tar xf memcached-1.4.15.tar.gz
    cd memcached-1.4.15
    ./configure --prefix=/usr/local/memcached --with-libevent=/usr/local/libevent
    make && make install
    # 编辑服务脚本 # 一次启动了2个memcache实例,一个用于Nginx,一个用于后端PHP服务
    vi /etc/init.d/memcached
    #!/bin/bash
    #
    # Init file for memcached
    #
    # chkconfig: - 86 14
    # description: Distributed memory caching daemon
    #
    # processname: memcached
    # config: /etc/sysconfig/memcached
    . /etc/rc.d/init.d/functions
    ## Default variables
    PORT1="11211"
    PORT2="11311"
    USER="nobody"
    MAXCONN="1024"
    CACHESIZE="64"
    OPTIONS=""
    RETVAL=0
    prog="/usr/local/memcached/bin/memcached"
    desc="Distributed memory caching"
    lockfile1="/var/lock/subsys/memcached_$PORT1"
    lockfile2="/var/lock/subsys/memcached_$PORT2"
    start() {
            echo -n $"Starting $desc (memcached): "
            daemon $prog -d -p $PORT1 -u $USER -c $MAXCONN -m $CACHESIZE -o "$OPTIONS"
    daemon $prog -d -p $PORT2 -u $USER -c $MAXCONN -m $CACHESIZE -o "$OPTIONS"
            RETVAL=$?
            [ $RETVAL -eq 0 ] && success && touch $lockfile1 && touch $lockfile2 || failure
            echo
            return $RETVAL
    }
    stop() {
            echo -n $"Shutting down $desc (memcached): "
            killproc $prog
            RETVAL=$?
            [ $RETVAL -eq 0 ] && success && rm -f $lockfile1 && rm -f $lockfile2 | failure
            echo
            return $RETVAL
    }
    restart() {
            stop
            start
    }
    reload() {
            echo -n $"Reloading $desc ($prog): "
            killproc $prog -HUP
            RETVAL=$?
            [ $RETVAL -eq 0 ] && success || failure
            echo
            return $RETVAL
    }
    case "$1" in
      start)
            start
            ;;
      stop)
            stop
            ;;
      restart)
            restart
            ;;
      condrestart)
            [ -e $lockfile1 ] && [ -e $lockfile1 ] && restart
            RETVAL=$?
            ;;
      reload)
            reload
            ;;
      status)
            status $prog
            RETVAL=$?
            ;;
       *)
            echo $"Usage: $0 {start|stop|restart|condrestart|status}"
            RETVAL=1
    esac
    exit $RETVAL

    安装配置NFS

    yum -y install nfs-utils
    vi /etc/exports
    /www/lnmmp.com 172.16.0.0/16(rw,no_root_squash)
    exportfs -ar # 导出NFS共享目录
    cd /www/lnmmp.com
    unzip phpwind_v9.0_utf8.zip
    mv phpwind_v9.0_utf8/upload/* .
    chmod -R 777 attachment conf data html res src themes windid

    Web层:Apache

    Apache的安装见博客"httpd-2.4 编译安装";  

    PHP-fpm的安装见博客“LAMP架构之PHP-FPM 服务器”;

    PHP加速器opcache的安装配置见博客“LAMP-PHP各加速器性能剖析”;

    配置PHP支持memcache

    tar xf memcache-2.2.5.tgz
    cd memcache-2.2.5
    /usr/local/php/bin/phpize
    ./configure --with-php-config=/usr/local/php/bin/php-config --enable-memcache
    make && make install
    # 上述安装完后会有类似这样的提示:
    Installing shared extensions:     /usr/local/php/lib/php/extensions/no-debug-non-zts-20090626/
    vi /usr/local/php/lib/php.ini # 配置memcache模块位置及php会话保存至memcache中
    extension=/usr/local/php/lib/php/extensions/no-debug-non-zts-20090626/memcache.so
    session.save_handler = memcache
    session.save_path = "tcp://172.16.25.111:11311"
    # 自定义set memcache的程序
    vi /www/lnmmp.com/set_mem.php
    <?php
        $fn = dirname(__FILE__).$_SERVER['QUERY_STRING'];
        if (file_exists($fn)) {
            $data = file_get_contents($fn);
            $mem = new Memcache();
            $mem->connect("172.16.25.111",11311) or die("Could not connect");
            $mem->set($_SERVER['QUERY_STRING'],$data,0,600) or die("Failed to save data at the memcached server");
            header('Content-Length: '.filesize($fn)."\r\n");
            header('Content-Type: text/html'."\r\n");
            header('X-cache: MISS'."\r\n");
            print "$data";
        } else {
            header('Location: http://xxrenzhe.lnmmp.com'."\r\n");
            header('Content-Length: '.filesize($fn)."\r\n");
            header('X-cache: '.$fn."\r\n");
        }
    ?>

    Apache配置

    vi /etc/httpd/httpd.conf
    # DocumentRoot "/usr/local/apache/htdocs" # 注释掉此行
    Include /etc/httpd/extra/httpd-vhosts.conf # 取消此行注释
    vi /etc/httpd/extra/httpd-vhosts.conf
    <VirtualHost *:80>
        DocumentRoot "/www/lnmmp.com"
        ServerName xxrenzhe.lnmmp.com
        ErrorLog "logs/lnmmp.com-error_log"
        CustomLog "logs/lnmmp.com-access_log"common
        <Directory "/www/lnmmp.com">
            Options Indexes FollowSymLinks
            AllowOverride None
            Require all granted
        </Directory>
    </VirtualHost>

    NFS目录挂载

    mount -t nfs 172.16.25.111:/www/lnmmp.com /www/lnmmp.com

    服务启动

    service httpd start
    service php-fpm start 

    数据库层:Ameoba+MariaDB

    MariaDB的安装详见博客“MySQL初识-架构-安装-初始化-连接-管理工具-数据文件”;

    MariaDB的主从复制架构配置见博客“Maria10实现主从复制架构及SSL复制”;

    Ameoba安装见“http://docs.hexnova.com/amoeba/index.html”;

    Ameoba实现读写分离见“http://docs.hexnova.com/amoeba/rw-splitting.html

     

    测试验证

    Nginx利用memcache缓存小静态文件测试效果

    wKioL1NfqcjQB2MUAAltUsxZWDs411.jpg

    Nginx利用memcache缓存静态文件测试效果

    wKiom1NfqhfQlrdbAAnjcLU_Wzo533.jpg

    PHP利用memcache保存session数据测试效果

    wKioL1NfqhOjiODOAAm4zcc6NeM213.jpg

  • 相关阅读:
    .NET C#模仿Windows方式打开指定文件所在的文件夹,并定位到文件【加强版】
    .NET C#执行程序功能时根据Windows用户角色动态提权执行相关业务功能的方法
    .NET C#实现string类型List<T>二分查找算法功能(支持Contains模糊匹配)
    由于定时模块的错误导致系统无法启动
    mongodb执行js命令
    查看mongodb执行命令耗时
    es设置translog保留时间
    mongodb设置开机自启动
    python写数据到elasticsearch
    es查询相关
  • 原文地址:https://www.cnblogs.com/xiaocen/p/3704395.html
Copyright © 2020-2023  润新知