每个网站都是基于一个环境,然后才能运行,而大多数情况下,应用最多的就是我们的LAMP,其中L指的是Linux,A指的是Apache的httpd,M指的是MySQL,不过我们接下来采用的MariaDB,最后P就是专门用于动态网页开发的PHP了,首先会介绍搭建LAMP的步骤,最后再介绍优化方法。
   
拓扑图如下所示:
分离式LAMP搭建及各类服务实现_LAMP
    
实验环境准备:软件包以及下载地址
Linux主机:CentOS6.5
httpd服务器:
apache:httpd-2.4.9.tar.bz2          http://olex.openlogic.com/packages/apache/2.4.9
apr:apr-1.5.0.tar.bz2               https://apr.apache.org/download.cgi
apr-util:apr-util-1.5.3.tar.bz2     https://apr.apache.org/download.cgi

mariadb服务器:图中的mysql服务器
MariaDB:mariadb-5.5.39.tar.gz         https://downloads.mariadb.org/mariadb/5.5.39/
建议多加一块硬盘,用于存放数据库的数据

php服务器:
php:php-5.4.26.tar.bz2              http://mirrors.sohu.com/php/
xcache:xcache-3.0.3.tar.gz        http://xcache.lighttpd.net/pub/Releases/3.0.3/


注意:DNS服务器也可以搭建在其中任意一台服务器上,但是生成环境下肯定是分离开的

LAMP环境搭建如下:
首先,编译时要用到gcc-c++的编译器,可以把Development Tools这个组包安上或是安装gcc-c++


1、搭建httpd的web服务器
httpd所依赖的软件为apr和apr-util,所有,我们要把这两个包装上
安装apr软件包

[root@localhost src]# tar jxf apr-1.5.0.tar.bz2
[root@localhost src]# cd apr-1.5.0
[root@localhost apr-1.5.0]# ./configure  - -prefix=/usr/local/apr
[root@localhost apr-1.5.0]# make && make install

中间如果遇到问题建议google搜索

安装apr-util的软件包

[root@localhost src]# tar jxf apr-util-1.5.3.tar.bz2
[root@localhost src]# cd apr-util-1.5.3
[root@localhost apr-util-1.5.3]# ./configure  - -prefix=/usr/local/apr-util  - -with-apr=/usr/local/apr/                #这个要将前面的apr一起编译进去
[root@localhost apr-util-1.5.3]# make && make install

安装httpd软件包,要求原有的rpm包安装的httpd服务已经停止

[root@localhost src]# tar jxf httpd-2.4.9.tar.bz2
[root@localhost src]# cd httpd-2.4.9

我们可以使用下面的命令,查看configure的参数选项

[root@localhost httpd-2.4.9]# ./configure –help
[root@localhost 
httpd-2.4.9]# ./configure  --prefix=/usr/local/apache  --sysconfdir=/etc/httpd2 
    --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- -enable-so:允许动态加载模块(prefork,worker,event)
--with-mpm=event:这里使用的event时间模块

以下是我出现的错误及解决方法:
configure: error: pcre-config for libpcre not found. PCRE is required and available from http://pcre.org/
这是由于缺少pcre的开发包所导致的错误
解决办法,安装pcre的开发包

[root@localhost ~]# yum install -y pcre-devel

没有问题出现后,进行编译、安装

[root@localhost httpd-2.4.9]# make && make install

然后,将命令加入到PATH环境变量中去      

[root@localhost httpd-2.4.9]# vim /etc/profile.d/httpd.sh
export PATH=/usr/local/apache/bin:$PATH          #加入这行
[root@localhost httpd-2.4.9]# source /etc/profile.d/httpd.sh      #重读一下这个文件

将man手册页加入到系统中

[root@localhost httpd-2.4.9]# vim /etc/man.config
MANPATH /usr/local/apache/man

时间有些长,耐心等待就好,httpd的编译结束,启动服务

[root@localhost httpd-2.4.9]# apachectl start

服务启动后,我们在浏览器里输入IP地址进行验证
分离式LAMP搭建及各类服务实现_LAMP_02

