一、配置文件结构与基础信息
(一)配置文件位置
- 在 CentOS、Red Hat 等系统中:
主配置文件通常是 /etc/httpd/conf/httpd.conf,同时 /etc/httpd/conf.d/ 目录下可以存放一些额外的配置文件(以 .conf 扩展名形式存在),用于按功能模块、虚拟主机等进行细分配置,这些文件都会被主配置文件引入并生效。 - 在 Debian、Ubuntu 等系统中:
主配置文件一般为 /etc/apache2/apache2.conf,相关配置片段还分布在多个目录中,像 /etc/apache2/sites-available/ 存放虚拟主机配置文件(可通过软链接到 /etc/apache2/sites-enabled/ 使其生效),/etc/apache2/mods-available/ 存放可用模块配置(通过软链接到 /etc/apache2/mods-enabled/ 启用模块)等。
(二)基本语法格式
配置文件由众多指令(Directives)构成,基本格式是“指令名 参数1 参数2…”,例如:
ServerRoot “/etc/httpd”
其中 ServerRoot 是指令名,”/etc/httpd” 是参数,用来指定服务器的根目录,即服务器查找配置文件、模块文件、日志文件等相关文件的基准位置。
使用 # 符号添加注释内容,注释行不会对配置产生实际作用,比如:
# This is a comment line to explain something about the configuration
ServerName example.com
二、核心配置指令详解
(一)ServerRoot
明确服务器的根目录,示例:
ServerRoot “/etc/httpd”
它决定了后续很多文件路径的相对位置,像配置文件、日志文件等通常会基于此根目录来存放。
(二)ServerAdmin
用于设置服务器管理员的邮箱地址,在服务器出现问题返回错误页面等情况时,该地址会展示给客户端,方便用户反馈问题,例如:
ServerAdmin [email protected]
(三)ServerName
定义服务器的域名或者 IP 地址以及可选的端口信息,对服务器准确标识自身以及客户端正确访问至关重要,例如:
ServerName example.com:80
若不配置此指令,服务器可能通过一些默认机制推测自身标识,但可能引发访问异常,所以建议明确配置。
(四)DocumentRoot
指定网站的根目录,即服务器响应客户端请求时查找网页文件的主要位置,比如:
DocumentRoot “/var/www/html”
当客户端发起访问请求时,服务器会从这个指定目录下查找诸如 index.html 等页面文件来返回给客户端。
(五)Listen
用来指定服务器监听的端口以及对应的 IP 地址(可选),默认常监听在 80 端口(HTTP 协议常用端口),可以配置多个监听项,像:
Listen 80
Listen 192.168.1.100:8080
前者表示监听所有可用 IP 地址的 80 端口,后者表示监听 IP 地址为 192.168.1.100 的 8080 端口,这样服务器就能接收来自不同端口、不同 IP 地址的客户端请求。
(六)ErrorLog
确定错误日志文件的存放位置,方便管理员查看服务器运行过程中出现的各类错误情况,例如:
ErrorLog “logs/error_log”
这里相对 ServerRoot 目录下的 logs 目录来存放错误日志文件(不同系统默认位置可能稍有不同,有的会直接写绝对路径,如 /var/log/httpd/error_log )。
(七)CustomLog
用于指定访问日志的记录位置和格式,通过选择不同的格式能记录诸如客户端 IP、访问时间、请求的页面等丰富的详细信息,常见的记录格式有 common、combined 等,示例:
CustomLog “logs/access_log” combined
表示采用 combined 格式记录访问日志到相对 ServerRoot 目录下的 logs 目录中的 access_log 文件中。
(八)LoadModule
此指令用于加载各种 Apache 的功能模块,不同模块能赋予服务器不同的功能特性,像 mod_ssl 用于支持 SSL/TLS 加密通信,mod_rewrite 用于 URL 重写等,加载模块的示例如下:
LoadModule ssl_module modules/mod_ssl.so
即加载 mod_ssl 模块,对应的模块文件是 modules/mod_ssl.so(不同系统模块文件存放路径可能略有差异)。
三、重要配置段解析
(一) 配置段
用于精细地控制对特定目录的访问权限、可执行操作等属性,(该段配置的目录可以不与DocumentRoot指定的目录有包含关系,也就是各定义各的目录,定义的权限可以继承到其子目录中,如某些目录没有定义权限也无继承权限则会应用系统的默认权限,一般是:Require all granted)示例:
<Directory “/var/www/html”>
Options Indexes FollowSymLinks
AllowOverride None
Require all granted
</Directory>
- Options:
指定该目录下允许的操作选项,常见选项及含义如下:
- Indexes:若访问的目录下没有默认的首页文件(如 index.html 等),开启此选项可让服务器展示目录中的文件列表,也就是启用目录索引功能;若关闭(使用 -Indexes ),则在无首页文件时返回相应的访问错误提示(如 403 Forbidden 等)。
- FollowSymLinks:允许服务器跟随符号链接访问文件,开启后可通过符号链接访问相关文件,但从安全角度考虑,有时需谨慎使用。
- ExecCGI:允许在该目录下执行 CGI 脚本,开启此选项要确保有相应的安全防护措施,避免恶意脚本执行。
- AllowOverride:
决定是否允许 .htaccess 文件覆盖当前目录的配置,有不同取值:
- None:表示不允许通过 .htaccess 文件改变任何已有的配置,适用于对配置管理要求严格、统一的情况,保障服务器配置的稳定性和安全性,常用于生产环境关键目录。
- All:给予最大的灵活性,允许在该目录及其子目录下通过 .htaccess 文件覆盖几乎所有能在 <Directory> 配置段里出现的指令相关配置,但存在安全风险,需谨慎使用。
- 部分指令类别(如 AuthConfig、FileInfo、Indexes、Limit 等):可以指定具体的指令类别来允许 .htaccess 文件进行覆盖,这样能在一定程度上平衡灵活性与安全性,比如 AllowOverride AuthConfig 允许在 .htaccess 文件中配置用户认证相关指令。
- Require:
用于设置访问权限,常见用法有:
- Require all granted:授予所有访问权限,即允许任何客户端访问该目录及其子目录。
- Require ip [IP 地址或网段]:限制只有指定 IP 地址或网段内的客户端能访问,例如 Require ip 192.168.1.100 表示只允许 IP 地址为 192.168.1.100 的客户端访问。
(二) 配置段
用于配置虚拟主机,使得一台服务器可以通过不同的域名或者 IP 地址提供多个不同的网站服务,示例:
<VirtualHost *:80>
ServerName site1.example.com
DocumentRoot “/var/www/site1”
<Directory “/var/www/site1”>
Options Indexes FollowSymLinks
AllowOverride None
Require all granted
</Directory>
ErrorLog “logs/site1_error_log”
CustomLog “logs/site1_access_log” combined
</VirtualHost>
上述配置定义了一个监听所有 IP 地址的 80 端口的虚拟主机,其对应的域名是 site1.example.com,网站根目录是 /var/www/site1,同时配置了该目录的访问权限以及相应的错误日志和访问日志记录方式,不同的虚拟主机可根据自身需求按此方式进行独立配置。
(三) 配置段
基于请求的 URL 路径来配置访问规则等,与 <Directory> 配置段基于实际文件目录位置不同,例如:
<Location “/admin”>
Require ip 192.168.1.100
</Location>
表示只有 IP 地址为 192.168.1.100 的客户端才能访问服务器上以 /admin 为 URL 路径的资源,常用于对特定 URL 路径下的资源进行访问权限控制等场景。
(四) 配置段
针对特定的文件或者文件类型来配置访问规则,例如:
<Files “*.php”>
SetHandler application/x-httpd-php
</Files>
此配置针对所有 .php 文件,设置其处理程序为 application/x-httpd-php,让服务器能够正确处理 php 文件并执行相应的脚本代码,可用于对不同类型文件进行差异化的处理配置。
四、模块相关配置要点
(一)mod_rewrite 模块(用于 URL 重写)
首先确保加载了该模块(通过 LoadModule 指令加载 mod_rewrite.so 文件),然后可在相应的配置段(如 <VirtualHost> 或者 <Directory> )中配置重写规则,示例:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME}!-f
RewriteCond %{REQUEST_FILENAME}!-d
RewriteRule ^(.*)$ index.php?$1 [L,QSA]
这组规则含义为:若请求的文件名不是一个实际存在的文件(!-f 条件),且不是一个实际存在的目录(!-d ),则将请求重写到 index.php 文件,并传递相应的参数([L,QSA] 表示最后一条规则、追加查询字符串等含义),常用于将动态页面请求伪静态化、优化 URL 结构等场景。
(二)mod_ssl 模块(用于 SSL/TLS 加密通信)
加载模块后(同样通过 LoadModule 指令加载对应的模块文件),配置 SSL 相关参数,比如:
SSLCertificateFile “/etc/pki/tls/certs/server.crt”
SSLCertificateKeyFile “/etc/pki/tls/private/server.key”
分别指定 SSL 证书文件和私钥文件的存放位置,用于在服务器与客户端之间建立安全的加密通信连接,保障数据传输的安全性,常用于对网站启用 HTTPS 访问的配置场景。
注意:
如果config.d目录下有welcome.conf文件,会过滤掉主页的默认页面,建议注释掉相关的配置行:
sed -i 's/^[^#].*/#&/' config.d/welcome.conf
Leave a Reply