php以模块方式、和fpm方式 搭建LAMP环境详解

2019-09-18 10:04:34 浏览数 (1)

CentOS6.6上编译安装LAMP

apache版本:2.4.12

php版本:

mysql版本:mariadb-5.5.43-linux-x86_64.tar.gz

要求:

提供2个虚拟主机,

web1:phpMyAdmin, 同时提供SSL

web2:wordpress;

其中php与其它软件的结合,要求分2种情况实现(1.php模块;2.php是fpm方式)

详细配置过程如下:

1.编译安装httpd(构建 MPM 为动态模块)

# httpd-2.4.9编译过程依赖于pcre-devel软件包

yuminstall pcre-devel -y

# 编译安装apr

代码语言:javascript复制
tar xf apr-1.5.2.tar.gz
cd apr-1.5.2
./configure --prefix=/usr/local/apr
make -j 4 && make install

# 编译安装apr-util

代码语言:javascript复制
tar xf apr-util-1.5.4.tar.gz
cd apr-util-1.5.4
./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr/
make -j 4 && make install

# 编译安装httpd

代码语言:javascript复制
tar xf httpd-2.4.12.tar.gz
cd httpd-2.4.12
./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

make -j 4 && make install

资料:

(1)构建MPM为静态模块

在全部平台中,MPM都可以构建为静态模块。在构建时选择一种MPM,链接到服务器中。如果要改变MPM,必须重新构建。为了使用指定的MPM,请在执行configure脚本时,使用参数 --with-mpm=NAME。NAME是指定的MPM名称。编译完成后,可以使用 ./httpd -l来确定选择的MPM。此命令会列出编译到服务器程序中的所有模块,包括 MPM。

(2)构建 MPM为动态模块

在Unix或类似平台中,MPM可以构建为动态模块,与其它动态模块一样在运行时加载。构建 MPM 为动态模块允许通过修改LoadModule指令内容来改变MPM,而不用重新构建服务器程序。在执行configure脚本时,使用--enable-mpms-shared选项即可启用此特性。当给出的参数为all时,所有此平台支持的MPM模块都会被安装。还可以在参数中给出模块列表。默认MPM,可以自动选择或者在执行configure脚本时通过--with-mpm选项来指定,然后出现在生成的服务器配置文件中。编辑LoadModule指令内容可以选择不同的MPM。

# 修改httpd配置文件

vi/etc/httpd24/httpd.conf:

代码语言:javascript复制
PidFile "/usr/local/apache/logs/httpd.pid"      # 添加下面一行内容
ServerName 127.0.0.1:80                         #去掉这行的注释,修改为127.0.0.1:80

# 修改环境变量

vi /etc/profile.d/httpd.sh

代码语言:javascript复制
export PATH=/usr/local/apache/bin:$PATH

source/etc/profile.d/httpd.sh

# 配置httpd的服务启动脚本(2.2版本的httpd脚本基础上修改)

注意下面红色标注的地方,需要根据实际情况修改

vi/etc/init.d/httpd 写入如下内容:

代码语言:javascript复制
#!/bin/bash
#
# httpd        Startup script for the Apache HTTP Server
#
# chkconfig: - 85 15
# description: Apache Web server.
# processname: httpd
 
# Source function library.
. /etc/rc.d/init.d/functions
 
if [ -f /etc/sysconfig/httpd ]; then
        . /etc/sysconfig/httpd
fi
 
# Start httpd in the C locale by default.
HTTPD_LANG=${HTTPD_LANG-"C"}
 
# This will prevent initlog from swallowing up a pass-phrase promptif
# mod_ssl needs a pass-phrase from the user.
INITLOG_ARGS=""
 
# Set HTTPD=/usr/sbin/httpd.worker in /etc/sysconfig/httpd to use aserver
# with the thread-based "worker" MPM; BE WARNED that somemodules may not
# work correctly with a thread-based MPM; notably PHP will refuse tostart.
 
