LAMP平台源码编译的实现

  1. 云栖社区>
  2. 博客>
  3. 正文

LAMP平台源码编译的实现

余二五 2017-11-15 16:56:00 浏览669
展开阅读全文

编译环境:

Linux:CentOS 6.5

Aapache: httpd-2.4.9

Mysql: MaraiDB-5.5.32

PHP: php-5.5.26

模式一:web服务器 、数据库服务器、php在同一台服务器

实验拓扑图:

lamp1

在这种模式下,处理客户端的请求过程大致如下:

web介接收到客户端的请求后,如果是静态资源,则直接返回;如果请求的是动态资源,httpd负责处理的这个请求的进程(线程)会通过模块来处理请求,如果请求中会访问数据库会去数据库中取得数据,然后经运行结果返回这个进程,进程将结果返回到客户端。

第一步:源码编译 httpd-2.4.9

1、安装 apr 和 apr-util 依赖包,这里采用源码方式安装。

2、安装其他依赖包,例如:

1
yum install pcer-devel openssl-devel -y

3、安装 httpd-2.4.9

编译参数如下:

1
2
3
4
./configure --prefix=/usr/local/apache --sysconfdir=/etc/httpd24 \
--enable-so --enable-ssl --enable-cgi --enable-rewrite --with-zlib \
--with-pcre --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util \
--enable-modules=most --enable-mpms-shared=all --with-mpm=event

4、提供 httpd 配置文件和服务启动脚本。

这块的内容参照上一篇博客《http-2.4.9源码编译》。

第二步:编译安装 MaraiDB-5.5.32

这里采用的安装方式是采用通用二进制的方式,类似于“绿色软件”。解压后不需要再次编译直接可以使用。具体使用源码编译会使用cmake编译,会在后续的过程中继续介绍。

1、创建用户和组

1
2
groupadd -r mysql
useradd -r -g mysql mysql

2、准备好数据存储的磁盘

为了在使用数据开始提高数据的安全性,建议将数据库的数据存放于独立的磁盘中,使用逻辑卷。

1
2
3
4
5
6
7
8
9
10
pvcreate /dev/sda5 
vgcreate mysqlvg -s 4M /dev/sda5 
lvcreate -n data -m 3 -L MYDATA -L 5G mysqlvg
lvcreate -n data  -L 5G mysqlvg
mke2fs -t ext4 -L MYDATA -m 3 /dev/mysqlvg/data 
mkdir /mydata
mount /dev/mapper/mysqlvg-data /mydata/
mkdir  /mydata/data
chown mysql.mysql /mydata/data/
usermod -m -d /mydata/data

3、安装并初始化MariaDB

解压到/usr/local目录:

1
tar xf mariadb-5.5.32-linux-x86_64.tar.gz -C /usr/local/

创建链接文件,名称为mysql:

1
ln -sv /usr/local/mariadb-5.5.32-linux-x86_64 /usr/local/mysql

改变目录的属主和属组:

1
chown mysql.mysql /usr/local/mysql -R

初始化环境:

1
/usr/local/mysql/scripts/mysql_install_db --user=mysql --datadir=/mydata/data

4、提供主配置文件

1
cp /usr/local/mysql/support-files/my-large.cnf /etc/my.cnf

修改:

1
2
3
[mysqld]
thread_concurrency = 2 #工作的线程数,建议是当前cpu数的2倍
datadir = /mydata/data #添加数据目录

5、提供服务控制脚本

1
2
cp /usr/local/mysqlsupport-files/mysql.server  
/etc/rc.d/init.d/mysqld<BR>chmod +x /etc/rc.d/init.d/mysqld

添加至服务列表:

1
2
chkconfig --add mysqld
chkconfig mysqld on

首次启动时安全保证:这里可以设置 root 密码,删除test库等操作

1
usr/local/mysql/bin/mysql_secure_installation

而后就可以启动服务测试使用了。

6、输出mysql的man手册、头文件、库文件

man:在/etc/man.conf中添加:

1
MANPATH /usr/local/mysql/man

头文件:

1
ln -sv /usr/local/mysql/include /usr/include/mysql

库文件:

1
2
echo /usr/local/mysql/lib” > /etc/ld.conf.d/mysql.conf
ldconfig

7、导出命令

1
echo ”PATH=/usr/local/mysql/bin:$PATH“

4

第三步、编译php-5.5.26

编译后直接作为httpd的模块运行:

1、解决依赖关系

1
2
yum groupinstall “Development tools” "Desktop Platform Development" -y
yum install libmcrypt-devel bizp2-devel libpng-devel

2、编译安装php-5.4.26

1
2
3
4
5
6
7
8
9
tar xf php-5.4.26.tar.bz2
cd php-5.4.26
./configure --prefix=/usr/local/php5 --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/apache/bin/apxs --with-mcrypt  \
 --with-config-file-path=/etc --with-config-file-scan-dir=/etc/php.d \
 --with-bz2  --enable-maintainer-zts

# 这一步可能出现错误,一般都是安装包的问题,解决依赖关系就可以了。

说明:
1、这里为了支持apache的worker或event这两个MPM,编译时使用了--enable-maintainer-zts选项。
2、如果使用PHP5.3以上版本,为了链接MySQL数据库,可以指定mysqlnd,这样在本机就不需要先安装MySQL或MySQL开发包了。mysqlnd从php 5.3开始可用,可以编译时绑定到它(而不用和具体的MySQL客户端库绑定形成依赖),但从PHP 5.4开始它就是默认设置了。
# ./configure --with-mysql=mysqlnd --with-pdo-mysql=mysqlnd --with-mysqli=mysqlnd

1
2
3
make
make test
make intall

为php提供配置文件:

1
cp php.ini-production /etc/php.ini

3、 编辑apache配置文件httpd.conf,以apache支持php
# vim /etc/httpd/httpd.conf
1、添加如下二行

1
2
AddType application/x-httpd-php  .php
AddType application/x-httpd-php-source  .phps

2、定位至DirectoryIndex index.html 
   修改为:

1
DirectoryIndex  index.php  index.html

而后重新启动httpd,或让其重新载入配置文件即可测试php是否已经可以正常使用。

2

测试与数据库通信 index.php示例如下:
3 

四、启用服务器状态

mod_status模块可以让管理员查看服务器的执行状态,它通过一个HTML页面展示了当前服务器的统计数据。这些数据通常包括但不限于:
(1) 处于工作状态的worker进程数;
(2) 空闲状态的worker进程数;
(3) 每个worker的状态,包括此worker已经响应的请求数,及由此worker发送的内容的字节数;
(4) 当前服务器总共发送的字节数;
(5) 服务器自上次启动或重启以来至当前的时长;
(6) 平均每秒钟响应的请求数、平均每秒钟发送的字节数、平均每个请求所请求内容的字节数;

启用状态页面的方法很简单,只需要在主配置文件中添加如下内容即可:

1
2
3
4
<Location /server-status>
    SetHandler server-status
    Require all granted
</Location>

需要提醒的是,这里的状态信息不应该被所有人随意访问,因此,应该限制仅允许某些特定地址的客户端查看。比如使用Require ip 172.16.0.0/16来限制仅允许指定网段的主机查看此页面。

5 

示例:利用搭建好的yum平台安装phpMyAdmin数据库管理软件。

1
2
tar xf phpMyAdmin-3.5.1-all-languages.tar.bz2 -C /usr/local/apache24/htdocs/
mv /usr/local/apache24/htdocs/phpMyAdmin-3.5.1-all-languages/ /usr/local/apache24/htdocs/pma

此时我们就可以访问测试了:

6  7

此时我们可以使用ab工具对web服务器压测:

测试环境:

cpu型号:Intel(R) Core(TM) i3-3110M CPU @ 2.40GHz

内存大小:4G

cpu核心数:4

1
ab -n 10000 -c 1000 http://192.168.1.66/pam/index.php

测试结果:

