LAMP架构升级版–LNMMP   2014-04-27 23:01:27

标签:memcache LAMP升级 LNMMP

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://xxrenzhe.blog.51cto.com/4036116/1403784

简介

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=\([^ ]*\).*//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

本文出自 “小小忍者” 博客,请务必保留此出处http://xxrenzhe.blog.51cto.com/4036116/1403784