lamp架构搭建

1. LAMP架构介绍

lamp,其实就是由Linux+Apache+Mysql/MariaDB+Php/Perl/Python的一组动态网站或者服务器的开源软件,除Linux外其它各部件本身都是各自独立的程序,但是因为经常被放在一起使用,拥有了越来越高的兼容度,共同组成了一个强大的Web应用程序平台。

LAMP指的是Linux(操作系统)、Apache(HTTP服务器)、MySQL(也指MariaDB,数据库软件)和PHP(有时也是指Perl或Python)的第一个字母,一般用来建立web应用平台。

image-20200707181436214

2.web服务器工作流程

在说lamp架构平台的搭建前,我们先来了解下什么是CGI,什么是FastCGI,什么是......

web服务器的资源分为两种,静态资源和动态资源

  • 静态资源就是指静态内容,客户端从服务器获得的资源的表现形式与原文件相同。可以简单的理解为就是直接存储于文件系统中的资源
  • 动态资源则通常是程序文件,需要在服务器执行之后,将执行的结果返回给客户端

那么web服务器如何执行程序并将结果返回给客户端呢?下面通过一张图来说明一下web服务器如何处理客户端的请求

img

如上图所示

阶段①显示的是httpd服务器(即apache)和php服务器通过FastCGI协议进行通信,且php作为独立的服务进程运行

阶段②显示的是php程序和mysql数据库间通过mysql协议进行通信。php与mysql本没有什么联系,但是由Php语言写成的程序可以与mysql进行数据交互。同理perl和python写的程序也可以与mysql数据库进行交互

2.1 cgi与fastcgi

上图阶段①中提到了FastCGI,下面我们来了解下CGI与FastCGI。

CGI(Common Gateway Interface,通用网关接口),CGI是外部应用程序(CGI程序)与WEB服务器之间的接口标准,是在CGI程序和Web服务器之间传递信息的过程。CGI规范允许Web服务器执行外部程序,并将它们的输出发送给Web浏览器,CGI将web的一组简单的静态超媒体文档变成一个完整的新的交互式媒体。

FastCGI(Fast Common Gateway Interface)是CGI的改良版,CGI是通过启用一个解释器进程来处理每个请求,耗时且耗资源,而FastCGI则是通过master-worker形式来处理每个请求,即启动一个master主进程,然后根据配置启动几个worker进程,当请求进来时,master会从worker进程中选择一个去处理请求,这样就避免了重复的生成和杀死进程带来的频繁cpu上下文切换而导致耗时

2.2 httpd与php结合的方式

httpd与php结合的方式有以下三种:

  • modules:php将以httpd的扩展模块形式存在,需要加载动态资源时,httpd可以直接通过php模块来加工资源并返回给客户端
    • httpd prefork:libphp5.so(多进程模型的php)
    • httpd event or worker:libphp5-zts.so(线程模型的php)
  • CGI:httpd需要加载动态资源时,通过CGI与php解释器联系,获得php执行的结果,此时httpd负责与php连接的建立和断开等
  • FastCGI:利用php-fpm机制,启动为服务进程,php自行运行为一个服务,https通过socket与php通信

php的解释器是php-cgi。php-cgi只是个CGI程序,只能解析请求,返回结果,不会进程管理,而php-fastcgi是php-cgi的升级版。php-fpm的功能就是能够调度php解释进程实现进程管理。

较于CGI方式,FastCGI更为常用,很少有人使用CGI方式来加载动态资源**

三种方式的特点

以CGI方式运行PHP,由于CGI是非常驻内存集,每次Webserver接受客户端的HTTP请求,然后建立进程执行CGI程序,客户端的请求被传递给CGI程序,CGI执行后结果再返回Webserver。 每次浏览页面都要重复上面的动作,会有非常大的消耗。

