一、Apache简介
1.1 关于Apache
Apache HTTP Server(简称Apache)是Apache软件基金会的一个开放源码的Web服务器,可以在大多数计算机操作系统中运行,由于其跨平台和安全性被广泛使用,是最流行的Web服务器端软件之一。它快速、可靠并且可通过简单的API扩展,将Perl/Python等解释器编译到服务器中。
1.2 Apache 的特点
-
具有开放的源代码。
-
跨平台应用。Apache 服务器可以运行在绝大多数软硬件平台上,几乎所有 UNIX 操作系统都可以运行,同时也可以在 Windows 系统平台上良好的运行。
-
支持各种 Web 编程语言。
-
模块化设计。Apache 不是将所有的功能集中在固定的服务程序内部,而是尽可能地通过标准的模块实现特有的功能,因此 Apache 服务器具有良好的扩展性。
-
运行稳定。Apache 服务器可以用于构建具有大负载访问量的 Web 站点。
-
良好的安全性。开源软件共同具有的特性。
二、Apache服务器的安装
本文基于CentOS 7.5系统安装并配置Apache服务器,Apache的版本是2.4.6。
[root@apache ~]# uname -r
3.10.0-862.el7.x86_64
[root@apache ~]# cat /etc/redhat-release
CentOS Linux release 7.5.1804 (Core)
2.1 安装Apache
Apache的主程序名称是httpd,服务器配置好YUM源后,使用如下命令安装httpd,并可同时安装其依赖包。依赖包主要包括apr、apr-utils和httpd-tools。
[root@apache ~]# yum install httpd -y
2.2 启动Apache
httpd安装后,系统会生成一个名为httpd.service的服务,启动此服务便可以启动Apache。
[root@apache ~]# systemctl list-unit-files --type=service | grep httpd
httpd.service disabled
[root@apache ~]# systemctl start httpd.service
[root@apache ~]# systemctl enable httpd.service
Apache服务器的守护进程为httpd,默认在TCP 80端口侦听用户请求。
[root@apache ~]# netstat -nptl | grep 80
tcp6 0 0 :::80 :::* LISTEN 70787/httpd
在浏览器中输入服务器的http://IP地址可以浏览Apache的默认网站。
2.3 Apache相关目录和文件
1、Apache主配置文件
/etc/httpd/conf/httpd.conf ,是Apache的主配置文件,几乎包含了所有的配置。有的版本将主配置文件拆分成数个小配置文件,分别管理不同的参数。后面会详细解释Apache主配文件。
2、额外配置文件目录
为了便于管理和维护,可以将一些配置参数从主配置文件分离出来,形成额外的配置文件,以.conf结尾,存放在/etc/httpd/conf.d/目录中,在主配置文件中配置IncludeOptional conf.d/*.conf,从而当重启Apache的时候,可以将它们读入主配置文件。
3、默认网站主目录
/var/www/html/这个目录就是Apache默认的存放Web页面的目录、即默认网站主目录。
4、模块文件目录
Apache采用了模块化设计,Apache 的模块分为静态模块和动态模块两种。Apache 最基本的模块是静态模块,静态模块不能够随意的添加或卸载;而动态模块则可以进行添加和删除操作,因此使 Apache 具有很大的灵活性。Apache支持的外挂模块的模块文件默认是放置在/usr/lib64/httpd/modules目录中。
使用命令httpd -M可以查看哪些是静态模块(static),哪些是动态模块(shared)。
5、日志目录
/var/log/httpd/是Apache日志文件默认的保存位置,对于流量比较大的网站来说,这个目录要格外注意,这里的数据文件可能会非常大。
6、CGI程序目录
/var/www/cgi-bin/是Apache保存可执行的CGI程序的默认位置。
三、Apache配置文件详解
3.1 主站点的基本配置
ServerRoot "/etc/httpd"
# Apache软件安装的位置。若配置文件中其他目录没有指定绝对路径,则目录是相对于该目录。
Listen 80
# 服务器监听的端口号。
ServerName www.example.com:80
# 主站点名称(网站的主机名)。
ServerAdmin root@localhost
# 管理员的邮件地址。
DocumentRoot "/var/www/html"
# 主站点的网页存储位置。
User apache
Group apache
# 运行httpd进程的用户和组(都是apache)
3.2 对目录的访问控制
1、语法:
<Directory>和</Directory>用于封装一组指令,使之仅对某个目录及其子目录生效。
<Directory “目录路径”> ... </Directory>
2、例如:
<Directory "/var/www/html">
Options Indexes FollowSymLinks
AllowOverride None
Require all granted
</Directory>
3、说明:
(1)Options:配置在特定目录使用的特性,有以下8种选项
#1、All: 所有特性全部选择,除了MultiViews
#2、None: 所有特性全部不选择
#3、Indexes: 如果访问网站的目录中没有DirectoryIndex (如index.html),则返回该目录文件列表
#4、Includes: 允许服务端包含功能
#5、FollowSymLinks: 允许在目录中使用符号链接引导到其他目录
#6、SymLinksifOwnerMatch: 当符号链接和其指向的目录的所有者是同一用户时,才会使用符号链接
#7、ExecCGI: 允许使用CGI
#8、MultiViews: 允许使用内容协商的"多重视图",如果请求的路径可能对应多种类型的文件,那么服务器将根据请求的具体情况自动选择最匹配项
# 例如在网站根目录下有demo.jpg和demo.html的两个文件,此访问http://localhost/demo,如果根目录中没有demo子目录,那么服务器将会继续查找形如demo.*的文件,然后根据具体情况返回最匹配的demo.jpg或者demo.html
(2)AllowOverride:用于配置是否允许使用.htaccess文件中的配置覆盖当前配置生效,有6种选项
#1、All: 允许使用
#2、None: 不允许使用,.htaccess文件配置将被忽略
#3、FileInfo: 允许使用文件控制类型的配置指令,包括:AddEncoding, AddLanguage, AddType等
#4、AuthConfig: 允许使用认证类型的配置指令,包括:AuthDBMGroupFile, AuthDBMUserFile等
#5、Indexes: 允许使用控制目录索引的配置指令,包括:AddDescription, AddIcon等
#6、Limit: 允许使用权限控制类型的配置指令,包括:Allow, Deny和Order
(3)Require:用于配置访问权限,常见的配置如下:
# Require all denied: 拒绝所有访问请求,也是Require缺省配置
# Require all granted: 允许所有访问请求
# Require ip 192.168 10.10.10: 允许特定IP段的访问请求
# Require not ip 192.168 10.10.10: 不允许特定IP段的访问请求
# Require命令缺省标签为 <RequireAny>...</RequireAny>,表示任何一条规则满足即可访问
# 如果要表示所有规则同时满足时才可访问,需要使用标签 <RequireAll>...</RequireAll>
3.3 文件访问控制
1、语法
提供基于文件名的访问控制,文件名也可以是一个包含通配符的字符串,其中"?"匹配任何单个字符,"*"匹配任何字符串序列。在"~"字符之后可以使用正则表达式。
<Files "文件名"> ... </Files>
2、例如
<Files ".ht*">
Require all denied #禁止访问.ht开头的文件
</Files>
3.4 模块配置
模块文件位于/usr/lib64/httpd/modules目录中,这些模块是否被加载,可以参考配置/etc/httpd/conf.modules.d目录中的配置文件。
在主配置文件中,使用<IfModule 模块名>和</IfModule >用于封装一组指令,使如果加载了对应的模块,封装的指令才有效。
3.5 默认访问页面
例如:
<IfModule dir_module>
DirectoryIndex index.html
#默认首页文件
</IfModule>
3.6 日志配置
1、错误日志
ErrorLog "logs/error_log"
#日志的保存位置/etc/httpd/logs/error_log
LogLevel warn
#指定错误日志的级别,对应级别及该级别以上的错误日志信息才会记录到错误日志中。
Apache的错误日志级别用于控制Apache服务器记录错误信息的严重程度。Apache的错误日志级别包括:
-
emerg:紧急(会导致服务器不能正常工作)
-
alert:需要立即修复的问题
-
crit:严重错误
-
error:错误
-
warn:警告
-
notice:需要注意的信息
-
info:一般信息
-
debug:调试信息(可能包含大量信息)
2、日志格式
<IfModule log_config_module>
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b" common
<IfModule logio_module>
# You need to enable mod_logio.c to use %I and %O
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio
</IfModule>
#定义访问日志的保存位置和日志别名nickname
CustomLog "logs/access_log" combined
</IfModule>
格式中的各个参数,如:
-
%h:客户端的ip地址或主机名
-
%l:这是由客户端 identd 判断的RFC 1413身份,输出中的符号 "-" 表示此处信息无效。
-
%u:由HTTP认证系统得到的访问该网页的客户名。有认证时才有效,输出中的符号 "-" 表示此处信息无效。
-
%t:服务器完成对请求的处理时的时间。
-
%r:引号中是客户发出的包含了许多有用信息的请求内容。
-
%>s:这个是服务器返回给客户端的状态码。
-
%b:最后这项是返回给客户端的不包括响应头的字节数。
-
%{Referer}i:此项指明了该请求是从被哪个网页提交过来的。
-
%{User-Agent}i:此项是客户浏览器提供的浏览器识别信息。
3、例如
192.168.200.1 - - [29/Apr/2024:21:24:09 +0800] "GET /noindex/css/bootstrap.min.css HTTP/1.1" 200 19341 "http://192.168.200.100/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36"
3.7 网页重定向和虚拟目录配置
<IfModule alias_module>
# Redirect: 用于将访问的文件重定向到新的目录
# Example:
# Redirect permanent /foo http://www.example.com/bar
Redirect /mastc https://www.mastc.edu.cn/
# Alias: 将网站路径映射到文件系统路径,用于访问不在网站根目录下的内容,即虚拟目录
# Example:
# Alias /webpath /full/filesystem/path
Alias /images /var/images
# ScriptAlias: 脚本映射,与Alias类似,只是目标文档被视为脚本
# 并在请求时由服务器运行,而不是作为发送到客户端的文档
ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"
</IfModule>
例1:网页跳转
Redirect /mastc https://www.mastc.edu.cn/
例2:虚拟目录
-
准备目录和文件
[root@centos-teach ~]# mkdir /var/images
[root@centos-teach ~]# cp /usr/share/backgrounds/*.jpg /var/images/
-
配置主配置文件
Alias /images /var/images
<Directory "/var/images">
AllowOverride None
Options Indexes FollowSymLinks
Require all granted
</Directory>
3.8 其他配置
# 响应内容的默认编码格式
# 通常,文件的字符编码和客户端浏览器编码相同时,页面才会正常显示,否则会乱码。
# 可以通过meta标签或header()函数可以设置客户端浏览器的编码。
# 优先级:header() >> AddDefaultCharset >> meta
AddDefaultCharset UTF-8
# 导入额外配置文件
IncludeOptional conf.d/*.conf
# 导入功能模块配置文件
Include conf.modules.d/*.conf