2、搭建MariaDB的数据库服务器,我们这里采用二进制的安装包安装
进程运行的用户,如果权限过大,万一服务被劫持,就会给服务器和机房内的其他服务器造成严重的威胁,所有,mariadb服务运行于mysql用户之下

创建mysql的用户和组:

[root@localhost ~]# groupadd -r mysql
[root@localhost ~]# useradd -g mysql -r mysql

将安装包解压至/usr/local目录下

[root@localhost src]# tar zxf mariadb-5.5.36-linux-x86_64.tar.gz -C /usr/local/

为mariadb服务器提供一个存放数据的目录,用另一个磁盘,用逻辑卷的形式挂载后利用

[root@localhost local]# fdisk /dev/sdb                      #格式成LVM的格式
[root@localhost local]# fdisk -l /dev/sdb
Disk /dev/sdb: 21.5 GB, 21474836480 bytes
255 heads, 63 sectors/track, 2610 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0xca6e1b9a
 
   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1               1        2610    20964793+  8e  Linux LVM将上面的磁盘做成逻辑卷:
[root@localhost local]# pvcreate /dev/sdb1
dev_is_mpath: failed to get device for 8:17
Physical volume "/dev/sdb1" successfully created
[root@localhost local]# vgcreate myvg /dev/sdb1
Volume group "myvg" successfully created
[root@localhost local]# lvcreate -L 15G -n mylv myvg
Logical volume "mylv" created
[root@localhost local]# lvs
LV   VG   Attr       LSize  Pool Origin Data%  Move Log Cpy%Sync Convert
mylv myvg -wi-a—– 15.00g

将逻辑卷格式化后,进行挂载使用:

[root@localhost local]# mke2fs -t ext4 -b 2048 -m 3 -L MYSQL /dev/myvg/mylv

创建挂载的目录:/MySQL,使其开机后都自动挂载

[root@localhost local]# mkdir /MySQL
[root@localhost local]# vim /etc/fstab
LABEL=MYSQL             /MySQL                  ext4    defaults        0 0
[root@localhost local]# mount –a               #让fstab下的挂载选项生效

可以使用mount命令查看,是否已经挂载成功

对解压后的mariadb的文件夹进行如下操作

[root@localhost local]# cd /usr/local/
[root@localhost local]# ln -sv mariadb-5.5.36-linux-x86_64/ mysql          #做一个软链接

给mariadb服务提供配置文件和启动脚本

[root@localhost local]# cd mysql/support-files/
[root@localhost support-files]# mkdir /etc/mysql               #存放配置文件的目录
[root@localhost support-files]# cp my-large.cnf /etc/mysql/my.cnf           #配置文件
[root@localhost ~]# mkdir /MySQL/data                #提供数据存放目录
[root@localhost ~]# vim /etc/mysql/my.cnf             #编辑配置文件,加入如下配置,在mysqld中
  datadir = /MySQL/data         #指定数据存放的位置[root@localhost support-files]# cp mysql.server /etc/rc.d/init.d/mysqld           #提供启动脚本
[root@localhost support-files]# chkconfig –add mysqld                            #加入开机启动选项
[root@localhost support-files]# chkconfig –list mysqld
mysqld           0:off       1:off       2:on 3:on 4:on 5:on 6:off

初始化mariadb服务

[root@localhost mysql]# ./scripts/mysql_install_db –user=mysql –datadir=/MySQL/data/

启动mariadb服务

[root@localhost mysql]# service mysqld start
Starting MySQL…                                          [  OK  ]

查看3306端口是否在监听

[root@localhost mysql]# ss -tnlp

 
3、以fpm的形式安装php服务器

安装php的软件包

[root@localhost src]# tar jxf php-5.4.26.tar.bz2
[root@localhost 
php-5.4.26]# ./configure  --prefix=/usr/local/php  - -with-mysql=mysqlnd  --with-openssl  - -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  --enable-maintainer-zts

这里用了mysqlnd,表明的是本机就不需要先安装MySQL或MySQL开发包了
由于上面的apache编译时采用的event模式,所以,编译php时,这个选项一定要加:--enable-maintainer-zts

出现的错误如下:
configure: error: xml2-config not found. Please check your libxml2 installation.
这是libxml2的开发包没有安装,解决方法如下:

[root@localhost ~]# yum install -y libxml2-devel

configure: error: Please reinstall the BZip2 distribution
是由于bzip2的开发包没有安装,安装即可

[root@localhost ~]# yum install -y bzip2-devel

configure: error: mcrypt.h not found. Please reinstall libmcrypt.
这是因为libmcrypt的开发库没有,安装就行了

[root@localhost ~]# yum install -y libmcrypt-devel

进行编译安装

[root@localhost php-5.4.26]# make && make install

接下来为php-fpm提供配置文件

[root@localhost php-5.4.26]# cp php.ini-production /etc/php.ini

提供php-fpm的启动脚本,并设为开机启动选项

[root@localhost php-5.4.26]# cp sapi/fpm/init.d.php-fpm /etc/rc.d/init.d/php-fpm
[root@localhost php-5.4.26]# chmod a+x /etc/rc.d/init.d/php-fpm            #添加执行权限
[root@localhost php-5.4.26]# chkconfig –add php-fpm
[root@localhost php-5.4.26]# chkconfig –list php-fpm
php-fpm          0:off       1:off       2:on 3:on 4:on 5:on 6:off

为php-fpm提供一个配置文件

[root@localhost ~]# cd /usr/local/php/etc/
[root@localhost etc]# mv php-fpm.conf.default php-fpm.conf       #更改名称,作为php-fpm的配置文件

配置php-fpm的配置文件

[root@localhost etc]# vim php-fpm.conf            #更改内容如下所示
[global]
pid = /usr/local/php/var/run/php-fpm.pid
;;;;;;;;;;;;;;;;;;;;
; Pool Definitions ;
;;;;;;;;;;;;;;;;;;;;
listen =172.16.0.0:9000        #监听172.16这个段地址的9000端口
pm.max_children = 20          #每个进程启动多少个线程
pm.start_servers = 4             #启动的进程数目
pm.min_spare_servers = 2            #最小的空闲进程数
pm.max_spare_servers = 6           #最大的空闲进程数

其他的配置默认不变

接下来,我们就可以启动php-fpm服务了

[root@localhost etc]# service php-fpm start

查看服务是否已经启动:

[root@localhost etc]# ss –tlnp              #9000的端口是否监听

 
4、安装DNS服务器,这里,我就在httpd的服务器上进行的
安装DNS软件,即bind

[root@localhost ~]# yum install bind

我们下面要用到的域名有:
wp.test.com
pma.test.com
dpl.test.com

 
编辑DNS的主配置文件,更改如下:

[root@localhost ~]# vim /etc/named.conf
options {
       directory       "/var/named";   
       recursion yes;
};
zone "." IN {
        type hint;
        file "named.ca";
};
include "/etc/named.rfc1912.zones";

然后再辅配置文件下,加入test.com这个域

[root@localhost ~]# vim /etc/named.rfc1912.zones
zone "test.com" IN {
        type master;
        file "test.com.zone";
};

新建区域文件,如下所示,在/var/named目录下

$TTL    3600
$ORIGIN  test.com.
@       IN      SOA     ns.test.com. admin.test.com. (
        2014081301
        2H
        10M
        5D
        1D
)
        IN      NS      ns
ns      IN      A       172.16.30.30
wp      IN      A       172.16.30.30
pma     IN      A       172.16.30.30
dpl     IN      A       172.16.30.30

 
将客户端的DNS服务器选项指定到上方的DNS服务器的地址


实验测试要求:
提供wordpress博客服务,要求基于用户名认证(用户名luffy,密码luffy),是虚拟主机搭建
wordpress-3.3.1-zh_CN.zip

提供phpMyadmin的数据库页面管理工具,是基于https的,要有证书认证
phpMyAdmin-3.5.1.tar.bz2

提供drupal的服务,要求提供查看服务器情况,即server-status

准备工作:
    在php的服务器上,创建/web/wp,/web/pma,和/web/dpl三个目录
    为了保持一致,我们在httpd的服务也创建上面的三个目录,具体步骤略。


