Advanced
安装
安装 Apache 最简单的方式就是在线安装:
安装内核
# Installing on Fedora/CentOS/Red Hat Enterprise Linux
sudo yum install httpd
sudo systemctl enable httpd
sudo systemctl start httpd
# Installing on Ubuntu/Debian
sudo apt install apache2
sudo service apache2 start
安装Apache的时候默认会安装核心特性与多处理模块(MPM),其他的扩展模块可以后续自行安装。
安装模块
安装 Apache HTTP Server 内核的同时,会默认安装一些模块,通过 apachectl -M
命令即可查看。
$ apachectl -M
Loaded Modules:
core_module (static)
so_module (static)
...
安装模块有yum/apt在线安装和源码编译安装两种方式,其中在线安装非常简单:
在线安装
例如:准备在CentOS上安装 mod_ssl
模块:
-
搜索 mod_ssl 是否存在
sudo yum search mod_ssl
============================= N/S matched: mod_ssl =============================
mod_ssl.x86_64 : SSL/TLS module for the Apache HTTP Server -
搜索结果提示有一个 mod_ssl.x86_64 可用,接下来运行安装命令
sudo yum install mod_ssl
-
等待自动安装,直至安装完成
源码安装
如果在线搜索找不到所需的 Module, 就需要通过源码编译安装的方式安装新的模块。主要步骤如下:
- 安装 apxs 这个Apache模块管理工具以及配套工具
yum install httpd-devel
yum groupinstall 'Development tools' - 下载 Apache 源码到 /opt 目录,并解压之
cd /opt
wget http://mirror.bit.edu.cn/apache//httpd/httpd-2.4.41.tar.gz
tar xvf httpd-2.4.41.tar.gz - 以安装 mod_auth_form 模块为例,我们找到其所在的目录,然后运行编译命令
cd /opt/httpd-2.4.41/modules/aaa
mod_auth_form.c - 编译成功,会增加一个模块配置文件:/usr/lib64/httpd/modules/mod_auth_form.so
以上的源码编译安装方案来源于此处
启停模块
需要注意的是,安装过的所有模块并不会全部被启用,即安装模块与启用是有区别的,只有安装之后才能被启用,被启用的模块也可以让它停止运行。接下来,我们讲解如何启停模块。
下面先介绍通过修改模块配置文件实现模块启用的方案:
以CentOS为例,我们打开Apache模块配置文件:/etc/httpd/conf.modules.d/00-base.conf
...
LoadModule version_module modules/mod_version.so
LoadModule vhost_alias_module modules/mod_vhost_alias.so
#LoadModule buffer_module modules/mod_buffer.so
#LoadModule watchdog_module modules/mod_watchdog.so
...
其中带“#”号的模块是没有启用的,如果需要启用,去掉“#”号,然后重启 Apache HTTP 服务即可。
修改Apache配置文件显得繁琐,可以安装通过a2enmod
这个模块来管理Apache扩展模块的启停
更新
Apache HTTP Server在安全性方面有良好记录,并且开发人员社区高度关注安全性问题。但是,不可避免的是,某些问题(无论大小)都会在发布后在软件中发现。因此,保持对软件更新的了解至关重要。如果您直接从Apache获得HTTP Server的版本,我们强烈建议您订阅Apache HTTP Server公告列表,在其中可以随时了解新版本和安全更新。
原理
配置
Apache HTTP Sever 提供了灵活的配置项,以帮助用户适用各种业务场景。
配置文件
- 主配置文件:/etc/httpd/conf/httpd.conf
- 扩展配置文件:/etc/httpd/conf.d/.conf*
当Apache启动时,会加载/etc/httpd/conf.d/目录中的所有以.conf结尾的文件,做为配置文件来使用,所以管理员可以将配置推荐写在.conf中,如果将配置项写入主配置文件,系统升级时,配置项还要重新修改一遍,如果写在扩展配置项,则不存在此问题,同时也可以从繁杂的主配置文件中脱离出来。
配置项
配置项 | 说明 |
---|---|
ServerTokens OS | 系统信息,在访问出错时出现;把OS改为Minor,就不显示系统信息 |
ServerSignature On | 把On改为Off就连普通的系统都给隐藏起来;改为Email就会显示管理员的邮箱(邮箱需要另外配置 ServerAdmin ) |
ServerAdmin root@localhost | 管理员邮箱 |
ServerName localhost | 服务器的主机名,一般是用虚拟机来设置,通常这个值是自动指定的,推荐显式的指定它以防止启动时出错 |
UseCanonicalName Off | 设置为"On",Apache会使用ServerName指令的值 设置为 "Off"时,Apache会使用用户端提供的主机名和端口号。 如果有虚拟主机,必须设置为Off |
ServerRoot "/etc/httpd" | 配置项的根目录,类似html里面的base;默认到这个路径里面找; |
PidFile run/httpd.pid | 进程PID,位置在 /etc/httpd/run/httpd.pid,主进程决定着子进程 |
Timeout 60 | 若60秒后没有收到或送出任何数据就切断该连接 |
KeepAlive Off | 是否开启持久化链接,访问网站时要对网站的很多资源,如css,js,image等等创建不同的链接;事实上我们可以建立一个持久化链接来应对多个请求; |
MaxKeepAliveRequests 100 | 一个持久化链接最多能应对多少个请求 |
KeepAliveTimeout 15 | 15秒不链接就断开 |
Listen 80 | 监听端口,默认是80,如果这里要更改为其他端口比如88的话,下面的ServerName localhost:88也得更改 |
KeepAliveTimeout 15 | 15秒不链接就断开 |
Include conf.d/*.conf | 扩展配置文件 |
User apache | Apache子进程所有者 |
Group apache | Apache子进程所属组 |
DirectoryIndex index.html index.html.var | 默认主文件 |
DocumentRoot "/var/www/html" | 网站数据根目录 |
ErrorDocument 404 /404.html | 404可以通过PHP程序来处理(在框架中),可以通过rewrite来处理,但是最理想的模式是让Apache来处理 |
Directory | 定位目录 /(也就是Apache网站根目录) |
Indexes | 如果访问的文件不存在,显示目录文件列表;要禁止的话前面加上一个 - (-indexes) |
FollowSymLinks | 软链接 |
AllowOverride | 是否允许目录配置文件.htaccess有效ALL有效,None无效 |
IfModule | 如果存在模块mod_userdir.c... |
配置注意事项:
- Apache对文件的操作就会用系统给的一个临 时账号Apache作为第三方other来运行
- Apache的配置规则是 后出现,先应用 后面的出现的配置会覆盖前面的。
- 以上配置都应该在扩展配置里面覆盖更改或增加;
核心模块
多处理
Apache HTTP 服务器被设计为一个功能强大,并且灵活的 web 服务器, 可以在很多平台与环境中工作。不同平台和不同的环境往往需要不同的特性,或可能以不同的方式实现相同的特性最有效率。
Apache httpd 通过模块化的设计来适应各种环境。这种设计允许网站管理员通过在编译时或运行时,选择哪些模块将会加载在服务器中,来选择服务器特性。
Apache提供一个名称为多处理模块(MPM),用来接受请求, 以及调度子进程处理请求。
下表列出了不同系统的默认 MPM。如果你不在编译时选择,那么它就是你将要使用的 MPM。
操作系统 | MPM名称 |
---|---|
Netware | mpm_netware |
OS/2 | mpmt_os2 |
Unix | prefork ,worker 或 event ,取决于平台特性 |
Windows | mpm_winnt |
查看 MPM
以CentOS为例,查看当前系统的MPM模式,只需运行 httpd -V
命令即可查看:
[root@lamp7 ~]# httpd -V
Server version: Apache/2.4.6 (CentOS)
Server built: Aug 8 2019 11:41:18
Server's Module Magic Number: 20120211:24
Server loaded: APR 1.4.8, APR-UTIL 1.5.2
Compiled using: APR 1.4.8, APR-UTIL 1.5.2
Architecture: 64-bit
Server MPM: prefork
threaded: no
forked: yes (variable process count)
另外,在Apache主配置文件:/etc/httpd/conf/httpd.conf 中,可以设置 prefork 的工作参数:
<IfModule prefork.c>
StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxClients 256
MaxRequestsPerChild 3000
</IfModule>
切换 MPM
以CentOS为例,切换当前系统的MPM模式,编辑:/etc/httpd/conf.modules.d/00-mpm.conf 文件
LoadModule mpm_prefork_module modules/mod_mpm_prefork.so
#LoadModule mpm_worker_module modules/mod_mpm_worker.so
#LoadModule mpm_event_module modules/mod_mpm_event.so
通过去掉或增加“#”号的方式,选择一种MPM模式,重启Apache后生效
比较 MPM
图1:Prefork,每个子进程只有一个线程,在一个时间点内只能处理一个请求
图2:work,多进程和多线程的混合模式