18.1 lamp简介
有了前面学习的知识的铺垫,今天可以来学习下第一个常用的web架构了。
所谓lamp,其实就是由Linux+Apache+Mysql/MariaDB+Php/Perl/Python的一组动态网站或者服务器的开源软件,除Linux外其它各部件本身都是各自独立的程序,但是因为经常被放在一起使用,拥有了越来越高的兼容度,共同组成了一个强大的Web应用程序平台。
LAMP指的是Linux(操作系统)、Apache(HTTP服务器)、MySQL(也指MariaDB,数据库软件)和PHP(有时也是指Perl或Python)的第一个字母,一般用来建立web应用平台
18.2 Web服务器工作流程
在说lamp架构平台的搭建前,我们先来了解下什么是CGI,什么是FastCGI,什么是......
web服务器的资源分为两种,静态资源和动态资源。
所谓静态资源就是指静态内容,客户端从服务器获得的资源的表现形式与原文件相同。可以简单的理解为就是直接存储于文件系统中的资源
动态资源则通常是程序文件,需要在服务器执行之后,将执行的结果返回给客户端。
那么web服务器如何执行程序并将结果返回给客户端呢?下面通过一张图来说明一下web服务器如何处理客户端的请求
如上图所示
阶段①显示的是httpd服务器(即apache)和php服务器通过FastCGI协议进行通信,且php作为独立的服务进程运行
阶段②显示的是php程序和mysql数据库间通过mysql协议进行通信。php与mysql本没有什么联系,但是由Php语言写成的程序可以与mysql进行数据交互。同理perl和python写的程序也可以与mysql数据库进行交互
18.2.1 cgi与fastcgi
上图阶段①中提到了FastCGI,下面我们来了解下CGI与FastCGI。
CGI(Common Gateway Interface,通用网关接口),CGI是外部应用程序(CGI程序)与WEB服务器之间的接口标准,是在CGI程序和Web服务器之间传递信息的过程。CGI规范允许Web服务器执行外部程序,并将它们的输出发送给Web浏览器,CGI将web的一组简单的静态超媒体文档变成一个完整的新的交互式媒体。
FastCGI(Fast Common Gateway Interface)是CGI的改良版,CGI是通过启用一个解释器进程来处理每个请求,耗时且耗资源,而FastCGI则是通过master-worker形式来处理每个请求,即启动一个master主进程,然后根据配置启动几个worker进程,当请求进来时,master会从worker进程中选择一个去处理请求,这样就避免了重复的生成和杀死进程带来的频繁cpu上下文切换而导致耗时
18.2.2 httpd与php结合的方式
httpd与php结合的方式有以下三种:
a) modules:php将以httpd的扩展模块形式存在,需要加载动态资源时,httpd可以直接通过php模块来加工资源并返回给客户端
httpd prefork:libphp5.so(多进程模型的php)
httpd event or worker:libphp5-zts.so(线程模型的php)
b) CGI:httpd需要加载动态资源时,通过CGI与php解释器联系,获得php执行的结果,此时httpd负责与php连接的建立和断开等
c) FastCGI:利用php-fpm机制,启动为服务进程,php自行运行为一个服务,https通过socket与php通信
较于CGI方式,FastCGI更为常用,很少有人使用CGI方式来加载动态资源
18.2.3 web工作流程
下面来通过上面的图说明一下web的工作流程
客户端通过http协议请求web服务器资源,web资源收到请求后判断客户端请求的资源是静态资源或是动态资源,若是静态资源则直接从本地文件系统取之返回给客户端。否则若为动态资源则通过FastCGI协议与php服务器联系,通过CGI程序的master进程调度worker进程来执行程序以获得客户端请求的动态资源,并将执行的结果通过FastCGI协议返回给httpd服务器,httpd服务器收到php的执行结果后将其封装为http响应报文响应给客户端。在执行程序获取动态资源时若需要获得数据库中的资源时,由Php服务器通过mysql协议与MySQL/MariaDB服务器交互,取之而后返回给httpd,httpd将从php服务器收到的执行结果封装成http响应报文响应给客户端。
18.3 lamp平台构建
18.3.1 通过yum安装方式构建lamp平台
CentOS7下构建lamp:
要安装的程序包:httpd,php,php-mysql,mariadb-server
注意:php要求httpd使用prefork MPM
1
2
3
|
yum -y
install
httpd php php-mysql mariadb-server
systemctl start httpd.service
systemctl start mariadb.service
|
CentOS6下构建lamp:
要安装的程序包:httpd,php,php-mysql,mysql-server
1
2
3
|
yum -y
install
httpd php php-mysql mysql-server
service httpd start
service mysqld start
|
18.3.2 编译安装lamp
http对fastcgi协议的支持:
a) httpd-2.2:需要额外安装fastcgi模块
1
2
3
4
5
6
|
wget https:
//mirrors
.tuna.tsinghua.edu.cn
/apache//httpd/mod_fcgid/mod_fcgid-2
.3.9.
tar
.bz2
tar
xf mod_fcgid-2.3.9.
tar
.bz2
cd
mod_fcgid-2.3.9
.
/configure
.apxs
make
make
install
|
b) httpd-2.4:自带fastcgi模块
安装次序:httpd,MariaDB,php
安装httpd-2.2:
1
2
3
4
5
6
7
8
9
10
11
12
|
cd
/usr/src
wget http:
//mirror
.bit.edu.cn
/apache//httpd/httpd-2
.2.32.
tar
.bz2
tar
xf httpd-2.2.32.
tar
.bz2
cd
httpd-2.2.32
.
/configure
--prefix=
/usr/local/httpd
make
make
install
echo
'PATH=/usr/local/httpd/bin:$PATH'
>
/etc/profile
.d
/httpd
.sh
source
/etc/profile
.d
/httpd
.sh
ln
-s
/usr/local/httpd/include/
/usr/include/httpd
echo
'MANPATH /usr/local/httpd/man'
>>
/etc/man
.config
apachectl start
|
安装MariaDB:
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
|
cd
/usr/src
wget http:
//ftpmirror
.gnu.org
/gcc/gcc-5
.2.0
/gcc-5
.2.0.
tar
.bz2
tar
xf gcc-5.2.0.
tar
.bz2
cd
gcc-5.2.0
.
/contrib/download_prerequisites
yum -y
install
gcc-c++ glibc-static gcc
.
/configure
--prefix=
/usr/local/gcc
--
enable
-bootstrap --
enable
-checking=release --
enable
-languages=c,c++ --disable-multilib
make
-j $(
cat
/proc/cpuinfo
|
grep
'processor'
|
wc
-l)
make
install
echo
'export PATH=/usr/local/gcc/bin:$PATH'
>
/etc/profile
.d
/gcc
.sh
.
/etc/profile
.d
/gcc
.sh
ln
-sv
/usr/local/gcc/include/
/usr/include/gcc
echo
'/usr/local/gcc/lib64'
>
/etc/ld
.so.conf.d
/gcc
.conf
echo
'/usr/local/gcc/lib'
>>
/etc/ld
.so.conf.d
/gcc
.conf
ldconfig -p |
grep
gcc
#验证是否导出头文件
cd
/usr/src
yum
install
-y ncurses-devel openssl-devel openssl cmake mysql-devel
wget
groupadd -r -g 306 mysql
useradd
-r -g 306 -u 306 mysql
mkdir
-pv
/data/mydata
chown
-R mysql.mysql
/data/mydata
tar
xf mariadb-10.2.6.
tar
.gz
cd
mariadb-10.2.6
cmake . -DCMAKE_INSTALL_PREFIX=
/usr/local/mysql
\
-DMYSQL_DATADIR=
/data/mydata
\
-DSYSCONFDIR=
/etc
\
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_ARCHIVE_STORAGE_ENGINE=1 \
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
-DWITH_READLINE=1 -DWITH_SSL=system \
-DWITH_ZLIB=system -DWITH_LIBWRAP=0 \
-DMYSQL_UNIX_ADDR=
/tmp/mysql
.sock \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci
make
-j $(
cat
/proc/cpuinfo
|
grep
'processor'
|
wc
-l)
make
install
|
cmake参数说明:
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
|
# 安装根目录
-DCMAKE_INSTALL_PREFIX=
/usr/local/mysql
# 数据存储目录
-DMYSQL_DATADIR=
/data/mydata
# UNIX socket文件
-DMYSQL_UNIX_ADDR=
/tmp/mysql
.sock
# 配置文件(my.cnf)目录
-DSYSCONFDIR=
/etc
# 默认字符集
-DDEFAULT_CHARSET=utf8
# 默认字符校对
-DDEFAULT_COLLATION=utf8_general_ci
# TCP/IP端口
-DMYSQL_TCP_PORT=3306
# * ARCHIVE 引擎支持
-DWITH_ARCHIVE_STORAGE_ENGINE=1
# * ARIA 引擎支持
-DWITH_ARIA_STORAGE_ENGINE=1
# * BLACKHOLE 引擎支持
-DWITH_BLACKHOLE_STORAGE_ENGINE=1
# * FEDERATEDX 引擎支持
-DWITH_FEDERATEDX_STORAGE_ENGINE=1
# * PARTITION 引擎支持
-DWITH_PARTITION_STORAGE_ENGINE=1
# * PERFSCHEMA 引擎支持
-DWITH_PERFSCHEMA_STORAGE_ENGINE=1
# * SPHINX 引擎支持
-DWITH_SPHINX_STORAGE_ENGINE=1
# * XTRADB 支持
-DWITH_XTRADB_STORAGE_ENGINE=1
# * innoDB 引擎支持
-DWITH_INNOBASE_STORAGE_ENGINE=1
# * Myisam 引擎支持
-DWITH_MYISAM_STORAGE_ENGINE=1
# readline库
-DWITH_READLINE=1
# 启用加载本地数据
-DENABLED_LOCAL_INFILE=1
# 扩展支持编码 ( all | utf8,gbk,gb2312 | none )
-DWITH_EXTRA_CHARSETS=all
# 扩展字符支持
-DEXTRA_CHARSETS=all
# 系统传输使用SSL加密
-DWITH_SSL=system
# 系统传输使用zlib压缩,节约带宽
-DWITH_ZLIB=system
# libwrap库
-DWITH_LIBWRAP=0
# 运行用户
-DMYSQL_USER=mysql
# 调试模式
-DWITH_DEBUG=0
|
配置MariaDB:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
cd
/usr/local/mysql/
scripts
/mysql_install_db
--user=mysql --datadir=
/data/mydata/
echo
'export PATH=/usr/local/mysql/bin:$PATH'
>
/etc/profile
.d
/mysql
.sh
.
/etc/profile
.d
/mysql
.sh
ln
-sv
/usr/local/mysql/include/
/usr/local/include/mysql
echo
'/usr/local/mysql/lib'
>
/etc/ld
.so.conf.d
/mysql
.conf
ldconfig -
v
ldconfig -p |
grep
mysql
cp
support-files
/mysql
.server
/etc/rc
.d
/init
.d
/mysqld
chkconfig --add mysqld
chkconfig mysqld on
cp
support-files
/my-large
.cnf
/etc/my
.cnf
sed
-i
'/\[mysqld\]/a datadir=/data/mydata'
/etc/my
.cnf
service mysqld start
mysql -uroot -e
'GRANT all ON *.* TO root@"localhost" identified by "qwe123!"'
|
安装php:详见18.4.3
18.3.3 测试
php程序执行环境:在/var/www/html目录下新建一个index.php文件,其内容如下:
1
2
3
|
<?php
phpinfo();
?>
|
测试php程序与mysql通信:在/var/www/html目录下新建一个index.php文件,其内容如下:
1
2
3
4
5
6
7
8
9
|
<?php
$conn=mysql_connect(
'HOSTNAME'
,
'USERNAME OF MYSQL'
,
'PASSWORD OF MYSQL USER'
);
if
($conn)
echo
'Connect Success!'
;
else
echo
'Connect Failed!'
;
fi
mysql_close();
?>
|
18.4 php
18.4.1 php解释器与MariaDB/mysql交互
php解释器本身无须与MariaDB交互,只有那些用到数据存储系统的程序才需要与数据存储交互。
常见的数据存储系统有以下这些:
a) 文件系统:存储文件
b) SQL:MariaDB,Oracle,MSSQL,...
c) NoSQL:redis,mongodb,hbase,...
NewSQL
18.4.2 php配置文件
php官网:www.php.net
php加速器:APC,eAccelerator,Xcache,OPcache
配置文件:/etc/php.ini,/etc/php.d/*.ini
php.ini核心配置选项:http://php.net/manual/zh/ini.core.php
php.ini配置选项列表:http://php.net/manual/zh/ini.list.php
配置文件(php.ini)在php启动时被读取。对于服务器模块版本的php,仅在web服务器启动时读取一次。对于CGI和CLI版本,每次调用都会读取
18.4.3 php编译安装
php编译安装步骤:
a) 解决依赖关系
配置好yum源(系统安装湖及Epel源)后执行如下命令:
1
2
3
|
yum -y groupinstall
'Desktop Platform Development'
yum -y
install
epel-release
yum -y
install
bzip2
-devel libmcrypt-devel libxml2-devel
|
b) 编译安装php
1
2
3
4
5
6
|
cd
/usr/src
wget http:
//cn2
.php.net
/distributions/php-5
.6.30.
tar
.xz
xz -d php-5.6.30.
tar
.xz
tar
xf php-5.6.30.
tar
cd
php-5.6.30
.
/configure
--prefix=
/usr/local/php
--with-mysql=
/usr/local/mysql
--with-openssl --with-mysqli=
/usr/local/mysql/bin/mysql_config
--
enable
-mbstring --with-freetype-
dir
--with-jpeg-
dir
--with-png-
dir
--with-zlib --with-libxml-
dir
=
/usr
--
enable
-xml --
enable
-sockets --with-apxs2=
/usr/local/httpd/bin/apxs
--with-mcrypt --with-config-
file
-path=
/etc
--with-config-
file
-scan-
dir
=
/etc/php
.d --with-bz2 --
enable
-maintainer-zts --with-mysql=mysqlnd --with-pdo-mysql=mysqlnd --with-mysqli=mysqlnd --
enable
-opcache
|
说明:
这里为了支持apache的worker或event这两个MPM,编译时使用了--enable-maintainer-zts选项
如果使用PHP5.3以上版本,为了链接mysql数据库,可以指定mysqlnd,这样在本机就不需要先安装mysql或mysql开发包了
mysqlnd从php5.3开始可用,可以编译时绑定到它(而不用和具体的mysql客户端绑定形成依赖),但从php5.4开始它就是默认设置了
1
2
3
4
5
6
|
.
/configure
--with-mysql=mysqlnd --with-pdo-mysql=mysqlnd --with-mysqli=mysqlnd
make
#make test
make
install
echo
'export PATH=/usr/local/php/bin:$PATH'
>
/etc/profile
.d
/php
.sh
.
/etc/profile
.d
/php
.sh
|
c) 为php提供配置文件
1
|
cp
php.ini-production
/etc/php
.ini
|
d) 编辑apache配置文件httpd.conf使其支持php
添加如下两行:
1
2
|
AddType application
/x-httpd-php
.php
AddType application
/x-httpd-php-source
.phps
|
定位至DirectoryIndex index.html,修改为:
1
|
DirectoryIndex index.php index.html
|
而后重启httpd,或让其重新载入配置文件即可测试php是否已经可以正常使用
e) 安装xcache,为php加速(php5.5及以下版本)
安装xcache:
1
2
3
4
5
6
7
|
cd
/usr/src
wget http:
//xcache
.lighttpd.net
/pub/Releases/3
.2.0
/xcache-3
.2.0.
tar
.bz2
tar
xf xcache-3.2.0.
tar
.bz2
cd
xcache-3.2.0
/usr/local/php/bin/phpize
.
/configure
--
enable
-xcache --with-php-config=
/usr/local/php/bin/php-config
make
&&
make
install
|
安装结束时,会出现类似如下行:
1
|
Installing shared extensions:
/usr/local/php/lib/php/extensions/no-debug-zts-20131226/
|
编辑php.ini,整合php和xcache:
首先将xcache提供的样例配置导入php.ini:
1
|
cat
xcache.ini >>
/etc/php
.ini
|
说明:xcache.ini文件在xcache的源码目录中
接下来编辑/etc/php.ini,找到zend_extension开头的行,修改为如下行:
1
|
zend_extension =
/usr/local/php/lib/php/extensions/no-debug-zts-20131226/xcache
.so
|
注意:如果php.ini文件中有多条zend_extension指令行,需确保此新增的行排在第一位
编辑/etc/php.ini,修改以下内容:
1
2
3
4
|
xcache.admin.user =
"admin"
#通过openssl passwd -1 PASSWORD命令生成密码,然后在http://xcache.lighttpd.net/demo/cacher/mkpassword.php页面加密密码
xcache.admin.pass =
"21232f297a57a5a743894a0e4a801fc3"
xcache.mmap_path =
"/tmp/xcache"
|
创建/tmp/xcache文件并赋权:
1
2
|
touch
/tmp/xcache
chmod
777
/tmp/xcache
|
重启httpd:
1
|
apachectl restart
|
然后在phpinfo页面查看是否有xcache模块
f) OPcache(5.5+版本加速)
PHP5.5.0以后版本自带Opcache加速器,但默认情况下未启用。所以编译的使用我们想要启用该PHP加速器就应该添加参数 : –enable-opcache 来制定。
对于已经编译安装了PHP5.5.0以上版本但当初又没有启用该加速器的用户可以像PHP添加模块一样编译添加。步骤如下:
1
2
3
4
|
cd
/usr/src/php-5
.6.30
/ext/opcache
/usr/local/php/bin/phpize
.
/configure
--with-php-config=
/usr/local/php/bin/php-config
make
&&
make
install
|
最后它会告诉你opcache.so已编译成功,放在/usr/local/php/lib/php/extensions/no-debug-zts-20131226/目录下
编辑php.ini文件,配置opcache
vim /etc/php.ini
修改或添加如下代码并保存退出:
1
2
3
4
|