1
2
3
Requests per second:    424.73 [#/sec] (mean)
Time per request:       2354.452 [ms] (mean)
Time per request:       2.354 [ms] (mean, across all concurrent requests)

五、安装xcache,为php加速:

1、安装

1
2
3
4
5
tar xf xcache-3.0.3.tar.gz
cd xcache-3.0.3
/usr/local/php/bin/phpize
./configure --enable-xcache --with-php-config=/usr/local/php5/bin/php-config
make && make install

安装结束时,会出现类似如下行:
Installing shared extensions:     /usr/local/php5/lib/php/extensions/no-debug-zts-20100525/

2、编辑php.ini,整合php和xcache:

首先将xcache提供的样例配置导入php.ini

1
2
mkdir /etc/php.d
cp xcache.ini /etc/php.d

说明:xcache.ini文件在xcache的源码目录中。

接下来编辑/etc/php.d/xcache.ini,找到zend_extension开头的行,修改为如下行:

1
zend_extension = /usr/local/php/lib/php5/extensions/no-debug-zts-20100525/xcache.so

注意:如果php.ini文件中有多条zend_extension指令行,要确保此新增的行排在第一位。

安装了php加速器后,测试效果大致能提升一倍左右

1
2
3
Requests per second:    1161.31 [#/sec] (mean)
Time per request:       861.096 [ms] (mean)
Time per request:       0.861 [ms] (mean, across all concurrent requests)

模式二:web服务器 、数据库服务器、php在分别在不同服务器

实验拓扑图如下:

9

第一步:在192.168.1.33上安装http-2.4.9

安装过程和模式一一样,这里不再详述。安装完成后只提供服务脚本,先不做其他配置。

测试结果:

10

第二步:在192.168.1.66上安装mariadb-5.5.32

这里使用通用二进制方式安装,与模式一也是一样。

测试结果:

11 

第三步:在192.168.1.99上安装php-5.5.26

此时httpd和php之间通过fcgi协议通信。

在192.168.1.99上:

1、解决依赖关系

1
2
yum -y groupinstall "Desktop Platform Development"  “Development Tools”
yum install -y openssl-devel bzip2-devel libmcrypt-devel

2、安装php-5.4.26

1
2
3
4
5
6
7
8
9
10
tar xf php-5.4.26.tar.bz2 
cd php-5.4.26 
./configure --prefix=/usr/local/php --with-openssl --with-mysql=mysqlnd \
--with-pdo-mysql=mysqlnd --with-mysqli=mysqlnd --enable-mbstring \
--with-freetype-dir --with-jpeg-dir --with-png-dir --with-zlib \
 --with-libxml-dir=/usr --enable-xml --enable-sockets \
 --enable-fpm --with-mcrypt \
 --with-config-file-path=/etc --with-config-file-scan-dir=/etc/php.d \
  --with-bz2 --with-gd --enable-maintainer-zts
make && make install

--with-config-file-scan-dir Set the path where to scan for configuration files

mysqli 扩展允许用户访问由 MySQL 4.1 或更高版本所提供的功能。

pdo:轻量级的统一接口(PHP Data Objects)

为php提供配置文件:

1
cp php.ini-production /etc/php.ini

3、配置php-fpm
为php-fpm提供SysV init脚本,并将其添加至服务列表:

1
2
3
4
cp sapi/fpm/init.d.php-fpm  /etc/rc.d/init.d/php-fpm
chmod +x /etc/rc.d/init.d/php-fpm
chkconfig --add php-fpm
chkconfig php-fpm on

为php-fpm提供配置文件:

1
cp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf

配置fpm的相关选项为你所需要的值,并启用pid文件:

1
2
3
4
5
6
7
pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 2
pm.max_spare_servers = 8
pid = /usr/local/php/var/run/php-fpm.pid 
listen = 192.168.1.99:9000
listen.allowed_clients = 192.168.1.33 # 为了安全开启此设置,默认情况下是都允许连接的

接下来就可以启动php-fpm了:

1
service php-fpm start

验证:

12 

在192.168.1.33上:

1、启用httpd的相关模块

在Apache httpd 2.4以后已经专门有一个模块针对FastCGI的实现,此模块为mod_proxy_fcgi.so,它其实是作为mod_proxy.so模块的扩充,因此,这两个模块都要加载

1
2
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so

2、配置虚拟主机支持使用fcgi

在相应的虚拟主机中添加类似如下两行

1
2
ProxyRequests Off # 开启反向代理
ProxyPassMatch ^/(.*\.php)$ fcgi://192.168.1.99:9000/PATH/TO/DOCUMENT_ROOT/$1

ProxyRequests Off:关闭正向代理
ProxyPassMatch:把以.php结尾的文件请求发送到php-fpm进程,php-fpm至少需要知道运行的目录和URI,所以这里直接在fcgi://192.168.1.99:9000后指明了这两个参数,其它的参数的传递已经被mod_proxy_fcgi.so进行了封装,不需要手动指定。

3、编辑apache配置文件httpd.conf,让apache能识别php格式的页面,并支持php格式的主页

vim /etc/httpd24/httpd.conf

1)、添加如下二行

1
2
AddType application/x-httpd-php  .php
AddType application/x-httpd-php-source  .phps

2)、定位至DirectoryIndex index.html  修改为:

1
DirectoryIndex  index.php  index.html

4、创建站点目录和测试页面

1
mkdir -p /web/vhosts/wordpress

测试结果:

24

结果尽然没有成功。why???

244 

仔细发现是原理的问题,关键的一点是:web服务器接收到关于php的请求后,实际是在哪里执行php程序呢??

出现上述问题是,没有把握好原理。web服务器(192.168.1.33)收到php请求后,使用 fcgi 协议反向代理到 php 应用程序服务器(192.168.1.99)的对应路径下执行相关的 php 程序。

解决办法:

在192.168.1.33:

1
rm -rf /web/vhosts/wordpress/index.php

在192.168.1.99:

1
mkdir -p /web/vhosts/wordpress/

添加测试页面:

1
2
3
4
5
6
7
8
9
10
11
12
cat  << EOF >/web/vhosts/wordpress/index.php
<?php
    $link = mysql_connect('192.168.1.66','guoting','guoting');
    if ($link)
        echo "Success...";
     else
        echo "Failure..."
 
    mysql_close();
    phpinfo();
?>
EOF

测试结果如下:

wKiom1Pu1QnQEr_yAAQdHdQViRc681.jpg

解决了这个问题的话,lamp平台搭建就基本完成。

在192.168.1.99上安装xcache,作法同模式一。安装完成后,确保有这个模块。如下图:

28

示例:

在模式二的平台上搭建drupal。

在192.168.1.33上:

1
unzip /root/wordpress-3.3.1-zh_CN.zip -d /web/vhosts/wordpress/

访问:http://www.wordpress.org/wordpress 根据提示安装,关键步骤如下:   

41  42

360截图20140814205519081

44

这里面好多图片等内容都没有加载到,解决办法之一是:在web服务器上提供相同的资源,如下图

45

 

    至此,lapm平台的搭建基本完成。对于如何解决httpd动静资源的分离,后续会讲解更好的方法。 










本文转自 羊木狼 51CTO博客,原文链接:http://blog.51cto.com/guoting/1540185,如需转载请自行联系原作者

网友评论

登录后评论
0/500
评论
余二五
+ 关注