LAMMP架构的企业级应用
=========================================
LAMMP是什么
LAMMP的实现
LAMMP适用的生产环境
==========================================
一、LAMMP是什么
LAMMP,是几个英文单词首字母的缩写。
L是Linux的缩写,Linux操作系统,Linux以稳定、安全、且开源著称的操作系统,适用于做 服务器。
A是Apache的缩写,Apache是一款提供Web服务器的开源软件,Apache是一个极具稳定安全、高度模块化、支持模块动态扩展的Web服务器,是搭建Web服务器的首选之一,据统计全球有50%左右的Web服务器是用Apache搭建的。http://www.netcraft.com/ 这个网站,是对全球web服务器的排名。
M是Mysql的缩写,Mysql是数据库管理系统,数据库管理软件,也是开源软件。
M是Memcached的缩写,Memcached是一款开源、高性能、分布式内存对象缓存系统,可应用各种需要缓存的场景,其主要目的是通过降低对Database的访问来加速web应用程序。它是一个基于内存的“键值对”存储,用于存储数据库调用、API调用或页面引用结果的直接数据,如字符串、对象等。
Memcached是一款开发工具,它既不是一个代码加速器,也不是数据库中间件。其设计哲学思想主要反映在如下方面:
1. 简单key/value存储:服务器不关心数据本身的意义及结构,只要是可序列化数据即可。存储项由“键、过期时间、可选的标志及数据”四个部分组成;
2. 功能的实现一半依赖于客户端,一半基于服务器端:客户负责发送存储项至服务器端、从服务端获取数据以及无法连接至服务器时采用相应的动作;服务端负责接收、存储数据,并负责数据项的超时过期;
3. 各服务器间彼此之间不互相通信:不在服务器间进行数据同步;服务器宕机,存储的数据立即丢失
4. O(1)的执行效率
5. 清理超期数据:默认情况下,Memcached是一个LRU缓存,同时,它按事先预订的时长清理超期数据;但事实上,memcached不会删除任何已缓存数据,只是在其过期之后不再为客户所见;而且,memcached也不会真正按期限清理缓存,而仅是当get命令到达时检查其时长;
P是PHP的缩写,是一种面向对象的编程语言。
LAMMP的架构拓扑图:
![LAMMP.png 211841557.png]()
此LAMMP架构是分别搭建在不同的服务器上面,在生产环境中,更是应该如此,一台服务器提供多种应用,服务器会很消耗资源,提供服务的性能也会降低。
此架构中各服务器的工作
Apache在此架构中,响应回复用户html的请求
FastCGI是把php程序执行的结果响应给Apache
Memcached是根据用户请求的动态网页文件中是否需要Memcached服务器缓存数据,Memcached是把数据存储在内存中的,速度可想而知了。
Mysql是响应用户是否需写入查询数据
用户的请求资源到获取资源的过程
1、当用户只需要请求web服务器的html页面时,Apache直接响应请求,所经过的过程为1--->8
2、当用户需请求一个web服务器的动态的页面时,Apache把用户请求的php执行程序发送给FastCGI服务器执行,FastCGI把执行的结果返回给Apache服务器,服务器把程序生成的的静态页面响应给客户端。所经过的过程1--->2--->7--->8
3、当用户需要请求的web服务器资源中需要数据时,Apache把用户请求的php执行 程序给FastCGI执行,执行过程中需要对数据进行操作时且Memcached中没有缓存时,FastCGI去请求Mysql服务器的资源,mysql服务器把数据响应给FastCGI,如果此数据需要缓存则FastCGI把数据缓存到Memcached服务器上,然后把数据响应给Apache,Apache生成静态的页面响应给客户端。所经过的过程1--->2--->5--->6[--->3]--->7--->8(如果需要缓存则会经过3过程)
4、当用户需要请求的web服务器资源中需要数据时,Apache把用户请求的php执行程序给 FastCGI执行,执行过程中需要对数据进行操作时Memcached中有缓存时,Memcached直接把 数据响应给FastCGI,然后把数据响应给Apache,Apache生成静态的页面响应给客户端。所经过的过程1--->2--->3--->4--->7--->8
二、LAMMP的实现
Apache服务器所需的软件包
apr-1.4.6.tar.bz2
http://mirror.esocc.com/apache/apr/apr-1.4.6.tar.bz2
apr-util-1.5.2.tar.bz2
http://mirror.esocc.com/apache/apr/apr-util-1.5.2.tar.bz2
httpd-2.4.6.tar.bz2(提供Web服务器的软件包)
http://mirror.esocc.com/apache/httpd/httpd-2.4.6.tar.bz2
由于httpd-2.4的包linux系统中的apr版本不够新,所以需要下载更新的apr相关的包,直接下载源码包进行安装。
FastCGI服务器所需的软件包
libmcrypt
http://mirrors.sohu.com/fedora-epel/6Server/x86_64/libmcrypt-2.5.8-9.el6.x86_64.rpm
libmcypt-devel
http://mirrors.sohu.com/fedora-epel/6Server/x86_64/libmcrypt-devel-2.5.8-9.el6.x86_64.rpm
xcache-3.0.3.tar.bz2 (缓存php执行好的代码,加速opcode)
http://xcache.lighttpd.net/pub/Releases/3.0.3/xcache-3.0.3.tar.bz2
php-5.4.19.tar.bz2 (提供php-fpm(FastCGI)服务的软件包)
http://downloads.php.net/stas/php-5.4.19.tar.bz2
memcache-2.2.7.tgz (FastCGI连接Memcache服务器的软件包)
http://pecl.php.net/get/memcache-2.2.7.tgz
Memcached服务器所需的软件包
libevent-2.0.21-stable.tar.gz
http://nchc.dl.sourceforge.net/project/levent/libevent/libevent-2.0/libevent-2.0.21-stable.tar.gz
memcached-1.4.15.tar.gz (安装Memcached服务器的软件包)
http://memcached.googlecode.com/files/memcached-1.4.15.tar.gz
Mysql服务器所需的软件包
mysql-5.5.33-linux2.6-x86_64.tar.gz
http://downloads.skysql.com/archives/mysql-5.5/mysql-5.5.33-linux2.6-x86_64.tar.gz
安装的是mysql的通用二进制程序包,此软件包解压之后就可以使用
思路:
1、每个服务器的安装操作都是独立,但是最后需要建立关系
2、解决WEB怎么连接PHP-FPM(FastCGI)
3、解决PHP-FPM(FastCGI)怎么连接Memcached
4、解决PHP-FPM(FastCGI)怎么连接Mysql
Apache服务器的配置安装:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
|
[root@jie1 ~]
anaconda-ks.cfg apr-util-1.5.2.
tar
.bz2
install
.log
apr-1.4.6.
tar
.bz2 httpd-2.4.6.
tar
.bz2
install
.log.syslog
[root@jie1 ~]
[root@jie1 ~]
[root@jie1 ~]
[root@jie1 ~]
[root@jie1 ~]
[root@jie1 ~]
httpd-tools-2.2.15-26.el6.centos.x86_64
[root@jie1 ~]
[root@jie1 apr-1.4.6]
[root@jie1 ~]
[root@jie1 apr-util-1.5.2]
[root@jie1 ~]
[root@jie1 httpd-2.4.6]
[root@jie1 ~]
[root@jie1 ~]
prog=httpd
httpd=${HTTPD-
/usr/local/apache/bin/httpd
}
pidfile=${PIDFILE-
/usr/local/apache/logs/
${prog}.pid}
lockfile=${LOCKFILE-
/var/lock/subsys/
${prog}}
RETVAL=0
check13 () {
CONFFILE=
/usr/local/apache/conf/httpd
.conf
[root@jie1 ~]
ServerName 172.16.22.1:80
[root@jie1 ~]
Starting httpd: [ OK ]
[root@jie1 apache]
[root@jie1 apache]
[root@jie1 apache]
[root@jie1 apache]
[root@jie1 apache]
|
FastCGI(php-fpm)服务器的配置安装:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
|
[root@jie2 ~]
anaconda-ks.cfg xcache-3.0.3.
tar
.bz2
install
.log
memcache-2.2.7.tgz php-5.4.19.
tar
.bz2
install
.log.syslog
[root@jie2 ~]
[root@jie2 ~]
[root@jie2 ~]
[root@jie2 ~]
[root@jie2 ~]
[root@jie2 ~]
[root@jie2 php-5.4.19]
[root@jie2 php-5.4.19]
[root@jie2 php]
[root@jie2 php]
[root@jie2 php]
[root@jie2 php]
[root@jie2 etc]
Listen 172.16.22.2:9000
[root@jie2 fpm]
/root/php-5
.4.19
/sapi/fpm
[root@jie2 fpm]
[root@jie2 fpm]
[root@jie2 fpm]
[root@jie2 fpm]
[root@jie2 fpm]
[root@jie2 ~]
[root@jie2 memcache-2.2.7]
[root@jie2 memcache-2.2.7]
Installing shared extensions:
/usr/local/php/lib/php/extensions/no-debug-non-zts-20100525/
extension=
/usr/local/php/lib/php/extensions/no-debug-non-zts-20100525/memcache
.so
[root@jie2 ~]
[root@jie2 xcache-3.0.3]
[root@jie2 xcache-3.0.3]
Installing shared extensions:
/usr/local/php/lib/php/extensions/no-debug-non-zts-20100525/
[root@jie2 xcache-3.0.3]
[root@jie2 xcache-3.0.3]
[root@jie2 xcache-3.0.3]
Gracefully shutting down php-fpm .
done
Starting php-fpm
done
|
Memcached服务器的配置安装
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
|
[root@jie3 ~]
[root@jie3 ~]
anaconda-ks.cfg
install
.log.syslog memcached-1.4.15.
tar
.gz
install
.log libevent-2.0.21-stable.
tar
.gz
[root@jie3 ~]
[root@jie3 ~]
[root@jie3 ~]
[root@jie3 libevent-2.0.21-stable]
[root@jie3 ~]
[root@jie3 libevent]
[root@jie3 libevent]
/usr/local/libevent/lib
:
libevent_core-2.0.so.5 -> libevent_core.so
libevent_openssl-2.0.so.5 -> libevent_openssl.so
libevent_pthreads-2.0.so.5 -> libevent_pthreads.so
libevent-2.0.so.5 -> libevent.so
libevent_extra-2.0.so.5 -> libevent_extra.so
libevent-1.4.so.2 -> libevent-1.4.so.2.1.3
libevent_extra-1.4.so.2 -> libevent_extra-1.4.so.2.1.3
libevent_core-1.4.so.2 -> libevent_core-1.4.so.2.1.3
[root@jie3 libevent]
`
/usr/include/libevent
' -> `/usr/local/libevent/'
[root@jie3 ~]
[root@jie3 ~]
#!/bin/bash
.
/etc/rc
.d
/init
.d
/functions
PORT=
"11211"
USER=
"nobody"
MAXCONN=
"1024"
CACHESIZE=
"64"
IP=
"172.16.22.3"
RETVAL=0
prog=
"/usr/local/memcached/bin/memcached"
desc=
"Distributed memory caching"
lockfile=
"/var/lock/subsys/memcached"
start() {
echo
-n $
"Starting $desc (memcached): "
daemon $prog -d -p $PORT -u $USER -c $MAXCONN -m $CACHESIZE -l $IP
RETVAL=$?
[ $RETVAL -
eq
0 ] && success &&
touch
$lockfile || failure
echo
return
$RETVAL
}
stop() {
echo
-n $
"Shutting down $desc (memcached): "
killproc $prog
RETVAL=$?
[ $RETVAL -
eq
0 ] && success &&
rm
-f $lockfile || 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 $lockfile ] && restart
RETVAL=$?
;;
reload)
reload
;;
status)
status $prog
RETVAL=$?
;;
*)
echo
$
"Usage: $0 {start|stop|restart|condrestart|status}"
RETVAL=1
esac
exit
$RETVAL
[root@jie3 memcached]
[root@jie3 memcached]
[root@jie3 memcached]
[root@jie3 /]
Starting Distributed memory caching (memcached): [ OK ]
[root@jie3 /]
tcp 0 0 172.16.22.3:11211 0.0.0.0:* LISTEN 9802
/memcached
|
Mysql服务器的配置安装:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
|
[root@jie4 ~]
anaconda-ks.cfg
install
.log.syslog
install
.log mysql-5.5.33-linux2.6-x86_64.
tar
.gz
[root@jie4 ~]
[root@jie4 ~]
[root@jie4
local
]
[root@jie4
local
]
mkdir
: created directory `
/mysql
'
mkdir
: created directory `
/mysql/data
'
[root@jie4
local
]
[root@jie4
local
]
[root@jie4
local
]
[root@jie4
local
]
[root@jie4 mysql]
[root@jie4 support-files]
cp
: overwrite `
/etc/my
.cnf'? y
[root@jie4 support-files]
[root@jie4 ~]
thread_concurrency = 4
datadir =
/mysql/data
[root@jie4 support-files]
[root@jie4 scripts]
[root@jie4 scripts]
Starting MySQL........... [ OK ]
[root@jie4
local
]
[root@jie4
local
]
[root@jie4 scripts]
[root@jie4 mysql]
[root@jie4 mysql]
[root@jie4 mysql]
`
/usr/include/mysqld
' -> `/usr/local/mysql/include/'
[root@jie4 mysql]
[root@jie4 mysql]
[root@jie4
local
]
[root@jie4
local
]
mysql>
select
user,password,host from mysql.user;
+------+-------------------------------------------+-----------+
| user | password | host |
+------+-------------------------------------------+-----------+
| root | *84BB5DF4823DA319BBF86C99624479A198E6EEE9 | localhost |
| root | | jie4.com |
| root | | 127.0.0.1 |
| root | | ::1 |
| | | localhost |
| | | jie4.com |
+------+-------------------------------------------+-----------+
6 rows
in
set
(0.00 sec)
mysql> drop user root@
'::1'
;
Query OK, 0 rows affected (0.00 sec)
mysql> drop user root@
'jie4.com'
;
Query OK, 0 rows affected (0.00 sec)
mysql> drop user
''
@
'jie4.com'
;
Query OK, 0 rows affected (0.00 sec)
mysql> drop user
''
@
'localhost'
;
Query OK, 0 rows affected (0.00 sec)
mysql> create user root@
'172.16.%.%'
identified by
'mypass'
;
Query OK, 0 rows affected (0.00 sec)
mysql>
select
user,password,host from mysql.user;
+------+-------------------------------------------+------------+
| user | password | host |
+------+-------------------------------------------+------------+
| root | *84BB5DF4823DA319BBF86C99624479A198E6EEE9 | localhost |
| root | | 127.0.0.1 |
| root | *6C8989366EAF75BB670AD8EA7A7FC1176A95CEF4 | 172.16.%.% |
+------+-------------------------------------------+------------+
3 rows
in
set
(0.01 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
mysql> \q
|
到此为止每个服务器独立提供的服务已经安装搭建完成,现在需要让他们协同一起工作,用户的体验就好像是工作在一台机器上面
1)解决Apache与FastCGI的协同工作
a)Apache服务器的操作
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
[root@jie1 ~]
LoadModule proxy_module modules
/mod_proxy
.so
LoadModule proxy_fcgi_module modules
/mod_proxy_fcgi
.so
Include conf
/extra/httpd-vhosts
.conf
[root@jie1 ~]
<VirtualHost *:80>
DocumentRoot
"/web/htdocs/"
ServerName www.jie.com
<Directory
"/web/htdocs"
>
AllowOverride None
Options None
Require all granted
<
/Directory
>
ProxyRequests Off
ProxyPassMatch ^/(.*\.php)$ fcgi:
//172
.16.22.2:9000
/website/
$1
<
/VirtualHost
>
[root@jie1 ~]
mkdir
: created directory `
/web
'
mkdir
: created directory `
/web/htdocs
'
[root@jie1 ~]
<?php
phpinfo();
?>
[root@jie1 htdocs]
Stopping httpd: [ OK ]
Starting httpd: [ OK ]
[root@jie1 htdocs]
|
b)FastCGI服务器的操作
|
1
2
3
4
5
|
[root@jie2 ~]
[root@jie2 website]
[root@jie2 website]
Gracefully shutting down php-fpm .
done
Starting php-fpm
done
|
c)测试结果
![q1.png 133839137.png]()
2、解决PHP-FPM(FastCGI)怎么连接Memcached
因为我们之前已经在FastCGI安装了连接memcached的软件包memcache且把memcache.so模块装载到php的配置文件中了,这样就实现了PH-FPM(FastCGI)连接Memcached。
a)在Apache服务器上网页存放路径下新建mem.php的测试页面
[root@jie1 htdocs]# cat /web/htdocs/mem.php
<?php
$mem = new Memcache;
$mem->connect("172.16.22.3", 11211);
$mem->set('key','test info');
print_r($mem->get('key'));
print_r($mem->getstats());
?>
b)在FastCGI服务器上面copy mem.php的测试页面
[root@jie2 website]# scp 172.16.22.1:/web/htdocs/mem.php ./
c)测试结果![q2.png 134745994.png]()
在生产环境中是否要用memcached服务器缓存数据,取决于客户请求的php程序,当用户请求的php程序中,开发人员将此程序开发需要请求memcached服务器则会用到memcached服务器来缓存客户的数据。在此仅供测试FastCGI服务器是否能连接memcached服务器。
3、解决PHP-FPM(FastCGI)怎么连接Mysql
PHP-FPM连接mysql,在编译的时候可以加这三个参数,然后PHP-FPM服务器上也可以不用安装mysql也可以连接mysqld服务器。
--with-mysql=mysqlnd --with-pdo-mysql=mysqlnd --with-mysqli=mysqlnd
a)在Apache服务器上网页存放路径下新建testdb.php的测试页面
[root@jie1 htdocs]# cat testdb.php
<?php
$link=mysql_connect('172.16.22.4','root','mypass');
if($link) echo "mysql test success!!";
else echo "mysql test failed!!!";
mysql_close();
?>
b)在FastCGI服务器上面copy testdb.php的测试页面
[root@jie2 website]# scp 172.16.22.1:/web/htdocs/testdb.php ./
c)测试结果
![q3.png 155516216.png]()
自此,已经解决WEB怎么连接PHP-FPM(FastCGI),解决PHP-FPM(FastCGI)怎么连接Memcached,解决PHP-FPM(FastCGI)怎么连接Mysql,LAMMP分别搭建在不同的服务器上且可以协同工作已经完成。
三、LAMMP适用的生产环境
由于memcached只是把数据缓存到内存中,当memcached服务器宕机之后,memcached保存的数据就丢失了,所以在电商站点对session的数据要求严格是memcached服务器不能适用于此生成环境,如果不是电商站点,只是想加快客户访问自己的网站的速度,那memcached所能提供的速度还是很大的,因为数据时直接缓存在内存中了,那速度就可以而知,“尽情期待能保存电商站点的session回话中的数据之Redis架构的搭建”。
本文转自 jie783213507 51CTO博客,原文链接:http://blog.51cto.com/litaotao/1282360,如需转载请自行联系原作者