# Path to the apachectl script, server binary, and short-form for messages.
apachectl=/usr/local/apache/bin/apachectl
httpd=${HTTPD-/usr/local/apache/bin/httpd}
prog=httpd
pidfile=${PIDFILE-/usr/local/apache/logs/httpd.pid}
lockfile=${LOCKFILE-/var/lock/subsys/httpd}
RETVAL=0
 
start() {
        echo -n$"Starting $prog: "
        LANG=$HTTPD_LANGdaemon --pidfile=${pidfile} $httpd $OPTIONS
        RETVAL=$?
        echo
        [ $RETVAL = 0 ]&& touch ${lockfile}
        return $RETVAL
}
 
stop() {
  echo -n $"Stopping$prog: "
  killproc -p ${pidfile} -d 10$httpd
  RETVAL=$?
  echo
  [ $RETVAL = 0 ] &&rm -f ${lockfile} ${pidfile}
}
reload() {
    echo -n $"Reloading$prog: "
    if ! LANG=$HTTPD_LANG$httpd $OPTIONS -t >&/dev/null; then
        RETVAL=$?
        echo $"notreloading due to configuration syntax error"
        failure $"notreloading $httpd due to configuration syntax error"
    else
        killproc -p ${pidfile}$httpd -HUP
        RETVAL=$?
    fi
    echo
}
 
# See how we were called.
case "$1" in
  start)
  start
  ;;
  stop)
  stop
  ;;
  status)
        status -p ${pidfile} $httpd
  RETVAL=$?
  ;;
  restart)
  stop
  start
  ;;
  condrestart)
  if [ -f ${pidfile} ] ; then
    stop
    start
  fi
  ;;
  reload)
        reload
  ;;
 graceful|help|configtest|fullstatus)
  $apachectl $@
  RETVAL=$?
  ;;
  *)
  echo $"Usage: $prog{start|stop|restart|condrestart|reload|status|fullstatus|graceful|help|configtest}"
  exit 1
esac
 
exit $RETVAL
代码语言:javascript复制
chmod  x /etc/init.d/httpd           #给脚本增加执行权限
chkconfig --add httpd                #将httpd加入服务启动
代码语言:javascript复制

servicehttpd start

ss -lnt| grep 80                          # 检查是否启动成功

2.安装MariaDB

# 下文以通用二进制格式包的配置为例。

# 准备mysql的数据目录

代码语言:javascript复制
mkdir /data

# 添加mysql服务账户

代码语言:javascript复制
useradd -r -s /sbin/nologin mysql
chown -R mysql:mysql /data

# 安装并初始化MariaDB

