Apache 配置文件
预定义配置文件:
当Apache HTTP服务器安装完成后,其启动过程确实会根据预定义的配置文件读取配置,从而从句相关配置来运行Web服务器。
查看预定义的主配置文件位置: httpd -V
或 apachectl -V
-D HTTPD_ROOT="/usr/local/apache" # 指定 Apache 的安装根目录
-D DEFAULT_PIDLOG="logs/httpd.pid" # 指定PID文件存放位置
-D DEFAULT_ERRORLOG="logs/error_log" # 错误日志存放位置
-D AP_TYPES_CONFIG_FILE="conf/mime.types" # MIME 类型配置文件的路径
-D SERVER_CONFIG_FILE="conf/httpd.conf" # 服务器的主配置文件的路径。
注:SERVER_CONFIG_FILE 选项
使用的是相对路径(不以/
开头)其值是相对于 HTTPD_ROOT 指定的路径。
手动指定配置文件:
如果需要手动指定Apache服务的主配置文件路径,可以在启动服务的时候,通过 -f 选项
来自定义配置文件。
例如:
apachectl start -f /etc/apache/apache2.conf
总结:
-
启动Apache服务时,没有手动指定配置文件,会使用预定义的配置文件启动,如果不存在就报错。
-
如果手动指定了配置文件,那么启动服务就会读取指定配置文件,不会使用预定义的配置文件,如果使用的是相对路径,则是相对于ServerRoot的路径
Apache子配置文件:
如果把所有配置都放一个配置文件里,不方便后期管理。可以将不同的配置放在不同的文件里面,然后在主配置文件中通过对应的指令来进行引入。这样在加载主配置文件的时候,子配置文件也会跟着加载。
-
Include
:如果指定的文件或文件模式不存在,Apache将在启动时抛出错误,并且服务器将无法启动。 -
IncludeOptional
:允许指定的文件或文件模式不存在。如果文件不存在,Apache将简单地忽略该指令,而不会产生错误。
例如:
IncludeOptional conf-enabled/*.conf
Apache配置文件主要由三部分组成:
-
基础全局配置:会影响整个服务器,例如日志文件位置、监听端口等。
-
模块配置:DSO模式的模块默认是以
.so
存放在某个目录下,需要在配置文件中通过LoadModule 指令
来进行加载才会生效。 -
多主机配置:设置特定网站的属性,如域名、文档根目录、特定日志文件等。
Apache配置文件格式:
-
井号(
#
)开头的表示注释 -
单一指令由指令名称后跟一个或多个参数组成。
directive value
-
指令块由
< 和 >
包裹的一系列指令,用于定义一个特定的上下文或环境。
Apache 全局基础配置
指定运行Apache服务的用户和组:
默认情况下,Apache可能以root用户启动,但出于安全原因,它通常会切换到非特权用户来运行服务器的大部分任务。
-
User 指令
: 指定了运行Apache服务器进程的用户身份。 -
Group 指令
:指定了运行Apache进程的用户组。
例如:
User apache
Group apache
指定Apache监听的端口:
可以是指定IP地址的端口,也可以是监听本机所有IP地址的端口。 Listen [ip:]port
例如:
Listen 8000
注:这里忽略了IP地址,表示监听本机上所有IP的8000端口
指定Apache的根目录:
在Web服务器的上下文中,"根目录"通常指的是URL中的/
所代表的服务器上的目录。这个根目录是Web服务器用来响应Web请求的起始点,是存放网站文件(如HTML文档、图片、脚本等)的基本路径。
DocumentRoot 指令
:指定Apache HTTP服务器的根目录
例如:当用户访问 http://XXX.com/ ,实际上访问的是 /var/www/html下的文件。
DocumentRoot "/var/www/html"
指定Apache的安装目录:
在Apache服务的配置文件中,如果使用相对路径(如配置文件、模块、日志等),那么都是相对于服务器安装位置的。
ServerRoot 指令
:指定服务器的安装位置
例如:
ServerRoot "/usr/local/apache"
指定域名:
ServerName 指令
:定义服务器的全局主机名
例如:
ServerName www.example.com
Apache日志管理:
Apache日志管理功能是mod_log_config 模块
提供的,所以需要保证这个模块成功被加载才能完成日志管理。
Apache的日志主要可以分为两类:
-
错误日志:记录服务器的错误信息。错误日志的格式不像访问日志那样灵活,但可以配置错误日志的位置和记录级别。
-
访问日志:记录Apache服务器所有接收到的请求。
错误日志管理:
错误日志的格式是固定的,但是可以配置记录到错误日志的信息的详细程度。
LogLevel 指令
:指定记录到错误日志的日志级别。可以是以下值。
-
debug
:提供调试信息,适用于开发或测试环境。日志信息最详细 -
info:提供一般信息性消息,比 debug 级别少。
-
notice:提供正常但有意义的条件的信息。
-
warn
:提供警告级别的消息,通常表示有某些需要关注的问题。 -
error
:提供错误级别的消息,通常表示无法提供某个请求或功能的问题。 -
crit:提供临界条件的消息,通常表示更严重的问题。
-
alert:需要立即采取行动的消息。
-
emerg:提供紧急消息,通常表示系统不可用的状况。
ErrorLog 指令
:指定错误日志的路径和日志名。
例如:将warn以上的日志记录到/var/log/error.log下
LogLevel warn
ErrorLog /var/log/error.log
访问日志管理:
和错误日志的区别在于,访问日志可以自定义内容格式。
-
LogFormat:自定义访问日志的格式
-
CustomLog:指定访问日志的存放位置和文件名,需要指定使用的日志格式。
注:相关参数说明:https://httpd.apache.org/docs/2.4/zh-cn/mod/mod_log_config.html
例如:定义一个名为 common 的访问日志,并且将访问日志存放为 /var/log/access_log
LogFormat "%h %l %u %t \"%r\" %>s %b" common
CustomLog logs/access_log common
Apache 虚拟主机管理
正常情况下,一个物理web服务器只能部署一个网站,但是通过虚拟主机技术,可以再一个物理服务器上托管多个网站。每个网站表现得就像是在自己独立的服务器上运行一样。
web服务器:
web服务器就是我们所说的网页服务器,由遍布全球的众多网页服务器共同构成WWW
网站:
网站是指存储在Web服务器上的一组相关网页的集合,网页是互联网上的一个文档,通常是HTML(超文本标记语言)格式。它包含文本、图片、链接、视频、音频等多种元素,并可以通过网页浏览器查看。
一个Apache服务器中可以配置多个虚拟主机,可以通过三种方式来区分不同的虚拟主机:
-
端口:虚拟主机通过不同的端口来区分。这意味着所有虚拟主机共享相同的IP地址,但是每个网站通过不同的端口访问。
-
域名:多个虚拟主机共享同一个IP地址和端口,但是根据请求的HTTP头部中的Host字段来区分
-
IP:每个虚拟主机拥有不同的IP地址。这意味着您的服务器必须有多个IP地址,并且每个网站被分配到不同的IP地址
<VirtualHost>
指令块:
Apache的虚拟主机就是通过 VirtualHost 指令块配置的,每个<VirtualHost>块
定义了单独一个网站的配置,允许每个网站拥有独立的域名、文档根目录、日志文件以及其他特定设置。
格式:
<VirtualHost IP地址|域名|端口>
相关配置参数
</VirtualHost>
例如:当用户访问8000端口的时候,访问的就是这个虚拟主机里面定义的环境。
<VirtualHost *:8080>
相关配置参数
</VirtualHost>
注:果是通过端口来区分虚拟主机,那么虚拟主机的端口应该是要包含IP地址或通配符,而不是只写一个端口号。
虚拟主机配置参数:
在 VirtualHost 指令块中,可以通过多个配置选项来指定当前虚拟主机的相关属性。
不能在VirtualHost 指令块中使用的全局配置选项:
-
ServerRoot:指定服务的安装目录
-
Listen:指定监听的端口
-
LoadModule:用于加载Apache特定模块
-
User 和 Group:运行服务的用户和组
-
Include:包含子配置文件
-
ServerTokens:Apache服务器响应头中提供的信息量。例如版本信息
可以在VirtualHost 指令块中使用的全局配置选项
-
ServerName:指定域名
-
CustomLog:指定访问日志
-
ServerAdmin:指定该虚拟主机的管理员电子邮件地址。
-
ServerAlias:为虚拟主机指定额外的域名或别名
-
其它若干
虚拟主机常见配置选项:
-
DocumentRoot
:用于指定该虚拟主机的文档根目录。 -
ServerAlias
:用于为虚拟主机指定额外的域名或别名。 -
<Directory>
:用于指定特定目录的访问控制和其他选项。 -
Alias
:将一个 URL 路径映射到服务器上的一个物理目录 -
Location
:对URL中的路径做权限控制。
例如:当客户端向8000端口发送请求的时候,会在文件系统的/home/ehigh/work/html/generalsystemfe/dist下寻找文件,并且这个目录是允许所有人访问的。如果有相关的日志就会记录到对应位置下。
<VirtualHost *:8000>
DocumentRoot /home/ehigh/work/html/generalsystemfe/dist
<Directory /home/ehigh/work/html/generalsystemfe/dist>
Options FollowSymLinks MultiViews
AllowOverride All
Require all granted
</Directory>
ErrorLog /var/log/apache2/general_error.log
CustomLog /var/log/apache2//general_access.log combined
</VirtualHost>
Directory 指令块:
在文件系统中,目录是存储文件和其他目录的地方,在Apache中,使用Directory来命名这个指令块,说明该指令块直接作用于这些文件系统层面的目录,通过这个指令块可以针对服务器上的特定目录精确地定义访问规则和行为。
特点:基于文件系统的路径对目录进行相关的权限控制。
格式:
<Directory "dir-path">
# 配置参数
</Directory>
注:dir-path
表示文件系统上的目录路径。
例如:指定了路径为/var/www/html的目录,并且通过一些参数来对该目录进行访问控制。
<Directory /var/www/html>
Options FollowSymLinks MultiViews
AllowOverride All
Require all granted
</Directory>
Directory 指令块中的参数选项:
Options 指令
:用于开启或关闭指定目录中的特定功能,可以控制目录的行为和服务器如何响应对该目录的请求。
-
Indexes:用于指定默认的索引文件,如果请求的URL对应一个目录,并且该目录中没有默认的索引文件(index.html),开启Indexes选项会让服务器生成一个包含该目录内所有文件和子目录列表的网页。否则会返回一个4xx的错误。
-
FollowSymLinks:用于指定允许服务器跟随符号链接(软链接)到其指向的目标。当在Apache配置的 <Directory> 块中启用这个选项时,如果Apache遇到一个符号链接,它将跟随这个链接到其指向的实际文件或目录。
-
ExecCGI:指定在该目录下允许执行 CGI(Common Gateway Interface)脚本,即该目录下的 CGI 脚本可以被服务器执行,从而生成动态内容。
-
None:表示关闭了该目录的所有额外功能,这包括目录列表、符号链接跟随等功能。
-
All:几乎开启所有额外功能。
例如:
<Directory "/var/www/html">
Options Indexes FollowSymLinks
</Directory>
通过Indexes值:如果客户端请求的是 /var/www/html 目录下的某个子目录,并且该子目录中没有默认的索引文件(如 index.html),则 Apache 服务器会自动生成一个包含该目录内所有文件和子目录列表的网页
。这样,用户可以在浏览器中看到目录内容的列表。
通过FollowSymLinks值:如果 /var/www/html 目录或其子目录中存在符号链接(软链接),Apache 服务器会跟随这些链接到它们指向的实际文件或目录。
假设/var/www/html有一个文件a.txt是/home/ehigh/b.txt的软链接,若没有开启 FollowSymLinks 选项,那么当用户尝试访问位于 /var/www/html 下的 a.txt 文件时,将无法看到 b.txt 的内容。
Require 指令
:用于指定访问权限,当用户发起请求时,通过这个选项控制这个请求是否具备对应的权限
-
Require all granted:允许所有访问
-
Require all denied:拒绝所有访问
-
Require user <username>:仅允许特定用户访问
-
Require ip <ip-address>:仅允许来自特定IP地址的访问
例如:允许所有人访问
<Directory "/var/www/html">
Require all granted
</Directory>
DirectoryIndex 指令
:用于指定目录中的默认页面。
例如:
# 会将index.html作为目录的默认索引文件
DirectoryIndex index.html
ErrorDocument 指令
:定义特定错误代码的自定义错误页面
例如:
ErrorDocument 404 /notfound.html。
AllowOverride 指令
:用于指定在 .htaccess 文件中可以覆盖的配置类型。 .htaccess 文件通常用于在没有服务器主配置文件访问权限的情况下,对单个目录及其子目录进行配置。
-
None:不允许 .htaccess 文件中的任何指令覆盖全局配置。这是出于安全和性能考虑的默认设置
-
All:允许 .htaccess 文件中的所有指令覆盖全局配置。
.htaccess 文件
的作用就是让开发人员可以不修改Apache配置的情况下,自定义服务器的行为。
例如:当在 Apache 的 <Directory> 指令块中设置了 AllowOverride 选项之后,可以在该目录下创建一个 .htaccess 文件。通过这个文件可以用来配置当前所在目录(以及其所有子目录)的一些特定设置,包括访问控制权限和其他 Web 服务器行为。
Location指令块
:
Location指令块不关心文件系统的实际路径,而是只关心URL的路径
格式:
<Location URL-path>
# 配置指令
</Location>
例如:拒绝所有对 /admin 路径的访问请求
<Location /admin>
Require all denied
</Location>
Apache 实现反向代理
Apache的代理功能是mod_proxy 和 mod_proxy_http 模块
提供的,所以需要保证这两个模块正常加载,才能使用代理功能。
-
mod_proxy 模块
:提供基本的代理功能。它是实现代理请求(包括反向代理和负载均衡)的核心模块。 -
mod_proxy_http 模块
:是 mod_proxy 的一个子模块,专门用于处理 HTTP 和 HTTPS 的请求。
代理说明:
代理:将客户端的请求转发到其它服务器
正向代理: 和客户端交互,例如;为内部网络的客户端提供出口到互联网的能力。
反向代理: 和服务端交互,将客户端的请求转发到后端服务器,并将响应返回给客户端。对于客户端而言,它看似与 Apache 服务器直接交互,而实际上请求可能被转发到了其他服务器。
反向代理工作流程:
1、客户端发送请求到反向代理服务器
2、反向代理服务器(如果是apache)通过ProxyPass 指令将这个请求转发到后端服务器。
3、后端服务器接收请求并处理后,返回响应給代理服务器。
4、代理服务器将后端服务器的响应发送给客户端。
反向代理配置流程:
1、确保mod_proxy 模块
和 mod_proxy_http 模块
被加载
可以通过 apachectl -M | grep proxy 检查是否加载,如果没有加载需要通过 LoadModule 指令在配置文件中指定。
LoadModule 模块名称 模块路径
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so
2、将 ProxyRequests
选项设置为off表示不作为正向代理,即作为反向代理服务器。
ProxyRequests Off
3、将 ProxyPreserveHost
选项设置为 On,使 Apache 保留原始的 Host 头部,而不是替换成后端服务器的地址。即代理服务器转发这个请求的时候,响应头里面的Host不会变为代理服务器的ip地址,而是保留请求服务器的地址。
ProxyPreserveHost On
4、通过 ProxyPass 指令
实现当用户访问本服务器的某个URL时,就将请求发送給指定的服务器进行处理。
格式:
ProxyPass [path] [url]
注:
1、如果是全局配置 ProxyRequests 和 ProxyPreserveHost
,那么整个Apache服务器都会作为反向代理服务器,如果是局部配置(虚拟主机),那么只会会影响该虚拟主机的行为,不会将整个Apache作为反向代理。
2、根据反向代理工作流程,后端服务器返回的响应首先是给代理服务器,但是如果响应是一个 HTTP 重定向(如状态码 301/302),它通常包含一个 Location 头部,指示浏览器重定向到一个新的 URL。Location 头部中通常包含的是后端服务器的地址,而不是反向代理服务器的地址。
这个时候通过 ProxyPassReverse 指令
告诉 Apache 如何修改从后端服务器返回的 Location(和 Content-Location)头部,将其中的后端服务器地址替换为反向代理服务器的地址。
例如:将访问本机80的http请求发到1212端口上
1、确定模块已经启用
apachectl -M | grep mod_proxy
2、规则配置
<VirtualHost *:80>
ProxyRequests Off
ProxyPreserveHost On
# 将所有访问端口 80 的请求转发到 http://127.0.0.1:1212/
ProxyPass / http://127.0.0.1:1212/
ProxyPassReverse / http://127.0.0.1:1212/
</VirtualHost>
3、重启服务
sudo systemctl restart apache2.service
Apache 响应头管理
HTTP响应头是由一系列的键值对
组成,遵循HTTP协议的标准格式。
典型的HTTP响应头格式:
HTTP/1.1 200 OK # HTTP协议版本 状态码和状态消息
Content-Type: text/html; charset=UTF-8 # 响应体的媒体类型
Content-Length: 15824 # 响应体的大小,以字节为单位
Connection: keep-alive # 控制连接的选项,持久连接
Server: Apache/2.4.1 (Unix) # 生成响应的服务器软件信息
Last-Modified: Mon, 12 Dec 2022 15:56:35 GMT
Cache-Control: max-age=600 # 响应数据的缓存策略,指定了资源的最大缓存寿命为 600 秒
Expires: Thu, 01 Dec 2023 16:00:00 GMT # 响应过期的时间
修改HTTP响应头
在某些情况下,可能需要修改HTTP的响应头,这个时候可以通过Apache的 Header 指令
实现。这个指令是 mod_headers 模块
提供的,所以需要确保该模块被加载才能正常使用。
格式:
Header 操作类型 HTTP响应头的名称 "头部对应的值"
操作类型说明:
-
set:用于设置一个响应头,属于覆盖式操作,确保指定的头部只有一个值
-
add:用于添加一个新的 HTTP 响应头,而不替换已有的头部,如果指定的头部已存在,Header add 会将新的值添加到现有值旁边。这意味着同一个头部可以有多个值。
-
unset:用于删除特定的 HTTP 响应头,Apache 会从即将发送给客户端的响应中移除指定的头部。
例如:设置一个名为 name 的 HTTP 响应头部,其值为 "tom"
Header set name "tom"
Apache 跨域配置
域(domain)的概念: “跨”意味着“超越”或“穿过”,“域”在这里指的是“源”。所以“跨域”字面上的意思是“超越源的限制”。
源(origin)的概念: 由协议、域名和端口组成的组合,只有当这三部分都相同,两个URL才被认为是同源。
所以如果从某个源向另外一个源发起http请求,如果协议、端口、域名其中有一个不同,都称为跨域。
同源策略(Same-Origin Policy): web浏览器默认有一种安全机制叫作同源策略,限制了来自不同源的文档或脚本互相交互,以此来防止潜在的恶意行为。
解决跨域问题: CORS机制
CORS(跨源资源共享):服务器可以通过设置 Access-Control-Allow-Origin 响应头来指明哪些源被允许访问资源。如果浏览器的 CORS 检查通过,它将允许跨域请求。
Apache配置CORS机制解决跨域问题:
(1)确保mod_headers 模块
已经被加载
LoadModule headers_module modules/mod_headers.so
(2)在对应的虚拟主机中配置策略
# 表示允许任何域的跨域请求
Header set Access-Control-Allow-Origin "*"
(3)重启服务即可
sudo systemctl restart apache2.service
注:除了配置http响应头中的 Access-Control-Allow-Origin 键
的值外,还可以通过设置以下键的值来实现更细腻的配置。
Access-Control-Allow-Methods
:指定允许的 HTTP 方法。
例如:允许POST、GET请求进行跨域
Header set Access-Control-Allow-Methods "POST, GET"
Access-Control-Allow-Headers
:指定允许的 HTTP 头部。即如果请求头中包含了对应的键,就运行跨域
例如:如果请求头中包含 name 这个键,就允许跨域
# 允许多个头部,则需要在同一个引号内列出它们,用逗号分隔。
Header set Access-Control-Allow-Headers "name"
Access-Control-Allow-Credentials
:指示是否允许发送凭证
例如:允许浏览器在执行跨域请求时携带用户凭证(如 Cookies 和 HTTP 认证信息)
Header set Access-Control-Allow-Credentials "true"
Apache URL重写
URL重定向
Apache的 mod_alias 模块
提供了一个叫作 Redirect的指令,通过它可以实现简单的重定向场景。
语法格式:
Redirect [HTTP 状态码] 源路径 目标路径
-
http状态码:可以是301也可以是302,缺省值是302
-
源路径:应该是相对于当前服务器或虚拟主机的根路径。不应该不包括协议类型、域名或端口号。
-
目标路径:可以是相对路径,也可以是完整的 URL路径
例如:访问本地8000端口的时候重定向到0.105的8001端口。没有指定http状态码,默认是302
<VirtualHost *:8000>
Redirect / http://192.168.0.105:8001
</VirtualHost>
URL重写
Apache的mod_rewrite 模块
可以实现复杂情况下的URL重写操作。
RewriteEngine
:用于开启或关闭 URL 重写引擎。有两个默认值
-
on:开启
-
off:关闭
RewriteCond
:用于定义一个条件,用于测试 URL 或其他服务器变量,并根据测试结果决定是否应用后续的 RewriteRule。
RewriteRule 匹配需要重写的 URL 用于替换与Pattern匹配的URL部分的字符串
RewriteRule
:用于根据定义的规则重写 URL。当 URL 与规则匹配时,它会被替换或重定向到新的 URL。
RewriteRule 匹配需要重写的 URL 用于替换与Pattern匹配的URL部分的字符串
例如:将 HTTP 请求重定向到 HTTPS
RewriteEngine On
RewriteCond %{HTTPS} off # %{HTTPS}是一个服务器变量,表示当前请求是否通过 HTTPS 协议发送。如果请求是通过 HTTPS 发送的,这个变量的值会是 on
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
Apache 安全优化
隐藏版本信息
正常情况下,通过HTTP响应头的 server 字段可以查看使用的web服务器及其版本信息。将服务器版本信息隐藏后,可以让攻击者更难发现服务器的具体版本和配置信息,从而更难针对性地发起攻击。
可以通过以下两个指令来实现服务器版本信息的隐藏:
ServerTokens 指令
控制 Apache 在 HTTP 响应头部 Server 字段中提供的信息量。
-
Prod:仅显示 Apache,不显示版本号或其他详细信息
-
Major:显示主版本号(例如 Apache/2)
-
Minor:显示主版本号和次版本号(例如 Apache/2.4)
-
Min:显示完整的版本号,但不显示操作系统信息
-
OS:显示完整的版本号和操作系统信息
-
Full(默认值):显示完整的版本号、模块信息和操作系统信息
例如:
ServerTokens Prod
ServerSignature 指令
控制 Apache 在生成的错误页面(如 404 页面)和服务器生成的目录列表底部显示的服务器签名信息。
-
On:在页面底部显示服务器版本和虚拟主机名。
-
Off:不显示服务器签名。
-
EMail:显示服务器管理员的电子邮件地址(从 ServerAdmin 指令中获取)。
例如:
ServerSignature Off
基于用户认证的访问控制
-
作用:决定哪些用户或用户组可以访问服务器上的资源。
-
实现:通过身份验证(如用户名和密码)和授权(定义用户权限)实现。
-
应用场景:可以应用于服务器的任何部分,无论是特定目录、特定位置还是整个域。
\<Directory> 指令
:
-
作用:定义特定文件系统目录的配置。从而控制对文件系统中特定目录的访问权限和行为。
-
应用场景:仅适用于服务器的文件系统路径。
\<Location> 指令
:
-
作用:定义针对URL路径的配置。控制基于URL的访问和重写规则。
-
应用场景:适用于服务器的URI路径,与文件系统结构无关。
用户访问控制和Location、Directory指令块的区别和联系:
-
区别:Location、Directory指令块专注于路径的类型,用户访问控制专注于用户身份和权限
-
联系:两者可以结合使用来实现更细粒度的权限控制。
实现基于用户的访问控制:
1、创建认证文件:认证文件包含了允许访问的用户名和对应密码
htpasswd -c /etc/apache2/.htpasswd username
-
因为是第一次创建用户,所以使用 -c 参数来指定存放用户信息的文件,后面添加用户就不需要加-c参数
-
htpasswd 工具安装apache的时候就自带
2、配置访问规则,可以通过以下指令进行配置
-
AuthType
:指定认证的类型,一般设置认证类型为基本认证(用户的用户名和密码以明文形式发送) -
AuthName
:设置认证区域的名称,这将在弹出的登录对话框中显示 -
AuthUserFile
:指向包含用户名和密码的文件 -
Require tom
:表示只有有效用户(即在 .htpasswd 文件中的用户)可以访问
说明:用户认证和授权配置(如基于用户的访问控制)需要在一个特定的上下文中定义,通常是在 Directory, Location, 或类似的指令块内。
例如:只允许admin用户访问 /systemtest页面
(1)创建认证文件,创建认证文件的时候会提示输入认证密码。
htpasswd -c /etc/apache2/.htpasswd admin
(2)认证规则配置
<VirtualHost *:80>
ServerName www.example.com
# 其他配置 ...
<Location "/systemtest">
AuthType Basic
AuthName "System Test Restricted Area"
AuthUserFile /etc/apache2/.htpasswd
Require user admin
</Location>
</VirtualHost>
配置 HTTPS
Apache的HTTPS功能是 mod_ssl模块
提供的,所以需要先保证该模块被加载。
-
如果是编译安装,需要在生成Makefile文件时,加入
--enable-ssl
选项在编译时安装这个模块,它会将 mod_ssl 模块编译为动态共享对象(DSO)模式。 -
如果是包管理器安装,例如ubuntu的apt,可以通过
a2enmod ssl
来加载该模块,a2enmod是一个脚本,用于启用Apache的模块,而ssl是要启用的模块名称。
mod_ssl模块安装
如果是通过包管理工具安装的Apache,且发现没有mod_ssl模块,可以使用以下方法进行安装
# redhat 系列
sudo yum install mod_ssl
# debian 系列
sudo apt install libapache2-mod-ssl
a2enmod 工作原理:
使用基于Debian的包管理器(如 apt)安装Apache时,它会下载并安装一系列模块,但默认情况下,并不是所有模块都被启用。
这些模块的配置文件放在/etc/apache2/mods-available/ 目录中。
-
.load 文件包含必要的 LoadModule 指令,用于加载模块。
-
.conf 文件(如果存在)包含模块的特定配置。
使用a2enmod命令启用一个模块时,实际上是将对应模块的.load和.conf文件软链接到/etc/apache2/mods-enabled/目录下。因为主配置文件中包含了这两个配置:
IncludeOptional mods-enabled/*.load
IncludeOptional mods-enabled/*.conf
HTTPS配置流程:
1、启用mod_ssl模块
LoadModule ssl_module modules/mod_ssl.so
2、证书申请
可以通过OpenSSL的工具生成自签名证书。
3、证书配置
-
SSLEngine :是否为相应的虚拟主机启用SSL/TLS
-
SSLCertificateFile:指定服务器证书的位置
-
SSLCertificateKeyFile:指定服务器私钥文件的位置
4、虚拟主机配置
<VirtualHost *:443>
ServerName www.yourdomain.com
SSLEngine on
SSLCertificateFile /etc/ssl/certs/apache-selfsigned.crt
SSLCertificateKeyFile /etc/ssl/private/apache-selfsigned.key
# 其他配置 ...
</VirtualHost>
Apache 性能调优
切换工作模式
通过httpd -V
或 apachectl -V
的输出信息可以查看Apache默认的工作模式。
通过查看Apache服务当前加载的是哪个MPM模块,也可以确定当前的工作模式。通过 通过httpd -M
或 apachectl -M
可以查看已经加载了的DSO模块。
apachectl -M | grep mpm
修改Apache工作模式:
1、编辑Apache配置文件,通过LoadModule
指令来加载对应的mpm模块。
# 注释掉不想使用的MPM模块,并确保想要使用的MPM模块是激活的
# LoadModule mpm_event_module modules/mod_mpm_event.so
LoadModule mpm_prefork_module modules/mod_mpm_prefork.so
#LoadModule mpm_worker_module modules/mod_mpm_worker.so
2、调整MPM设置(如果需要)
通过 <IfModule>
块加载对应的参数,<IfModule>指令块中包裹的配置指令只有在指定的模块被加载时才会生效。通过 <IfModule>
块确保即使在该模块未加载的情况下,Apache服务器也能正常启动和运行。
如果只切换了mpm模块
,但是没有调整其参数,会使用默认参数,更多参数配置需要参考官方文档。
官方文档:https://httpd.apache.org/docs/2.4/zh-cn/mpm.html
<IfModule> 格式:
<IfModule 模块名称>
directives value
</IfModule>
例如:
<IfModule mpm_prefork_module>
StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxRequestWorkers 150
MaxConnectionsPerChild 0
</IfModule>
启用压缩功能
Apache的 mod_deflate模块
提供了压缩功能,用于压缩服务器发送给客户端的数据。
压缩原理:
客户端发起请求:
- 当浏览器请求一个资源时,它在
Accept-Encoding
头部中包含它支持的压缩格式,例如 gzip、deflate。
服务端响应请求:
-
如果浏览器支持压缩(如 gzip),并且服务器配置了相应的压缩,服务器会发送压缩过的资源,并在
Content-Encoding
头部中标明所用的压缩格式 -
如果浏览器不支持压缩,或者请求的资源类型没有配置为压缩,服务器会发送未压缩的资源。
MIME介绍:
MIME是 Multipurpose Internet Mail Extensions 的缩写,译为多用途互联网邮件扩展。刚开始是给电子邮件设计的一种规范,用于支持通过电子邮件发送非ASCII文本和非文本附件(如图像、视频、音频等)。
后来,随着互连网的发展,MIME的应用扩展到了互联网上,成为一种重要的标准,用于描述文档的性质和格式。
在web上,MIME是一种用于指示文档的类型和格式的标准,使得览器能够正确地显示或处理下载的数据。
例如,当Web服务器发送HTML文档时,它会在HTTP头信息中使用Content-Type字段来指定MIME类型,如text/html。
MIME由两部分组成:主类型/子类型
-
大类:表示文件的基本类别
-
小类:在大类的基础上进一步细分,描述文件的具体格式或数据类型。
常见的大类:
-
text:用于文本文件,这些文件通常包含人类可读的文本
-
image:用于图像文件
-
audio:用于音频文件
-
video:用于视频文件
-
application:用于各种类型的数据和应用程序文件,例如二进制文件、文档文件等
例如:text/html
,text 是大类,表示这是一个文本类型的文件,html 是小类,指明了具体的文本格式为 HTML
Apache 启用压缩功能的两种方法:
SetOutputFilter DEFLATE
:用于启用对所有响应数据的压缩,而不是基于特定的 MIME 类型。这个指令告诉 Apache 使用 mod_deflate 模块来压缩所有输出的数据。
缺点: 会对所有http响应进行压缩,前提是浏览器支持并请求了压缩内容。如果一些内容本来就压缩过了,会再次进行压缩,导致CPU负担加大。
例如:配置对整个网站的所有响应内容进行压缩。
<Location />
SetOutputFilter DEFLATE
</Location>
AddOutputFilterByType DEFLATE
:根据特定的MIME类型对内容进行压缩,这样可以更加精细地控制哪些内容需要被压缩。
例如:
<IfModule mod_deflate.c>
AddOutputFilterByType DEFLATE text/plain
AddOutputFilterByType DEFLATE text/html
AddOutputFilterByType DEFLATE text/xml
AddOutputFilterByType DEFLATE text/css
AddOutputFilterByType DEFLATE application/xml
AddOutputFilterByType DEFLATE application/xhtml+xml
AddOutputFilterByType DEFLATE application/rss+xml
AddOutputFilterByType DEFLATE application/javascript
AddOutputFilterByType DEFLATE application/x-javascript
</IfModule>
说明:一般使用AddOutputFilterByType DEFLATE
指令来对特定类型的资源进行压缩,而不是用SetOutputFilter DEFLATE
压缩所有数据。