实验环境:RHEL 7.5 ip:192.168.10.205

LAMP: Linux+Apache+Maridb(Mysql)+PHP,常用来搭建动态网站或者服务器的开源软件。习惯上,apache一般是指httpd,当然Apache还有很多的其他软件。

apache(httpd)、mariadb、php可以安装在同一台机子,也可以安装在不同的机子。这里演示的是在一台机子上部署lamp。

如果想分别安装在不同的机子,请参考我的另一博文: https://www.logmm.org/lamp-distributed/

一、安装相关依赖包

[root@node5 ~]#yum  install  expat-devel  pcre-devel  libxml2-devel  openssl-devel  gcc  -y
[root@node5 ~]# yum install -y libcurl-devel gd-devel bzip2-devel

二、编译安装httpd.2.4.33

httpd2.4开始要依赖apr、apr-util包,所以编译安装httpd之前先编译安装apr、apr-util。

1、编译安装apr-1.6.3

下载apr-1.6.3包

[root@node5 ~]#curl -O  http://mirrors.hust.edu.cn/apache/apr/apr-1.6.3.tar.gz   
[root@node5 ~]#tar xf apr-1.6.3.tar.gz   
[root@node5 ~]#cd apr-1.6.3   
[root@node5 apr-1.6.3]#  ./configure  --prefix=/usr/local/apr   
[root@node5 apr-1.6.3]#  make  &&  make  install

2、编译安装apr-util-1.6.1

[root@node5 ~]#curl -O  http://mirrors.hust.edu.cn/apache/apr/apr-util-1.6.1.tar.gz 
[root@node5 ~]#tar xf  apr-util-1.6.1.tar.gz
[root@node5 ~]#cd apr-util-1.6.1 
[root@node5 apr-util-1.6.1]# ./configure  --prefix=/usr/local/apr-util  --with-apr=/usr/local/apr/
[root@node5 apr-util-1.6.1]#  make  &&  make  install

3、编译安装httpd-2.4.33

[root@node5 ~]#curl  -O  http://mirrors.hust.edu.cn/apache/httpd/httpd-2.4.33.tar.gz
[root@node5 ~]#tar  xf   httpd-2.4.33.tar.gz
[root@node5 ~]#cd  httpd-2.4.33  
[root@node5 httpd-2.4.33]#./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=prefork  
[root@node5 httpd-2.4.27]#  make  &&  make  install 

参数解析:

--prefix=/usr/local/apache  指定安装目录
--sysconfdir=/etc/httpd24  指定配置文件路径
--enable-so  启动模块动态装卸载
--enable-ssl 编译ssl模块
--enable-cgi 支持cgi机制(能够让静态web服务器能够解析动态请求的一个协议)
--enable-rewrite  支持url重写
--with-zlib  支持数据包压缩
--with-pcre  支持正则表达式
--with-apr=/usr/local/apr  指明依赖的apr所在目录
--with-apr-util=/usr/local/apr-util/  指明依赖的apr-util所在的目录
--enable-modules=most    启用的模块
--enable-mpms-shared=all   以共享方式编译的模块
--with-mpm=prefork     指明httpd的工作方式为prefork,工作模式有:prefork、event、worker等

httpd常见3种工作模式:

prefork:多进程模型,每个进程响应一个请求。一个主进程负责生产n个子进程(称为工作进程),每个子进程处理一个用户请求;即便没有用户请求,也会预先生产多个空闲进程(最多不超过1024个)。

worker:多线程模型,一个进程生产多个线程,一个线程响应一个请求。

event:事件驱动模型,一个线程响应多个请求。

4、设置环境变量

可以不用设置环境变量,因为后面配置httpd服务脚本了

[root@node5 ~]#vim  /etc/profile.d/httpd.sh
  export  PATH=/usr/local/apache/bin:$PATH
[root@node5 ~]#source /etc/profile.d/httpd.sh

5、配置服务脚本

httpd源码包解压后build/rpm目录下httpd.init文件就是服务脚本

[root@node5 ~]# cp httpd-2.4.33/build/rpm/httpd.init /etc/rc.d/init.d/httpd    
[root@node5 ~]#vim /etc/rc.d/init.d/httpd

httpd=${HTTPD-/usr/local/apache/bin/httpd}

pidfile=${PIDFILE-/usr/local/apache/logs/${prog}.pid}

CONFFILE=/etc/httpd24/httpd.conf

根据实际情况修改以上三项
添加可执行权限

[root@node5 init.d]# chmod +x httpd

将httpd服务添加到系统服务:

[root@node5 init.d]# chkconfig –add httpd

6、修改httpd配置文件的ServerName,以及pidfile

[root@node5 ~]# vim /etc/httpd/httpd.conf

ServerName localhost:80

PidFile /var/run/httpd.pid

7、启动httpd服务

[root@node5 ~]#service   httpd  start 

8、清空防火墙

[root@node5 ~]#iptables -F

浏览器输入:192.168.10.205

三、编译安装mariadb

在RHEL/Centos 7.x版本开始,默认的yum源是mariadb数据库。mriadb数据库是MySQL的一个分支,主要由开源社区在维护,采用GPL授权许可 MariaDB的目的是完全兼容MySQL。

MySQL之父Widenius先生离开了Sun之后,觉得依靠Sun/Oracle来发展MySQL,实在很不靠谱,于是决定另开分支,这个分支的名字叫做MariaDB。

mariadb数据库安装分yum安装、源码包安装、二进制包安装。源码安装十分耗时,特别是编译过程,如果电脑配置不好,基本上编译要1小时以上。

在这里,使用mariadb-10.2.14-linux-x86_64.tar.gz演示二进制包安装。

1、下载mariadb二进制安装包

[root@node5 ~]# curl -O https://mirrors.shu.edu.cn/mariadb//mariadb-10.2.14/bintar-linux-x86_64/mariadb-10.2.14-linux-x86_64.tar.gz

2、创建系统mysql用户和组

[root@node5 ~]# groupadd -r -g 306 mysql
[root@node5 ~]# useradd -r -g 306 -s /sbin/nologin mysql

3、创建数据库数据存放目录

数据库数据存放目录是:/mydata/mariadb

[root@node5 ~]# mkdir /mydata/mariadb -pv
mkdir: created directory ‘/mydata’
mkdir: created directory ‘/mydata/mariadb’
[root@node5 ~]#chown -R mysql.mysql /mydata/ 

4、解压数据二进制包

把mariadb-10.2.14-linux-x86_64.tar.gz解压到/usr/local目录中

[root@node5 ~]# tar xf mariadb-10.2.14-linux-x86_64.tar.gz -C /usr/local/

进入/usr/local目录中,创建mariadb-10.2.14-linux-x86_64/软连接为mysql,并且设置属主属组为mysql

[root@node5 ~]# cd /usr/local/
[root@node5 local]# ln -sv mariadb-10.2.14-linux-x86_64/  mysql
‘mysql’ -> ‘mariadb-10.2.14-linux-x86_64/’
[root@node5 local]# 
[root@node5 local]# chown -R mysql.mysql mysql

5、数据库初始化安装

进入/usr/local/mysql/目录中,然后初始化数据安装

[root@node5 ~]# cd /usr/local/mysql/
[root@node5 mysql]# ./scripts/mysql_install_db --user=mysql --basedir=/usr/local/mysql/ --datadir=/mydata/
OK

To start mysqld at boot time you have to copy
support-files/mysql.server to the right place for your system

PLEASE REMEMBER TO SET A PASSWORD FOR THE MariaDB root USER !
To do so, start the server, then issue the following commands:

'/usr/local/mysql//bin/mysqladmin' -u root password 'new-password'
'/usr/local/mysql//bin/mysqladmin' -u root -h node5 password 'new-password'

Alternatively you can run:
'/usr/local/mysql//bin/mysql_secure_installation'

which will also give you the option of removing the test
databases and anonymous user created by default.  This is
strongly recommended for production servers.

See the MariaDB Knowledgebase at http://mariadb.com/kb or the
MySQL manual for more instructions.

You can start the MariaDB daemon with:
cd '/usr/local/mysql/' ; /usr/local/mysql//bin/mysqld_safe --datadir='/mydata/mariadb/'

You can test the MariaDB daemon with mysql-test-run.pl
cd '/usr/local/mysql//mysql-test' ; perl mysql-test-run.pl

Please report any problems at http://mariadb.org/jira

The latest information about MariaDB is available at http://mariadb.org/.
You can find additional information about the MySQL part at:
http://dev.mysql.com
Consider joining MariaDB's strong and vibrant community:
Get Involved
[root@node5 mysql]#

参数解释:

–user: 数据库用户,这里使用mysql用户

–basedir: 数据库安装目录,因为二进制包直接解压就可以安装了,所以解压之后的目录就是数据库安装目录,我们解压在/usr/local/中,并且设置了软连接为mysql,所以,–basedir=/user/local/mysql

–datadir: 数据库文件的存放目录,这里设置为/mydata/mariadb

6、配置数据服务文件

mariadb解压后的目录中的support-files/目录里面有一个mysql.server文件,这个文件就是mariadb数据库的服务文件,将此文件复制到/etc/rc.d/init.d/目录中,重命名为mariadb,再添加可执行权限:

[root@node5 mysql]# cp support-files/mysql.server /etc/rc.d/init.d/mariadb
[root@node5 mysql]# chmod +x /etc/rc.d/init.d/mariadb
[root@node5 mysql]# 

将mariadb添加到系统服务:

[root@node5 mysql]# chkconfig --add mariadb

7、配置数据配置文件

在系统的/etc/目录中有一个默认的数据库配置文件:my.cnf。可以直接编辑这个默认的配置文件,此处为了方便,所以复制解压包中的配置文件到/etc/目录中。
备份系统默认的配置文件(my.cnf):

[root@node5 mysql]# cp /etc/my.cnf /etc/my.cnf.bak

mariadb解压后的目录中support-files有多个配置文件。这里使用my-large.cnf,将此文件复制/etc/目录,重命名为my.cnf

[root@node5 mysql]# cp support-files/my-large.cnf /etc/my.cnf
cp: overwrite ‘/etc/my.cnf’? y
[root@node5 mysql]# 

配置/etc/my.cnf,在[mysqld]段中添加:datadir=/mydata/mariadb:
[root@node5 mysql]# vim /etc/my.cnf
[mysqld]

datadir=/mydata/mariadb

8、设置环境变量

[root@node5 mysql]# echo 'export PATH=/usr/local/mysql/bin:$PATH'>/etc/profile.d/mysql.sh
[root@node5 mysql]# chmod +x /etc/profile.d/mysql.sh
[root@node5 mysql]# source /etc/profile.d/mysql.sh
[root@node5 mysql]# 

9、启动mariadb服务

[root@node5 mysql]# systemctl start mariadb

查看一下端口:

[root@node5 mysql]# ss -tnl
State  Recv-Q Send-Q Local Address:PortPeer Address:Port  
LISTEN 0  128*:22 *:*  
LISTEN 0  100127.0.0.1:25 *:*  
LISTEN 0  80:::3306  :::*  
LISTEN 0  128   :::22:::*  
LISTEN 0  100  ::1:25:::*  
[root@node5 mysql]# 

运行mysql命令,可以直接进入数据库:

[root@node5 ~]# mysql
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 10
Server version: 10.2.14-MariaDB-log MariaDB Server

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> show databases;
+--------------------+
| Database   |
+--------------------+
| information_schema |
| mysql  |
| performance_schema |
| test   |
+--------------------+
4 rows in set (0.01 sec)

MariaDB [(none)]> 

OK,mariadb二进制包安装成功。

四、编译安装php

这里使用最新版的php演示(php7.2.6)

1、下载php-7.2.6安装包

[root@node5 ~]# curl -O http://cn2.php.net/distributions/php-7.2.6.tar.gz   

2、编译安装libmcrypt

libmcrypt是用于加密算法的扩展库程序

[root@node5 ~]# curl -O https://www.linuxprobe.com/Software/libmcrypt-2.5.8.tar.gz
[root@node5 ~]# tar xf libmcrypt-2.5.8.tar.gz 
[root@node5 ~]# cd libmcrypt-2.5.8
[root@node5 libmcrypt-2.5.8]# ./configure && make && make install

3、创建www用户

创建一个用于运行php-fpm服务的用户,假设用户名为www。

[root@node5 ~]# groupadd -r www
[root@node5 ~]# useradd -r -g www -s /sbin/nologin www
[root@node5 ~]# id www
uid=997(www) gid=305(www) groups=305(www)
[root@node5 ~]# 

4、解压、编译、安装php

php与httpd的整合有两种方式,一种是编译成httpd的一个模块,另一种是作为独立的服务(fpm)。这里先示范fpm模式。

4.1 php-fpm模式编译

此模式httpd2.4之后的版本才支持。编译时使用–enable-fpm选项即可。

[root@node5 ~]# tar xf php-7.2.6.tar.gz 
[root@node5 ~]# cd php-7.2.6
[root@node5 php-7.2.6]# ./configure  --prefix=/usr/local/php7\ 
 --with-config-file-path=/etc/php7\ 
 --with-config-file-scan-dir=/etc/php7.d\ 
 --with-mysqli=mysqlnd\ 
 --with-pdo-mysql=mysqlnd\  
 --with-mysql-sock=/tmp/mysql.sock\ 
 --with-iconv-dir\ 
 --with-freetype-dir\ 
 --with-jpeg-dir\ 
 --with-png-dir\ 
 --with-zlib\
 --with-bz2\ 
 --with-libxml-dir\ 
 --with-curl\ 
 --with-gd\ 
 --with-openssl\ 
 --with-mhash\
 --with-mcrypt\
 --with-xmlrpc\ 
 --with-pdo-mysql\ 
 --with-libmbfl\ 
 --with-onig\ 
 --with-pear\ 
 --enable-xml\ 
 --enable-bcmath\ 
 --enable-shmop\ 
 --enable-sysvsem\ 
 --enable-inline-optimization\ 
 --enable-mbregex\ 
 --enable-fpm\ 
 --enable-mbstring\ 
 --enable-pcntl\ 
 --enable-sockets\ 
 --enable-zip\ 
 --enable-soap\ 
 --enable-opcache\ 
 --enable-pdo\ 
 --enable-mysqlnd-compression-support\ 
 --enable-maintainer-zts\  
 --enable-session\ 
 --with-fpm-user=www\ 
 --with-fpm-group=www
[root@node5 php-7.2.6]# make && make install

4.1.1 配置php-fpm服务文件和php配置文件

上面编译php的时候指定配置文件存放目录为/etc/php7、/etc/php7.d,所以要创建这两个目录。

[root@node5 ~]# mkdir /etc/php7{,.d} -v
mkdir: created directory ‘/etc/php7’
mkdir: created directory ‘/etc/php7.d’
[root@node5 ~]# 

php的配置文件:

复制php解压目录中的php.ini-production(此文件就是php的配置文件)到/etc/php7/目录中,并重命名为php.ini

[root@node5 ~]# cd php-7.2.6
[root@node5 php-7.2.6]# cp php.ini-production /etc/php7/php.ini

php-fpm的服务文件:

php-fpm的服务文件在php解压目录中的sapi/fpm/目录里面,名字为:init.d.php-fpm,将此文件复制到/etc/rc.d/init.d/目录中,并且重命名为:php-fpm,并且添加可执行权限:

[root@node5 php-7.2.6]# cp sapi/fpm/init.d.php-fpm /etc/rc.d/init.d/php-fpm
[root@node5 php-7.2.6]# chmod +x /etc/rc.d/init.d/php-fpm

将php-fpm添加到系统服务:

[root@node5 php-7.2.6]# chkconfig --add php-fpm

4.1.2 配置php-fpm的配置文件

php-fpm的配置文件在php安装目录中的/etc/目录里面。编译安装的时候指定了安装目录是/usr/local/php7/,所以php-fpm的配置文件在/usr/local/php7/etc目录中。查看一下这个目录有哪些文件。

[root@node5 php-7.2.6]# cd /usr/local/php7
[root@node5 php7]# ls etc
php-fpm.conf.default  php-fpm.d
[root@node5 php7]# 

etc目录中的php-fpm.conf.default文件就是php-fpm的配置文件,将此文件复制一份,并重命名为php-fpm.conf即可:

[root@node5 php7]# cp etc/php-fpm.conf.default etc/php-fpm.conf

此外,etc/php-fpm.d/目录中有一个www.conf.default文件,将此文件复制一份,并且重命名为www.conf:

[root@node5 php7]# ls etc/php-fpm.d/
www.conf.default
[root@node5 php7]# cp etc/php-fpm.d/www.conf.default etc/php-fpm.d/www.conf
[root@node5 php7]# 

至此,php编译安装并且配置完成。

4.1.3 整合php与httpd

修改httpd配置文件:vim /etc/httpd24/httpd.conf

(1)开启反向代理模块(mod_proxy.so、mod_proxy_fcgi.so)。

在Apache httpd 2.4以后已经专门有一个模块针对FastCGI的实现,此模块为mod_proxy_fcgi.so,它其实是作为mod_proxy.so模块的扩充,因此,这两个模块都要加载:

即把HTTP的配置文件中的#LoadModule proxy_module modules/mod_proxy.so、#LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so 这两项前面的#号去掉。如下所示:

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

(2)在IfModule dir_module段中添加index.php,如下所示

<IfModule dir_module>
    DirectoryIndex index.html index.php
</IfModule>

(3)添加对php页面的支持。

在适当位置添加: AddType application/x-httpd-php .php、AddType application/x-httpd-php-source .phps,如下所示:

AddType application/x-httpd-php   .php
AddType application/x-httpd-php-source   .phps

(4)在适当位置比如在文件末尾添加:Include /etc/httpd24/extra/ceshi.conf

Include  /etc/httpd24/extra/ceshi.conf

/etc/httpd24/extra/ceshi.conf此文件用于后面做测试,也就是创建一个虚拟主机解析php,此文件在后面创建。

4.1.4 创建测试页

在httpd的默认网站目录(/usr/local/apache/htdocs/)创建php测试页:

[root@node5 ~]# vim /usr/local/apache/htdocs/index.php
<?php
    $link=new mysqli('127.0.0.1','root','');
    if($link)
       echo "connect mariadb Success";
    else
       echo "connect mariadb Failure";
    mysqli_close($link);

    phpinfo();
?>

把默认的index.html重命名:
[root@node5 ~]# mv /usr/local/apache/htdocs/index.html /usr/local/apache/htdocs/index.html.bak

4.1.5 创建虚拟主机

[root@node5 ~]# vim /etc/httpd24/extra/ceshi.conf
  <VirtualHost *:80>
        DocumentRoot "/usr/local/apache/htdocs"
        ServerName haha
        ProxyRequests Off
        ProxyPassMatch ^/(.*.php)$ fcgi://127.0.0.1:9000/usr/local/apache/htdocs/$1
    <Directory "/usr/local/apache/htdocs">
        AllowOVerride None
        Require all granted
    </Directory>
 </VirtualHost>

4.1.6 清空防火墙规则,设置SELinux

清空防火墙:

[root@node5 ~]# iptables -F

设置SELinux:
如果没有开启SELinux,则不需要执行下面的命令:

[root@node5 ~]# setsebool -P httpd_can_network_connect 1

4.1.7 重启httpd、mariadb、php-fpm服务

[root@node5 ~]# systemctl restart httpd mariadb php-fpm
[root@node5 ~]# 

4.1.8 打开浏览器测试

在浏览器输入192.168.10.205,如下图所示:

显示正常,并且连接数据库也成功了。

至此lamp编译安装部署成功,此处的php作为一个单独的服务去解析动态请求。。。

下面演示php作为httpd的一个模块(而不是单独的服务了)去解析动态请求。。。

4.2 php作为httpd的一个模块编译

4.2.1 编译php

因为前面已经下载了php并且已经解压了,所以不需要再下载解压了。直接编译即可。

php编译成httpd的一个模块来解析动态请求,编译时需要设置–with-apxs2选项。

为了跟前面4.1实验有所的区别,这次编译安装的目录设置为:/usr/local/php7.1,配置文件目录为:/etc/php7.1/、/etc/php7.1.d/

编译如下:

./configure  --prefix=/usr/local/php7.1\
 --with-config-file-path=/etc/php7.1\
 --with-config-file-scan-dir=/etc/php7.1.d\
 --with-mysqli=mysqlnd\
 --with-pdo-mysql=mysqlnd\
 --with-mysql-sock=/tmp/mysql.sock\
 --with-apxs2=/usr/local/apache/bin/apxs\
 --with-iconv-dir\
 --with-freetype-dir\
 --with-jpeg-dir\
 --with-png-dir\
 --with-zlib\
 --with-bz2\
 --with-libxml-dir\
 --with-curl\
 --with-gd\
  --with-openssl\
 --with-mhash\
 --with-xmlrpc\
 --with-pdo-mysql\
 --with-libmbfl\
 --with-onig\
 --with-pear\
 --enable-xml\
 --enable-bcmath\
 --enable-shmop\
 --enable-sysvsem\
 --enable-inline-optimization\
 --enable-mbregex\
 --enable-mbstring\
 --enable-pcntl\
 --enable-sockets\
 --enable-zip\
 --enable-soap\
 --enable-pdo\
 --enable-mysqlnd-compression-support\
 --enable-maintainer-zts\
 --enable-session
[root@node5 php-7.2.6]# make && make install

4.2.2 配置php配置文件

复制php解压目录中的php.ini-production(此文件就是php的配置文件)到/etc/php7.1/目录中,并重命名为php.ini:

[root@node5 php-7.2.6]# mkdir /etc/php7.1{,.d} -v
mkdir: created directory ‘/etc/php7.1’
mkdir: created directory ‘/etc/php7.1.d’
[root@node5 php-7.2.6]# cp php.ini-production /etc/php7.1/php.ini
[root@node5 php-7.2.6]# 

在4.1的实验中已经配置好httpd可以支持php了,为了不冲突,注释掉4.1实验中httpd配置文件所设置的“Include /etc/httpd24/extra/ceshi.conf”,如下:

#Include  /etc/httpd24/extra/ceshi.conf

前面已经创建了测试页。在此不需要再次设置。重启httpd、mariadb服务:

[root@node5 ~]# systemctl restart httpd mariadb

可以直接打开浏览器输入:192.168.10.205,如下图所示:

OK,成功。。。

附: Apache运行PHP常见的两种方式

1、PHP handlers: PHP以模块的方式运行在Apache中时,PHP解释器被“内嵌”在Apache的进程里。Apache不会调用任何外部的PHP进程,因此这种方式使Apache与PHP能更好的通信。

优点:

1.易于安装和更新

2.容配置

缺点:

1.仅能与Apache一起工作

2.增加了Apache子进程内存开销

3.当更改php.ini文件后,需要重启Apache

2、FPM/FastCGI: PHP-FPM是Web服务器使用PHP的一种最新方式,也是PHP FastCGI的另外一种实现。

优点:

1.兼容多数Web服务器

2.比mod_php占内存小

3.更多的配置项,包括多版本PHP和suexec

缺点

1.配置复杂

2.不被大家所熟知


发表评论

电子邮件地址不会被公开。 必填项已用*标注

6 − 3 =