搭建LAMP环境示例

大白配小猪 2019-12-16

编译apache httpd                    

安装依赖包。

[ ~]# yum -y install pcre pcre-devel expat-devel

编译apr和apr-util。

[ ~]# ls
anaconda-ks.cfg  apr-1.6.3.tar.gz  apr-util-1.6.1.tar.gz  httpd-2.4.29.tar.gz
[ ~]# tar xf apr-1.6.3.tar.gz 
[ ~]# tar xf apr-util-1.6.1.tar.gz 
[ ~]# cd apr-1.6.3
[ apr-1.6.3]# ./configure --prefix=/usr/local/apr 
[ apr-1.6.3]# make && make install
[ apr-1.6.3]# cd ../apr-util-1.6.1
[ apr-util-1.6.1]# ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr && make && make install

编译httpd。

[ apr-util-1.6.1]# cd ..
[ ~]# tar xf httpd-2.4.29.tar.gz 
[ ~]# cd httpd-2.4.29
[ httpd-2.4.29]# ./configure --prefix=/usr/local/apache2 --sysconfdir=/etc/apache --with-z --with-pcre --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util --with-mpm=event --enable-mpms-shared=all
[ httpd-2.4.29]# make && make install

编译后的规范化操作:                                      

[ httpd-2.4.29]# echo "MANPATH /usr/local/apache/man" >>/etc/man.config  # 设置man路径。
[ httpd-2.4.29]# echo ‘PATH=/usr/local/apache/bin:$PATH‘ >/etc/profile.d/apache.sh[ httpd-2.4.29]# source /etc/profile.d/apache.sh
# 设置PATH环境变量。
[ httpd-2.4.29]# ln -s /usr/include /usr/local/apache2/include
# 输出头文件。

编译php                      

三种工作模式:CGI、作为模块加入到apache、fastcgi。最简单的是以模块方式加入到apache,此处演示的是php-fpm管理php-cgi方式。

fastcgi模式的php-cgi,由php-fpm提供服务管理,它会根据配置文件启动一定数量的cgi进程,其默认监听的端口为9000,该服务正常工作需要配置文件。也就是说fastcgi模式的php有两个配置文件,一个是php的配置文件,一个是php-fpm的配置文件。

虽然此处演示的是php-fpm管理方式,但有必要说明下,在Linux中如果模块化安装php,不推荐在使用Apache 2.x中使用线程化MPM(worker和event),而是使用prefork模式的mpm,因为Linux系统的线程设计并不那么完美。所以,如果php和apache在同一台主机上(cgi或者模块化方式安装php的时候),建议httpd使用prefork模型,而不在同一台主机中,建议将php设计为fastcgi的工作模式。而在windows平台中则无需考虑这些问题,因为windows系统是真正意义上的多线程系统。

下载相关文件:
php下载地址:http://php.net/downloads
php手册地址:http://php.net/manual/zh/
手册下载地址:http://php.net/download-docs.php

php编译选项说明                        

编译安装php有非常非常多的选项,比httpd还多。可以在解压php后的目录下使用./configure --help查看。以下是部分选项,其中给出"--enable-XXXX"的选项表示默认是disable的,若要开启,需要在此处手动enable,如果给出的是"--disable-XXXX"表示默认是enable的。

--prefix=PREFIX
【SAPI modules:】
--with-apxs2=FILE       Build shared Apache 2.0 Handler module. FILE is the optional
                          pathname to the Apache apxs tool apxs
--enable-fpm            Enable building of the fpm SAPI executable

【General settings:】
--with-config-file-path=PATH      Set the path in which to look for php.ini [PREFIX/lib]
--with-config-file-scan-dir=PATH  Set the path where to scan for configuration files

【Extensions:】
      #######################################################
      # --with-EXTENSION=shared[,PATH]                      #
      # NOTE: Not all extensions can be build as ‘shared‘.  #
      # Example: --with-foobar=shared,/usr/local/foobar/    #
      #######################################################
--with-openssl=DIR      Include OpenSSL support (requires OpenSSL >= 0.9.6)
--enable-mbstring       Enable multibyte string support
--with-zlib=DIR         Include ZLIB support
--with-bz2=DIR          Include BZip2 support
--with-mhash=DIR        Include mhash support
--with-mcrypt=DIR       Include mcrypt support
--with-freetype-dir=DIR  GD: Set the path to FreeType 2 install prefix
--with-jpeg-dir=DIR     GD: Set the path to libjpeg install prefix
--with-png-dir=DIR      GD: Set the path to libpng install prefix
--with-libxml-dir=DIR   SimpleXML: libxml2 install prefix
--enable-sockets        Enable sockets support
--disable-xml           Disable XML support (不写时默认--enable-xml)

【连接数据库:】
--with-mysql=DIR        Include MySQL support.  DIR is the MySQL base
                          directory, if no DIR is passed or the value is
                          mysqlnd the MySQL native driver will be used
--with-mysqli=FILE      Include MySQLi support.  FILE is the path
                          to mysql_config.  If no value or mysqlnd is passed
                          as FILE, the MySQL native driver will be used
--with-pdo-mysql=DIR    PDO: MySQL support. DIR is the MySQL base directory
                          If no value or mysqlnd is passed as DIR, the
                          MySQL native driver will be used
--enable-mysqlnd        Enable mysqlnd explicitly, will be done implicitly
                          when required by other extensions
【Zend:】
--enable-maintainer-zts    Enable thread safety - for code maintainers only!!

部分选项说明:

  1. 在【zend】扩展部分的选项"--enable-maintainer-zts"是为了让php支持多线程MPM的,即php以模块化方式或cgi模式安装时且httpd配置为worker或event时需要启用该项。而如果php以fastcgi模式安装时,由于php有独立的服务和进程,所以该项是多余的。
  2. "--with-apxs2"是让php以模块化的方式安装到其他程序中,"--enable-fpm"是让php以fastcgi模式工作的选项。所以此处采用后者,而以模块方式和httpd交互时采用前者。
  3. "--with-config-file-path"和"--with-config-file-scan-dir"分别是php配置文件php.ini的存放位置以及其他加载的配置文件路径,scan-dir类的目录就像/etc/profile.d、/etc/httpd/conf.d这样的目录路径。
  4. "--with-openssl"选项让php支持ssl;"--enable-mbstring"选项是让php支持多字节字符的,例如中文一个字符两个字节,也就是说让php支持国际化的;"--with-zlib"、"--with-bz2"、"--with-mhash"和"--with-mcrypt"选项让php支持这些压缩和加密机制。
  5. "--with-freetype-dir"、"--with-jpeg-dir"和"--with-png-dir"分别是让php支持多种文字样式、支持jpeg、支持png的选项。
  6. php连接mysql有两种方式,一种是以libmysql的驱动方式连接mysql,一种是以mysqlnd方式驱动连接mysql。以下列出了libmysql和mysqlnd这两种驱动方式的编译模式。

(1).以libmysql驱动方式连接mysql(Mariadb),需要提前安装mysql(Mariadb)和mysql-devel(mariadb-devel),并使用"--with-mysql"选项指定mysql安装路径,"--with-mysqli"选项指定mysql_config脚本的路径,"--with-pdo-mysql"选项也指定mysql安装路径。假如mysql安装在/usr/local/mysql下。

./configure --prefix=/usr/local/php --with-mysql=/usr/local/mysql --with-mysqli=/usr/local/mysql/bin/mysql_config

(2).以mysqlnd驱动方式连接mysql,不需要提前安装mysql和mysql-devel,--with-mysql、--with-mysqli和--with-pdo-mysql选项都不需要指定具体路径,只需使用mysqlnd作为这些选项的值即可。

