LAMP之三(编译安装httpd-fpm)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LAMP之三(编译安装httpd-fpm)相关的知识,希望对你有一定的参考价值。

linux+httpd+php-fpm+mysql

编译安装


环境:

iptables、selinux关闭状态

系统: CentOS release 6.7 (Final)

yum源:epel,cdrom


软件:

php-5.6.17

下载页面:http://php.net/downloads.php

httpd 2.4.18

下载页面:http://httpd.apache.org/download.cgi#apache24

mariadb 前面有专门编译的了,这里就直接yum安装了。

编译安装mariadb5.5:   http://fanqie.blog.51cto.com/9382669/1708239


主机:

httpd
172.16.40.20
php-fpm
172.16.40.21
mysql

172.16.40.22

技术分享


一、http

二、php

三、Mysql(rpm安装的

四、安装phpMydmin和wordpress

五、为phpMyadmin添加https。



一、http:

httpd2.4依赖于apr1.4,而我们系统上面自带的apr是1.3.9的版本。所以我们要自己来编译新版本的apr工具。

apr是httpd程序代码跨平台的基础。不然还要为各个系统上运行的httpd来编写不同的库函数。

提供了一个对httpd统一的环境,而不用再操心为各个系统再编写适用的底层库。

网摘:

APR(Apache portable Run-time libraries,Apache可移植运行库)主要为上层的应用程序提供一个可以跨越多操作系统平台使用的底层支持接口库。在早期 的Apache版本中,应用程序本身必须能够处理各种具体操作系统平台的细节,并针对不同的平台调用不同的处理函数。 

apr下载地址(apr、apr-utils):

http://apr.apache.org/download.cgi

http://mirrors.hust.edu.cn/apache//apr/apr-1.5.2.tar.gz

http://mirrors.hust.edu.cn/apache//apr/apr-util-1.5.4.tar.gz

技术分享

这里是新装的系统,缺少开发工具和开发库。简单点可以直接安装开发包组。

yum groupinstall "Development tools"                              #开发工具
yum groupinstall "Server Platform Development"            #服务器开发库


apr:

[[email protected] apr-1.5.2]# ./configure --prefix=/usr/local/apr
[[email protected] apr-1.5.2]# make
[[email protected] apr-1.5.2]# make install


apr-utils:

[[email protected] apr-util-1.5.4]# ./configure --prefix=/usr/local/apr/ --with-apr=/usr/local/apr
[[email protected] apr-util-1.5.4]# make && make install


httpd:

所依赖的包。

[[email protected] httpd-2.4.18]# yum install pcre-devel openssl-devel -y

pcre 重写引擎要用到的,用来区配地址以重写为别的地址。

安装httpd:

[[email protected] httpd-2.4.18]# ./configure --prefix=/usr/local/httpd24 --sysconfdir=/etc/httpd24 --enable-modules=most --enable-so --enable-ssl --enable-mpms-shared=all --enable-cgid --enable-rewrite --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr --with-pcre --with-mpm=event
[[email protected] httpd-2.4.18]# make && make install
--prefix=/usr/local/httpd24   #安装位置
--sysconfdir=/etc/httpd24      #配置文件位置。
--enable-modules=most        #要启用的模块,就是会编译成模块的, 而不是自动挂载的。对应的还有:
                                                   #--enable-mods-shared  要启用的共享模块。
                                                   #--enable-mods-static     要启用的静态模块。
--enable-so                               #启用动态装载(DSO)功能。也就是动态装载模块的功能。
--enable-ssl                              #启用ssl模块。不知道在上面的most里面有没有包括这个,没有尝试过。
--enable-mpms-shared=all    #各mpm功能以模块的形式存在。可以通过挂载不同的mpm模块来使用不同的功能模型。prefork,event,worker
--enable-cgid                            #cgi脚本功能,这里要用event模型,线程模型用这个来开启。非线程模型用--enabl-cgi来开启。
--enable-rewrite                      #URL重写的基本定义规则。
--with-pcre                                #使用外部的pcre库。
--with-mpm=event                  #默认event模型


服务脚本我们可以把系统自带的http脚本复制一份改一下就可以,也省得麻烦自己写了。

[[email protected] httpd24]# cp /root/httpd /etc/init.d/httpd24       #我这里就是从别处复制来的。
[[email protected] httpd24]# chkconfig --add httpd24                    #添加进chkconfig控制。
[[email protected] httpd24]# chkconfig httpd24 on                         #设置开机启动
[[email protected] httpd24]# chkconfig --list httpd24                      #查看状态。
httpd24         0:off   1:off   2:on    3:on    4:on    5:on    6:off

修改一下脚本,主要改的也就几个:

apachectl=/usr/local/httpd24/bin/apachectl
httpd=/usr/local/httpd24/bin/httpd
prog=httpd
pidfile=/var/run/httpd24/httpd.pid                #这个路径也可以直接指到默认的pid所在的位置,安装目录的logs/httpd.pid。不然就要在httpd的配置文件中修改pid文件所在位置,
lockfile=/var/lock/subsys/httpd24

我这里的设置,为了用系统上的httpd区分开(有时候可能一些软件依赖,httpd会自动安装上的),所以pidfile用了httpd24的目录。创建所必须的目录即可。

修改pid文件位置。添加一条PidFile指令即可。

技术分享

启动:

[[email protected] httpd24]# service httpd24 start
Starting httpd: AH00558: httpd: Could not reliably determine the server‘s fully qualified domain name, using localhost.localdomain. Set the ‘ServerName‘ directive globally to suppress this message
                                                           [  OK  ]

这个错误是因为没有设置ServerName,然后反解IP地址失败,或者反解名称与主机名不一样导致的。设置上ServerName就可以了。如:

ServerName www.star.com


编译安装的2.4个人感觉与rpm安装还容易配置,配置文件非常的有条理。用什么功能,就配置对应的配置文件就行。


虚拟主机设置

因为在前二篇里已经反复写过两次配置过程了。这里就简略的写了。

加载模块,加载子配置文件。

技术分享

技术分享

[[email protected] httpd24]# pwd
/etc/httpd24
[[email protected] httpd24]# vim extra/httpd-vhosts.conf
41 <VirtualHost *:80>
 42         ServerName www.star.com
 43         DocumentRoot "/web/vhosts/www"
 44         CustomLog "/var/log/httpd24/www/access_log" combined
 45         ErrorLog "/var/log/httpd24/www/error_log"
 46         <Directory "/web/vhosts/www">
 47                 Options None
 48                 Require all granted
 49         </Directory>
 50 </VirtualHost>
 51 
 52 
 53 
 54 <VirtualHost *:80>
 55         ServerName myadm.star.com
 56         DocumentRoot "/web/vhosts/myadm"
 57         CustomLog "/var/log/httpd24/myadm/access_log" combined
 58         ErrorLog "/var/log/httpd24/myadm/error_log"
 59         <Directory "/web/vhosts/myadm">
 60                 Options None
 61                 Require all granted
 62         </Directory>
 63 </VirtualHost>


关闭中心中机,注释DocumentRoot:

[[email protected] star]# vim /etc/httpd24/httpd.conf
#DocumentRoot "/usr/local/httpd24/htdocs


创建所需目录

[[email protected] httpd24]# mkdir /web/vhosts/{www,myadm} -pv
[[email protected] httpd24]# mkdir /var/log/httpd24/{www,myadm} -pv

把httpd的执行文件添加进PATH变量,也可以用符号链接的方式:

[[email protected] star]# vim /etc/profile.d/httpd24.sh
export PATH=/usr/local/httpd24/bin:$PATH
[[email protected] star]# . /etc/profile.d/httpd24.sh
[[email protected] star]# echo $PATH
/usr/local/httpd24/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin

测试并重启httpd(重载也可以):

[[email protected] star]# httpd -t
Syntax OK
[[email protected] star]# service httpd24 restart
Stopping httpd:                                            [  OK  ]
Starting httpd:                                            [  OK  ]
[[email protected] star]#

测试页面,内容就朋友们自定吧:

[[email protected] star]# vim /web/vhosts/www/index.html
[[email protected] star]# vim /web/vhosts/myadm/index.html

本地测试可以在hosts文件中添加主机名来完成域名解析:

windows主机在system32/driver/etc/hosts文件中修改

linux主机在/etc/hosts中。

如我这里的:

[email protected]:/mnt/g/soft$ sudo vim /etc/hosts
.....
172.16.40.20 www.star.com myadm.star.com
.....


测试没有问题,html服务工作正常 。

现在我们再添加反向代理的条目,php页面都代理至后端的php服务器。并且在DirectoryIndex后面加入默认文档index.php。我们测试这里主页面都是php的,所以要在index.html前面。

主配置文件启用代理模块,有两个, 一个是总代理模块,一个是fcgi功能模块。

[[email protected] httpd24]# pwd
/etc/httpd24
[[email protected] httpd24]# vim httpd.conf

技术分享

添加代理指令

现在的httpd-vhosts配置文件:

AddType application/x-httpd-php .php        #添加或覆盖mime类型。
                                                                           #现在.php的mime就是application/x-httpd-php。 主类型/次类型
ProxyRequests Off                                           #关闭正向代理
<VirtualHost *:80>
        ServerName www.star.com
        DocumentRoot "/web/vhosts/www"
        CustomLog "/var/log/httpd24/www/access_log" combined
        ErrorLog "/var/log/httpd24/www/error_log"
        ProxyPassMatch ^/(.*\.php)$     fcgi://172.16.40.21:9000/web/php/www/$1        #代理至
        <Directory "/web/vhosts/www">
                Options None
                Require all granted
        </Directory>
</VirtualHost>

<VirtualHost *:80>
        ServerName myadm.star.com
        DocumentRoot "/web/vhosts/myadm"
        CustomLog "/var/log/httpd24/myadm/access_log" combined
        ErrorLog "/var/log/httpd24/myadm/error_log"
        ProxyPassMatch ^/(.*\.php)$     fcgi://172.16.40.21:9000/web/php/myadm/$1     #代理至
        <Directory "/web/vhosts/myadm">
                Options None
                Require all granted
        </Directory>
</VirtualHost>

上面的AddType定义mime,可以把反向代理关闭以后,在浏览器中打开一个.php页面试一下。

技术分享

不过因为浏览器无法识别此mime,所以会下载此文件。

扩充一点:浏览器能做的就是只显示文本而已,而其它的数据都是通过mime类型来加载对应的插件或软件来处理的。



默认文档

技术分享

dir模块默认都是启用的,所以里面的指令是生效的。


[[email protected] httpd24]# service httpd24 reload
Reloading httpd: 
[[email protected] httpd24]#

现在默认网页就已经不能打开了,php给转到了后端,而后端不会返回数据。

技术分享



二、php:

[[email protected] php-5.6.17]# ./configure --prefix=/usr/local/php --enable-fpm --with-fpm-user=php --with-fpm-group=php --with-config-file-path=/etc/ --with-config-file-scan-dir=/etc/php.d/ --with-openssl --with-zlib --with-bz2 --with-jpeg-dir --with-png-dir  --enable-mbstring --with-mcrypt --with-mysql=mysqlnd --with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd  --enable-sockets --with-freetype-dir
[[email protected] php-5.6.17]# make install

make test 实在是太耗时间了,这里就不试了。生产环境最好还是跑一下。


报错信息:

configure: error: xml2-config not found. Please check your libxml2 installation.
[[email protected] php-5.6.17]# yum install libxml2-devel -y
configure: error: Cannot find OpenSSL‘s <evp.h>
[[email protected] php-5.6.17]# yum install openssl-devel -y
configure: error: Please reinstall the BZip2 distribution
[[email protected] php-5.6.17]# yum install -y bzip2-devel
configure: error: mcrypt.h not found. Please reinstall libmcrypt.
[[email protected] php-5.6.17]# yum install libmcrypt-devel -y

参数介绍:

--enable-fpm                                #启用fpm。  不能与做为httpd模块的方式并存。也就是--with-apxs2
--with-fpm-user=php                  #指定程序运行的用户
--with-fpm-group=php                #指定程序运行的用户组
--with-config-file-path=/etc/       #指定php编译器环境配置文件。与php-fpm不一样。php-fpm只是提供对外连接接口的。编译器才是真正来编译php程序的。
--with-config-file-scan-dir=/etc/php.d/      #php编译器的扩展配置文件所在目录。如把对于xcache的配置文件放在里面。
--with-openssl                               #openssl支持。
--with-zlib                                       #zlib是提供数据压缩用的函式库。它不能创建gzip压缩文件,但可以读取和在gzip压缩文件中写入数据。
--with-bz2                                       #bzip2库函式。可以透明地读写 bzip2(.bz2)压缩文件。
--with-jpeg-dir                                #输出图象到浏览器或文件,动态绘图功能。
--with-png-dir                                 #也一样。
--enable-mbstring                         # 多字节字符支持,如汉字。
--with-mcrypt                                 #提供多种加密算法支持的库
--with-mysql=mysqlnd                  #指定mysql连接器,mysqlnd是php内置的连接mysql系列数据库的连接器。 
--with-mysqli=mysqlnd                 #指定mysqli连接器
-with-pdo-mysql=mysqlnd           #指定mysql-pdo连接器。
--enable-sockets                            #启用socket通迅,BSD-socket。  也就是远程网络通信了。本地文件通信是unix-socket.
--with-freetype-dir                         #字体引擎。


额外的参数:

--sysconfdir=DIR                #这个是fpm的配置文件所在位置,一般不用配置,默认在安装目录下的etc下。
--with-mhas                        #基于离散数学原理的不可逆向的php加密方式扩展库
--enable-zip                        #透明地读写ZIP压缩文档以及它们里面的文件。现在好像不怎么用zip压缩了吧。



编译核心配置选项列表

http://cn2.php.net/manual/zh/configure.about.php


FPM配置选项

http://cn2.php.net/manual/zh/install.fpm.configuration.php



针对各数据库系统对应的扩展

http://php.net/manual/zh/refs.database.vendors.php


连接器mysql,mysqli,mysql-pdo介绍

http://php.net/manual/zh/mysqli.overview.php


其它信息可以查看php手册或google。

php手册,可以在右上角搜索信息。

http://php.net/manual/zh/index.php




接着来配置我们的php。

php编译器配置文件。

[[email protected] php-5.6.17]# cp php.ini-production  /etc/php.ini
[[email protected] php-5.6.17]# mkdir /etc/php.d

php-fpm服务脚本。注意这是在php代码的目录。

[[email protected] php-5.6.17]# cp sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm     
[[email protected] php-5.6.17]# chmod +x /etc/init.d/php-fpm
[[email protected] php-5.6.17]# chkconfig --add php-fpm
[[email protected] php-5.6.17]# chkconfig php-fpm on
[[email protected] php-5.6.17]# chkconfig --list php-fpm
php-fpm         0:关闭  1:关闭  2:启用  3:启用  4:启用  5:启用  6:关闭
[[email protected] php-5.6.17]#
注意不要复制错了,不要复制成init.d.php-fpm.in了,这个文件是php安装之前的文件,而init.d.php-fpm是安装以后生成的。


fpm配置文件:

[[email protected] php]# pwd
/usr/local/php
[[email protected] php]# ls
bin  etc  include  lib  php  sbin  var
[[email protected] php]# cd etc
[[email protected] etc]# ls
pear.conf  php-fpm.conf.default
[[email protected] etc]# cp php-fpm.conf.default php-fpm.conf

编辑配置文件:

[[email protected] etc]# vim php-fpm.conf
listen = 172.16.40.21:9000
listen.allowed_clients = 172.16.40.20

注要就这两项,其它的暂时也不用修改。


启动php-fpm:

[[email protected] local]# service php-fpm start
Starting php-fpm [28-Jan-2016 22:58:53] ERROR: [pool www] cannot get uid for user ‘php‘
[28-Jan-2016 22:58:53] ERROR: FPM initialization failed
 failed

额,忘了创建php用户了。

[[email protected] local]# useradd -r -s /sbin/nologin php
[[email protected] local]# service php-fpm start
Starting php-fpm  done
[[email protected] local]# ss -tnl
State      Recv-Q Send-Q                       Local Address:Port                         Peer Address:Port 
LISTEN     0      128                           172.16.40.21:9000                                    *:*


安装xcache

[[email protected] star]# tar -xf xcache-3.2.0.tar.gz 
[[email protected] star]# cd xcache-3.2.0
[[email protected] xcache-3.2.0]# /usr/local/php/bin/p
pear        peardev     pecl        phar        phar.phar   php         php-cgi     php-config  phpize
[[email protected] xcache-3.2.0]# /usr/local/php/bin/phpize
Configuring for:
PHP Api Version:         20131106
Zend Module Api No:      20131226
Zend Extension Api No:   220131226
Cannot find autoconf. Please check your autoconf installation and the
$PHP_AUTOCONF environment variable. Then, rerun this script.

phpize和php-config工具都是用来为php安装第三方扩展模块用的。


缺少autoconf.  用来生成config配置文件的。

[[email protected] xcache-3.2.0]# yum install autoconf -y

[[email protected] xcache-3.2.0]# /usr/local/php/bin/phpize
Configuring for:
PHP Api Version:         20131106
Zend Module Api No:      20131226
Zend Extension Api No:   220131226
[[email protected] xcache-3.2.0]# 

[[email protected] xcache-3.2.0]# ./configure --enable-xcache --with-php-config=/usr/local/php/bin/php-config 
[[email protected] xcache-3.2.0]# make
[[email protected] xcache-3.2.0]# make install
Installing shared extensions:     /usr/local/php/lib/php/extensions/no-debug-non-zts-20131226/

这个路径是xcache模块的存放路径,如果php识别不出来,就要自己手动指定extension了,而且要完整路径。不过现在一般都可以识别出来的。

复制xcache中的配置文件到/etc/php.d/。  用来让php识别此扩展模块。

[[email protected] xcache-3.2.0]# cp xcache.ini  /etc/php.d/


测试:

创建php下网页文件存放目录。此目录就是前面httpd用fcgi协议发过来的目录。

[[email protected] star]# mkdir /web/php/{www,myadm} -pv
mkdir: created directory `/web‘
mkdir: created directory `/web/php‘
mkdir: created directory `/web/php/www‘
mkdir: created directory `/web/php/myadm‘

创建网页测试:

[[email protected] star]# vim /web/php/www/index.php

<h1>www.star.com</h1>
<?php
        phpinfo();
?>

[[email protected] star]# vim /web/php/myadm/index.php

<h1>myadm.star.com</h1>
<?php
        phpinfo();
?>

重启php-fpm。打开网页完成测试。

[[email protected] xcache-3.2.0]# service php-fpm restart

技术分享


三、mysql:

安装,为wordpress创建数据库并授权用户。创建远程管理用户root。 这里就不做其它操作了。

[[email protected] ~]# yum install mysql-server -y
[[email protected] ~]# service mysqld start
[[email protected] ~]# mysql

mysql> CREATE DATABASE wordpress;
Query OK, 1 row affected (0.00 sec)

mysql> GRANT ALL ON wordpress.* TO [email protected]‘172.16.40.21‘ IDENTIFIED BY ‘abcdefg‘;
Query OK, 0 rows affected (0.00 sec)

mysql> GRANT ALL ON *.* TO [email protected]‘172.16.40.21‘ IDENTIFIED BY ‘abcdefg‘;
Query OK, 0 rows affected (0.00 sec)


四、安装phpMyAdmin,WordPress。


php主机:

phpMyAdmin:

[[email protected] star]# unzip phpMyAdmin-4.5.3.1-all-languages.zip 
[[email protected] star]# mv phpMyAdmin-4.5.3.1-all-languages/* /web/php/myadm/
mv: overwrite `/web/php/myadm/index.php‘? y


wordpress:

[[email protected] star]# unzip wordpress-4.4.1-zh_CN.zip 
[[email protected] star]# mv wordpress/* /web/php/www/
mv: overwrite `/web/php/www/index.php‘? y
[[email protected] star]# 

[[email protected] star]# cd /web/php/www
[[email protected] www]# cp wp-config-sample.php  wp-config.php
[[email protected] www]# vim wp-config.php

技术分享

修改上述信息为所定义的数据库和所授权的数据库用户。


phpMyAdmin:

[[email protected] www]# cd ../myadm/
[[email protected] myadm]# cp config.sample.inc.php config.inc.php
[[email protected] myadm]# openssl rand -base64 15
3Wvh8YWSRv0RxKYfvinv
[[email protected] myadm]# vim config.inc.php

技术分享

添加随机码和目标数据库。



httpd主机:

[[email protected] star]# mv phpMyAdmin-4.5.3.1-all-languages/* /web/vhosts/myadm/
[[email protected] star]# mv wordpress/* /web/vhosts/www/
mv: overwrite `/web/vhosts/www/index.php‘? y
[[email protected] star]#

那个php文件是刚才我这里测试的时候创建的。


现在我们来测试一下,这两个php应用能正常打开不。

注意防火墙。

技术分享

技术分享


都工作正常。

提示MySQL版本太低了。额。

技术分享

我这里用centos7做数据库看一下。


修改一下phpMyAdmin配置文件对数据库的指向。  只要修改php主机上的就可以了。 我们知道 httpd是不会执行php文件的。

phpMyAdmin:

$cfg[‘Servers‘][$i][‘host‘] = ‘172.16.40.12‘;


久违的页面终于出来了。

技术分享



五、为phpMyadmin添加https。


这里就不写怎么建立私有CA了,前面都写了两遍,看的也眼花不是。只来过一下怎么开启吧。

httpd主机, php主机休息了。

挂载模块,和开启ssl的配置文件:

LoadModule ssl_module modules/mod_ssl.so
LoadModule socache_shmcb_module modules/mod_socache_shmcb.so

Include /etc/httpd24/extra/httpd-ssl.conf

证书和私钥放到了配置目录的ssl目录下了。

[[email protected] httpd24]# ls
extra  httpd.conf  magic  mime.types  original  ssl
[[email protected] httpd24]# ls ssl
myadm.crt  myadm.key
[[email protected] httpd24]#

现在对于myadm.star.com虚拟主机的配置,www.star.com的虚拟主机没有修改,这里就不帖了。

<VirtualHost *:443>
        ServerName myadm.star.com
        DocumentRoot "/web/vhosts/myadm"
        CustomLog "/var/log/httpd24/myadm/access_log" combined
        ErrorLog "/var/log/httpd24/myadm/error_log"
        ProxyPassMatch ^/(.*\.php)$     fcgi://172.16.40.21:9000/web/php/myadm/$1
        SSLEngine on
        SSLCertificateFile "/etc/httpd24/ssl/myadm.crt"
        SSLCertificateKeyFile "/etc/httpd24/ssl/myadm.key"
        <Directory "/web/vhosts/myadm">
                Options None
                Require all granted
        </Directory>
</VirtualHost>

要注意SSLEngine on在现在这种状态只能放在虚拟主机里面,只在这个虚拟主机中启用ssl。不然会因为另一个虚拟主机没有证书而报错的。

[Fri Jan 29 11:59:27.191067 2016] [ssl:emerg] [pid 1216:tid 140707884644096] AH02572: Failed to configure at least one certificate and key for www.star.com:443
[Fri Jan 29 11:59:27.191204 2016] [ssl:emerg] [pid 1216:tid 140707884644096] SSL Library Error: error:140A80B1:SSL routines:SSL_CTX_check_private_key:no certificate assigned
[Fri Jan 29 11:59:27.191212 2016] [ssl:emerg] [pid 1216:tid 140707884644096] AH02312: Fatal error initialising mod_ssl, exiting.
AH00016: Configuration Failed


因为是私有CA,所以要手动的把CA的根证书导入浏览器。 让浏览器信任由此CA所颁发的证书。

看一下现在的浏览器。

技术分享

技术分享


技术分享


本文出自 “大蕃茄” 博客,请务必保留此出处http://fanqie.blog.51cto.com/9382669/1739953

以上是关于LAMP之三(编译安装httpd-fpm)的主要内容,如果未能解决你的问题,请参考以下文章

基于NFS实现lamp的负载均衡之三: 部署bind9

源代码编译安装LAMP环境

编译安装LAMP

一键安装lamp环境 centos

第862期成为一名函数式码农之三

LAMP环境编译安装