代码语言:javascript复制
tar xf mariadb-5.5.43-linux-x86_64.tar.gz -C /usr/local
cd /usr/local/
ln -s mariadb-5.5.43-linux-x86_64 mysql
cd mysql/
chown mysql:mysql ./*
scripts/mysql_install_db --user=mysql --datadir=/data
chown -R root  ./*

# 为mysql提供配置文件

代码语言:javascript复制
mkdir /etc/mysql
cp support-files/my-large.cnf /etc/mysql/my.cnf

编辑 /etc/mysql/my.cnf ,在[mysqld]配置文件下,添加如下四行:

代码语言:javascript复制
datadir = /data
basedir = /usr/local/mysql
innodb_file_per_table = on
skip_name_resolve = on

# 为mysql提供服务启动脚本

代码语言:javascript复制
cp support-files/mysql.server /etc/init.d/mysqld
chmod  x /etc/init.d/mysqld
chkconfig --add mysqld

# 添加环境变量

代码语言:javascript复制
echo "export PATH=/usr/local/mysql/bin:$PATH" >/etc/profile.d/mysql.sh
source /etc/profile.d/mysql.sh

现在mysql就可以servicemysqld start 启动了。

ss -lnt| grep 3306           # 检查mysql是否启动成功

# 运行mysql安装配置向导

代码语言:javascript复制
./usr/local/mysql/bin/mysql_secure_installation      # 根据提示设置密码、删除帐号等操作
  • 为root用户设置密码 删除匿名账号 取消root用户远程登录 删除test库和对test库的访问权限 刷新授权表使修改生效

# 增加mysql账户

# 查看当前mysql存在的账户情况

# 建立一个可以远程访问的账户root@%,密码为amdamd。

代码语言:javascript复制
mysql -uroot -p 输入密码,进入mysql命令行终端,执行:
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'amdamd'WITH GRANT OPTION;
flush privileges;

# 下面还有些配置是可有可无的,但是建议也修改下

目的:使用mysql的安装符合系统使用规范,并将其开发组件导出给系统使用

代码语言:javascript复制
# 输出mysql的man手册至man命令的查找路径
echo "MANPATH /usr/local/mysql/man" >>/etc/man.config
 
# 输出mysql的头文件至系统头文件路径/usr/include
ln -sv /usr/local/mysql/include /usr/include/mysql
 
# 输出mysql的库文件给系统库查找路径
echo '/usr/local/mysql/lib' > /etc/ld.so.conf.d/mysql.conf
ldconfig    # 让系统重新载入系统库

3.安装php-5.4.40

# 解决依赖关系

代码语言:javascript复制
# 请配置好yum源(系统安装源及epel源)后执行如下命令:
yum -y groupinstall "Desktop Platform Development"
yum -y install bzip2-devel libmcrypt-devel libxml2-devel

# 编译安装php-5.4.40

代码语言:javascript复制
tar xf php-5.4.40.tar.bz2
cd php-5.4.40
./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/apache/bin/apxs --with-mcrypt 
 --with-config-file-path=/etc--with-config-file-scan-dir=/etc/php.d 
--with-bz2  --enable-maintainer-zts

make -j 4
make install

说明:

1、这里为了支持apache的worker或event这两个MPM,编译时使用了--enable-maintainer-zts选项。

2、如果使用PHP5.3以上版本,为了链接MySQL数据库,可以指定mysqlnd,这样在本机就不需要先安装MySQL或MySQL开发包了。mysqlnd从php5.3开始可用,可以编译时绑定到它(而不用和具体的MySQL客户端库绑定形成依赖),但从PHP 5.4开始它就是默认设置了。

./configure--with-mysql=mysqlnd --with-pdo-mysql=mysqlnd --with-mysqli=mysqlnd

# 为php提供配置文件

代码语言:javascript复制
cp php.ini-production /etc/php.ini

# 修改/etc/httpd24/httpd.conf使其支持php扩展

代码语言:javascript复制
# 添加如下二行
AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps
 
#定位至DirectoryIndex index.html 修改为:
DirectoryIndex  index.php  index.html
 
LoadModule php5_module       modules/libphp5.so       # 安装过php扩展后,httpd.conf文件里应该有这一行

# 测试php是否可以生效

代码语言:javascript复制
service httpd restart
代码语言:javascript复制
编写php版本及数据库连接测试文件
代码语言:javascript复制
vim  /usr/local/apache/htdocs/index.php
内容如下:
代码语言:javascript复制
<?php
         $link=mysql_connect('127.0.0.1','root','amdamd');
         if($link)
                   echo"Success";
         else
                   echo"failure";
         mysql_close();
 
         phpinfo();
?>
代码语言:javascript复制
正常情况下,如果返回结果如下图所示,表示我们上面所有的配置都是没有问题的。

# 配置1个http链接方式的apache虚拟主机

编辑 /etc/httpd24/httpd.conf

代码语言:javascript复制
取消Include /etc/httpd24/extra/httpd-vhosts.conf  前面的#注释

编辑 /etc/httpd24/extra/httpd-vhosts.conf写入内容如下:

代码语言:javascript复制
<VirtualHost *:80>
    DocumentRoot"/web/wp"
    ServerName wp.stu13.com
         <Directory"/web/wp">
                   Options none
                   AllowOverridenone
                   Require allgranted
         </Directory>
    ErrorLog"/var/log/httpd/wp-error.log"
    CustomLog"/var/log/httpd/wp-access.log" combined
</VirtualHost>

# 在未安装xcache情况下,对网站执行压力测试

ab -c 10-n 1000 http://pma.stu13.com/index.php 【phpMyAdmin的登录页】

多次测试,大致结果如下:

结果省略.........

# 安装xcache,为php加速

代码语言:javascript复制
tar xcache-3.2.0.tar.gz
cdxcache-3.2.0
/usr/local/php/bin/phpize
./configure--enable-xcache --with-php-config=/usr/local/php/bin/php-config
make -j4 && make install

安装完成后,会给出个目录,形如:/usr/local/php/lib/php/extensions/no-debug-zts-20100525/这种。

# 编辑php.ini,整合php和xcache

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

mkdir/etc/php.d

cpxcache.ini /etc/php.d           # xcache.ini文件在xcache的源码目录中

# 修改/etc/php.d/xcache.ini,启用xcache

代码语言:javascript复制
在[xcache-common]下面修改
extension = /usr/local/php/lib/php/extensions/no-debug-zts-20100525/xcache.so   # 路径是上面安装xcache生成的

# 启用服务器状态

修改主配置/etc/http24/httpd.conf,添加如下内容:

代码语言:javascript复制
<Location /server-status>
    SetHandler server-status
    Require all granted           # 为了安全起见,建议不是允许全部人防止该页面。
         Requireip 192.168.2.1    # 如改成Require ip 192.168.2.1 ,只允许这个指定的IP访问server-status页面
</Location>

mod_status模块可以让管理员查看服务器的执行状态,它通过一个HTML页面展示了当前服务器的统计数据。这些数据通常包括但不限于:

(1) 处于工作状态的worker进程数;

(2) 空闲状态的worker进程数;

(3) 每个worker的状态,包括此worker已经响应的请求数,及由此worker发送的内容的字节数;

(4) 当前服务器总共发送的字节数;

(5) 服务器自上次启动或重启以来至当前的时长;

(6) 平均每秒钟响应的请求数、平均每秒钟发送的字节数、平均每个请求所请求内容的字节数;

# 安装过xcache后,再次对网站执行压力测试

ab -c 10-n 1000 http://pma.stu13.com/index.php

多次测试,结果会发现比未安装时候节约了2/3的时间。

# 配置httpd以支持SSL网页访问

vi/etc/httpd24/httpd.conf 修改内容如下

代码语言:javascript复制
# 去掉这三行的注释
代码语言:javascript复制
LoadModule ssl_module modules/mod_ssl.so
LoadModule socache_shmcb_module modules/mod_socache_shmcb.so
Include /etc/httpd24/extra/httpd-ssl.conf

vi/etc/httpd24/extra/httpd-ssl.conf 修改内容如下

代码语言:javascript复制
<VirtualHost *:443>
DocumentRoot "/web/pma"
ServerName pma.stu13.com
<Directory "/web/pma">
         Options none
         Require all granted
</Directory>
ErrorLog "/var/log/httpd/ssl-error.log"
TransferLog "/var/log/httpd/ssl-access.log"
SSLCertificateFile"/etc/httpd24/ssl/pma.stu13.com.crt"
SSLCertificateKeyFile "/etc/httpd24/ssl/httpd.key"
........
<VirtualHost >

说明:CA认证不是本文的重点,这里略过了,详情参考其他博文。

第二部分、fpm方式的php的LAMP环境搭建

apache、MySQL的安装与前面一样,这里只是大致说下。

2.1编译安装httpd【没有安装xcache加速】

2.2配置通用二进制MariaDB

2.3编译安装php

# 解决依赖关系(有的包在epel源里)

代码语言:javascript复制
yum -y groupinstall "X Software Development"
yum install libmcrypt libmcrypt-devel mhash mhash-devel -y

# 编译安装php-5.4.40

代码语言:javascript复制
tar xf php-5.4.40.tar.gz
cd php-5.4.40
./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 --enable-fpm--with-mcrypt --with-config-file-path=/etc--with-config-file-scan-dir=/etc/php.d --with-bz2
make -j 4 && make install

# 为php提供配置文件

代码语言:javascript复制
cp php.ini-production /etc/php.ini

# 为php-fpm添加服务启动

代码语言:javascript复制
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提供配置文件

代码语言:javascript复制
cp /usr/local/php5/etc/php-fpm.conf.default/usr/local/php5/etc/php-fpm.conf

# 编辑php-fpm的配置文件

vim /usr/local/php5/etc/php-fpm.conf

配置fpm的相关选项为你所需要的值,并启用pid文件(如下最后一行):

代码语言:javascript复制
pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 2
pm.max_spare_servers = 8
pid = /usr/local/php5/var/run/php-fpm.pid

说明:

pm.max_children:静态方式下开启的php-fpm进程数量。

pm.start_servers:动态方式下的起始php-fpm进程数量。

pm.min_spare_servers:动态方式下的最小php-fpm进程数量。

pm.max_spare_servers:动态方式下的最大php-fpm进程数量。

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

servicephp-fpm start

ps aux |grep php-fpm     # 检查是否启动成功

ss -lntp| grep php-fpm    # 检查端口是否在监听

2.4配置httpd支持php-fpm

# 编辑/etc/httpd24/httpd.conf,取消下面2行的注释

代码语言:javascript复制
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so

# 配置虚拟主机支持fcgi

# vi/etc/httpd24/extra/httpd-vhosts.conf在原来的基础上,增加下面红色的两行内容

代码语言:javascript复制
<VirtualHost *:80>
    DocumentRoot"/web/wp"
    ServerName wp.stu13.com
   
   ProxyRequests Off         # php-fpm 需要增加这一行
   ProxyPassMatch ^/(.*.php)$ fcgi://127.0.0.1:9000/web/wp/$1  # php-fpm 需要增加这一行
   
    <Directory"/web/wp">
        Options none
        AllowOverride none
        Require all granted
    </Directory>
    ErrorLog"/var/log/httpd/wp-error.log"
    CustomLog"/var/log/httpd/wp-access.log" combined
</VirtualHost>

# vi/etc/httpd24/extra/httpd-ssl.conf在原来的基础上,增加下面红色的两行内容

代码语言:javascript复制
<VirtualHost *:443>
DocumentRoot "/web/pma"
ServerName pma.stu13.com
 
   ProxyRequests Off        # php-fpm需要增加这一行
   ProxyPassMatch ^/(.*.php)$ fcgi://127.0.0.1:9000/web/pma/$1  # php-fpm需要增加这一行
 
<Directory "/web/pma">
         Options none
         Require all granted
</Directory>
ErrorLog "/var/log/httpd/ssl-error.log"
TransferLog "/var/log/httpd/ssl-access.log"
SSLCertificateFile"/etc/httpd24/ssl/pma.stu13.com.crt"    # 注意这里路径
SSLCertificateKeyFile "/etc/httpd24/ssl/httpd.key"        # 注意这里路径
........
<VirtualHost >

说明:

ProxyRequestsOff:关闭正向代理

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

# 配置httpd支持php页面

vi/etc/httpd24/httpd.conf

代码语言:javascript复制
AddType application/x-httpd-php .php                         # 添加这一行
AddType application/x-httpd-php-source  .phps                # 添加这一行
DirectoryIndex  index.php  index.html                        # 增加对index.php的支持

# 可以编写个test.php测试页,放到网站根目录下:

代码语言:javascript复制
<?php
         phpinfo();
?>

# 安装配置xcache

代码语言:javascript复制
tar xf xcache-3.2.0.tar.gz
cd xcache-3.2.0
/usr/local/php5/bin/phpize
./configure --enable-xcache --with-php-config=/usr/local/php5/bin/php-config
make && make install
cat xcache.ini >> /etc/php.ini

serverhttpd restart        # 重启httpd服务,使xcache生效。

# 压力测试

过程省略......

0 人点赞