以mod_php模式运行PHP,意味着php是作为apache的一个模块来启动的,因此只有在apache启动的时候会加载扩展模块,在apache运行期间是不会再去读取和加载扩展模块的。显然使用mod_php的方式运行PHP效率比CGI方式更高。

FastCGI方式,使用php-fpm单独管理php进程池,PHP-FPM简单可靠的 FastCGI 进程管理器(FastCGI Process Manager),FastCGI是一个常驻型的CGI,可以一直执行,只要激活后,而且还支持分布式运算(使得php程序解释执行可以单独交给php服务器),即可以在网站服务器以外的主机上执行并且接受来自其它网站服务器来的请求。而mod_php与fastcgi相比,俩者都有进程池的概念,但是,fastcgi将服务器端动、静态请求更好的分离。php进程除了问题不会将web服务器也当掉。

2.3 web工作流程

通过上面的图说明一下web的工作流程:

  • 客户端通过http协议请求web服务器资源
  • web服务器收到请求后判断客户端请求的资源是静态资源或是动态资源
    • 若是静态资源则直接从本地文件系统取之返回给客户端。
    • 否则若为动态资源则通过FastCGI协议与php服务器联系,通过CGI程序的master进程调度worker进程来执行程序以获得客户端请求的动态资源,并将执行的结果通过FastCGI协议返回给httpd服务器,httpd服务器收到php的执行结果后将其封装为http响应报文响应给客户端。在执行程序获取动态资源时若需要获得数据库中的资源时,由Php服务器通过mysql协议与MySQL/MariaDB服务器交互,取之而后返回给httpd,httpd将从php服务器收到的执行结果封装成http响应报文响应给客户端。

3. lamp平台搭建

环境说明:

系统 IP 需要安装的服务
centos7 192.168.32.125 httpd-2.4 mysql-5.7 php php-mysql

lamp平台软件安装次序:

    httpd --> mysql --> php

注意:php要求httpd使用prefork MPM

3.1 安装httpd

//配置YUM源
[root@localhost ~]# curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
[root@localhost ~]# sed -i -e '/mirrors.cloud.aliyuncs.com/d' -e '/mirrors.aliyuncs.com/d' /etc/yum.repos.d/CentOS-Base.repo
[root@localhost ~]# sed -i 's/\$releasever/7/g' /etc/yum.repos.d/CentOS-Base.repo
[root@localhost ~]# yum -y install epel-release wget

//安装开发工具包
[root@localhost ~]# yum groups mark install 'Development Tools'

//创建apache服务的用户和组
[root@localhost ~]# groupadd -r apache
[root@localhost ~]# useradd -r -M -s /sbin/nologin -g apache apache 

//安装依赖包
[root@localhost ~]# yum -y install openssl-devel pcre-devel expat-devel libtool gcc gcc-c++

//下载和安装apr以及apr-util
[root@localhost ~]# mkdir lamp
[root@localhost ~]# cd lamp/
[root@localhost lamp]# wget http://mirror.bit.edu.cn/apache/apr/apr-1.7.0.tar.gz
[root@localhost lamp]# wget http://mirror.bit.edu.cn/apache/apr/apr-util-1.6.1.tar.gz
[root@localhost lamp]# ls
apr-1.7.0.tar.gz  apr-util-1.6.1.tar.gz
[root@localhost lamp]# tar xf apr-1.7.0.tar.gz 
[root@localhost lamp]# tar xf apr-util-1.6.1.tar.gz
[root@localhost apr-1.7.0]# cd apr-1.7.0
[root@localhost apr-1.7.0]# ./configure --prefix=/usr/local/apr
......
[root@localhost apr-1.7.0]# make && make install
......
[root@localhost apr-1.7.0]# cd /root/lamp/apr-util-1.6.1
[root@localhost apr-util-1.6.1]# ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr
......
[root@localhost apr-util-1.6.1]# make && make install
......

//编译安装httpd
[root@localhost apr-util-1.6.1]cd /root/lamp/
[root@localhost lamp]# wget http://mirror.bit.edu.cn/apache/httpd/httpd-2.4.43.tar.gz
[root@localhost lamp]# tar xf httpd-2.4.43.tar.gz 
[root@localhost lamp]# cd httpd-2.4.43
[root@localhost httpd-2.4.43]# ./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@localhost httpd-2.4.43]# make && make install
......

//安装后配置
[root@localhost ~]# echo 'export PATH=/usr/local/apache/bin:$PATH' > /etc/profile.d/httpd.sh
[root@localhost ~]# source /etc/profile.d/httpd.sh
[root@localhost ~]# ln -s /usr/local/apache/include/ /usr/include/httpd
[root@localhost ~]# echo 'MANPATH /usr/local/apache/man' >> /etc/man_db.conf

//取消ServerName前面的注释
[root@localhost ~]# sed -i '/#ServerName/s/#//g' /etc/httpd24/httpd.conf 
//启动apache
[root@localhost httpd-2.4.43]# apachectl start
[root@localhost httpd-2.4.43]# ss -tanl
State      Recv-Q Send-Q Local Address:Port               Peer Address:Port              
LISTEN     0      100    127.0.0.1:25                       *:*                  
LISTEN     0      128          *:22                       *:*                  
LISTEN     0      100      [::1]:25                    [::]:*                  
LISTEN     0      128       [::]:80                    [::]:*                  
LISTEN     0      128       [::]:22                    [::]:*  

//配置apache开机自启
[root@localhost httpd-2.4.43]# mv build/rpm/httpd.init /etc/init.d/httpd
#找到下面三行
httpd=${HTTPD-/usr/sbin/httpd}
pidfile=${PIDFILE-/var/run/${prog}.pid}
        CONFFILE=/etc/httpd/conf/httpd.conf

#修改为
httpd=${HTTPD-/usr/local/apache/bin/httpd} #原为/usr/sbin
pidfile=${PIDFILE-/usr/local/apache/logs/${prog}.pid} #原为/var/logs/
		CONFFILE=/etc/httpd24/httpd.conf #原为/etc/httpd/conf

[root@localhost httpd-2.4.43]# chkconfig --add httpd
[root@localhost httpd-2.4.43]# chkconfig httpd on
[root@localhost httpd-2.4.43]# chkconfig --list

Note: This output shows SysV services only and does not include native
      systemd services. SysV configuration data might be overridden by native
      systemd configuration.

      If you want to list systemd services use 'systemctl list-unit-files'.
      To see services enabled on particular target use
      'systemctl list-dependencies [target]'.

httpd          	0:off	1:off	2:on	3:on	4:on	5:on	6:off
netconsole     	0:off	1:off	2:off	3:off	4:off	5:off	6:off
network        	0:off	1:off	2:on	3:on	4:on	5:on	6:off

[root@localhost httpd-2.4.43]# service httpd stop
Stopping httpd (via systemctl):                            [  OK  ]
[root@localhost httpd-2.4.43]# 
[root@localhost httpd-2.4.43]# 
[root@localhost httpd-2.4.43]# 
[root@localhost httpd-2.4.43]# 
[root@localhost httpd-2.4.43]# 
[root@localhost httpd-2.4.43]# ss -tanl
State      Recv-Q Send-Q Local Address:Port               Peer Address:Port              
LISTEN     0      100    127.0.0.1:25                       *:*                  
LISTEN     0      128          *:22                       *:*                  
LISTEN     0      100      [::1]:25                    [::]:*                  
LISTEN     0      128       [::]:22                    [::]:* 
[root@localhost httpd-2.4.43]# service httpd start
Starting httpd (via systemctl):                            [  OK  ]
[root@localhost httpd-2.4.43]# ss -tanl
State      Recv-Q Send-Q Local Address:Port               Peer Address:Port              
LISTEN     0      100    127.0.0.1:25                       *:*                  
LISTEN     0      128          *:22                       *:*                  
LISTEN     0      100      [::1]:25                    [::]:*                  
LISTEN     0      128       [::]:80                    [::]:*                  
LISTEN     0      128       [::]:22                    [::]:* 

3.2 安装mysql

//安装依赖包
[root@localhost ~]# yum -y install libaio ncurses-devel openssl-devel openssl cmake mariadb-devel

//创建用户和组
[root@localhost src]# groupadd -r -g 306 mysql
[root@localhost src]# useradd -r -M -s /sbin/nologin -g 306 -u 306 mysql

//下载二进制格式的mysql软件包
[root@localhost ~]# cd /root/lamp/
[root@localhost lamp]# wget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.30-linux-glibc2.12-x86_64.tar.gz
[root@localhost lamp]# tar xf mysql-5.7.30-linux-glibc2.12-x86_64.tar.gz -C /usr/local/
[root@localhost lamp]# ls /usr/local/
apache    bin    include  libexec                              share
apr       etc    lib      mysql-5.7.30-linux-glibc2.12-x86_64  src
apr-util  games  lib64    sbin
[root@localhost lamp]# cd /usr/local/
[root@localhost local]# ln -sv mysql-5.7.30-linux-glibc2.12-x86_64/ mysql
‘mysql’ -> ‘mysql-5.7.30-linux-glibc2.12-x86_64/’
[root@localhost local]# ll
total 0
drwxr-xr-x. 13 root root 152 Jul  7 02:55 apache
drwxr-xr-x.  6 root root  58 Jul  7 02:38 apr
drwxr-xr-x.  5 root root  43 Jul  7 02:40 apr-util
drwxr-xr-x.  2 root root   6 Apr 11  2018 bin
drwxr-xr-x.  2 root root   6 Apr 11  2018 etc
drwxr-xr-x.  2 root root   6 Apr 11  2018 games
drwxr-xr-x.  2 root root   6 Apr 11  2018 include
drwxr-xr-x.  2 root root   6 Apr 11  2018 lib
drwxr-xr-x.  2 root root   6 Apr 11  2018 lib64
drwxr-xr-x.  2 root root   6 Apr 11  2018 libexec
lrwxrwxrwx.  1 root root  36 Jul  7 16:27 mysql -> mysql-5.7.30-linux-glibc2.12-x86_64/
drwxr-xr-x.  9 root root 129 Jul  7 16:19 mysql-5.7.30-linux-glibc2.12-x86_64
drwxr-xr-x.  2 root root   6 Apr 11  2018 sbin
drwxr-xr-x.  5 root root  49 Feb 12 17:48 share
drwxr-xr-x.  2 root root   6 Apr 11  2018 src


//修改目录/usr/local/mysql的属主属组
[root@localhost local]# chown -R mysql.mysql /usr/local/mysql
[root@localhost local]# ll /usr/local/mysql -d
lrwxrwxrwx. 1 mysql mysql 36 Jul  7 16:27 /usr/local/mysql -> mysql-5.7.30-linux-glibc2.12-x86_64/

//添加环境变量
[root@localhost ~]# ls /usr/local/mysql
bin  COPYING  docs  include  lib  man  README  share  support-files
[root@localhost ~]# echo 'export PATH=/usr/local/mysql/bin:$PATH' > /etc/profile.d/mysql.sh
[root@localhost ~]# . /etc/profile.d/mysql.sh
[root@localhost ~]# echo $PATH
/usr/local/mysql/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin

//建立数据存放目录
[root@localhost ~]# mkdir /opt/data
[root@localhost ~]# chown -R mysql.mysql /opt/data/
[root@localhost ~]# ll /opt/
total 0
drwxr-xr-x. 2 mysql mysql 6 Jul  7 16:33 data

//初始化数据库
[root@localhost ~]# /usr/local/mysql/bin/mysqld --initialize-insecure --user=mysql --datadir=/opt/data/
2020-07-07T20:37:14.398813Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
2020-07-07T20:37:14.573541Z 0 [Warning] InnoDB: New log files created, LSN=45790
2020-07-07T20:37:14.602139Z 0 [Warning] InnoDB: Creating foreign key constraint system tables.
2020-07-07T20:37:14.657577Z 0 [Warning] No existing UUID has been found, so we assume that this is the first time that this server has been started. Generating a new UUID: a43e8f3d-c091-11ea-8e9c-000c293918a9.
2020-07-07T20:37:14.658310Z 0 [Warning] Gtid table is not ready to be used. Table 'mysql.gtid_executed' cannot be opened.
2020-07-07T20:37:15.046082Z 0 [Warning] CA certificate ca.pem is self signed.
2020-07-07T20:37:15.126386Z 1 [Warning] root@localhost is created with an empty password ! Please consider switching off the --initialize-insecure option.

//配置mysql
[root@localhost ~]#  ln -sv /usr/local/mysql/include/ /usr/local/include/mysql
‘/usr/local/include/mysql’ -> ‘/usr/local/mysql/include/’
[root@localhost ~]# echo '/usr/local/mysql/lib' > /etc/ld.so.conf.d/mysql.conf
[root@localhost ~]# ldconfig

//生成配置文件
[root@localhost ~]# cat > /etc/my.cnf <<EOF
[mysqld]
basedir = /usr/local/mysql
datadir = /opt/data
socket = /tmp/mysql.sock
port = 3306
pid-file = /opt/data/mysql.pid
user = mysql
skip-name-resolve
EOF

//配置服务启动脚本
[root@localhost ~]# cp -a /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
[root@localhost ~]# sed -ri 's#^(basedir=).*#\1/usr/local/mysql#g' /etc/init.d/mysqld
[root@localhost ~]# sed -ri 's#^(datadir=).*#\1/opt/data#g' /etc/init.d/mysqld
//设置开机自启
[root@localhost ~]# chkconfig --add mysqld
[root@localhost ~]# chkconfig --list

Note: This output shows SysV services only and does not include native
      systemd services. SysV configuration data might be overridden by native
      systemd configuration.

      If you want to list systemd services use 'systemctl list-unit-files'.
      To see services enabled on particular target use
      'systemctl list-dependencies [target]'.

httpd          	0:off	1:off	2:on	3:on	4:on	5:on	6:off
mysqld         	0:off	1:off	2:on	3:on	4:on	5:on	6:off
netconsole     	0:off	1:off	2:off	3:off	4:off	5:off	6:off
network        	0:off	1:off	2:on	3:on	4:on	5:on	6:off

//启动mysql
[root@localhost ~]# service mysqld start
Starting MySQL. SUCCESS! 
[root@localhost ~]# ss -tanl
State       Recv-Q Send-Q Local Address:Port               Peer Address:Port              
LISTEN      0      100       127.0.0.1:25                            *:*                  
LISTEN      0      128               *:22                            *:*                  
LISTEN      0      100           [::1]:25                         [::]:*                  
LISTEN      0      80             [::]:3306                       [::]:*                  
LISTEN      0      128            [::]:80                         [::]:*                  
LISTEN      0      128            [::]:22                         [::]:*  

//修改密码
[root@localhost ~]# mysql
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.30 MySQL Community Server (GPL)

Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

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

mysql> 
mysql> set password=password('qwer!@#$');
Query OK, 0 rows affected, 1 warning (0.01 sec)

mysql> quit
Bye


3.3 安装php

//配置php的源
[root@localhost ~]# wget http://rpms.remirepo.net/enterprise/remi-release-7.rpm
anaconda-ks.cfg  lamp  remi-release-7.rpm
[root@localhost ~]# rpm -Uvh remi-release-7.rpm 
[root@localhost ~]# yum makecache --enablerepo=remi-php74

//安装依赖包
[root@localhost ~]# yum -y install libxml2 libxml2-devel openssl openssl-devel bzip2 bzip2-devel libcurl libcurl-devel libicu-devel libjpeg libjpeg-devel libpng libpng-devel openldap-devel  pcre-devel freetype freetype-devel gmp gmp-devel libmcrypt libmcrypt-devel readline readline-devel libxslt libxslt-devel mhash mhash-devel sqlite-devel oniguruma-devel php74-php-mysqlnd
安装过程略....


//下载php
[root@localhost ~]# cd lamp/
[root@localhost lamp]# wget https://www.php.net/distributions/php-7.4.7.tar.xz

//编译安装php
[root@localhost lamp]# tar xf php-7.4.7.tar.xz 
[root@localhost lamp]# cd php-7.4.7
[root@localhost php-7.4.7]#  ./configure --prefix=/usr/local/php7  \
--with-config-file-path=/etc \
--enable-fpm \
--enable-inline-optimization \
--disable-debug \
--disable-rpath \
--enable-shared \
--enable-soap \
--with-openssl \
--enable-bcmath \
--with-iconv \
--with-bz2 \
--enable-calendar \
--with-curl \
--enable-exif  \
--enable-ftp \
--enable-gd \
--with-jpeg \
--with-png-dir \
--with-zlib-dir \
--with-freetype \
--with-gettext \
--enable-json \
--enable-mbstring \
--enable-pdo \
--with-mysqli=mysqlnd \
--with-pdo-mysql=mysqlnd \
--with-readline \
--enable-shmop \
--enable-simplexml \
--enable-sockets \
--enable-zip \
--enable-mysqlnd-compression-support \
--with-pear \
--enable-pcntl \
--enable-posix
[root@localhost php-7.4.7]# make -j $(cat /proc/cpuinfo |grep processor|wc -l)
编译过程略
[root@localhost php-7.4.7]# make install
安装过程略

//安装后配置环境变量
[root@localhost php-7.4.7]# echo 'export PATH=/usr/local/php7/bin:$PATH' > /etc/profile.d/php7.sh
[root@localhost php-7.4.7]# source /etc/profile.d/php7.sh
[root@localhost php-7.4.7]# which php
/usr/local/php7/bin/php
[root@localhost php-7.4.7]# php -v
PHP 7.4.7 (cli) (built: Jul  7 2020 17:36:40) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies


//配置php-fpm
[root@localhost php-7.4.7]# cp php.ini-production /etc/php.ini
[root@localhost php-7.4.7]# cp sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm
[root@localhost php-7.4.7]# chmod +x /etc/rc.d/init.d/php-fpm

[root@localhost php-7.4.7]# cp /usr/local/php7/etc/php-fpm.conf.default /usr/local/php7/etc/php-fpm.conf
[root@localhost php-7.4.7]# cp /usr/local/php7/etc/php-fpm.d/www.conf.default /usr/local/php7/etc/php-fpm.d/www.conf

//编辑php-fpm的配置文件(/usr/local/php7/etc/php-fpm.conf):
//配置fpm的相关选项为你所需要的值:
[root@localhost ~]# vim /usr/local/php7/etc/php-fpm.conf
.....
.....
pm.max_children = 50    ;最多同时提供50个进程提供50个并发服务
pm.start_servers = 5    ;启动时启动5个进程
pm.min_spare_servers = 2    ;最小空闲进程数
pm.max_spare_servers = 8    ;最大空闲进程数

[root@localhost ~]# tail /usr/local/php7/etc/php-fpm.conf
; files from a glob(3) pattern. This directive can be used everywhere in the
; file.
; Relative path can also be used. They will be prefixed by:
;  - the global prefix if it's been set (-p argument)
;  - /usr/local/php7 otherwise
include=/usr/local/php7/etc/php-fpm.d/*.conf
pm.max_children = 50 
pm.start_servers = 5
pm.min_spare_servers = 2
pm.max_spare_servers = 8

pm.max_children = 50 #子进程最大数
pm.start_servers = 5 #启动时的进程数
pm.min_spare_servers = 2 #保证空闲进程数最小值,如果空闲进程小于此值,则创建新的子进程
pm.max_spare_servers = 8 #保证空闲进程数最大值,如果空闲进程大于此值,此进行清理


//启动php-fpm,设置开机自启
[root@localhost ~]# service php-fpm start
Starting php-fpm  done
[root@localhost ~]# chkconfig --add php-fpm
[root@localhost ~]# chkconfig --list

Note: This output shows SysV services only and does not include native
      systemd services. SysV configuration data might be overridden by native
      systemd configuration.

      If you want to list systemd services use 'systemctl list-unit-files'.
      To see services enabled on particular target use
      'systemctl list-dependencies [target]'.

httpd          	0:off	1:off	2:on	3:on	4:on	5:on	6:off
mysqld         	0:off	1:off	2:on	3:on	4:on	5:on	6:off
netconsole     	0:off	1:off	2:off	3:off	4:off	5:off	6:off
network        	0:off	1:off	2:on	3:on	4:on	5:on	6:off
php-fpm        	0:off	1:off	2:on	3:on	4:on	5:on	6:off

//默认情况下,fpm监听在127.0.0.1的9000端口,可以在/usr/local/php7/etc/php-fpm.d/www.conf
[root@localhost ~]# ss -tanl
State       Recv-Q Send-Q Local Address:Port               Peer Address:Port              
LISTEN      0      100       127.0.0.1:25                            *:*                  
LISTEN      0      128       127.0.0.1:9000                          *:*                  
LISTEN      0      128               *:22                            *:*                  
LISTEN      0      100           [::1]:25                         [::]:*                  
LISTEN      0      80             [::]:3306                       [::]:*                  
LISTEN      0      128            [::]:80                         [::]:*                  
LISTEN      0      128            [::]:22                         [::]:* 


[root@localhost ~]# vim /usr/local/php7/etc/php-fpm.d/www.conf
#修改listen = 127.0.0.1:9000为listen = 0.0.0.0:9000
[root@localhost ~]# service php-fpm restart
Gracefully shutting down php-fpm . done
Starting php-fpm  done
[root@localhost ~]# ss -tanl
State       Recv-Q Send-Q Local Address:Port               Peer Address:Port              
LISTEN      0      100       127.0.0.1:25                            *:*                  
LISTEN      0      128               *:9000                          *:*                  
LISTEN      0      128               *:22                            *:*                  
LISTEN      0      100           [::1]:25                         [::]:*                  
LISTEN      0      80             [::]:3306                       [::]:*                  
LISTEN      0      128            [::]:80                         [::]:*                  
LISTEN      0      128            [::]:22                         [::]:*         
//启动了5个进程
[root@localhost ~]# ps -ef | grep php
root     116120      1  0 18:03 ?        00:00:00 php-fpm: master process (/usr/local/php7/etc/php-fpm.conf)
nobody   116121 116120  0 18:03 ?        00:00:00 php-fpm: pool www
nobody   116122 116120  0 18:03 ?        00:00:00 php-fpm: pool www
nobody   116123 116120  0 18:03 ?        00:00:00 php-fpm: pool www
nobody   116124 116120  0 18:03 ?        00:00:00 php-fpm: pool www
nobody   116125 116120  0 18:03 ?        00:00:00 php-fpm: pool www
root     116128   1598  0 18:03 pts/0    00:00:00 grep --color=auto php

3.4 配置apache

3.4.1 启用代理模块

在apache httpd 2.4以后已经专门有一个模块针对FastCGI的实现,此模块为mod_proxy_fcgi.so,它其实是作为mod_proxy.so模块的扩展,因此,这两个模块都要加载,编辑httpd.conf文件,取消以下两行内容的注释:

  • LoadModule proxy_module modules/mod_proxy.so
  • LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so
//启用httpd的相关模块
[root@localhost ~]# sed -i '/proxy_module/s/#//g' /etc/httpd24/httpd.conf
[root@localhost ~]# sed -i '/proxy_fcgi_module/s/#//g' /etc/httpd24/httpd.conf

3.4.2 配置虚拟主机

在需要使用fcgi的虚拟主机中添加类似如下两行:

ProxyRequests Off       //关闭正向代理
ProxyPassMatch ^/(.*\.php)$ fcgi://127.0.0.1:9000/PATH/TO/DOCUMENT_ROOT/$1

例如:

ProxyPassMatch ^/(.*\.php)$ fcgi://127.0.0.1:9000/var/www/html/idfsoft.com/$1

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

注意:

这里写的/var/www/html/是yum源安装方式生成的网页存放目录,这里必须改成你编译安装指定的网页存放路径
这里的idfsoft.com是用域名命名的目录,你必须改成你所使用的域名
这里的$1表示匹配所有以.php结尾的http请求

//创建虚拟主机目录并生成php测试页面
[root@localhost ~]# mkdir /usr/local/apache/htdocs/test.com
[root@localhost ~]# cat > /usr/local/apache/htdocs/test.com/index.php <<EOF
<?php
   phpinfo();
?>
EOF

[root@localhost ~]# chown -R apache.apache /usr/local/apache/htdocs/
[root@localhost ~]# ll -d /usr/local/apache/htdocs/
drwxr-xr-x. 3 apache apache 40 Jul  7 18:07 /usr/local/apache/htdocs/


[root@localhost ~]# vim /etc/httpd24/httpd.conf
//在配置文件的最后加入以下内容
<VirtualHost *:80>
    DocumentRoot "/usr/local/apache/htdocs/test.com"
    ServerName www.test.com
    ProxyRequests Off
    ProxyPassMatch ^/(.*\.php)$ fcgi://127.0.0.1:9000/usr/local/apache/htdocs/test.com/$1
    <Directory "/usr/local/apache/htdocs/test.com">
        Options none
        AllowOverride none
        Require all granted
    </Directory>
</VirtualHost>  

[root@localhost ~]# vim /etc/httpd24/httpd.conf
//搜索AddType,添加以下内容
    # If the AddEncoding directives above are commented-out, then you
    # probably should define those extensions to indicate media types:
    #
    AddType application/x-compress .Z
    AddType application/x-gzip .gz .tgz
    AddType application/x-httpd-php .php        #添加此行
    AddType application/x-httpd-php-source .phps        #添加此行
    
[root@localhost ~]# sed -i '/    DirectoryIndex/s/index.html/index.php index.html/g' /etc/httpd24/httpd.conf

//重启apache服务
[root@localhost ~]# apachectl -t
Syntax OK
[root@localhost ~]# service httpd restart
Restarting httpd (via systemctl):                          [  OK  ]
[root@localhost ~]# ss -tanl
State       Recv-Q Send-Q Local Address:Port               Peer Address:Port              
LISTEN      0      100       127.0.0.1:25                            *:*                  
LISTEN      0      128               *:9000                          *:*                  
LISTEN      0      128               *:22                            *:*                  
LISTEN      0      100           [::1]:25                         [::]:*                  
LISTEN      0      80             [::]:3306                       [::]:*                  
LISTEN      0      128            [::]:80                         [::]:*                  
LISTEN      0      128            [::]:22                         [::]:*         

3.5 验证

1.修改/etc/hosts文件,添加域名与IP的映射
2.在浏览器上使用域名访问,若看到以下界面则表示lamp架构搭建成功,否则请检查操作

image-20200707181436214

posted @ 2020-07-08 10:52  EverEternity  阅读(466)  评论(0编辑  收藏  举报