LAMP架構升級版--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服務

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

安裝配置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 p_w_upload 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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章