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

  • 2019 年 10 月 4 日
  • 筆記

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

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

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

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:

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

# 修改环境变量

vi /etc/profile.d/httpd.sh

export PATH=/usr/local/apache/bin:$PATH

source/etc/profile.d/httpd.sh

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

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

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

#!/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
chmod +x /etc/init.d/httpd           #给脚本增加执行权限  chkconfig --add httpd                #将httpd加入服务启动

servicehttpd start

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

2.安装MariaDB

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

# 准备mysql的数据目录

mkdir /data

# 添加mysql服务账户

useradd -r -s /sbin/nologin mysql  chown -R mysql:mysql /data

# 安装并初始化MariaDB

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提供配置文件

mkdir /etc/mysql  cp support-files/my-large.cnf /etc/mysql/my.cnf

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

datadir = /data  basedir = /usr/local/mysql  innodb_file_per_table = on  skip_name_resolve = on

# 为mysql提供服务启动脚本

cp support-files/mysql.server /etc/init.d/mysqld  chmod +x /etc/init.d/mysqld  chkconfig --add mysqld

# 添加环境变量

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安装配置向导

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

# 增加mysql账户

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

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

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

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

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

# 输出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

# 解决依赖关系

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

# 编译安装php-5.4.40

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提供配置文件

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

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

# 添加如下二行  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是否可以生效

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

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

编辑 /etc/httpd24/httpd.conf

取消Include /etc/httpd24/extra/httpd-vhosts.conf  前面的#注释

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

<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加速

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

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

# 启用服务器状态

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

<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 修改内容如下

# 去掉这三行的注释
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 修改内容如下

<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源里)

yum -y groupinstall "X Software Development"  yum install libmcrypt libmcrypt-devel mhash mhash-devel -y

# 编译安装php-5.4.40

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提供配置文件

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

# 为php-fpm添加服务启动

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提供配置文件

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文件(如下最后一行):

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行的注释

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

# 配置虚拟主机支持fcgi

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

<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在原来的基础上,增加下面红色的两行内容

<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

AddType application/x-httpd-php .php                         # 添加这一行  AddType application/x-httpd-php-source  .phps                # 添加这一行  DirectoryIndex  index.php  index.html                        # 增加对index.php的支持

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

<?php           phpinfo();  ?>

# 安装配置xcache

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生效。

# 压力测试

过程省略……