./configure --prefix=/usr/local/php --with-mysql=mysqlnd --with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd

在php 5.3的时候已经支持mysqlnd驱动方式了,在php 5.4的时候mysqlnd已经是默认的配置选项了。建议使用mysqlnd的驱动方式。

php编译过程                              

由于是配置fastcgi的模式,所以在./configure的时候将apxs2功能换为"--enable-fpm",并且由于此模式下的php由自己独立的服务来控制进程的生成,所以对于为了支持httpd线程的选项"--enable-maintainer-zts"也去掉。以下是编译安装过程:

[ ~]# yum install -y bzip2-level libmcrypt-devel openssl-devel libxml2-devel
[ ~]# tar xf php-5.4.25.tar.gz 
[ ~]# cd php-5.4.25
[ php-5.4.25]# yum install -y epel-release
[ php-5.4.25]# yum install -y bzip2-level libmcrypt-devel openssl-devel libxml2-devel libmcrypt
[ php-5.4.25]# ./configure --prefix=/usr/local/php --with-openssl --enable-mbstring --enable-sockets --with-freetype-dir --with-jpeg-dir --with-png-dir --with-libxml-dir=/usr --enable-xml --with-zlib --with-mcrypt --with-bz2 --with-mhash --with-config-file-path=/etc --with-config-file-scan-dir=/etc/php.d --with-mysql=mysqlnd --with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd --enable-fpm
[ php-5.4.25]# make && make install
[ php-5.4.25]# cp php.ini-production /etc/php.ini
# 提供php配置文件
[ php-5.4.25]# cp sapi/fpm/init.d.php-fpm /etc/init.d/php-fpmd
[ php-5.4.25]# chmod +x /etc/init.d/php-fpmd
# 提供php-fpm服务管理脚本
[ php-5.4.25]# cd /usr/local/php/
[ php]# cp etc/php-fpm.conf.default etc/php-fpm.conf
[ php]# vi etc/php-fpm.conf # 修改php-fpm配置文件(做实验的话改不改随意)
pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 2
pm.max_spare_servers = 8
[ php]# service php-fpmd start    
Starting php-fpm  done

配置httpd使其转发动态请求给php-fpm                    

[ php]# vi /etc/apache/httpd.conf 
# 启用fcgi的支持模块。
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so
# 添加php后缀格式文件的识别功能。
AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps
# 添加php后缀的主页
DirectoryIndex index.php index.html
# 启用虚拟主机模块,Include虚拟主机配置文件,并注释中心主机DocumentRoot。
#DocumentRoot "/usr/local/apache/htdocs"
Include /etc/apache/extra/httpd-mpm.conf
# 配置虚拟主机。注意主机中需要添加下面两行,第一行表示关闭正向代理功能,第二行表示反向代理时进行正则匹配。
# 对主机的.php(不区分大小写)文件的访问都通过fcgi协议交给php,由于此处测试,php正好和httpd在同一服务器上,# 且php-fpm默认监听的端口为9000,所以为fcgi://127.0.0.1:9000,在此之后还需要写上/DocumentRoot/$1,
# "$1"是正则的反向引用ProxyRequests off ProxyPassMatch "(?i)^/(.*\.php)$" fcgi://127.0.0.1:9000/var/www/a.com/$1

配置虚拟主机

[ extra]# cd /etc/apache/extra/
[ extra]# vi httpd-vhosts.conf 
<VirtualHost 192.168.1.220:80>
    ServerAdmin -host.example.com
    DocumentRoot "/usr/local/apache2/htdocs/"
    #ServerName dummy-host.example.com
    ErrorLog "logs/192_error.log"
    CustomLog "logs/192_access.log" common
</VirtualHost>
[ extra]# apachectl restart
[ extra]# vi /usr/local/apache2/htdocs/index.html <h1>a.com</h1><?php    phpinfo();?>~
 

相关推荐