一、概述
LNMMP环境是Linux + Nginx + Memcached + MySQL + PhP,即LNMP + memcached。
Memcached简介:
1、Memcached是一款开源、高性能、分布式内存对象缓存系统,可应用各种需要缓存的场景,其主要目的是通过降低对Database的访问来加速web应用程序。它是一个基于内存的“键值对”存储,用于存储数据库调用、API调用或页面引用结果的直接数据,如字符串、对象等。
2、memcached是以LiveJournal旗下Danga Interactive 公司的Brad Fitzpatric 为首开发的一款软件。现在已成为mixi、hatena、Facebook、Vox、LiveJournal等众多服务中提高Web应用扩展性的重要因素。
3、Memcached是一款开发工具,它既不是一个代码加速器,也不是数据库中间件。其设计哲学思想主要反映在如下方面:
简单key/value存储:服务器不关心数据本身的意义及结构,只要是可序列化数据即可。存储项由“键、过期时间、可选的标志及数据”四个部分组成; 功能的实现一半依赖于客户端,一半基于服务器端:客户负责发送存储项至服务器端、从服务端获取数据以及无法连接至服务器时采用相应的动作;服务端负责接收、存储数据,并负责数据项的超时过期; 各服务器间彼此无视:不在服务器间进行数据同步; O(1)的执行效率 清理超期数据:默认情况下,Memcached是一个LRU缓存,同时,它按事先预订的时长清理超期数据;但事实上,memcached不会删除任何已缓存数据,只是在其过期之后不再为客户所见;而且,memcached也不会真正按期限清理缓存,而仅是当get命令到达时检查其时长;
4、Memcached提供了为数不多的几个命令来完成与服务器端的交互,这些命令基于memcached的协议实现。
存储类命令:set, add, replace, append, prepend 获取数据类命令:get, delete, incr/decr 统计类命令:stats, stats items, stats slabs, stats sizes 清理命令: flush_all
规划:
nginx+php IP:172.16.12.101 hostname:node1
mariadb IP:172.16.12.102 hostname:mysql
memcashed IP:172.16.12.103 hostname:mem
二、编译安装nginx和php(172.16.12.101)
1、编译安装nginx
①、准备工作
解决依赖环境:
yum groupinstall -y "Server Platform Development" yum groupinstall -y "Development tools" yum install pcre-devel -y
nginx下载地址:nginx-1.4.7.tar.gz
②、编译安装nginx:
//创建系统用户和组nginx [root@node1 ~]# groupadd -r nginx [root@node1 ~]# useradd -r -g nginx nginx 接着开始编译和安装: [root@node1 nginx-1.4.7]# tar xf nginx-1.4.7.tar.gz [root@node1 nginx-1.4.7]# cd nginx-1.4.7 [root@node1 nginx-1.4.7]# ./configure --prefix=/usr --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 [root@node1 nginx-1.4.7]# make && make install [root@node1 nginx-1.4.7]# mkdir -pv /var/tmp/nginx/client [root@node1 nginx-1.4.7]# chown -R nginx.nginx /var/tmp/nginx/
注解:
--prefix=/usr 安装目录 --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 PID文件存放的位置 --lock-path=/var/lock/nginx.lock 锁文件位置 --user=nginx 运行程序的用户 --group=nginx 运行程序的组 --with-http_ssl_module 启用SSL认证模块 --with-http_flv_module 启用流媒体模块 --with-http_gzip_static_module 启用静态页面压缩 --http-client-body-temp-path=/var/tmp/nginx/client/ HTTP包体存放的临时目录 --http-proxy-temp-path=/var/tmp/nginx/proxy/ 定义从后端服务器接收的临时文件的存放路径,可以为临时文件路径定义至多三层子目录的目录树 --http-fastcgi-temp-path=/var/tmp/nginx/fcgi/ 接收到FastCGI服务器数据,临时存放于本地某目录
③、为nginx提供服务脚本
[root@node1 ~]# vim /etc/rc.d/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 [root@node1 ~]# chmod +x /etc/rc.d/init.d/nginx
④、加入服务列表,开机启动
[root@node1 ~]# chkconfig --add nginx [root@node1 ~]# chkconfig nginx on [root@node1 ~]# chkconfig --list nginx nginx 0:off 1:off 2:on 3:on 4:on 5:on 6:off
⑤、启动并测试
[root@node1 nginx-1.4.7]# service nginx start Starting nginx: [ OK ] [root@node1 nginx-1.4.7]# curl -I http://172.16.12.101 HTTP/1.1200OK Server: nginx/1.4.7 Date: Sun, 27Apr 201410:35:28GMT Content-Type: text/html Content-Length: 612 Last-Modified: Sun, 27Apr 201410:30:08GMT Connection: keep-alive ETag: "535cdc30-264" Accept-Ranges: bytes
2、编译安装php
①、解决依赖关系
yum -y groupinstall "Desktop Platform Development" //让编译的php支持mcrypt扩展,mhash扩展和libevent yum -y install libmcrypt-devel yum -y install bzip2-devel yum -y install mhash-devel
下载:http://xmlsoft.org/sources/libxml2-2.9.0.tar.gz
[root@node1 ~]# tar xf libxml2-2.9.0.tar.gz [root@node1 ~]# cd libxml2-2.9.0 [root@node1 libxml2-2.9.0]# ./configure --prefix=/usr/local/libxml [root@node1 libxml2-2.9.0]# make && make install [root@node1 libxml2-2.9.0]# cd [root@node1 ~]# tar xf libmcrypt-2.5.7.tar.gz [root@node1 ~]# cd libmcrypt-2.5.7 [root@node1 cd libmcrypt-2.5.7]# ./configure [root@node1 cd libmcrypt-2.5.7]# make && make install
②、php下载:php-5.4.26.tar.bz2
编译安装php:
[root@node1 ~]# tar xf php-5.4.26.tar.bz2 [root@node1 ~]# cd php-5.4.26 [root@node1 php-5.4.26]# ./configure --prefix=/usr/local/php --with-mysql=mysqlnd --with-openssl --with-pdo-mysql=mysqlnd --with-mysqli=mysqlnd --enable-mbstring --with-freetype-dir --with-jpeg-dir --with-png-dir --with-zlib --with-libxml-dir=/usr/local/libxml --enable-xml --enable-sockets --enable-fpm --with-mcrypt --with-config-file-path=/etc --with-config-file-scan-dir=/etc/php.d --with-bz2 [root@node1 php-5.4.26]# make && make install
③、php-fpm
添加启动php-fpm服务脚本
[root@node1 php-5.4.26]# cp php.ini-production /etc/php.ini [root@node1 php-5.4.26]# cp sapi/fpm/init.d.php-fpm /etc/rc.d/init.d/php-fpm [root@node1 php-5.4.26]# chmod +x /etc/rc.d/init.d/php-fpm [root@node1 php-5.4.26]# chkconfig --add php-fpm [root@node1 php-5.4.26]# chkconfig --list |grep php-fpm php-fpm 0:off 1:off 2:on 3:on 4:on 5:on 6:off
编辑配置文件
[root@node1 php-5.4.26]# cp /usr/local/php/etc/php-fpm.conf.default/usr/local/php/etc/php-fpm.conf [root@node1 php-5.4.26]# vim /usr/local/php/etc/php-fpm.conf [root@node1 php-5.4.26]# grep -v "^;"/usr/local/php/etc/php-fpm.conf |grep -v "^$" //修改成如下参数 [global] pid = /usr/local/php/var/run/php-fpm.pid error_log = log/php-fpm.log process.max = 128 [www] user = nobody group = nobody listen = 127.0.0.1:9000 listen.backlog = 128 pm = dynamic pm.max_children = 50 pm.start_servers = 5 pm.min_spare_servers = 2 pm.max_spare_servers = 6
启动php-fpm服务
[root@node1 php-5.4.26]# service php-fpm start Starting php-fpm done [root@node1 php-5.4.26]# ss -tnl |grep 9000 LISTEN 0128172.16.12.101:9000*:*
④、安装Ccache
[root@node1 ~]# tar xf xcache-3.1.0.tar.bz2 [root@node1 ~]# cd xcache-3.1.0 [root@node1 xcache-3.1.0]# /usr/local/php/bin/phpize [root@node1 xcache-3.1.0]# ./configure --enable-xcache --with-php-config=/usr/local/php/bin/php-config [root@node1 xcache-3.1.0]# make && make install //编译安装完会生成: ///usr/local/php/lib/php/extensions/no-debug-non-zts-20100525/ //复制到后面的xcache.ini文件中 [root@node1 xcache-3.1.0]# mkdir /etc/php.d [root@node1 xcache-3.1.0]# cp xcache.ini /etc/php.d/ [root@node1 xcache-3.1.0]# vim /etc/php.d/xcache.ini ;; thisisan example, it won't work unless properly configured into php.ini [xcache-common] ;; non-Windows example: //前面的信息修改到此处 //如果有多个"extension =",请将复制的记录放在第一条! extension = /usr/local/php/lib/php/extensions/no-debug-non-zts-20100525/xcache.so ;; Windows example: ; extension = php_xcache.dll
3、修改nginx配置文件
①、提供php代理
[root@node1 a]# vim /etc/nginx/nginx.conf [root@node1 a]# grep -v "#"/etc/nginx/nginx.conf |grep -v "^$" worker_processes 1; events { worker_connections 1024; } http { includemime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; server { listen 80; server_name localhost; location / { root /usr/html/; index index.php index.html index.htm; } error_page 404/404.html; location = /404.html { root /usr/html/; } error_page 500502503504/50x.html; location = /50x.html { root /usr/html/; } location ~ \.php$ { root /usr/html/; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; includefastcgi_params; } } } [root@node1 a]# service nginx restart
②、创建php站点服务
[root@node1 ~]# chown -R nginx.nginx /usr/html/ [root@node1 ~]# vim /usr/html/index.php <?php phpinfo(); ?>
③、重启php-fpm服务,测试xcache是否启用成功
[root@node1 a]# service nginx restart
三、编译安装mariadb 10(172.16.12.102)
1、依赖环境
[root@mysql ~]# yum install -y cmake
2、编译安装
[root@mysql ~]# groupadd -r mysql [root@mysql ~]# useradd -r -g mysql mysql [root@mysql ~]# mkdir -pv /mydata/data [root@mysql ~]# tar xf mariadb-10.0.10-linux-x86_64.tar.gz -C /usr/local/ [root@mysql ~]# cd /usr/local/ [root@mysql local]# ln -sv mariadb-10.0.10-linux-x86_64/ mysql [root@mysql local]# cd mysql [root@mysql mysql]# chown -R root.mysql ./* [root@mysql mysql]# scripts/mysql_install_db --user=mysql --datadir=/mydata/data/ [root@mysql mysql]# chown -R mysql:mysql /mydata/data
3、提供配置文件
[root@mysql mysql]# cp support-files/my-large.cnf /etc/my.cnf [root@mysql mysql]# vim /etc/my.cnf thread_concurrency = 2//修改 datadir = /mydata/data //添加
4、提供服务脚本
[root@mysql mysql]# cp support-files/mysql.server /etc/rc.d/init.d/mysqld [root@mysql mysql]# chmod +x /etc/rc.d/init.d/mysqld [root@mysql mysql]# chkconfig --add mysqld [root@mysql mysql]# chkconfig mysqld on
5、更新环境变量、帮助手册、库文件
[root@mysql mysql]# echo "export PATH=/usr/local/mysql/bin:$PATH">/etc/profile.d/mysql.sh [root@mysql mysql]# source /etc/profile.d/mysql.sh [root@mysql mysql]# echo "MANPATH /usr/local/mari/man">> /etc/man.config [root@mysql mysql]# ln -sv /usr/local/mysql/include/usr/include/mysql [root@mysql mysql]# echo '/usr/local/mysql/lib'> /etc/ld.so.conf.d/mysql.conf
6、启动并添加一个php测试用户
[root@mysql mysql]# service mysqld start [root@mysql mysql]# mysql MariaDB [(none)]> grant all on *.* to 'root'@'172.16.12.%'identified by 'mari'; MariaDB [(none)]> flush privileges;
7、测试php与mariadb的连接(在172.16.12.101上)
[root@node1 a]# vim /usr/html/index.php <?php $link = mysql_connect('172.16.12.102','root','mari'); if($link) echo "Success..."; else echo "Failure..."; mysql_close(); ?>
四、安装wordpress
1、解压编辑
[root@node1 ~]# tar xf wordpress-3.9-zh_CN.tar.gz -C /usr/html/ [root@node1 ~]# cd /usr/html/wordpress [root@node1 wordpress]# cp wp-config-sample.php wp-config.php [root@node1 wordpress]# vim wp-config.php //修改如下内容 define('DB_NAME', 'wordpress'); //事先在数据库里建好 define('DB_USER', 'root'); define('DB_PASSWORD', 'mari'); define('DB_HOST', '172.16.12.102');
2、将WordPress下所有文件拷贝到html下
[root@node1 html]# mv wordpress/* ./
测试
安装
3、使用ab测试下性能
[root@node1 html]# ab -n 100-c 10http://172.16.12.101/
五、安装memcached
下载:libevent-2.0.21-stable.tar.gz
1、解决依赖环境
[root@mem ~]# tar xf libevent-2.0.21-stable.tar.gz [root@mem libevent-2.0.21-stable]# ./configure --prefix=/usr/local/libevent [root@mem libevent-2.0.21-stable]# make && make install [root@mem libevent-2.0.21-stable]# echo "/usr/local/libevent/lib"> /etc/ld.so.conf.d/libevent.conf
2、编译安装memcached
[root@mem ~]# tar xf memcached-1.4.17.tar.gz [root@mem ~]# cd memcached-1.4.17 [root@mem memcached-1.4.17]# ./configure --prefix=/usr/local/memcached --with-libevent=/usr/local/libevent [root@mem memcached-1.4.17]# make && make install
3、更新二进制文件、帮助手册、库文件
[root@mem memcached-1.4.17]# echo "export PATH=/usr/local/memcached/bin:$PATH"> /etc/profile.d/memcached.sh [root@mem memcached-1.4.17]# . /etc/profile.d/memcached.sh [root@mem memcached-1.4.17]# echo "MANPATH /usr/local/memcached/share/man">> /etc/man.config [root@mem memcached-1.4.17]# ln -sv /usr/local/memcached/include/memcached /usr/include/memcached
Memcached启动参数说明:
-d 选项是启动一个守护进程, -m 是分配给Memcache使用的内存数量,单位是MB,默认64MB -M returnerror on memory exhausted (rather than removing items) -u 是运行Memcache的用户,如果当前为root 的话,需要使用此参数指定用户。 -l 是监听的服务器IP地址,默认为所有网卡。 -p 是设置Memcache的TCP监听的端口,最好是1024以上的端口 -c 选项是最大运行的并发连接数,默认是1024 -P 是设置保存Memcache的pid文件 -f <factor> chunk size growth factor (default: 1.25)
添加服务脚本
[root@mem memcached-1.4.17]# vim /etc/rc.d/init.d/memcached [root@mem memcached-1.4.17]# chmod o+x !$ chmod o+x /etc/rc.d/init.d/memcached [root@mem memcached-1.4.17]# service memcached start
4、在node1上为php扩展模块memcache
编译安装:
[root@node1 ~]# tar xf memcache-2.2.7.tgz [root@node1 ~]# cd memcache-2.2.7 [root@node1 memcache-2.2.7]# /usr/local/php/bin/phpize Configuring for: PHP Api Version: 20100412 Zend Module Api No: 20100525 Zend Extension Api No: 220100525 [root@node1 memcache-2.2.7]# ./configure --with-php-config=/usr/local/php/bin/php-config --enable-memcache [root@node1 memcache-2.2.7]# make && make install
编译完成后记录memcache.so模块路径:
/usr/local/php/lib/php/extensions/no-debug-non-zts-20100525/ 在/etc/php.ini里"动态模块"相关位置添加如下内容: extension=/usr/local/php/lib/php/extensions/no-debug-non-zts-20100525/memcache.so [root@node1 memcache-2.2.7]# service php-fpm restart
然后就可以写一个测试页面,来测试php是否能与后端缓存服务器联系了.
[root@node1 memcache-2.2.7]# vim /usr/html/testmemcached.php <?php $mem = newmemcache; $mem->connect("172.16.12.103", 11211) or die("Could not connect"); $version = $mem->getVersion(); echo "Server's version: ".$version."<br/>\n"; $mem->set('hellokey', 'Hello World', 0, 600) or die("Failed to save data at the memcached server"); echo "Store data in the cache (data will expire in 600 seconds)<br/>\n"; $get_result = $mem->get('hellokey'); echo "$get_result is from memcached server."; ?>
5、在Mamcached服务器上查看一下此条请求是否记录了
[root@mem ~]# telnet 127.0.0.111211 Trying 127.0.0.1... Connected to 127.0.0.1. Escape character is'^]'. gethellokey VALUE hellokey 011 Hello World END
6、性能检测
[root@node1 memadmin-master]# unzip memadmin-master.zip [root@node1 ~]# cd memadmin-master [root@node1 ~]# mv memadmin-master /usr/html/
登录:默认账号密码均为admin,配置并测试
点击”开始管理“: