***************** 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
測試: