前面几篇中分别简单介绍了web服务的基本原理、基本配置、简单编译安装以及LAMP的基本概念工作模型。
本篇博文将尝试在四台主机上分别编译安装httpd(2台)、php、mysql,实现一套LAMP框架下工作的web服务。httpd与php服务器通过fastcgi实现互联;php与mysql通过msqlnd实现互联;httpd服务器间使用nfs共享数据,nfs部署在php服务器上(刚好也能实现动态页面解析)。
基本内容如下:
httpd的编译安装
mysql的安装
php的编译安装
nfs配置
联机配置调试
一、全局规划
如图所示,共有四台主机,两台httpd主机,一台php主机(nfs共享磁盘也在此服务器上)、mysql数据库服务器。实验环境,centos6.5,x86_64。编译安装环境均安装好“Developmnet Tools和“Server PlatForm Development”包组。有特殊环境有求的,具体章节会给出。怎样安装这些包组不再详细讲解。(注:所有使用yum源安装的支持包组,均使用epel源进行安装,朋友们可以自行修改yum配置文件,连接epel的yum源进行安装)
httpd服务器 | 2台,准备安装包apr-1.5.0.tar.bz2,apr-util-1.5.3.tar.bz2,httpd-2.4.9.tar.bz2 | 主要负责静态页面显示,动态页面请求转发 |
php服务器 | 1台,准备安装包php-5.4.26.tar.bz2, | 主要负责php页面解析,同时部署nfs共享磁盘,放置动态页面和静态页面,供httpd服务器使用。 |
mysql | 1台,通过安装包mysql-5.5.33-linux2.6-x86_64.tar.gz。此处要注意安装包的平台匹配 | 负责提供数据库服务 |
这里要密切注意的是服务器配置安装的顺序问题,如果是在同一台机器上安装所有的服务,那么就必须把php放到最后,这里,我们分别置于不同的主机上,因此没有太多的顺序要求,但是,由于测试等需求,建议先安装httpd、mysql然后再安装php。
二、httpd的编译安装
这个系列已经讲过httpd的编译安装了,这里为了博文的连贯性,仍然给出安装配置过程。
1、 准备好编译安装环境,安装pcre-devel包,这个是依赖包,可以直接使用epel的yum源进行安装。
# yum -y install pcre-devel
2、安装apr包
#解压包 [root@station145 ~]# tar xf apr-1.5.0.tar.bz2 切换到包目录 [root@station145 ~]# cd apr-1.5.0 配置环境,指定安装路径 [root@station145 apr-1.5.0]# ./configure --prefix=/usr/local/apr #编译安装 [root@station145 apr-1.5.0]# make && make install
3、安装apr-util包
#解压包 [root@station145 ~]# tar xf apr-util-1.5.3.tar.bz2 #切换工作目录 [root@station145 ~]# cd apr-util-1.5.3 #配置环境,指定安装目录,指定apr目录 [root@station145 apr-util-1.5.3]# ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr/ #编译安装 [root@station145 apr-util-1.5.3]# make && make install
4、解压安装httpd2.4
#解压包 [root@station145 ~]# tar xf httpd-2.4.9.tar.bz2 #切换工作目录 [root@station145 ~]# cd httpd-2.4.9 #配置工作环境,设置各种配置,生成makefile文件 [root@station145 httpd-2.4.9]# ./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 #编译安装 [root@station145 httpd-2.4.9]# make && make install
这里要重点解释下配置环境中的各参数的意义
--prefix=/usr/local/apache | 指定程序安装路径 |
--sysconfdir=/etc/httpd24 | 指定配置文件路径 |
-enable-so | 使用动态共享库 |
--enable-ssl | 使用ssl功能 |
--enable-cgi | 使用cgi功能 |
--enable-rewrite | 使用url重写功能 |
-- with -zlib
|
使用zlib压缩库 |
-- with -pcre
|
|
-- with -apr=/usr/local/apr
|
指定apr安装路径 |
-- with -apr-util=/usr/local/apr-util/
|
指定apr-util安装路径 |
--enable-modules=most | 启动使用大部分的模块,也可以使用all值 |
--enable-mpms-shared=all | 启动mpm功能 |
-- with -mpm=event
|
指定默认启动的mpm模型 |
5、提供服务脚本
我们可以每次开机后都手动去启动httpd服务,这个很明显不符合我们的正常需求,因此我们需要给httpd2.4提供服务脚本(服务脚本是什么等概念这里不再具体讲解),并且加到系统自动启动服务中。
我们可以自己手工编写脚本,也可以使用httpd2.2(centos系统自自带的httpd服务)的服务脚本,稍加修改,就可以为httd24服务了。
这里我借用了httd2.2的服务脚本,进行简单修改。为了区别原有的服务脚本httpd,这里复制httpd为httpd24 注意:服务脚本存放在/etc/init.d目录下,必须要可执行权限
#复制旧的脚本,新的脚本为httpd24 [root@station145 ~]# cp /etc/init.d/httpd /etc/init.d/httpd24 [root@station145 ~]# vim /etc/init.d/httpd24
修改其中的部分内容,主要是相关路径
#httpd24的安装路径为/usr/local/apache,且没有sbin,只有bin因此修改下面的路径为当前路径 apachectl=/usr/local/apache/bin/apachectl httpd=${HTTPD-/usr/local/apache/bin/httpd} prog=httpd #设定pid文件路径 pidfile=${PIDFILE-/var/run/httpd24.pid} #设定所文件路径 lockfile=${LOCKFILE-/var/lock/subsys/httpd24}
添加在系统服务
#添加至系统服务 [root@station145 ~]# chkconfig --add httpd24 #查看是否添加成功 [root@station145 ~]# chkconfig --list httpd24 httpd24 0:off 1:off 2:off 3:off 4:off 5:off 6:off #开机自动启动 [root@station145 ~]# chkconfig httpd24 on
6、修改配置文件
主要是添加一条PidFile的文件路径。这里系统读取PidFile的顺序是配置文件、服务脚本,如果配置文件没有,再去找服务脚本。
#修改配置文件 [root@station145 ~]# vim /etc/httpd24/httpd.conf #添加一行 PidFile "/var/run/httpd24.pid"
7、导出二进制命令
需要将httpd24的命令导入到PATH环境变量中,否则每次都需要写完整路径。在/etc/profile.d下创建新的配置文件httpd24.sh
#创建新的配置文件 [root@station145 ~]# vim /etc/profile.d/httpd24.sh #导出命令 export PATH=/usr/local/apache/bin:$PATH 重读配置文件 [root@station145 ~]# . /etc/profile.d/httpd24.sh 查看是否成功 [root@station145 ~]# export $PATH
8、导出头文件
可能会有其他程序调用httd24的头文件,因此将其导入到系统中是至关重要的。我们使用软连接的方式添加到系统中。
[root@station145 ~]# ln -sv /usr/local/apache/include/ /usr/include/httpd `/usr/include/httpd‘ -> `/usr/local/apache/include/‘
9、导出man手册
man手册存放在httpd24的安装目录中,要想查看到需要在配置文件中添加查找路径
#配置man的配置文件 [root@station145 ~]# vim /etc/man.config #添加路径 MANPATH /usr/local/apache/man
10、测试是否成功
启动httpd24服务,service httpd24 start
在浏览器中输入http://172.16.37.4 可以成功看到
It works!
说明安装配置成功,如果没有出现,说明还有些问题,可以结合/usr/local/apache/logs里的错误日志来排查。
同理,将172.16.37.7也配置成web前端服务器。
三、mysql的安装
切换到172.16.37.2主机
由于mysql的编译安装比较麻烦,此出采用mysql的二进制安装包进行安装,要注意,一定要对应好安装包与系统的版本。
1、获取安装包,解压
#解压 [root@station75 ~]# tar xf mysql-5.5.33-linux2.6-x86_64.tar.gz
2、准备程序路径
我们将加压好的程序包(由于是二进制包,这里直接拷贝过去即可)
#拷贝到程序目录下 [root@station75 ~]# cp -r mysql-5.5.33-linux2.6-x86_64 /usr/local/
后期我们可能会到mysql进行升级,这样,其他引用这个安装路径的配置文件都需要修改,因此我们创建一个软件连接,一旦源程序包发生改变,我们只需重新生成链接即可。
#注意,此是所在的目录是/usr/local/ [root@station75 local]# ln -sv mysql-5.5.33-linux2.6-x86_64/ mysql `mysql‘ -> `mysql-5.5.33-linux2.6-x86_64/‘ #将全部文件属主属组改为mysql [root@station75 mysql]# chown mysql:mysql *
3、准备data目录
切换到mysql目录中,可以看到有目录data,这个目录是存放数据库数据的目录,后期数据量多的情况下,会占用大量的磁盘空间,并且对安全性、可扩展性要求也很高。因此,我们新 建分区,做成逻辑卷,开机自动挂载之某目录作为mysql的data目录,此处,我在根目录下创建目录/data,将做好的逻辑卷挂载至此目录上,在其下创建子目录data作为数据库的存放目录。(创建逻辑卷的过程将会占据大量篇幅,这里不做具体演示)
4、创建新的用户组和用户
mysql数据库由于多数情况下对安全行要求等较高,我们为它新建用户mysql,及用户组msyql,让其运行在较为安全的上下文中。
#添加组 [root@station75 ~]# groupadd -r mysql #添加系统用户 [root@station75 data]# [root@station75 data]# useradd -g mysql -r -s /sbin/nologin -M -d /data/data/ mysql #修改属主属组 [root@station75 data]# chown -R mysql:mysql /data/data/
5、初始化数据库
初始化数据库,进行建立系统库、系统用户等一系列操作。
#这里要注意的是不要切换到scripts目录中去,因为这里要调用bin下面的一个命令来执行这个脚本,如果切换到scriptes目录下,就找到不这个命令了 [root@station75 mysql]# scripts/mysql_install_db --datadir=/data/data/ --user=mysql
查看/data目录下文件
mysql performance_schema test 这些都是系统初始化后生成的文件。
6、提供服务脚本
在二进制包中开发人员已经提供了服务脚本,直接复制使用即可。若是编译安装,则不会有该服务脚本。
#安装包中提供的服务脚本路径为/usr/local/mysql/support-files/mysql.server [root@station75 ~]# cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld #将其添加到系统服务 [root@station75 ~]# chkconfig --add mysqld #检查系统服务 [root@station75 ~]# chkconfig --list mysqld mysqld 0:off 1:off 2:on 3:on 4:on 5:on 6:off
7、提供配置文件
同样,安装包体贴的为我们提供了配置文件,此处复制配置文件至/etc下,修改数据存放路径即可。
#安装包给我们提供了多个配置文件,此处使用my-large.cnf [root@station75 ~]# cp /usr/local/mysql/support-files/my-large.cnf /etc/my.cnf cp: overwrite `/etc/my.cnf‘? y 由于系统默认自带有mysql数据库,因此会有旧的配置文件,这里覆盖即可。 #修改配置文件,找到thread_concurrency,将其修改为cpu核心数X2的数字 thread_concurrency = 4 #添加新行,指定mysql数据文件的存放位置 datadir = /data/data
8、测试是否安装成功
[root@station75 ~]# /usr/local/mysql/bin/mysql #这里可以导出二进制命令,就不用写全部的路径了
如果能进入mysql的交互式界面,说明配置成功
9、导出二进制程序
同httpd
#新建文件 [root@station75 ~]# vim /etc/profile.d/mysql.sh export PATH=/usr/local/mysql/bin:$PATH #重新读取配置文件 [root@station75 ~]# . /etc/profile.d/mysql.sh
10、导出头文件
同httpd操作
[root@station75 ~]# ln -sv /usr/local/mysql/include/ /usr/include/mysql `/usr/include/mysql‘ -> `/usr/local/mysql/include/‘
11、导出库文件
导出库文件,以方便其他程序调用
#新建文件 [root@station75 ~]# vim /etc/ld.so.conf.d/mysql.conf 编辑内容如下 /usr/loca/mysql/lib #重新加载库文件(有缓存) [root@station75 ~]# ldconfig
11、导出man手册
同httpd
[root@station75 ~]# vim /etc/man.config MANPATH /usr/local/mysql/man
12、后续操作
在配置完成后,还有一些操作需要,主要有删除系统中的匿名用户、本地用户,并且给用户加上密码,以保证安全。
进入mysql交互模式 mysql> use mysql mysql> drop user ‘‘@‘localhost‘; 删除用户,这里不再一一操作。
为了让后期的php连接数据,这里我们创建一个php的帐号,赋权限到系统自带的test数据库上
mysql> grant all privileges on test to ‘php‘@‘172.16.37.3‘ identified by ‘1‘; #授权给172.16.37.3主机上,用户php,密码1
四、php编译安装
切换到172.16.37.3主机
php安装时我们采用fpm而不是编译成apache模块的方式
1、准备安装环境
需要安装包组X Software Development
[root@station75 ~]# yum groupinstall -y "X Software Development" #有的系统已经事先安装好了 bzip2-devel libmcrypt-devel,libxml2-deve这两个包也需要安装
2、解压源码包,监测环境,生成makefile文件
[root@localhost ~]# tar xf php-5.4.26.tar.bz2 [root@localhost ~]# cd php-5.4.26 [root@localhost php-5.4.26]# ./configure --prefix=/usr/local/php --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 [root@localhost ~]# make && make install
这里详细解析下有关参数
--prefix=/usr/local/php | 指定程序安装目录 |
--with-mysql=mysqlnd --with-pdo-mysql=mysqlnd --with-mysqli=mysqlnd |
数据库与php不在一个服务器上,指定此种方式,安装数据库连接驱动 |
--with-jpeg-dir --with-png-dir |
使用图片目录 |
--with-zlib | 使用压缩库 |
--enable-fpm | 使用fpm服务 |
--with-config-file-path=/etc | 配置文件目录 |
--with-config-file-scan-dir=/etc/php.d | 扩展配置文件扫描目录 |
--with-bz2 | 使用bz2压缩方式 |
--enable-xml | 使用xml |
3、提供配置文件
php源码包也为我们提供了现成的配置文件(分为开发环境和生产环境),复制配置文件到/etc下
[root@localhost ~]# cp /root/php-5.4.26/php.ini-production /etc/php.ini
4、配置fpm
这里fpm我们完全可以看作是一个服务
4.1提供服务脚本
同样系统也为我们提供了,复制到/etc/init.d即可使用。服务脚本保证fpm服务能在系统中运行。
[root@localhost ~]# cp /root/php-5.4.26/sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm
添加执行权限
[root@localhost init.d]# chmod +x php-fpm
添加在系统服务,并开机自动启动
[root@localhost init.d]# chkconfig --add php-fpm [root@localhost init.d]# chkconfig php-fpm on
4.2 提供配置文件
配置文件建立其与httpd服务的联系
php的安装目录里也有配置文件提供,将其备份修改名字即可进行配置
[root@localhost init.d]# cp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf
修改配置文件
#修改参数为自己需要的数字,此处并无定值 pm.max_children = 50 pm.start_servers = 5 pm.min_spare_servers = 2 pm.max_spare_servers = 8 #添加pid文件路径,要注意的是这里不是系统提供的pid文件目录,而是php的程序目录,这里是修改原来的内容,而不是手工添加。 pid = /usr/local/php/var/run/php-fpm.pid 修改监听主机为本机 listen = 172.16.37.3:9000
4.3 启动php-fpm
监测进程、端口情况
[root@localhost run]# service php-fpm start [root@localhost run]# ps aux | grep php-fpm root 51165 0.0 0.7 46924 3480 ? Ss 04:16 0:00 php-fpm: master process (/usr/local/php/etc/php-fpm.conf) nobody 51166 0.0 0.5 46924 2908 ? S 04:16 0:00 php-fpm: pool www nobody 51167 0.0 0.5 46924 2908 ? S 04:16 0:00 php-fpm: pool www nobody 51168 0.0 0.5 46924 2908 ? S 04:16 0:00 php-fpm: pool www nobody 51169 0.0 0.5 46924 2908 ? S 04:16 0:00 php-fpm: pool www nobody 51170 0.0 0.5 46924 2908 ? S 04:16 0:00 php-fpm: pool www root 51211 0.0 0.1 103252 828 pts/1 S+ 04:26 0:00 grep php-fpm [root@localhost run]# ss -tunl | grep 9000 tcp LISTEN 0 128 172.16.37.3:9000 *:*
可以看到服务已经启动,端口监听正常
五、nfs配置
我们希望两台httpd服务器能共享磁盘空间,这里采用nfs,在172.16.37.3主机上配置,httpd服务上挂载
1、给nfs单独建立一个磁盘分区,挂载至目录/www上,这里不再给出具体步骤
2、编辑导出文件
[root@localhost ~]# vim /etc/exports /www 172.16.37.0/24(rw,root_squash)
3、启动服务
[root@localhost www]# service nfs start
4、客户端挂载
分别编辑172.16.37.4和172.16.37.7主机的/etc/fstable文件,添加
#要注意,这里/www要实现在文件系统中创建好 172.16.37.3:/www /www nfs defaults,_netdev 0 0
然后mount -a,即可到/www目录中查看
六、联机调试
这里我们仅仅是在php上做好了配置,还需要在httpd服务器上配置。这里为了降低难度,用主机做测试,没有使用虚拟主机。实际上我们应该使用虚拟主机进行测试。
1、修改主机目录
DocumentRoot "/www" <Directory "/www">
2、修改选项
Options none 删除原来值,改为none
3、加载模块
LoadModule proxy_module modules/mod_proxy.so LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so
4、取消代理连接php服务器
ProxyRequests Off ProxyPassMatch ^/(.*\.php)$ fcgi://172.16.37.3:9000/www/$1
5、添加页面类型识别
#添加 AddType application/x-httpd-php .php AddType application/x-httpd-php-source .phps
6、设置主页识别
DirectoryIndex index.php index.html
同样的,我们在两台httpd主机上都进行如上设置
然后,我们在/www上放上一个测试,测试是否成功。
测试
[root@localhost www]# vim index.php #内容如下 <?php $link = mysql_connect(‘172.16.37.2‘,‘php‘,‘1‘); if ($link) echo "linked"; else echo "failed"; mysql_close(); phpinfo(); ?>
该测试页,可以看到php的详细信息,并且可以测试是否与数据连接成功。最后得到页面
大功告成,其实,这个时候可以使用域名进行解析。我才用了比较省事的方法,修改windows的host文件,添加上了一个域名,指向两个地址,
172.16.37.4 www.a.com
172.16.37.7 www.a.com
这个时候,随意停止到一个服务器的web服务,都可以正常访问。
七、总结
这个博文花了半天的时间完成,但是仍然没有完成,计划使用的xcache没有做。在接下来的更新版本中将会添加上。欢迎批评指正
Version 1.0 2013-3-26 初始版本