image.png源码编译构建LAMP

LAMP 架构是目前成熟的企业网站应用模式之一,指的是协同工作的一整套系统和相关软件, 能够提供动态 Web站点服务及其应用开发环境。LAMP是一个缩写词, 具体包括 Linux 操作系统、 Apache 网站服务器、 MySQL 数据库服务器、 PHP(或 Perl、Python) 网页编程语言。 本章将以源码编译的方式搭建 LAMP 环境, 能够满足企业定制化的需求。

在构建 LAMP 平台时, 各组件的安装顺序依次为 Linux、Apache、MySQL、PHP。
其中 Apache 和 MySQL的安装并没有严格的顺序;而PHP环境的安装一般放到最后,负责沟通 Web 服务器和数据库系统以协同工作。

Apache 网站服务基础

本节将介绍“Apache HTTP Server”的特点及其编译安装过程。

1、Apache简介

“Apache HTTP Server”是开源软件项目的杰出代表, 基于标准的 HTTP 网络协议提供网页浏览服务,在Web服务器领域中长期保持着超过半数的份额。 Apache 服务器可以运行在Linux、UNIX、Windows等多种操作系统平台中。

Apache的起源

Apache 服务器是针对之前出现的若干个 Web 服务器程序进行整合、 完善后形成的软件, 其名称来源于“A Patchy Server”, 意思是“基于原有 Web 服务程序的代码进行修改(补丁) 后形成的服务器程序”。

1995 年, Apache 服务程序发布了 1.0 版本, 之后一直由“Apache Group”负责该项目的管理和维护; 直到 1999 年, 在“Apache Group”的基础上成立了 Apache 软件基金会(Apache Software Foundation, ASF)。 目前, Apache 项目一直由 ASF 负责管理和维护。

ASF 是非盈利性质的组织, 最初只负责“Apache Web”服务器项目的管理, 随着 Web应用需求的不断扩大,ASF逐渐增加了许多与Web技术相关的开源软件项目, 因此 Apache现在不仅仅代表着 Web 服务器, 更广泛地代表着 ASF 管理的众多开源软件项目。ASF基金会的官方网站是http://www.apache.org/。

“Apache HTTP Server”是ASF旗下著名的软件项目之一,其正式名称是“httpd”,是历史上的 Apache 网站服务器。 在后续内容中, 若未作特殊说明, 使用“Apache”或者“httpd”,均指的是“Apache HTTP Server”。

Apache 的主要特点

Apache 服务器在功能、性能和安全性等方面的表现都是比较突出的,可以较好地满足Web 服务器用户的应用需求。其主要特点包括以下几个方面。

  • 开放源代码

这是 Apache 服务器的重要特性之一, 也是其他特性的基础。
Apache 服务程序由全世界的众多开发者共同维护, 并且任何人都可以自由使
用, 这充分体现了开源软件的精神。

  • 跨平台应用

这个特性得益于 Apache 的源代码开放。 Apache 服务器可以运
行在绝大多数软硬件平台上, 所有 UNIX 操作系统都可以运行 Apache 服务
器, 甚至 Apache 服务器可以良好地运行在大多数 Windows 系统平台中。
Apache 服务器的跨平台特性使其具有被广泛应用的条件。

  • 支持各种Web编程语言

Apache服务器可支持的网页编程语言包括Perl、PHP、
Python、 Java 等, 甚至微软的 ASP 技术也可以在 Apache 服务器中使用。 支持各种常用的 Web 编程语言使 Apache 具有更广泛的应用领域。

  • 模块化设计

Apache 并没有将所有的功能集中在单一的服务程序内部,而是尽可能地通过标准的模块实现专有的功能,这为Apache服务器带来了良好的扩展性。其他软件开发商可以编写标准的模块程序,从而添加Apache本身并不具有的其他功能。

  • 运行非常稳定

Apache 服务器可用于构建具有大负载访问量的Web站点,很多知名的企业网站都使用 Apache 作为 Web 服务软件。

  • 良好的安全性

Apache 服务器具有相对较好的安全性,这是开源软件共同具有的特性。并且,Apache的维护团队会及时对已发现的漏洞提供修补程序,为Apache的所有使用者提供尽可能安全的服务器程序。

2、安装httpd服务器

在配置 Apache 网站服务之前, 需要正确安装好 httpd 服务器软件。 httpd 服务器的安装可以选用 RPM 安装、 源码编译安装这两种方式, 前者相对比较简单、快速,但是在功能上存在一定的局限性。在实际的生产环境中, 使用源码编译安装的方式要更加普遍。

本小节将以下载的源码包httpd-2.4.39.tar.bz2为例,介绍httpd服务的定制安装过程。

准备工作

为了避免发生端口冲突、 程序冲突等现象, 建议卸载使用 RPM 方式安装的 httpd。

  1. [root@localhost ~]# yum remove httpd -y
  2. 或者
  3. [root@localhost ~]# rpm -e httpd

安装一些依赖包

  1. [root@localhost httpd-2.4.39]# yum install apr-util-devel pcre-devel pkgconfig -y

源码编译及安装

  1. 下载源码包
  1. [root@localhost ~]# wget http://mirrors.tuna.tsinghua.edu.cn/apache//httpd/httpd-2.4.39.tar.bz2
  1. 解包

将下载获得的 httpd源码包解压并释放到/usr/src目录下,且切换到展开后的源码目录中。

  1. [root@localhost ~]# tar jxvf httpd-2.4.39.tar.bz2 -C /usr/src/
  2. [root@localhost ~]# cd /usr/src/httpd-2.4.39/
  1. 配置

根据服务器的实际应用需要,可以灵活设置不同的定制选项,如指定安装路径、 启用字符集支持等。若要获知可用的各种配置选项及其含义,可以执行“./configure —help”命令。

  1. [root@localhost httpd-2.4.39]# ./configure --prefix=/usr/local/httpd \
  2. > --enable-so\
  3. > --enable-rewrite\
  4. > --enable-charset-lite\
  5. > --enable-cgi
  6. > --enable-mpms-shared=all

上述配置命令中, 各选项的含义如下。

  • –prefix: 指定将 httpd 服务程序安装到哪个目录下, 如/usr/local/httpd。
  • –enable-so: 启用动态加载模块支持, 使 httpd 具备进一步扩展功能的能力。
  • –enable-rewrite: 启用网页地址重写功能, 用于网站优化及目录迁移维护。
  • –enable-charset-lite:启动字符集支持,以便支持使用各种字符集编码的网页。
  • –enable-cgi: 启用 CGI 脚本程序支持,便于扩展网站的应用访问能力。
  • –enable-mpms-shared=all: 启用 MPM 所有支持的模式,这样 event、 worker、 prefork 就会以模块化的方式安装,要用哪个就在httpd.conf里配置就好了。
  1. 编译及安装

完成配置以后, 执行“make”命令进行编译, 将源代码转换为可执行的程序; 然后执行“make install”命令完成最后的安装过程; 将编译完的 httpd 程序及相关目录、 文件复制到预设的安装目录(由配置时的“–prefix”选项指定)。 其中“make”的过程可能会需要较长的时间。

  1. [root@localhost httpd-2.4.39]# make
  2. [root@localhost httpd-2.4.39]# make install

确认安装结果

由于指定的安装目录为/usr/local/httpd, 因此 httpd 服务的各种程序、 模块、 帮助文件等都将复制到此目录下。

  1. [root@localhost httpd-2.4.39]# ls -l /usr/local/httpd/
  2. total 36
  3. drwxr-xr-x. 2 root root 262 Jul 8 22:29 bin
  4. drwxr-xr-x. 2 root root 167 Jul 8 22:29 build
  5. drwxr-xr-x. 2 root root 78 Jul 8 22:29 cgi-bin
  6. drwxr-xr-x. 4 root root 84 Jul 8 22:29 conf
  7. drwxr-xr-x. 3 root root 4096 Jul 8 22:29 error
  8. drwxr-sr-x. 2 root root 24 Mar 27 23:05 htdocs
  9. drwxr-xr-x. 3 root root 8192 Jul 8 22:29 icons
  10. drwxr-xr-x. 2 root root 4096 Jul 8 22:29 include
  11. drwxr-xr-x. 2 root root 6 Jul 8 22:29 logs
  12. drwxr-xr-x. 4 root root 30 Jul 8 22:29 man
  13. drwxr-sr-x. 14 root root 8192 Mar 27 23:05 manual
  14. drwxr-xr-x. 2 root root 4096 Jul 8 22:29 modules

在安装后的/usr/local/httpd 目录下, 主要子目录的用途如下。

  • /usr/local/httpd/bin: 存放 httpd 服务的各种执行程序文件, 包括主程序 httpd、服务控制工具 apachectl 等。
  • /usr/local/httpd/conf: 存放 httpd 服务的各种配置文件, 包括主配置文件httpd.conf、 增强配置子目录 extra 等。
  • /usr/local/httpd/htdocs: 存放网页文档, 包括默认首页文件 index.html 等。
  • /usr/local/httpd/logs: 存放 httpd 服务的日志文件。
  • /usr/local/httpd/modules: 存放 httpd 服务的各种模块文件。
  • /usr/local/httpd/cgi-bin: 存放各种 CGI 程序文件。

优化执行路径

通过源码编译安装的 httpd 服务, 程序路径并不在默认的搜索路径中, 为了使该服务在使用时更加方便, 可以为相关程序添加符号链接。

  1. [root@localhost ~]# ln -s /usr/local/httpd/bin/* /usr/local/bin/
  2. [root@localhost ~]# ls -l /usr/local/bin/httpd /usr/local/bin/apachectl
  3. lrwxrwxrwx. 1 root root 30 Jul 8 22:36 /usr/local/bin/apachectl -> /usr/local/httpd/bin/apachectl
  4. lrwxrwxrwx. 1 root root 26 Jul 8 22:36 /usr/local/bin/httpd -> /usr/local/httpd/bin/httpd

这样, 在执行相关命令时就不用输入冗长的路径了。 例如, 当执行“httpd -v”命令(用于查看程序版本)时,即相当于执行“/usr/local/httpd/bin/httpd -v”命令。

  1. [root@localhost ~]# httpd -v
  2. Server version: Apache/2.4.39 (Unix)
  3. Server built: Jul 8 2019 22:26:48
  4. [root@localhost ~]# httpd -V
  5. Server version: Apache/2.4.39 (Unix)
  6. Server built: Jul 8 2019 22:26:48
  7. Server's Module Magic Number: 20120211:84
  8. Server loaded: APR 1.4.8, APR-UTIL 1.5.2
  9. Compiled using: APR 1.4.8, APR-UTIL 1.5.2
  10. Architecture: 64-bit
  11. Server MPM: worker
  12. threaded: yes (fixed thread count)
  13. forked: yes (variable process count)
  14. Server compiled with....
  15. -D APR_HAS_SENDFILE
  16. -D APR_HAS_MMAP
  17. -D APR_HAVE_IPV6 (IPv4-mapped addresses enabled)
  18. -D APR_USE_SYSVSEM_SERIALIZE
  19. -D APR_USE_PTHREAD_SERIALIZE
  20. -D SINGLE_LISTEN_UNSERIALIZED_ACCEPT
  21. -D APR_HAS_OTHER_CHILD
  22. -D AP_HAVE_RELIABLE_PIPED_LOGS
  23. -D DYNAMIC_MODULE_LIMIT=256
  24. -D HTTPD_ROOT="/usr/local/httpd"
  25. -D SUEXEC_BIN="/usr/local/httpd/bin/suexec"
  26. -D DEFAULT_PIDLOG="logs/httpd.pid"
  27. -D DEFAULT_SCOREBOARD="logs/apache_runtime_status"
  28. -D DEFAULT_ERRORLOG="logs/error_log"
  29. -D AP_TYPES_CONFIG_FILE="conf/mime.types"
  30. -D SERVER_CONFIG_FILE="conf/httpd.conf"

添加httpd服务启动脚本

在/usr/lib/systemd/system/目录下, 建立一个以.service结尾的单元(unit) 配置文件,用于控制由 systemd 管理或监控的 httpd 服务。

  1. [root@localhost ~]# vim /usr/lib/systemd/system/httpd.service
  2. [Unit]
  3. Description=The Apache HTTP Server
  4. After=network.target
  5. [Service]
  6. Type=forking
  7. PIDFile=/usr/local/httpd/logs/httpd.pid
  8. ExecStart= /usr/local/bin/apachectl $OPTIONS
  9. ExecReload= /bin/kill -HUP $MAINPID
  10. [Install]
  11. WantedBy=multi-user.target
  12. [root@localhost ~]# systemctl daemon-reload
  13. [root@localhost ~]# systemctl start httpd
  14. [root@localhost ~]# systemctl status httpd
  15. httpd.service - The Apache HTTP Server
  16. Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor preset: disabled)
  17. Active: active (running) since Mon 2019-07-08 22:44:33 CST; 4s ago
  18. Process: 22513 ExecStart=/usr/local/bin/apachectl $OPTIONS (code=exited, status=0/SUCCESS)
  19. Main PID: 22325 (httpd)
  20. CGroup: /system.slice/httpd.service
  21. 22325 httpd --help
  22. Jul 08 22:44:33 localhost.localdomain systemd[1]: Starting The Apache HTTP Server...
  23. Jul 08 22:44:33 localhost.localdomain apachectl[22513]: AH00558: httpd: Could not reliably determine the server's fully qualif...ssage
  24. Jul 08 22:44:33 localhost.localdomain apachectl[22513]: httpd (pid 22325) already running
  25. Jul 08 22:44:33 localhost.localdomain systemd[1]: Started The Apache HTTP Server.
  26. Hint: Some lines were ellipsized, use -l to show in full.
  27. [root@localhost ~]# systemctl enable httpd
  28. Created symlink from /etc/systemd/system/multi-user.target.wants/httpd.service to /usr/lib/systemd/system/httpd.service.

httpd服务器的基本配置

熟悉了 httpd 服务器的安装过程及主要目录结构以后,本节将进一步介绍使用 httpd 服务来架设 Web 站点的基本过程及常见配置。

一、Web站点的部署过程

1、确定网站名称、 IP地址

若要向 Internet 中发布一个 Web 站点, 需要申请一个合法的互联网 IP 地址, 并向 DNS服务提供商注册一个完整的网站名称。本案例采用本机的/etc/hosts文件做解析

  1. [root@localhost ~]# vim /etc/hosts
  2. 192.168.154.142 www.shengzhe.com
  3. [root@localhost ~]# hostname www.shengzhe.com
  4. [root@localhost ~]# hostnamectl set-hostname www.shengzhe.com
  5. [root@localhost ~]# cat /etc/hostname
  6. www.shengzhe.com

2、配置并启动httpd服务

配置httpd服务

编辑 httpd 服务的主配置文件 httpd.conf, 查找配置项“ServerName”, 在附近添加一行内容“ServiceName www.shengzhe.com”,用于设置网站名称。

  1. ServerName www.shengzhe.com:80

检查配置文件语法

  1. [root@www httpd]# apachectl -t
  2. Syntax OK

启动httpd服务
  1. [root@www httpd]# systemctl restart httpd.service
  2. [root@www httpd]# netstat -antp | grep httpd
  3. tcp6 0 0 :::80 :::* LISTEN 22990/httpd

3、部署网页文档

对于新编译安装的 httpd 服务, 网站根目录位于/usr/local/httpd/htdocs 下, 需要将 Web站点的网页文档复制或上传到此目录下。httpd服务器默认已提供了一个名为 index.html 的测试网页(可显示字串“It works! ”), 作为访问网站时的默认首页。

  1. [root@www httpd]# cat /usr/local/httpd/htdocs/index.html
  2. <html><body><h1>It works!</h1></body></html>

4、在客户机中访问Web站点

在客户机的网页浏览器中, 通过域名或 IP 地址访问 httpd 服务器, 将可以看到 Web 站点的页面内容。 若使用的是 httpd 服务默认的首页, 则页面会显示“It works! ”, 表示 httpd服务已经正常运作。

5、查看Web站点的访问情况

httpd 服务器使用了两种类型的日志: 访问日志和错误日志。 这两种日志的文件名分别为 access_log 和 error_log, 均位于/usr/local/httpd/logs 目录下。

通过查看访问日志文件 access_log, 可以及时了解 Web 站点的访问情况。 访问日志中的每一行对应一条访问记录, 记录了客户机的 IP 地址、 访问服务器的日期和时间、 请求的网页对象等信息。

  1. [root@www httpd]# tail /usr/local/httpd/logs/access_log
  2. 192.168.154.1 - - [08/Jul/2019:22:50:03 +0800] "GET / HTTP/1.1" 200 45
  3. 192.168.154.1 - - [08/Jul/2019:22:50:03 +0800] "GET /favicon.ico HTTP/1.1" 404 209
  4. 192.168.154.1 - - [08/Jul/2019:23:12:26 +0800] "GET / HTTP/1.1" 304 -
  5. 192.168.154.1 - - [08/Jul/2019:23:12:27 +0800] "GET / HTTP/1.1" 304 -
  6. 192.168.154.1 - - [08/Jul/2019:23:12:28 +0800] "GET / HTTP/1.1" 304 -

通过查看错误日志文件error_log,可以为排查服务器运行故障提供参考依据。 错误日志文件中的每一行对应一条错误记录, 记录了发生错误的日期和时间、 错误事件类型、错误事件的内容描述等信息

上述过程是使用 httpd 服务器部署并验证 Web 站点的基本步骤, 其中涉及 httpd.conf配置文件的改动量非常少,要搭建一台简单的Web服务器还是十分容易的。

二、配置文件 httpd.conf

主配置文件 httpd.conf 由注释行、 设置行两部分内容组成。 与大多数 Linux 配置文件一样,注释性的文字以“#”开始,包含了对相关配置内容进行的说明和解释。 除了注释行和空行以外的内容即设置行, 构成了 Web 服务的有效配置。 根据配置所作用的范围不同,设置行又可分为全局配置、 区域配置。

1、全局配置项

全局配置决定 httpd 服务器的全局运行参数, 使用“关键字 值”的配置格式。 例如,配置网站名称时使用的“ServerName www.kgc.com”, 其中“ServerName”为配置关键字,而“www.kgc.com”为对应的值。每一条全局配置都是一项独立的配置,不需要包含在其他任务区域中。以下列出了httpd.conf 文件中最常用的一些全局配置项。

  1. ServerRoot "/usr/local/httpd"
  2. Listen 80
  3. User daemon
  4. Group daemon
  5. ServerAdmin webmaster@kgc.com
  6. ServerName www.kgc.com
  7. DocumentRoot "/usr/local/httpd/htdocs"
  8. DirectoryIndex index.html index.php
  9. ErrorLog "logs/error_log"
  10. LogLevel warn
  11. CustomLog logs/access_log common
  12. PidFile logs/httpd.pid
  13. AddDefaultCharset UTF-8
  14. Include conf/extra/httpd-default.conf

在上述设置行中, 各全局配置项的含义如下:

  • ServerRoot: 设置 httpd 服务器的根目录, 该目录下包括了运行 Web 站点必需的子目录和文件。 默认的根目录为/usr/local/httpd, 与 httpd 的安装目录相同。在httpd.conf配置文件中,如果指定目录或文件位置时不使用绝对路径, 则该目录或文件位置都认为是在服务器的根目录下。
  • Listen: 设置 httpd 服务器监听的网络端口号, 默认为 80。
  • User: 设置运行 httpd 进程时的用户身份, 默认为 daemon。
  • Group: 设置运行 httpd 进程时的组身份, 默认为 daemon。
  • ServerAdmin: 设置 httpd 服务器的管理员 E-mail 地址, 可以通过此 E-mail地址及时联系 Web 站点的管理员。
  • ServerName: 设置 Web 站点的完整主机名(主机名+域名)。
  • DocumentRoot: 设置网站根目录,即网页文档在系统中的实际存放路径。 此配置项比较容易和 ServerRoot 混淆, 需要格外注意。
  • DirectoryIndex:设置网站的默认索引页(首页),可以设置多个首页文件,以空格分开, 默认的首页文件为 index.html。
  • ErrorLog: 设置错误日志文件的路径, 默认路径为 logs/error_log。
  • LogLevel: 设置记录日志的级别, 默认级别为 warn(警告)。
  • CustomLog : 设置访问日志文件的路径、日志类型,默认路径为logs/access_log, 使用的类型为 common(通用格式)。
  • PidFile: 设置用于保存httpd进程号(PID)的文件,默认保存地址为logs/httpd.pid, logs 目录位于 Apache 的服务器根目录下。
  • CharsetDefault:设置站点中的网页默认使用的字符集编码,如UTF-8、gb2312等。
  • Include: 包含另一个配置文件的内容,可以实现将一些特殊功能的配置放到一个单独的文件中, 再使用 Include 配置项将其包含到 httpd.conf 文件中, 这样便于独立进行配置功能的维护而不影响主配置文件。

以上配置项是 httpd.conf文件中主要的全局配置项。还有其他很多配置项, 在此不一一列举, 如果需要使用可以查看Apache服务器中的相关帮助手册文档。

2、区域配置项

除了全局配置项以外, httpd.conf文件中的大多数配置是包括在区域中的。 区域配置使用一对组合标记,限定了配置项的作用范围。例如,最常见的目录区域配置的形式如下所示:

  1. <Directory /> #定义"/"目录区域的开始
  2. Options FollowSymLinks #控制选项,允许使用符号链接
  3. AllowOverride None #不允许隐含控制文件中的覆盖配置
  4. Require all denied #禁止任何人访问此区域
  5. </Directory> #定义"/"目录区域的结束

在以上区域定义中,设置了一个根目录的区域配置,其中添加的访问控制相关配置只对httpd 服务的根目录有效, 而不会作用于全局或其他目录区域。


构建虚拟 Web 主机

虚拟 Web 主机指的是在同一台服务器中运行多个Web站点,其中的每一个站点实际上并不独立占用整个服务器,因此被称为“虚拟”Web主机。通过虚拟Web 主机服务可以充分利用服务器的硬件资源,从而大大降低网站构建及运行成本。

使用 httpd 可以非常方便地构建虚拟主机服务器, 只需要运行一个 httpd 服务就能够同时支撑大量的Web站点。httpd支持的虚拟主机类型包括以下三种。

  • 基于域名: 为每个虚拟主机使用不同的域名, 但是其对应的 IP 地址是相同的。例如, www.kgc.com 和 www.kcce.com 站点的 IP 地址都是 173.17.17.11。 这是使用最为普遍的虚拟 Web 主机类型。
  • 基于 IP 地址: 为每个虚拟主机使用不同的域名, 且各自对应的 IP 地址也不相同。 这种方式需要为服务器配备多个网络接口,因此应用并不是非常广泛。
  • 基于端口: 这种方式并不使用域名、 IP 地址来区分不同的站点内容, 而是使用了不同的 TCP端口号,因此用户在浏览不同的虚拟站点时需要同时指定端口号才能访问。

基于域名的虚拟主机

本小节以实现两个虚拟Web主机www.kgc.com和www.kcce.com为例,使用一台httpd服务器搭建, IP 地址为192.168.154.142。 具体构建过程介绍如下。

1.为虚拟主机提供域名解析

可以搭建DNS服务器做域名解析,如果是对公网用户提供服务,需要注册域名,做实验可以使用本地host文件做域名解析

2.为虚拟主机准备网页文档

为每个虚拟 Web 主机准备网站目录及网页文档。为了测试方便,分别为每个虚拟 Web主机提供包含不同内容的首页文件。例如,在/usr/local/httpd/htdocs/ 目录下创建两个子文件夹kgccom、 kccecom, 分别作为 www.kgc.com 和 www.kcce.com 的网站根目录, 并分别编写测试网页文件。

  1. [root@www ~]# cd /usr/local/httpd/htdocs/
  2. [root@www htdocs]# mkdir kgccom
  3. [root@www htdocs]# mkdir kccecom
  4. [root@www htdocs]# echo '<h1>www.kgc.com</h1>' > kgccom/index.html
  5. [root@www htdocs]# echo '<h1>www.kcce.com</h1>' > kccecom/index.html

3.添加虚拟主机配置

在 httpd 服务器的主配置文件中, 若要启用基于域名的虚拟 Web 主机, 通常需要配置以下几个方面的内容。

  • 虚拟主机区域: 使用……区域配置,为每一个虚拟Web主机建立独立的配置内容。 其中至少应包括虚拟主机的网站名称、 网页根目录的配置项; 其他( 如管理邮箱、 访问日志等) 配置项可根据实际需要添加。
  • 目录权限: 使用……区域配置, 为每一个虚拟 Web 主机的网站目录设置访问权限, 如允许任何人访问。 目录访问可以继承其父目录的授权许可,因此可以采取直接为父文件夹授权访问权限的方法来简化配置。

当虚拟 Web 主机的数量较多时, 建议使用独立的虚拟主机配置文件, 然后在 httpd.conf文件中通过 Include 加载这些配置。 这样可以将对 httpd.conf 文件的改动减至最少, 更方便配置内容的维护。

首先:

  1. [root@www httpd]# vim /usr/local/httpd/conf/httpd.conf
  2. # Virtual hosts
  3. Include conf/extra/httpd-vhosts.conf

然后:

  1. [root@www extra]# vim /usr/local/httpd/conf/extra/httpd-vhosts.conf
  2. <VirtualHost *:80>
  3. DocumentRoot '/usr/local/httpd/htdocs/kgccom'
  4. ServerName www.kgc.com
  5. ErrorLog "logs/www.kgc.com-error_log"
  6. CustomLog "logs/www.kgc.com-access_log" common
  7. <Directory '/usr/local/httpd/htdocs/kgccom'>
  8. Require all granted
  9. </Directory>
  10. </VirtualHost>
  11. <VirtualHost *:80>
  12. DocumentRoot '/usr/local/httpd/htdocs/kccecom'
  13. ServerName www.kcce.com
  14. ErrorLog "logs/www.kcce.com-error_log"
  15. CustomLog "logs/www.kcce.com-access_log" common
  16. <Directory '/usr/local/httpd/htdocs/kccecom'>
  17. Require all granted
  18. </Directory>
  19. </VirtualHost>
  20. [root@www extra]# apachectl -t
  21. Syntax OK
  22. [root@www extra]# systemctl restart httpd.service
  23. [root@www extra]#

4.在客户机中访问虚拟 Web 主机

在客户机的浏览器中, 使用网站名称分别访问不同的虚拟 Web 主机, 确认能够看到不同的网页内容, 此时表示基于域名的虚拟主机配置成功。

基于IP地址、 基于端口的虚拟主机

构建基于 IP 地址或基于端口的虚拟主机的过程与基于域名的虚拟主机类似, 也需要先提供域名解析、 准备网页文档, 再调整 httpd 配置、 重启 httpd 服务, 然后在客户机中访问虚拟主机进行测试。其中最主要的区别是, 不同类型的虚拟主机在 httpd.conf 文件中的配置内容略有不同。

1.基于 IP 地址的虚拟主机

需要配置多个IP地址,例如:192.168.154.142和192.168.154.143

  1. <VirtualHost 192.168.154.142:80>
  2. DocumentRoot '/usr/local/httpd/htdocs/kgccom'
  3. ServerName www.kgc.com
  4. ErrorLog "logs/www.kgc.com-error_log"
  5. CustomLog "logs/www.kgc.com-access_log" common
  6. <Directory '/usr/local/httpd/htdocs/kgccom'>
  7. Require all granted
  8. </Directory>
  9. </VirtualHost>
  10. <VirtualHost 192.168.154.143:80>
  11. DocumentRoot '/usr/local/httpd/htdocs/kccecom'
  12. ServerName www.kcce.com
  13. ErrorLog "logs/www.kcce.com-error_log"
  14. CustomLog "logs/www.kcce.com-access_log" common
  15. <Directory '/usr/local/httpd/htdocs/kccecom'>
  16. Require all granted
  17. </Directory>
  18. </VirtualHost>

重启服务进行测试即可

2.基于端口的虚拟主机

基于端口的虚拟主机通常只用于同一个 Web 站点, 其针对的网站名称、 IP 地址往往是相同的,但通过不同的TCP端口来提供访问不同网页内容的服务入口。

配置基于端口的虚拟Web主机时,需要通过多个Listen配置项来指定要监听的 TCP 端口号, 每个虚拟Web主机的VirtualHost配置中应同时指定IP地址和端口号。

例如, 若要实现当通过 80 端口访问www.kcce.com站点时,看到的是正常的 kcce 站点内容; 而当通过端口 8353 端口来访问 www.kcce.com 站点时, 可以看到 kcce 站点的后台管理系统页面, 则可参考以下内容调整 httpd 服务器的配置。

首选启动不同的侦听端口:

  1. [root@www httpd]# vim /usr/local/httpd/conf/httpd.conf
  2. Listen 192.168.154.142:80
  3. Listen 192.168.154.142:8353
  4. # Virtual hosts
  5. Include conf/extra/httpd-vhosts.conf

然后配置虚拟主机:

  1. [root@www extra]# vim /usr/local/httpd/conf/extra/httpd-vhosts.conf
  2. <VirtualHost 192.168.154.142:80>
  3. DocumentRoot '/usr/local/httpd/htdocs/kccecom'
  4. ServerName www.kcce.com
  5. ErrorLog "logs/www.kgc.com-error_log"
  6. CustomLog "logs/www.kgc.com-access_log" common
  7. <Directory '/usr/local/httpd/htdocs/kccecom'>
  8. Require all granted
  9. </Directory>
  10. </VirtualHost>
  11. <VirtualHost 192.168.154.142:8353>
  12. DocumentRoot '/usr/local/httpd/htdocs/kccecompad'
  13. ServerName www.kcce.com
  14. ErrorLog "logs/www.kcce.com-error_log"
  15. CustomLog "logs/www.kcce.com-access_log" common
  16. <Directory '/usr/local/httpd/htdocs/kccecompad'>
  17. Require all granted
  18. </Directory>
  19. </VirtualHost>

重启服务,测试即可


MySQL服务

MySQL 是一个真正的多线程、 多用户的 SQL 数据库服务, 凭借其高性能、 高可靠和易于使用的特性, 成为服务器领域中最受欢迎的开源数据库系统。 在 2008 年以前, MySQL项目由 MySQL AB 公司进行开发、 发布和支持, 之后历经 Sun 公司收购 MySQL AB 公司,Oracle 公司收购Sun公司的过程, 目前 MySQL 项目由 Oracle 公司负责运营和维护。

MySQL是目前使用最受信赖和广泛使用的开源数据库平台。全球十大最受欢迎和高流量的网站中有10个依赖于MySQL。MySQL 8.0通过提供全面的改进建立在这一势头上,旨在使创新的DBA和开发人员能够在最新一代的开发框架和硬件上创建和部署下一代Web,嵌入式,移动和云/ SaaS / PaaS / DBaaS应用程序平台。MySQL 8.0亮点包括:

  • MySQL文档存储
  • 交易数据字典
  • SQL角色
  • 默认为utf8mb4
  • 公用表表达式
  • 窗口功能
  • 以及更多

二进制安装mysql8

1. 前提

  1. 如果您以前使用操作系统本机程序包管理系统(如Yum或APT)安装了MySQL,则使用本机二进制文件安装时可能会遇到问题。确保您之前的MySQL安装已完全删除(使用您的包管理系统),并且还删除了任何其他文件,例如旧版本的数据文件。您也应该检查配置文件,如/etc/my.cnf或/etc/mysql目录,并删除它们。
  2. MySQL依赖于libaio库。如果未在本地安装此库,则数据目录初始化和后续服务器启动步骤将失败
  1. [root@www ~]# yum install libaio -y

2. 安装过程

  1. 创建一个MySQL用户和组
  1. [root@www ~]# groupadd mysql
  2. [root@www ~]# useradd -r -g mysql -s /bin/flase mysql
  1. 解压下载的二进制安装包
  1. [root@www ~]# cd /usr/local/
  2. [root@www local]# tar Jxvf /root/mysql-8.0.16-linux-glibc2.12-x86_64.tar.xz
  1. 创建一个链接目录mysql
  1. [root@www local]# ln -s mysql-8.0.16-linux-glibc2.12-x86_64 mysql
  2. [root@www local]# cd mysql
  3. [root@www mysql]# ls
  4. bin docs include lib LICENSE LICENSE.router man README README.router run share support-files var
  1. 为了避免在使用MySQL时始终键入客户端程序的路径名,可以将/usr/local/mysql/bin目录添加到PATH变量中,如何希望永远生效,可以写到/root/.bash_profile文件中
  1. # export PATH=$PATH:/usr/local/mysql/bin
  1. 安装后设置与测试

为导入和导出操作创建安全目录,进入安装目录:

  1. # cd /usr/local/mysql
  2. # mkdir mysql-files
  3. #设置属主属组为mysql,并设置权限
  4. # chown mysql:mysql mysql-files/
  5. # chmod 750 mysql-files/

初始化命令:

  1. [root@www mysql]# mysqld --initialize --user=mysql
  2. 2019-07-11T07:35:58.114852Z 0 [System] [MY-013169] [Server] /usr/local/mysql-8.0.16-linux-glibc2.12-x86_64/bin/mysqld (mysqld 8.0.16) initializing of server in progress as process 1929
  3. 2019-07-11T07:36:08.180488Z 5 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: pOMlL*Bs5ETP
  4. 2019-07-11T07:36:10.226446Z 0 [System] [MY-013170] [Server] /usr/local/mysql-8.0.16-linux-glibc2.12-x86_64/bin/mysqld (mysqld 8.0.16) initializing of server has completed

会生成一个密码,这个密码已经默认设置为过期,必须要更改才可以使用
\6. 安全启动数据库:(要确保使用mysql用户启动)

  1. [root@www mysql]# mysqld_safe --user=mysql &
  2. [1] 2001
  3. [root@www mysql]# Logging to '/usr/local/mysql/data/www.shengzhe.com.err'.
  4. 2019-07-11T07:39:05.773230Z mysqld_safe Starting mysqld daemon with databases from /usr/local/mysql/data
  1. 连接到数据库,修改root的新密码
  1. # mysql -uroot -p
  2. Enter password: 输入初始化的密码
  3. mysql> alter user 'root'@'localhost' identified by 'Com.123456';
  1. 测试服务器
    使用mysqladmin验证服务器是否正在运行。以下命令提供简单的测试,以检查服务器是否已启动并响应连接:
  1. [root@www mysql]# mysqladmin version -u root -pCom.123456
  2. mysqladmin: [Warning] Using a password on the command line interface can be insecure.
  3. mysqladmin Ver 8.0.16 for linux-glibc2.12 on x86_64 (MySQL Community Server - GPL)
  4. Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.
  5. Oracle is a registered trademark of Oracle Corporation and/or its
  6. affiliates. Other names may be trademarks of their respective
  7. owners.
  8. Server version 8.0.16
  9. Protocol version 10
  10. Connection Localhost via UNIX socket
  11. UNIX socket /tmp/mysql.sock
  12. Uptime: 4 min 4 sec
  13. Threads: 2 Questions: 8 Slow queries: 0 Opens: 144 Flush tables: 3 Open tables: 45 Queries per second avg: 0.032

显示可用变量

  1. [root@www mysql]# mysqladmin variables -uroot -pCom.123456

验证您是否可以关闭服务器:

  1. # mysqladmin -uroot -pCom.123456 shutdown

使用mysqlshow查看存在哪些数据库:

  1. [root@www mysql]# mysqlshow -pCom.123456
  2. mysqlshow: [Warning] Using a password on the command line interface can be insecure.
  3. +--------------------+
  4. | Databases |
  5. +--------------------+
  6. | information_schema |
  7. | mysql |
  8. | performance_schema |
  9. | sys |
  10. +--------------------+

如果指定数据库名称,mysqlshow将显示数据库中的表列表:

  1. [root@www mysql]# mysqlshow mysql -pCom.123456
  2. mysqlshow: [Warning] Using a password on the command line interface can be insecure.
  3. Database: mysql
  4. +---------------------------+
  5. | Tables |
  6. +---------------------------+
  7. | columns_priv |
  8. | component |
  9. | db |
  10. | default_roles |
  11. | engine_cost |
  12. | func |
  13. | general_log |
  14. | global_grants |
  15. | gtid_executed |
  16. | help_category |
  17. | help_keyword |
  18. | help_relation |
  19. | help_topic |
  20. | innodb_index_stats |
  21. | innodb_table_stats |
  22. | password_history |
  23. | plugin |
  24. | procs_priv |
  25. | proxies_priv |
  26. | role_edges |
  27. | server_cost |
  28. | servers |
  29. | slave_master_info |
  30. | slave_relay_log_info |
  31. | slave_worker_info |
  32. | slow_log |
  33. | tables_priv |
  34. | time_zone |
  35. | time_zone_leap_second |
  36. | time_zone_name |
  37. | time_zone_transition |
  38. | time_zone_transition_type |
  39. | user |
  40. +---------------------------+

使用mysql程序从mysql架构中的表中选择信息:

  1. [root@www mysql]# mysql -e "select User,Host,plugin From mysql.user" mysql -pCom.123456
  2. mysql: [Warning] Using a password on the command line interface can be insecure.
  3. +------------------+-----------+-----------------------+
  4. | User | Host | plugin |
  5. +------------------+-----------+-----------------------+
  6. | mysql.infoschema | localhost | caching_sha2_password |
  7. | mysql.session | localhost | caching_sha2_password |
  8. | mysql.sys | localhost | caching_sha2_password |
  9. | root | localhost | caching_sha2_password |
  10. +------------------+-----------+-----------------------+
  1. 构建主配置文件
  1. [root@www mysql]# touch /etc/my.cnf
  2. [root@www mysql]# chmod 644 /etc/my.cnf
  3. [root@www mysql]# vim /etc/my.cnf
  4. [mysqld]
  5. datadir=/usr/local/mysql/data
  6. basedir=/usr/local/mysql
  7. socket=/tmp/mysql.sock
  8. port=3306
  9. log-error=/usr/local/mysql/data/www.shengzhe.com.err
  10. user=mysql
  11. secure_file_priv=/usr/local/mysql/mysql-files
  12. local_infile=OFF
  1. 构建systemd服务单元配置文件
  1. [root@www mysql]# vim /usr/lib/systemd/system/mysqld.service
  2. [Unit]
  3. Description=MySQL Server
  4. Documentation=man:mysqld(8)
  5. Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html
  6. After=network.target
  7. After=syslog.target
  8. [Install]
  9. WantedBy=multi-user.target
  10. [Service]
  11. User=mysql
  12. Group=mysql
  13. Type=notify
  14. # Disable service start and stop timeout logic of systemd for mysqld service.
  15. TimeoutSec=0
  16. # Start main service
  17. ExecStart=/usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf $MYSQLD_OPTS
  18. # Use this to switch malloc implementation
  19. EnvironmentFile=-/etc/sysconfig/mysql
  20. # Sets open_files_limit
  21. LimitNOFILE = 10000
  22. Restart=on-failure
  23. RestartPreventExitStatus=1
  24. # Set environment variable MYSQLD_PARENT_PID. This is required for restart.
  25. Environment=MYSQLD_PARENT_PID=1
  26. PrivateTmp=false
  1. 配置MySQL开机启动
  1. [root@www mysql]# systemctl daemon-reload
  2. [root@www mysql]# systemctl enable mysqld.service
  3. Created symlink from /etc/systemd/system/multi-user.target.wants/mysqld.service to /usr/lib/systemd/system/mysqld.service.
  4. [root@www mysql]# systemctl start mysqld.service
  5. [root@www mysql]# systemctl status mysqld.service
  6. mysqld.service - MySQL Server
  7. Loaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled; vendor preset: disabled)
  8. Active: active (running) since Thu 2019-07-11 16:02:02 CST; 16s ago
  9. Docs: man:mysqld(8)
  10. http://dev.mysql.com/doc/refman/en/using-systemd.html
  11. Main PID: 3019 (mysqld)
  12. Status: "SERVER_OPERATING"
  13. CGroup: /system.slice/mysqld.service
  14. └─3019 /usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf
  15. Jul 11 16:00:36 www.shengzhe.com systemd[1]: Starting MySQL Server...
  16. Jul 11 16:02:02 www.shengzhe.com systemd[1]: Started MySQL Server.

构建 PHP 运行环境

PHP 即“Hypertext Preprocessor”(超级文本预处理语言) 的缩写, 是一种服务器端的HTML 嵌入式脚本语言。 PHP 的语法混合了 C、 Java、 Perl 及部分自创的新语法, 拥有更好的网页执行速度, 更重要的是 PHP 支持绝大多数流行的数据库,在数据库层面的操作功能十分强大,而且能够支持 UNIX、 Windows、 Linux 等多种操作系统。

PHP在Apache中有三种工作方式:

  1. Apache模块
    模块模式是以mod_php5模块的形式集成,此时mod_php5模块的作用是接收Apache传递过来的PHP文件请求,并处理这些请求,然后将处理后的结果返回给Apache。Apache的模块可以在运行的时候动态装载,这意味着对服务器可以进行功能扩展而不需要重新对源代码进行编译,甚至根本不需要停止服务器;但是在动态加载之前,需要将模块编译成为动态链接库。此时的动态加载就是加载动态链接库。Apache中对动态链接库的处理是通过模块mod_so来完成的,因此mod_so模块不能被动态加载,它只能被静态编译进Apache的核心,这意味着它是随着Apache一起启动的。
  2. CGI模式
    每当客户端请求动态资源的时候,WEB服务器就请求操作系统生成一个新的CGI解释器进程,CGI 的一个进程则处理完一个请求后退出,下一个请求来时再创建新进程。当然,这样在访问量很少没有并发的情况也行。可是当访问量增大,并发存在,这种方式就不适合了。
  3. FPM模式
    PHP-FPM是一个简单可靠的 FastCGI 进程管理器(FastCGI Process Manager),Apache官方网站也提供了配置Apache httpd 2.4.x使用mod_proxy_fcgi和PHP-FPM运行php程序的基本方法和设置运行方式的介绍。
    PHP-FPM 就意味着不用 Apache 内置的 mod_php,也就是要在 Apache 之外处理 php 程序的解释运行问题。看起来是多引入了一个额外的程序 PHP-FPM,既占 CPU 又占内存。但是这样一来,因为 Apache可以专心处理除 php 之外的静态网页及元素,反而httpd进程本身占用的CPU和内存可以显著降低,从而从整体上降低资源消耗。
    PHP-FPM 监听方式(接收 Apache 转过去的处理 PHP 的请求的方式)有 2 种:
    • TCP socket (IP和port),Listen IP地址:9000;
    • Unix Domain Socket(UDS),通常路径指明socket的位置/path/to/unix/socket

本节配置使用Apache模块方式

1、安装php7的YUM源

  1. rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
  2. rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm

2、安装PHP7.2

  1. [root@www ~]# yum install php72w php72w-cli php72w-common php72w-gd php72w-ldap php72w-mbstring php72w-mcrypt php72w-mysql php72w-pdo php72w-opcache

3、找到安装的php模块,并复制到apache模块目录下

  1. [root@www httpd]# find / -name '*php*.so'
  2. /usr/lib64/httpd/modules/libphp7-zts.so
  3. /usr/lib64/httpd/modules/libphp7.so
  4. [root@www httpd]# cp /usr/lib64/httpd/modules/libphp7-zts.so /usr/local/httpd/modules/
  5. [root@www httpd]# cp /usr/lib64/httpd/modules/libphp7.so /usr/local/httpd/modules/

4、修改Apache配置主配置文件

  1. #在主配置文件中添加以下内容
  2. [root@www httpd]# vim conf/httpd.conf
  3. LoadModule php7_module modules/libphp7.so
  4. LoadModule authn_file_module modules/mod_authn_file.so
  5. LoadModule mpm_prefork_module modules/mod_mpm_prefork.so
  6. #激活额外MPM配置文件
  7. Include conf/extra/httpd-mpm.conf
  8. #增加后面两行内容
  9. AddType application/x-compress .Z
  10. AddType application/x-gzip .gz .tgz
  11. AddType application/x-httpd-php .php
  12. AddType application/x-httpd-source .phps
  13. #增加默认首页index.php
  14. <IfModule dir_module>
  15. DirectoryIndex index.html index.php
  16. </IfModule>
  17. #重启服务
  18. [root@www httpd]# systemctl restart httpd

5、创建test.php测试文件并测试

  1. [root@www httpd]# cd /usr/local/httpd/htdocs/
  2. [root@www htdocs]# cat test.php
  3. <?php
  4. phpinfo();
  5. ?>
  6. [root@www htdocs]# curl http://192.168.154.142/test.php

也可以通过浏览器访问成功:

Apache配置管理 - 图3

6、创建MySQL数据库管理员

认证机制必须是mysql_native_password;默认mysql8使用 caching_sha2_password的身份验证机制。

  1. mysql> create user 'dbadmin'@'%' identified with mysql_native_password by 'Com.123456';
  2. Query OK, 0 rows affected (0.02 sec)
  3. mysql> grant all on *.* to 'dbadmin'@'%';
  4. Query OK, 0 rows affected (0.01 sec)
  5. mysql> grant GRANT OPTION on *.* to 'dbadmin'@'%';
  6. Query OK, 0 rows affected (0.01 sec)

7、修改PHP的配置文件

  1. [root@www htdocs]# vim /etc/php.ini
  2. mysqli.default_socket = /tmp/mysql.sock

8、创建数据库连接测试文件

  1. [root@www htdocs]# cd /usr/local/httpd/htdocs/
  2. [root@www htdocs]# cat mysql_test.php
  3. <?PHP
  4. $conn=mysqli_connect("localhost","dbadmin","Com.123456");
  5. if($conn){
  6. echo"ok";
  7. }else{
  8. echo"error";
  9. }
  10. ?>
  11. [root@www htdocs]# systemctl restart httpd
  12. [root@www htdocs]# curl http://192.168.154.142/mysql_test.php
  13. ok

LAMP 架构应用实例

在企业 Web 应用系统中, 动态网站已经逐步成为主流, 而基于 LAMP 架构的 Web 动态网站更是其中的佼佼者。phpMyAdmin 是一个使用 PHP 语言编写, 用来管理MySQL数据库的Web应用系统。通过该套件提供的网页界面, 即便是对 SQL 语句不太熟悉的人, 也能够非常容易地对MySQL 数据库进行管理和维护。phpMyAdmin的源码包可以从其官方站点http://www.phpmyadmin.net 下载。

  1. [root@www ~]# wget https://files.phpmyadmin.net/phpMyAdmin/4.9.0.1/phpMyAdmin-4.9.0.1-all-languages.tar.gz
  2. [root@www ~]# ls phpMyAdmin-4.9.0.1-all-languages.tar.gz
  3. phpMyAdmin-4.9.0.1-all-languages.tar.gz

1、解包并复制到网站目录

对于大部分 PHP 应用系统,只需要解包后复制到网站目录下即可完成部署, 之后再根据需要调整配置, 或者访问安装页面以完成进一步的安装。

  1. [root@www ~]# tar zxf phpMyAdmin-4.9.0.1-all-languages.tar.gz -C /usr/local/httpd/htdocs/
  2. [root@www ~]# cd /usr/local/httpd/htdocs/
  3. [root@www htdocs]# mv phpMyAdmin-4.9.0.1-all-languages/ phpMyAdmin
  4. [root@www htdocs]# ls
  5. index.html kccecom kgccom mysql_test.php phpMyAdmin test.php

2、建立配置文件 config.inc.php

将 phpMyAdmin 套件复制到网站目录以后,还需要创建配置文件方可正常使用。 默认提供的样例配置文件为config.sample.inc.php,需参照该文件内容建立 configi.inc.php配置文件。查找配置文件中的“blowfish_secret”行, 默认已经设置了一个短语密钥(此密钥用于网页cookie认证,不需要用户记忆), 可以根据需要自行修改。

  1. [root@www htdocs]# cd phpMyAdmin/
  2. [root@www phpMyAdmin]# cp config.sample.inc.php config.inc.php
  3. [root@www phpMyAdmin]# vim config.inc.php
  4. $cfg['blowfish_secret'] = '123.com'; /* YOU MUST FILL IN THIS FOR COOKIE AUTH! */

3、访问phpMyAdmin的Web管理界面

在浏览器中访问http://www.kgc.com/phpMyAdmin/,如果能够看到phpMyAdmin 系统的登录界面

image.png

4、使用 phpMyAdmin 系统

管理页面的初始界面是一个典型的分栏结构,左侧部分包括一排导航按钮(主页、 退出、查询、 帮助、 SQL 文档)、库列表;右侧部分是主体窗口, 其中显示了若干标签、 操作面板、界面控制等组件, 以及 MySQL、 网站服务器、 phpMyAdmin 的版本信息。

下面仅简单介绍 phpMyAdmin系统中几个常见的数据库操作,更多的操作方法需要大家自行去探索和实践。

  • 创建新的库、 新的表
  • 表及数据记录的管理
  • 直接执行 MySQL 查询语句