Apache-官方文档-Notes

官方文档地址

User’s Guide

Getting Start

Include 指令

可以用 Include 指令来包含多个配置文件:

1
2
3
4
5
6
7
ServerRoot "/etc/httpd"

# Server-pool management (MPM specific)
Include conf/extra/httpd-mpm.conf

# Multi-language error messages
Include conf/extra/httpd-multilang-errordoc.conf

由于这里设置了 ServerRoot, 因此 conf/extra/httpd-mpm 的实际路径为: /etc/httpd/conf/extra/httpd-mpm.conf

配置文件必须以 .conf 结尾.

写在在 <Directory>, <Location>, <VirtualHost> section 外的 directive 都具有全局作用域.

.htaccess 文件中的配置也是对当前目录有效.

DocumentRoot 指令

其用来指定静态资源的位置, 如 HTML, image files, CSS files 等.

其可以全局设置, 也可以给单个 virtual host 设置.

1
2
3
4
5
6
7
8
<VirtualHost *:81>
ServerAdmin webmaster@dummy-host.example.com
DocumentRoot "/srv/http/webpage/"
ServerName localhost
ServerAlias www.dummy-host.example.com
ErrorLog "/var/log/httpd/dummy-host.example.com-error_log"
CustomLog "/var/log/httpd/dummy-host.example.com-access_log" common
</VirtualHost>

当发出 request 但没有指定具体的文件名时, DocumentRoot 之下的 index.html 则会被返回.

ErrorLog 指令

其用来指定 error log 存放的位置. 同样可以全局或者给具体的 VirtualHost 设置.

<Directory> 指令

用于为一个 directory 单独设置一组配置, 语法如:

1
2
3
<Directory "/usr/local/httpd/htdocs">
Options Indexes FollowSymLinks
</Directory>

<Directory></Directory> 用于 enclose.

在指定路径时, unix 的 wild-card 都可以使用.

也可用正则表达式匹配:

1
2
3
<Directory ~ "^/www/[0-9]{3}">

</Directory>

但其相对于直接匹配优先级更低 (指靠后匹配)

<Location> 指令

<Directory> 类似, 但其作用于匹配请求的 URL 路径.

当匹配 file system 以外的内容时, 使用这个指令.

Binding to Addresses and Ports

Listen 指令设置 Apache 需要监听的端口:

1
2
Listen 80
Listen 8000

可以指定 ip:

1
2
Listen 192.0.2.1:80
Listen 192.0.2.5:8000

指定协议:

1
Listen 192.170.2.1:8443 https

(对 443 端口默认为 https, 而其他端口默认为 http)

可以用 <VirtualHost> 指令来为每一个绑定的地址和端口设置单独的行为.

Configuration File

配置的语法: 一行一个指令, 可以用 \ 续行写.

传递给指令的参数用空格分隔.

如果一个参数包含空格, 则需要用引号包裹.

指令都是 case-insensitive, 但 arguments 要注意大小写.

# 编写注释.

可以用 Difine 指令定义变量:

1
2
3
4
5
6
7
8
9
<IfDefine TEST>
Define servername test.example.com
</IfDefine>
<IfDefine !TEST>
Define servername www.example.com
Define SSL
</IfDefine>

DocumentRoot "/var/www/${servername}/htdocs"

这里配合 <IfDefine> 使用.

使用 Define 定义的变量或环境变量都可用:

1
${VAR}

的语法.

Modules

查看已编译进 Apache 的模块:

1
apachectl -l

查看动态加载的模块:

1
apachectl -M

动态加载一个模块, 用 LoadModule 指令:

1
LoadModule status_module "modules/mod_status.so"

可以配合 <IfModule test>...</IfModule> section 使用.

Configuration Sections

用于对服务的配置进行局部的处理, 用 configuration section containers 或者 .htaccess 文件.

可用的 section containers 有:

  • <Directory>
  • <DirectoryMatch>
  • <Files>
  • <FilesMatch>
  • <If>
  • <IfDefine>
  • <IfModule>
  • <IfVersion>
  • <Location>
  • <LocationMatch>
  • <MDomainSet>
  • <Proxy>
  • <ProxyMatch>
  • <VirtualHost>

其中: <DirectoryMatch>, <FilesMatch>, and <LocationMatch> that allow perl-compatible regular expressions

如:

1
2
3
<FilesMatch "\.(?i:gif|jpe?g|png)$">
Require all denied
</FilesMatch>

Alias 指令

给文件路径起别名, 如:

1
2
Alias "/foo/bar" "/srv/www/uncommon/bar"
Alias "/foo" "/srv/www/common/foo"

ProxyPass 指令

需要先启用 mod_proxymod_proxy_http 模块.

用于将 remote server 映射到 local server 的 space.

此时 local server 作为 reverse proxy 或者 gateway.

一般用于 <Location> section 中, 不能用于 <Directory>, <If>, <File> containers 中.

1
2
3
<Location "/mirror/foo/">
ProxyPass "http://backend.example.com/"
</Location>

等价于:

1
ProxyPass "/mirror/foo/" "http://backend.example.com/"

若不想反向代理子目录, 则:

1
2
3
4
5
6
<Location "/mirror/foo/">
ProxyPass "http://backend.example.com/"
</Location>
<Location "/mirror/foo/i">
ProxyPass "!"
</Location>

Options 指令

用于启用或禁用指令, 启用用 +, 而禁用用 -, 如:

1
Options +Indexes -FollowSymLinks

merge 的顺序

  1. <Directory> (except regular expressions) and .htaccess done simultaneously (with .htaccess, if allowed, overriding <Directory>)
  2. <DirectoryMatch> (and <Directory "~">)
  3. <Files> and <FilesMatch> done simultaneously
  4. <Location> and <LocationMatch> done simultaneously
  5. <If> sections, even when they are enclosed in any of the preceding contexts.

Dynamic Content with CGI

开启 CGI 脚本支持:

1
LoadModule cgid_module modules/mod_cgid.so

(mod_cgid 是 Apache 的外部 CGI 处理程序)

或:

1
LoadModule cgid_module modules/mod_cgi.so

(mod_cgi 是 Apache 的内部 CGI 处理程序, 但性能不如 cgid)

ScriptAlias 指令

Alias 具有相同的作用.

AddHandlerSetHandler 指令

当用户不具备 ScriptAlias 所指定目录下的 CGI 脚本的执行权限时, 可以通过 AddHandlerSetHandler 来指定其他目录下的脚本.

如:

1
AddHandler cgi-script .cgi .pl

这里 cgi-script 是自己取的名称, .cgi 是用作 CGI 脚本的文件类型.

1
SetHandler cgi-script

这里设定 Handler 为之前 add 的 cgi-script.

让一个目录可以运行 CGI 脚本, 需要设置 Options 指令:

1
2
3
<Directory "/usr/local/apache2/htdocs/somedir">
Options +ExecCGI
</Directory>

编写 CGI 脚本

CGI 脚本的所有输出都会被处理为一个 MIME-type 的 header. 且需要为 HTML 或者其他浏览器能够展示的格式.


Apache-官方文档-Notes
http://example.com/2023/10/11/Apache-官方文档-Notes/
作者
Jie
发布于
2023年10月11日
许可协议