1、基于虚拟主机,搭建wordpress,实现验证功能
编辑httpd服务器里的httpd配置文件
 
先将DocumentRoot注释,并且启用模块,并做如下更改

LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so
LoadModule vhost_alias_module modules/mod_vhost_alias.so

加载httpd-vhosts.conf这个配置文件

Include /etc/httpd2/extra/httpd-vhosts.conf

更改:识别index.php作为主页

<IfModule dir_module>
    DirectoryIndex index.html    index.php
</IfModule>

添加:使其能解析php

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

之后编辑extra下的httpd-vhosts.conf,编辑更改如下:

<VirtualHost *:80>
    DocumentRoot "/web/wp"
    ServerName wp.test.com
    ProxyRequests Off
    ProxyPassMatch ^/(.*\.php)$ fcgi://172.16.30.40:9000/web/wp/$1
        <Directory "/web/wp">
            Options none
            AllowOverride AuthConfig
            AuthType Basic
            AuthName "WordPress authorization"
            AuthUserFile /etc/httpd2/.htpasswd
            Require user luffy
        </Directory>
</VirtualHost>

    然后,先在php的服务器上存放wordpress的程序包,等程序运行一段时间后,
拷贝到httpd的服务器上,这样是为了数据的一致性,安装时,请求的是php文件,
php服务器与数据库进行交互,之后才能从php服务器拷贝过去

同时,要在mariadb数据库服务器里添加一个库,名为wpdb,操作如下

MariaDB [(none)]> CREATE DATABASE wpdb;
Query OK, 1 row affected (0.00 sec)
MariaDB [(none)]> GRANT ALL ON wpdb.* TO wpadmin@localhost IDENTIFIED BY '123';
Query OK, 0 rows affected (0.00 sec)
MariaDB [(none)]> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)

然后解压wordpress安装包,将wp-config-sample.php重命名为wp-config.php
[root@localhost wp]# vim wp-config.php
更改如下图所示:而且要php服务器和httpd服务器的wp-config.php配置一致
分离式LAMP搭建及各类服务实现_分离式_03
重启httpd服务器后,在浏览器上进行验证:

[root@localhost wp]# apachectl stop && apachectl start

分离式LAMP搭建及各类服务实现_LAMP_04
分离式LAMP搭建及各类服务实现_LAMP_05
然后,访问wordpress的主页,在浏览器输入http://wp.test.com
分离式LAMP搭建及各类服务实现_分离式_06

基于openssl建立https的web服务器,对phpmyadmin程序进行加密

基于openssl的网页加密,要有证书才行,这里,我们先自建CA,签发证书
建立CA前的准备

[root@localhost ~]# cd /etc/pki/CA/            #CA的目录
[root@localhost CA]# touch index.txt
[root@localhost CA]# touch serial
[root@localhost CA]# echo 01 > serial

建立CA,自签证书

[root@localhost CA]# (umask 077; openssl genrsa -out private/key.pem 2048)
[root@localhost CA]# openssl req -new -x509 -key key.pem -out cacert.pem -days 365
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
—–
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:HA
Locality Name (eg, city) [Default City]:ZZ
Organization Name (eg, company) [Default Company Ltd]:wlzx
Organizational Unit Name (eg, section) []:ops
Common Name (eg, your name or your server's hostname) []:pma.test.com 
Email Address []:admin@test.com
为httpd服务器生成密钥,生成证书:
[root@localhost CA]# cd /usr/local/apache/
[root@localhost apache]# mkdir ssl
[root@localhost apache]# cd ssl/
[root@localhost ssl]# (umask 077;openssl genrsa -out httpd.key 2048)                 #生成公钥
[root@localhost ssl]# openssl req -new -key httpd.key -out httpd.csr                  #生成请求
其他的与上面几乎一致,下面如下,直接回车,不要输入任何信息
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
 
[root@localhost ssl]# openssl ca -in httpd.csr -out httpd.crt -days 365             #CA签署证书

编辑httpd程序的主配置文件,启用以下两个注释

[root@localhost ~]# vim /etc/httpd2/httpd.conf
LoadModule ssl_module modules/mod_ssl.so             #加载ssl的模块
Include /etc/httpd2/extra/httpd-ssl.conf             #加载ssl的配置文件
LoadModule socache_shmcb_module modules/mod_socache_shmcb.so

配置ssl的配置文件

[root@localhost httpd2]# vim /etc/httpd2/extra/httpd-ssl.conf            #修改如下所示
       <VirtualHost _default_:443>
 
        DocumentRoot "/web/pma"
        ServerName pma.test.com:443
        ProxyRequests Off
        ProxyPassMatch ^/(.*\.php)$ fcgi://172.16.30.40:9000/web/pma/$1
        <Directory "/web/pma">
            Options none
            AllowOverride none
            Require all granted
        </Directory>
      
       SSLCertificateFile "/usr/local/apache/ssl/httpd.crt"
       SSLCertificateKeyFile "/usr/local/apache/ssl/httpd.key"

然后,在httpd服务器和php服务器里的/web/pma目录中都拷贝phpmyadmin的软件
都解压出来,放在pma目录下

tar jxf phpMyAdmin-3.5.1.tar.bz2
[root@localhost pma]# cd phpMyAdmin-3.5.1-all-languages/
[root@localhost pma]# mv * ./..
[root@localhost pma]# cd ..
[root@localhost pma]# rm -rf phpMyAdmin-3.5.1-all-languages/

编辑phpmyadmin的配置文件,使其连上mariadb服务器,只需要改php服务上的

[root@localhost pma]# cp config.sample.inc.php config.inc.php
[root@localhost pma]# vim config.inc.php
$cfg['Servers'][$i]['host'] = '172.16.30.50';    #将localhost改成mariadb的服务器地址

完成后,重启httpd服务,在浏览器里测试输入:https://pma.test.com
分离式LAMP搭建及各类服务实现_LAMP_07

我们要先修改phpmyadmin这个程序的配置文件,使其可以跟mariadb数据库交互

[root@localhost pma]# cp config.sample.inc.php config.inc.php 
[root@localhost pma]# vim config.inc.php    #更改如下
$cfg['Servers'][$i]['host'] = '172.16.30.50';

我们可以通过ftp把证书下载下来,导入到本机,关闭浏览器后,再次访问
分离式LAMP搭建及各类服务实现_LAMP_08
上面输入用户名密码之后,就能登入到mariadb的数据库服务器上了
分离式LAMP搭建及各类服务实现_LAMP_09


提供drupal的服务,另附查看httpd服务器状态功能
编辑httpd服务的虚拟主机的配置文件,添加如下内容

<VirtualHost *:80>
    DocumentRoot "/web/dpl"
    ServerName dpl.test.com
    ProxyRequests Off
    ProxyPassMatch ^/(.*\.php)$ fcgi://172.16.30.40:9000/web/dpl/$1
        <Directory "/web/dpl">
            Options none
            AllowOverride none
            Require all granted
        </Directory>
        <Location "/status">
            SetHandler server-status
            Require all granted
        </Location>
</VirtualHost>

将drupal的程序包分别下载到php服务器和httpd服务器的/web/dpl目录下
然后解压缩,将程序包的所有内容放到dpl目录下,参考上方对phpmyadmin的操作
 
更改drupal连接mariadb的配置文件,如下所示

[root@localhost dpl]# vim  sites/default/default.settings.php

取消斜杠注释符,修改如下内容

* array(
 *   'driver' => 'mysql',
 *   'database' => 'dpl',
 *   'username' => 'dpladmin',
 *   'password' => '123',
 *   'host' => '172.16.30.50',
 *   'port' => 3306,
 *   'prefix' => 'myprefix_',
 *   'collation' => 'utf8_general_ci',
 * );

这个过程并不是很难,只是加了一个Location,指定了status
重启httpd服务后,在浏览器上输入:http://dpl.test.com
分离式LAMP搭建及各类服务实现_分离式_10
然后再次输入:http://dpl.test.com/status,效果如下所示
分离式LAMP搭建及各类服务实现_LAMP_11