***************** mysql+nginx+php+memcache ******************
1.Mysql 安装
软件包依赖性:
# yum install -y gcc-c++ make ncurses-devel bison openssl-devel zlib-devel cmake-2.8.12.2-4.el6.x86_64.rpm
# tar zxf mysql-boost-5.7.17.tar.gz
# cd mysql-5.7.17/
cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \ #安装目录
-DMYSQL_DATADIR=/usr/local/mysql/data \ #数据库存放目录
-DMYSQL_UNIX_ADDR=/usr/local/mysql/data/mysql.sock \ #Unix socket 文件路径
-DWITH_MYISAM_STORAGE_ENGINE=1 \ #安装 myisam 存储引擎
-DWITH_INNOBASE_STORAGE_ENGINE=1 \ #安装 innodb 存储引擎
-DWITH_ARCHIVE_STORAGE_ENGINE=1 \ #安装 archive 存储引擎
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \ #安装 blackhole 存储引擎
-DWITH_PARTITION_STORAGE_ENGINE=1 \ #安装数据库分区
-DENABLED_LOCAL_INFILE=1 \ #允许从本地导入数据
-DWITH_READLINE=1 \ #快捷键功能
-DWITH_SSL=yes \ #支持 SSL
-DDEFAULT_CHARSET=utf8 \ #使用 utf8 字符
-DDEFAULT_COLLATION=utf8_general_ci \ #校验字符
-DEXTRA_CHARSETS=all \ #安装所有扩展字符集
-DMYSQL_TCP_PORT=3306 \ #MySQL 监听端口
安装:# cmake -DCMAKE_INSTALL_PREFIX=/usr/local/lnmp/mysql -DMYSQL_DATADIR=/usr/local/lnmp/mysql/data -DMYSQL_UNIX_ADDR=/usr/local/lnmp/mysql/data/mysql.sock -DWITH_MYISAM_STORAGE_ENGINE=1 -DWITH_INNOBASE_STORAGE_ENGINE=1 -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DEXTRA_CHARSETS=all -DWITH_BOOST=boost/boost_1_59_0
# rm -f CmakeCache.txt
# make && make install 重新编译时,需要清除旧的对象文件和缓存信息
# groupadd -g 27 mysql
# useradd -u 27 -g 27 -s /sbin/nologin -M -d /usr/local/lnmp/mysql mysql
# cp /usr/local/lnmp/mysql/support-files/my-default.cnf /etc/my.cnf #根据你的主机内存复制 mysql 配置文件
# cp /usr/local/lnmp/mysql/support-files/mysql.server /etc/init.d/mysqld
# cd /usr/local/lnmp/mysql/
# chown mysql.mysql . -R
# mysqld --initialize --user=mysql ##生成mysql密码
# chown root.root . -R
# chown mysql data -R
# service mysqld start ##开启数据库
# chkconfig mysqld on ##设置数据库开机自启动
# vim ~/.bash_profile
10 PATH=$PATH:$HOME/bin:/usr/local/lnmp/mysql/bin
# source ~/.bash_profile ##使之生效
# mysql -p ##进入数据库
初始化数据库:
# mysql_secure_installation
登录数据库:
# mysql -uroot -pwestos
******************** php安装 ************
# tar jxf php-5.6.20.tar.bz2
# cd php-5.6.20
软件包依赖性:
yum install -y libxml2-devel curl-devel libjpeg-turbo-devel libpng-devel freetype-devel gmp-devel net-snmp-devel bison
# rpm -ivh re2c-0.13.5-1.el6.x86_64.rpm
# rpm -ivh libmcrypt-devel-2.5.8-9.el6.x86_64.rpm libmcrypt-2.5.8-9.el6.x86_64.rpm
1).开始安装:
# ./configure --prefix=/usr/local/lnmp/php --with-config-file-path=/usr/local/lnmp/php/etc --with-mysql=mysqlnd --with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd --with-openssl --with-snmp --with-gd --with-zlib --with-curl --with-libxml-dir --with-png-dir --with-jpeg-dir --with-freetype-dir --with-gmp --with-gettext --enable-inline-optimization --enable-soap --enable-ftp --enable-sockets --enable-mbstring --enable-fpm --with-fpm-user=nginx --with-fpm-group=nginx --with-mcrypt --with-mhash
# make
# make install ##重新编译
2).配置
# cp /root/php-5.6.20/php.ini-production /usr/local/lnmp/php/etc/php.ini
# cp /root/php-5.6.20/sapi/fpm/init.d.php-fpm /etc/init.d/php-fmp
# chmod +x /etc/init.d/php-fmp
# cd /usr/local/lnmp/php/etc/
# vim /usr/local/lnmp/php/etc/php.ini
925 date.timezone = Asia/Shanghai #修改时区
# cp /usr/local/lnmp/php/etc/php-fpm.conf.default /usr/local/lnmp/php/etc/php-fpm.conf
# vim /usr/local/lnmp/php/etc/php-fpm.conf
25 pid = run/php-fpm.pid
# /etc/init.d/php-fmp start
# chkconfig php-fpm on #设置开机自启动
php-fpm监控9000端口
# vim ~/.bash_profile
10 PATH=$PATH:$HOME/bin:/usr/local/lnmp/mysql/bin:/usr/local/lnmp/php/bin
# source ~/.bash_profile
# php -m ##查看php所有模块
vim /usr/local/lnmp/nginx/html/index.php #设置主页
<?php
phpinfo()
?>
# nginx -s reload
测试:
172.25.62.1
# unzip Discuz_X3.2_SC_UTF8.zip
# mv /root/upload/ /usr/local/lnmp/nginx/html/bbs
# cd /usr/local/lnmp/nginx/html/bbs/
# chmod 777 config/ data/ uc_client/ uc_server/ -R
# vim /usr/local/lnmp/php/etc/php.ini
1001 pdo_mysql.default_socket= /usr/local/lnmp/mysql/data/mysql.sock
1150 mysql.default_socket = /usr/local/lnmp/mysql/data/mysql.sock
1209 mysqli.default_socket = /usr/local/lnmp/mysql/data/mysql.sock
# /etc/init.d/php-fmp reload
# chmod 755 /usr/local/lnmp/mysql/data/
# rm -fr /usr/local/lnmp/nginx/html/bbs/install/index.php
测试:172.25.7.1/bbs/install
######## Php 功能模块扩展 ############
Memcache 是 danga.com 的一个开源项目,它是一个高性能的分布式的内存对象缓存系统,通过在内存里维护一个统一的巨大的 Hash 表,能够用来存储各种格式的数据。可以类比于 MySQL 这样的服务,而 PHP 扩展的 Memcache 实际上是连接 Memcache 的方式。
缓存策略的改进
我们知道,Nginx的核心设计思想是事件驱动的非阻塞I/O。Nginx被设计为可以配置I/O多路复用策略,在Unix系统中传统的多路复用是 采用select或poll,但是这两个方法的问题是随着监听socket的增加,性能会下降,因为在linux内核中是采用轮询的方式判断是否可以触发 事件,换句话说算法的复杂度为O(N),而在较新的linux内核中引入了复杂度为O(1)的epoll,因此Nginx在Linux下默认采用 epoll,而在FreeBSD下默认采用kqueue作为I/O策略。
即便是这样,传统的缓存策略仍可能造成效率低下,因为传统上是通过PHP操作memcache的,要执行PHP代码,Nginx就必然要和FastCGI通信,同时也要进入PHP的生命周期,因此SAPI、PHP Core和Zend Engine的一系列逻辑会被执行。更糟糕的是,fpm和PHP可能会阻塞,因此破坏了Nginx的非阻塞性。(原文中此处表述有误,fastcgi与nginx进行同步通信,但并不会破坏nginx i/o的非阻塞性,多谢agentzh给予指正)下图展示了在memcache命中时整个处理过程。
可以看到,即使memcache命中,还是要进入PHP的生命周期。我们知道,目前很多互联网应用都使用RESTful规范进行设计,在 RESTful应用下,普遍使用uri和查询参数作为缓存的key,因此一种更高效的缓存策略是Nginx直接访问memcache,并用uri和args 等Nginx内置变量设定缓存key规则,这样,当缓存命中时,Nginx可以跳过通过fastcgi和PHP通信的过程,直接从memcache中获取 数据并返回。memc-nginx和srcache-nginx正是利用这种策略提高了缓存的效率。下图是这种高效缓存策略的示意图(当memcache 命中时)。
# tar zxf memcache-2.2.5.tgz
# cd memcache-2.2.5
# source ~/.bash_profile
# phpize
# ./configure
# make && make install
# vim /usr/local/lnmp/php/etc/php.ini
872 extension=memcache.so
# /etc/init.d/php-fmp reload
[root@server1 memcache-2.2.5]# php -m |grep memcache
memcache
# yum install -y memcached
# /etc/init.d/memcached start
# cp /root/memcache-2.2.5/example.php /usr/local/lnmp/nginx/html/
测试访问:http://172.25.62.1/example.php
# vim /root/memcache-2.2.5/memcache.php
20 $VERSION='$Id: memcache.php,v 1.2 2008/09/11 19:21:06 mikl Exp $';
21
22 define('ADMIN_USERNAME','admin'); // Admin Username
23 define('ADMIN_PASSWORD','westos'); // Admin Password
24 define('DATE_FORMAT','Y/m/d H:i:s');
25 define('GRAPH_SIZE',200);
26 define('MAX_ITEM_DUMP',50);
27
28 $MEMCACHE_SERVERS[] = '127.0.0.1:11211'; // add more as an array
29 //$MEMCACHE_SERVERS[] = 'mymemcache-server2:11211'; // add more as an array
# cp /root/memcache-2.2.5/memcache.php /usr/local/lnmp/nginx/html/
查看11211端口:
测试:memcache缓存机制
http://172.25.62.1/memcache.php
###### Nginx的Memc构建高效透明的缓存机制 ########
# tar zxf openresty-1.11.2.3.tar.gz
# cd openresty-1.11.2.3
# ./configure
# make && make install
# vim /usr/local/openresty/nginx/conf/nginx.conf
2 user nginx;
3 worker_processes 1;
4
5 #error_log logs/error.log;
6 #error_log logs/error.log notice;
7 #error_log logs/error.log info;
8
9 #pid logs/nginx.pid;
10
11
12 events {
13 worker_connections 65535;
14 }
15
16
17 http {
18 upstream memcache {
19 server 172.25.62.1:11211;
20 }
21 include mime.types;
22 default_type application/octet-stream;
46 location / {
47 root html;
48 index index.php index.html index.htm;
49 }
55 error_page 500 502 503 504 /50x.html;
56 location = /50x.html {
57 root html;
58 }
59
60 location /memc {
61 internal;
62 memc_connect_timeout 100ms;
63 memc_send_timeout 100ms;
64 memc_read_timeout 100ms;
65 set $memc_key $query_string;
66 set $memc_exptime 300;
67 memc_pass memcache;
68 }
78 location ~ \.php$ {
79 set $key $uri$args;
80 srcache_fetch GET /memc $key;
81 srcache_store PUT /memc $key;
82 root html;
83 fastcgi_pass 127.0.0.1:9000;
84 fastcgi_index index.php;
85 # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
86 include fastcgi.conf;
87 }
# vim /usr/local/lnmp/nginx/conf/nginx.conf
3 worker_processes 2;
4 #worker_cpu_affinity 01 10;
测试:不开启缓存
###开启缓存
# nginx -s stop
# /usr/local/openresty/nginx/sbin/nginx
测试: