Apache教程


Apache教程

安装

#安装Apache及其扩展包
yum -y install httpd httpd-manual mod_ssl mod_perl mod_auth_mysql

启动、停止、重启

#centos
service httpd start
service httpd stop
service httpd restart

主要的配置文件

配置文件在\etc\httpd下面,主要的配置文件\etc\httpd\conf\httpd.conf

基本配置

属性名+值 意义
ServerRoot "/your/index" Apache安装的目录
Listen 80 监听的端口,可以开启多个端口
Include conf.modules.d/*.conf 加载文件中的所有模块
LoadModule foo_module modules/mod_foo.so 加载单独模块
LoadFile LoadModule类似,但使用绝对路径
User username 运行时的用户名
Group groupname 运行时的用户组
ServerAdmin root@localhost 管理员的邮件地址
ServerName www.example.com:80 主站点名称,可以是域名也能是IP,不写时自动配置
DocumentRoot "/var/www/html" 主站点的网页存储位置
DirectoryIndex index 默认索引目录
RequestReadTimeout 允许限制客户端发送请求所花费的时间
TimeOut 传输或接收的延时,大于这个时间SERVER 会断开这个链接
KeepAliveTimeout 等待下一个请求的时间
MaxClients 允许的最大客户个数
KeepAlive 是否允许一个链接同时发出多的请求

目录访问权限控制

&ltDirectory "/yourindex"> 
&ltFiles "private.html">
        Require all denied
    &lt/Files>
Options FollowSymLinks 
AllowOverride None 
Order allow,deny 
Allow from all 
#Require all granted #Apache2.2后替换Order
&lt/Directory> 
属性名 意义
Directory 权限配置的容器名(文件系统容器),路径能正则匹配
/yourindex 需要配置权限的目录
Files 指定文件权限,路径能正则匹配
Options 配置在特定目录使用的特性
None 不启用任何额外功能
ExecCGI 在该目录下允许执行CGI脚本
FollowSymlinks 允许指定目录下的文件连接到目录外的文件或目录(在该目录下允许文件系统使用符号连接)
Indexes 当用户访问该目录时,如果用户找不到DirectoryIndex指定的主页文件(例如index.html),则返回该目录下的文件列表给用户
SymLinksIfOwnerMatch 当使用符号连接时,只有当符号连接的文件拥有者与实际文件的拥有者相同时才可以访问。
All 开启除 MultiViews 之外的所有选项
AllowOverride 允许存在于.htaccess文件中的指令类型
None 不搜索该目录下的.htaccess文件
All .htaccess文件中可以使用所有的指令
Order 控制在访问时AllowDeny两个访问规则哪个优先
Allow 允许访问的主机列表(可用域名或子网,例如:Allow from 192.168.0.0/16)
Deny 拒绝访问的主机列表
Order deny,allow 先检查拒绝,再检查允许,当拒绝与允许有冲突时,允许优先,默认规则为允许
Order allow,deny 先检查允许,再检查拒绝,当允许与拒绝有冲突时,拒绝优先。默认规则为拒绝
Require 测试经过身份验证的用户是否由授权提供者授权,Apache2.2后替换Order
Require all granted 允许所有访问请求
Require all denied 拒绝所有访问请求
Require ip ip1 ip2 只允许来自特定IP或IP段的访问请求,其他请求将被拒绝
Require host x.com 只允许来自特定域名主机的访问请求,其他请求将被拒绝
Require not ip ip1 拒绝ip1
Require not host gov 拒绝gov

虚拟主机容器

VirtualHost

&ltVirtualHost 10.1.2.3:80>
  ServerAdmin webmaster@host.example.com
  DocumentRoot "/www/docs/host.example.com"
  ServerName host.example.com
  ServerAlias server server2.example.com server2
  ServerAlias *.example.com
  UseCanonicalName Off
  ErrorLog "logs/host.example.com-error_log"
  TransferLog "logs/host.example.com-access_log"
&lt/VirtualHost>
属性名 意义
VirtualHost 包含一组仅适用于特定虚拟主机的指令
ServerAlias 为主机名创建一个别名
ProxyPreserveHost On 使用传入的主机 HTTP 请求标头进行代理请求
ProxyPass "/" "http://192.168.111.2/" 将远程服务器映射到本地服务器 URL 空间
ProxyPassReverse "/" "http://192.168.111.2/" 调整从反向代理服务器发送的 HTTP 响应标头中的 URL
ServerPath 由不兼容的浏览器访问的基于名称的虚拟主机的旧 URL 路径名
RewriteRule 定义重写引擎的规则
….

在单个 IP 地址上运行多个基于名称的网站

# Ensure that Apache listens on port 80
Listen 80
&ltVirtualHost *:80>
    DocumentRoot "/www/example1"
    ServerName www.example.com

    # Other directives here
&lt/VirtualHost>

&ltVirtualHost *:80>
    DocumentRoot "/www/example2"
    ServerName www.example.org

    # Other directives here
&lt/VirtualHost>

多个 IP 地址上的基于名称的主机

Listen 80

# This is the "main" server running on 172.20.30.40
ServerName server.example.com
DocumentRoot "/www/mainserver"

&ltVirtualHost 172.20.30.50>
    DocumentRoot "/www/example1"
    ServerName www.example.com

    # Other directives here ...
&lt/VirtualHost>

&ltVirtualHost 172.20.30.50>
    DocumentRoot "/www/example2"
    ServerName www.example.org

    # Other directives here ...
&lt/VirtualHost>

在不同的 IP 地址(例如内部和外部地址)上提供相同的内容

&ltVirtualHost 192.168.1.1 172.20.30.40>
    DocumentRoot "/www/server1"
    ServerName server.example.com
    ServerAlias server
&lt/VirtualHost>

在不同的端口上运行不同的站点

Listen 80
Listen 8080

&ltVirtualHost 172.20.30.40:80>
    ServerName www.example.com
    DocumentRoot "/www/domain-80"
&lt/VirtualHost>

&ltVirtualHost 172.20.30.40:8080>
    ServerName www.example.com
    DocumentRoot "/www/domain-8080"
&lt/VirtualHost>

&ltVirtualHost 172.20.30.40:80>
    ServerName www.example.org
    DocumentRoot "/www/otherdomain-80"
&lt/VirtualHost>

&ltVirtualHost 172.20.30.40:8080>
    ServerName www.example.org
    DocumentRoot "/www/otherdomain-8080"
&lt/VirtualHost>

基于IP的虚拟主机

Listen 80

&ltVirtualHost 172.20.30.40>
    DocumentRoot "/www/example1"
    ServerName www.example.com
&lt/VirtualHost>

&ltVirtualHost 172.20.30.50>
    DocumentRoot "/www/example2"
    ServerName www.example.org
&lt/VirtualHost>

基于端口和基于 ip 的混合虚拟主机

Listen 172.20.30.40:80
Listen 172.20.30.40:8080
Listen 172.20.30.50:80
Listen 172.20.30.50:8080

&ltVirtualHost 172.20.30.40:80>
    DocumentRoot "/www/example1-80"
    ServerName www.example.com
&lt/VirtualHost>

&ltVirtualHost 172.20.30.40:8080>
    DocumentRoot "/www/example1-8080"
    ServerName www.example.com
&lt/VirtualHost>

&ltVirtualHost 172.20.30.50:80>
    DocumentRoot "/www/example2-80"
    ServerName www.example.org
&lt/VirtualHost>

&ltVirtualHost 172.20.30.50:8080>
    DocumentRoot "/www/example2-8080"
    ServerName www.example.org
&lt/VirtualHost>

混合基于名称和基于 IP 的虚拟主机

Listen 80
&ltVirtualHost 172.20.30.40>
    DocumentRoot "/www/example1"
    ServerName www.example.com
&lt/VirtualHost>

&ltVirtualHost 172.20.30.40>
    DocumentRoot "/www/example2"
    ServerName www.example.org
&lt/VirtualHost>

&ltVirtualHost 172.20.30.40>
    DocumentRoot "/www/example3"
    ServerName www.example.net
&lt/VirtualHost>

# IP-based
&ltVirtualHost 172.20.30.50>
    DocumentRoot "/www/example4"
    ServerName www.example.edu
&lt/VirtualHost>

&ltVirtualHost 172.20.30.60>
    DocumentRoot "/www/example5"
    ServerName www.example.gov
&lt/VirtualHost>

一起使用 Virtual_host 和 mod_proxy

&ltVirtualHost *:*>
    ProxyPreserveHost On
    ProxyPass        "/" "http://192.168.111.2/"
    ProxyPassReverse "/" "http://192.168.111.2/"
    ServerName hostname.example.com
&lt/VirtualHost>

使用_default_vhosts

&ltVirtualHost _default_:80>
    DocumentRoot "/www/default80"
    # ...
&lt/VirtualHost>

&ltVirtualHost _default_:*>
    DocumentRoot "/www/default"
    # ...
&lt/VirtualHost>

将基于名称的虚拟主机迁移到基于 IP 的虚拟主机

Listen 80
ServerName www.example.com
DocumentRoot "/www/example1"

&ltVirtualHost 172.20.30.40 172.20.30.50>
    DocumentRoot "/www/example2"
    ServerName www.example.org
    # ...
&lt/VirtualHost>

&ltVirtualHost 172.20.30.40>
    DocumentRoot "/www/example3"
    ServerName www.example.net
    ServerAlias *.example.net
    # ...
&lt/VirtualHost>

使用 ServerPath 指令

&ltVirtualHost 172.20.30.40>
    # primary vhost
    DocumentRoot "/www/subdomain"
    RewriteEngine On
    RewriteRule "." "/www/subdomain/index.html"
    # ...
&lt/VirtualHost>

&ltVirtualHost 172.20.30.40>
    DocumentRoot "/www/subdomain/sub1"
    ServerName www.sub1.domain.tld
    ServerPath "/sub1/"
    RewriteEngine On
    RewriteRule "^(/sub1/.*)" "/www/subdomain$1"
    # ...
&lt/VirtualHost>

&ltVirtualHost 172.20.30.40>
    DocumentRoot "/www/subdomain/sub2"
    ServerName www.sub2.domain.tld
    ServerPath "/sub2/"
    RewriteEngine On
    RewriteRule "^(/sub2/.*)" "/www/subdomain$1"
    # ...
&lt/VirtualHost>

条件判断容器

If

&ltIf "!(%{HTTP_REFERER} -strmatch 'http://www.example.com/*')">
    Require all denied
&lt/If>
属性名 意义
If 条件满足则执行内部语句
!(%{HTTP_REFERER} -strmatch 'http://www.example.com/*') 条件

IfDefine

&ltIfDefine ClosedForNow>
    Redirect / http://otherserver.example.com/
&lt/IfDefine>
属性名 意义
IfDefine 若使用httpd -D ClosedForNow指令执行的操作就会执行里面的内容(可镶嵌)
ClosedForNow 使用httpd -D ClosedForNow指令执行,前面加!表示相反
Redirect 跳转到另一站点

IfModule

&ltIfModule mod_mime_magic.c>
    MimeMagicFile conf/magic
&lt/IfModule>
属性名 意义
IfModule 若使用了mod_mime_magic模块就执行里面内容(可镶嵌)
mod_mime_magic.c 模块名
MimeMagicFile 执行的指令

IfVersion

&ltIfVersion >= 2.1>
    # this happens only in versions greater or
    # equal 2.1.0.
&lt/IfVersion>
属性名 意义
IfVersion 版本满足就会执行
….

网站空间容器

Location

&ltLocation "/status">
  SetHandler server-status
  Require host example.com
&lt/Location>
属性名 意义
Location Location 容器内定义的指令仅对特定的 URL 有效
/status 将特定URL映射到mod_status提供的内部Apache HTTP Server处理程序

Proxy容器

Proxy

&ltProxy "http://example.com/foo/*">
  SetOutputFilter INCLUDES
&lt/Proxy>

更灵活的匹配容器

DirectoryMatch

&ltDirectoryMatch "^/www/(.+/)?[0-9]{3}/">
    # ...
&lt/DirectoryMatch>

FilesMatch

&ltFilesMatch ".+\.(gif|jpe?g|png)$">
    # ...
&lt/FilesMatch>

LocationMatch

&ltLocationMatch "^/combined/(?&ltsitename>[^/]+)">
    Require ldap-group cn=%{env:MATCH_SITENAME},ou=combined,o=Example
&lt/LocationMatch>

ProxyMatch

&ltProxyMatch "^http://(?&ltsitename>[^/]+)">
    Require ldap-group cn=%{env:MATCH_SITENAME},ou=combined,o=Example
&lt/ProxyMatch>

日志模块

通用日志格式

LogFormat "%h %l %u %t \"%r\" %>s %b" common
CustomLog logs/access_log.log common

组合日志格式

LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-agent}i\"" combined
CustomLog log/access_log.log combined
  • %h是远程主机
  • %l是由identd确定的用户的身份
  • %u是HTTP身份验证确定的用户名
  • %t是服务器处理完请求的时间
  • %r是来自客户端的请求行GET、HTTP
  • %> s是从服务器发送到客户端的状态代码
  • %b是客户端响应的大小(以字节为单位)
  • "%{Referer}i是链接到此URL的页面
  • %{User-Agent}i 是客户浏览器提供的浏览器识别信息
LogFormat "%400,501{User-agent}i" browserlog
LogFormat "%!200,304,302{Referer}i" refererlog
#前面的状态码是用来判断的
属性名 意义
ErrorLog “xxx” 定位服务器错误日志的位置,默认使用相对路径
LogLevel warn 日志级别
ErrorLogFormat 设置错误日志的格式
CustomLog logs/access_log common 创建和格式化日志文件common
LogFormat "%h %l %u %t "%r" %>s %b "%{Referer}i" "%{User-agent}i"" common common为用户日志别名,中间为具体格式
TransferLog "logs/host.example.com-access_log" 创建日志文件

附加的配置文件

环境变量

设置环境变量

属性名 意义
unique_id_module 为每个请求提供一个具有唯一标识符的环境变量
PassEnv LD_LIBRARY_PATH 从 shell 传递环境变量
SetEnv SPECIAL_PATH /foo/bin 设置环境变量
UnsetEnv LD_LIBRARY_PATH 从环境中删除变量
SetEnvIf Request_URI "\.(.*)$" EXTENSION=$1 根据请求的属性设置环境变量
SetEnvIfExpr expr [!]env-variable[=value] [[!]env-variable[=value]] ...
BrowserMatch Robot is_a_robot &ltbr>SetEnvIf User-Agent Robot is_a_robot 以 HTTP 用户代理为条件设置环境变量
SetEnvIfNoCase 根据请求的属性设置环境变量而不考虑大小写

使用环境变量

属性名 意义
Require all granted
CustomLog 设置日志文件的文件名和格式
Allow 控制哪些主机可以访问服务器的某个区域
Deny 控制哪些主机被拒绝访问服务器
ExtFilterDefine 定义外部过滤器
`Header [condition] add append
Header set Content-Type "text/plain" "expr=-z %{CONTENT_TYPE}"
RewriteCond TestString CondPattern [flags] 定义重写发生的条件
RewriteRule Pattern Substitution [flags] 定义重写引擎的规则

缓存指南

Sample httpd.conf
#
# Sample Cache Configuration
#
LoadModule cache_module modules/mod_cache.so
&ltIfModule mod_cache.c>
    LoadModule cache_disk_module modules/mod_cache_disk.so
    &ltIfModule mod_cache_disk.c>
        CacheRoot "c:/cacheroot"
        CacheEnable disk  "/"
        CacheDirLevels 5
        CacheDirLength 3
    &lt/IfModule>

    # When acting as a proxy, don't cache the list of security updates
    CacheDisable "http://security.update.server/update-list/"
&lt/IfModule>
属性名 意义
CacheRoot 存放缓存文件的根目录
CacheDirLength 子目录名称中的字符数
CacheDirLevels 缓存中子目录的级别数
CacheMaxFileSize 要放置在缓存中的文档的最大大小(以字节为单位)
CacheReadSize 在向下游发送数据之前要读取和缓存的文档的最小大小(以字节为单位)
CacheReadTime 在向下游发送数据之前读取时应经过的最短时间(以毫秒为单位)
CacheEnable cache_type [url-string] 使用指定的存储管理器启用指定 URL 的缓存
CacheSocache type[:args] 要使用的共享对象缓存实现
CacheDisable 禁用指定 URL 的缓存

内容协商

使用类型映射文件

AddHandler type-map .var

类型映射文件应与其描述的资源具有相同的名称,后跟扩展名.var.在下面显示的示例中,资源名为foo,因此类型映射文件名为foo.var

URI: foo

URI: foo.en.html
Content-type: text/html
Content-language: en

URI: foo.fr.de.html
Content-type: text/html;charset=iso-8859-2
Content-language: fr, de
URI: foo

URI: foo.jpeg
Content-type: image/jpeg; qs=0.8

URI: foo.gif
Content-type: image/gif; qs=0.5

URI: foo.txt
Content-type: text/plain; qs=0.01
URI: document.html

Content-language: en
Content-type: text/html
URI: document.html.en

Content-language: fr
Content-type: text/html
URI: document.html.fr

Content-language: de
Content-type: text/html
URI: document.html.de

这三段代码都是type-map

属性名 意义
URI: document.html 资源名
Content-type 资源类型
Content-language 资源语言
qs 权重
AddHandler type-map .var 与名为type-map的处理程序关联
.var 相当*的匹配值

Multiviews

如果服务器收到/some/dir/foo的请求,如果/some/dir启用了MultiViews,并且/some/dir/foo不存在,那么服务器会读取寻找的目录名为foo.*的文件

从 URL 映射到文件系统

Apache HTTP Server 使用请求的 URL 来确定提供文件的文件系统位置

ProxyPass         "/mirror/foo/" "http://backend.example.com/"
ProxyPassReverse  "/mirror/foo/" "http://backend.example.com/"
ProxyPassReverseCookieDomain  "backend.example.com"  "public.example.com"
ProxyPassReverseCookiePath  "/"  "/mirror/foo/"
属性名 意义
`Alias [URL-path] file-path directory-path`
Alias "/docs" "/var/web" 网址 http://www.example.com/docs/dir/file.html 将从/var/web/dir/file.html提供
`AliasMatch regex file-path directory-path`
AliasMatch "^/icons(/$)(.*)" "/usr/local/apache/icons$1$2"
`CheckSpelling on off`
DirectoryIndex disabled local-url [local-url] ... 客户端请求目录时要查找的资源列表
DocumentRoot
ErrorDocument 404 /errors/bad_urls.php 发生错误时服务器将返回给客户端的内容
Options
ProxyPass "/mirror/foo/" "http://backend.example.com/" 将远程服务器映射到本地服务器 URL 空间
ProxyPassReverse [path] url [interpolate] 调整从反向代理服务器发送的 HTTP 响应标头中的 URL
ProxyPassReverseCookieDomain internal-domain public-domain [interpolate] 从反向代理服务器调整 Set-Cookie 标头中的域字符串
ProxyPassReverseCookiePath internal-path public-path [interpolate] 调整来自反向代理服务器的 Set-Cookie 标头中的 Path 字符串
Redirect [status] [URL-path] URL 发送外部重定向请求客户端获取不同的 URL
Redirect 303 "/three" "http://example.com/other"
RedirectMatch [status] regex URL 根据当前 URL 的正则表达式匹配发送外部重定向
RewriteCond TestString CondPattern [flags] 定义重写发生的条件
RewriteRule Pattern Substitution [flags] 定义重写引擎的规则
`ScriptAlias [URL-path] file-path directory-path`
`ScriptAliasMatch regex file-path directory-path`
UserDir directory-filename [directory-filename] ... 用户特定目录的位置

全局配置

属性名 意义
`ServerName [scheme://]domain-name ip-address[:port]`
`ServerAdmin email-address URL`
`ServerSignature On Off
`ServerTokens Major Minor
`UseCanonicalName On Off
`UseCanonicalPhysicalPort On Off`
CoreDumpDirectory directory Apache HTTP Server 在转储核心之前尝试切换的目录
DocumentRoot directory-path 构成 Web 上可见的主文档树的目录
`ErrorLog file-path syslog[:[facility]`
`Mutex mechanism [default mutex-name] … [OmitPID]`
PidFile filename 服务器记录守护进程进程ID的文件
ScoreBoardFile file-path 用于存储子进程的协调数据的文件的位置
ServerRoot directory-path 服务器安装的基本目录
LimitRequestBody bytes 限制客户端发送的 HTTP 请求正文的总大小
LimitRequestFields number 限制将从客户端接受的 HTTP 请求头字段的数量
LimitRequestFieldSize bytes 限制客户端允许的 HTTP 请求头的大小
LimitRequestLine bytes 限制将从客户端接受的 HTTP 请求行的大小
`RLimitCPU seconds max [seconds
`RLimitMEM bytes max [bytes
`RLimitNPROC number max [number
ThreadStackSize size 处理客户端连接的线程使用的堆栈大小(以字节为单位)

SSL/TLS 加密

an example

LoadModule ssl_module modules/mod_ssl.so

Listen 443
&ltVirtualHost *:443>
    ServerName www.example.com
    SSLEngine on
    SSLCertificateFile "/path/to/www.example.com.cert"
    SSLCertificateKeyFile "/path/to/www.example.com.key"
&lt/VirtualHost>
属性值 意义
SSLEngine on SSL 引擎操作开关
`SSLCertificateFile file-path certid`
`SSLCertificateKeyFile file-path keyid`
SSLCipherSuite [protocol] cipher-spec 密码套件可用于 SSL 握手中的协商
SSLCipherSuite RC4-SHA:AES128-SHA:HIGH:!aNULL:!MD5
`SSLHonorCipherOrder on off`
SSLUseStapling off 在 TLS 握手中启用 OCSP 响应的装订
SSLStaplingCache "shmcb:logs/ssl_stapling(32768)" 配置 OCSP 装订缓存
SSLVerifyClient level 客户端证书验证类型
SSLVerifyDepth number 客户端证书验证中 CA 证书的最大深度
SSLCACertificateFile file-path 用于客户端身份验证的串联 PEM 编码 CA 证书文件
`SSLOptions [+ -]option …`
SSLRequire expression 仅当任意复杂的布尔表达式为真时才允许访问

URL重写

属性名 意义
RewriteBase URL-path 设置每个目录重写的基本 URL
RewriteCond TestString CondPattern [flags] 定义重写发生的条件
RewriteRule Pattern Substitution [flags] 定义重写引擎的规则
RewriteEngine on|off 启用或禁用运行时重写引擎
RewriteMap MapName MapType:MapSource [MapTypeOptions] 定义键查找的映射函数
RewriteOptions Options 为重写引擎设置一些特殊选项

认证和授权

属性值 意义
AllowOverride AuthConfig .htaccess 文件中允许的指令类型
`AuthType None Basic
AuthBasicProvider provider-name [provider-name] ... 设置此位置的身份验证提供程序
AuthDigestProvider provider-name [provider-name] ... 设置此位置的身份验证提供程序
Require [not] entity-name [entity-name] ... 测试经过身份验证的用户是否由授权提供者授权
AuthName auth-domain 用于 HTTP 身份验证的授权领域
AuthUserFile file-path 设置包含用于身份验证的用户和密码列表的文本文件的名称
AuthDBMUserFile file-path 设置包含用于身份验证的用户和密码列表的数据库文件的名称
AuthGroupFile file-path 设置包含授权用户组列表的文本文件的名称
`AuthLDAPURL url [NONE SSL
AuthGroupFile file-path 设置包含授权用户组列表的文本文件的名称
Require valid-user 所有有效用户都可以访问该资源
Require user userid [userid] ... 只有指定用户才能访问资源
Require group group-name [group-name] ... 只有命名组中的用户才能访问资源
&ltRequireAll> ... &lt/RequireAll> 附上一组授权指令,其中没有一个必须失败,并且至少一个必须成功才能使封闭指令成功
&ltRequireAny> ... &lt/RequireAny> 附上一组授权指令,其中一个必须成功才能使封闭指令成功
&ltRequireNone> ... &lt/RequireNone> 包含一组授权指令,其中没有一个必须成功才能使封闭指令不失败

如何工作

htpasswd -c /usr/local/apache/passwd/passwords rbowen
#创建文件

GroupName: rbowen dpitts sungo rshersey
#创建一个将组名与该组中的用户列表关联的组文件

htpasswd /usr/local/apache/passwd/passwords dpitts
#将用户添加到您已存在的密码文件

简单示例

能放在.htaccess中或者Directory

AuthType Basic
AuthName "Restricted Files"
# (Following line optional)
AuthBasicProvider file
AuthUserFile "/usr/local/apache/passwd/passwords"
Require user rbowen

让不止一个人进来

AuthType Basic
AuthName "By Invitation Only"
# Optional line:
AuthBasicProvider file
AuthUserFile "/usr/local/apache/passwd/passwords"
AuthGroupFile "/usr/local/apache/passwd/groups"
Require group GroupName

备用密码存储

&ltDirectory "/www/docs/private">
    AuthName "Private"
    AuthType Basic
    AuthBasicProvider dbm
    AuthDBMUserFile "/www/passwords/passwd.dbm"
    Require valid-user
&lt/Directory>

使用多个提供商

使用文件组授权和 LDAP 组授权

&ltDirectory "/www/docs/private">
    AuthName "Private"
    AuthType Basic
    AuthBasicProvider file
    AuthUserFile "/usr/local/apache/passwd/passwords"
    AuthLDAPURL ldap://ldaphost/o=yourorg
    AuthGroupFile "/usr/local/apache/passwd/groups"
    Require group GroupName
    Require ldap-group cn=mygroup,o=yourorg
&lt/Directory>

CGI与动态内容

属性名 意义
AddHandler cgi-script .cgi 将文件扩展名映射到指定的处理程序(指定拓展名.cgi为CGI文件)
Options ExecCGI
`ScriptAlias [URL-path] file-path directory-path`
LoadModule cgi_module modules/mod_cgi.so 配置 Apache 以允许 CGI 执行
`SetHandler handler-name none

要允许CGI程序执行用户目录中结束的任何文件。.cgi

&ltDirectory "/home/*/public_html">
    Options +ExecCGI
    AddHandler cgi-script .cgi
&lt/Directory>

如果您希望指定用户目录的子目录,其中所有内容都将被视为 CGI 程序。cgi-bin`

&ltDirectory "/home/*/public_html/cgi-bin">
    Options ExecCGI
    SetHandler cgi-script
&lt/Directory>

编写CGI

保存到名为first.pl的文件中,并将其放在cgi-bin目录中

#!/usr/bin/perl
print "Content-type: text/html\n\n";
print "Hello, World.";

浏览器输入URL地址

http://www.example.com/cgi-bin/first.pl

反向代理

简单的反向代理

ProxyPass "/images"  "http://www.example.com/"
ProxyPassReverse "/images"  "http://www.example.com/"

任何以/images路径开头的请求都被代理到指定的后端,否则它将在本地处理

集群和均衡器

负载均衡和故障转移

&ltProxy balancer://myset>
    BalancerMember http://www2.example.com:8080
    BalancerMember http://www3.example.com:8080
    ProxySet lbmethod=bytraffic
&lt/Proxy>

ProxyPass "/images/"  "balancer://myset/"
ProxyPassReverse "/images/"  "balancer://myset/"

均衡器和均衡器成员配置

&ltProxy balancer://myset>
    BalancerMember http://www2.example.com:8080
    BalancerMember http://www3.example.com:8080 loadfactor=3 timeout=1
    ProxySet lbmethod=bytraffic
&lt/Proxy>

ProxyPass "/images"  "balancer://myset/"
ProxyPassReverse "/images"  "balancer://myset/"

故障转移

&ltProxy balancer://myset>
    BalancerMember http://www2.example.com:8080
    BalancerMember http://www3.example.com:8080 loadfactor=3 timeout=1
    BalancerMember http://spare1.example.com:8080 status=+R
    BalancerMember http://spare2.example.com:8080 status=+R
    BalancerMember http://hstandby.example.com:8080 status=+H
    BalancerMember http://bkup1.example.com:8080 lbset=1
    BalancerMember http://bkup2.example.com:8080 lbset=1
    ProxySet lbmethod=byrequests
&lt/Proxy>

ProxyPass "/images/"  "balancer://myset/"
ProxyPassReverse "/images/"  "balancer://myset/"

均衡器启用

&ltLocation "/balancer-manager">
    SetHandler balancer-manager
    Require host localhost
&lt/Location>
属性值 意义
`ProxyPass [path] ! url [key=value [key=value …]] [nocanon] [interpolate] [noquery]`
BalancerMember [balancerurl] url [key=value [key=value ...]] 向负载均衡组添加成员
ProxyPassReverse [path] url [interpolate] 调整从反向代理服务器发送的 HTTP 响应标头中的 URL
BalancerMember [balancerurl] url [key=value [key=value ...]] 向负载均衡组添加成员
ProxySet url key=value [key=value ...] 设置各种代理平衡器或成员参数

.htaccess文件

httpd.conf的语法一样,作用于当前目录,一般用来设置单个功能

处理器

属性名 意义
Action action-type cgi-script [virtual] 为特定处理程序或内容类型激活 CGI 脚本
AddHandler handler-name extension [extension] ... 将文件扩展名映射到指定的处理程序
RemoveHandler extension [extension] ... 删除一组文件扩展名的任何处理程序关联
SetHandler handler-name none

过滤器

属性值 意义
FilterChain [+=-@!]filter-name ... 配置过滤器链
FilterDeclare filter-name [type] 声明一个智能过滤器
FilterProtocol filter-name [provider-name] proto-flags 声明一个智能过滤器
FilterProvider filter-name provider-name expression 注册内容过滤器
AddInputFilter filter[;filter...] extension [extension] ... 将文件扩展名映射到将处理客户端请求的过滤器
AddOutputFilter filter[;filter...] extension [extension] ... 将文件扩展名映射到将处理来自服务器的响应的过滤器
RemoveInputFilter extension [extension] ... 删除一组文件扩展名的任何输入过滤器关联
RemoveOutputFilter extension [extension] ... 删除一组文件扩展名的任何输出过滤器关联
ReflectorHeader inputheader [outputheader] 将输入标题反映到输出标题
ExtFilterDefine filtername parameters 定义外部过滤器
ExtFilterOptions option [option] ... 配置 mod_ext_filter 选项
SetInputFilter filter[;filter...] 设置将处理客户端请求和 POST 输入的过滤器
SetOutputFilter filter[;filter...] 设置将处理来自服务器的响应的过滤器

变量

HTTP变量
HTTP_ACCEPT
HTTP_COOKIE
HTTP_FORWARDED
HTTP_HOST
HTTP_PROXY_CONNECTION
HTTP_REFERER
HTTP_USER_AGENT
名字 描述
REQUEST_METHOD 传入请求的 HTTP 方法(例如GET)
REQUEST_SCHEME 该计划是请求URI的一部分
REQUEST_URI 请求URI的路径部分
DOCUMENT_URI REQUEST_URI一样
REQUEST_FILENAME 如果当时服务器已经确定了该路径,与请求匹配的文件或脚本的完整本地文件系统路径。否则,例如在虚拟主机上下文中使用时,与 REQUEST_FILENAME REQUEST_URI 相同的值
SCRIPT_FILENAME REQUEST_FILENAME一样
LAST_MODIFIED 如果此时服务器已经确定该格式中文件上次修改的日期和时间,则参照该日期和时间进行引用。20101231235959 LAST_MODIFIED
SCRIPT_USER 脚本所有者的用户名。
SCRIPT_GROUP 脚本组的组名。
PATH_INFO 尾随路径名称信息,请参阅AcceptPathInfo
QUERY_STRING 当前请求的查询字符串
IS_SUBREQ 如果当前请求是次要请求true,否则false
THE_REQUEST 完整的请求行(例如”GET /index.html HTTP/1.1“)
REMOTE_ADDR 远程主机的 IP 地址
REMOTE_PORT 远程主机的端口(2.4.26 及以后)
REMOTE_HOST 远程主机的主机名称
REMOTE_USER 已验证用户的名称(在&ltIF>不可用)
REMOTE_IDENT mod_ident 设置的用户名
SERVER_NAME 当前的虚拟ServerName
SERVER_PORT 当前vhost的服务器端口,请参阅ServerName
SERVER_ADMIN 当前的虚拟ServerAdmin
SERVER_PROTOCOL 请求所使用的协议
DOCUMENT_ROOT 当前的虚拟DocumentRoot
AUTH_TYPE 配置(例如AuthType basic)
CONTENT_TYPE 响应的内容类型(在 &ltIf> 间不可用)
HANDLER 创建响应的处理程序的名称
HTTP2 如果请求使用http/2on,否则off
HTTPS 如果请求使用httpson,否则off
IPV6 如果连接使用IPv6on,否则off
REQUEST_STATUS 请求的 HTTP 错误状态(在&ltIf>间不可用))
REQUEST_LOG_ID 请求的错误日志ID(参见ErrorLogFormat)
CONN_LOG_ID 连接的错误日志ID(参见ErrorLogFormat)
CONN_REMOTE_ADDR 连接的同侪 IP 地址(参见模块)mod_remoteip
CONTEXT_PREFIX
CONTEXT_DOCUMENT_ROOT
名字 描述
TIME_YEAR 本年度(例如2010)
TIME_MON 当月(,…,0112)
TIME_DAY 本月的当前日期(,…)01
TIME_HOUR 当前时间的小时部分(,…,0023)
TIME_MIN 当前时间的分钟部分
TIME_SEC 当前时间的秒钟部分
TIME_WDAY 一周的一天(从周日开始)0
TIME 格式中的日期和时间20101231235959
SERVER_SOFTWARE 服务器版本字符串
API_VERSION API 版本的日期(模块魔法数字)

二进制变量

名字 其他形式 描述
== = 字符串均等
!= 字符串不平等
&lt 字符串少于
&lt= 字符串小于或等于
> 字符串大于
>= 字符串大于或等于
=~ 字符串与常规表达方式匹配
!~ 字符串与常规表达不匹配
-eq eq 整数平等
-ne ne 整数不平等
-lt lt 整数小于
-le le 整数小于或相等
-gt gt 整数大于
-ge ge 整数大于或相等

统一变量

名字 描述
-d 参数被视为文件名。如果文件存在并且是目录,则为真
-e 参数被视为文件名。如果存在文件(或目录和特殊文件),则为真
-f 参数被视为文件名。如果文件存在并且是常规文件,则为真
-s 参数被视为文件名。如果文件存在且不是空的,则正确
-L 参数被视为文件名。如果文件存在并且是符号链接,则为真
-h 参数被视为文件名。真实的,如果文件存在,是符号链接(与-L相似)
-F 如果字符串是一个有效的文件,则可以通过该路径的所有服务器当前配置的访问控制进行访问。
-U 如果字符串是一个有效的URL,则可以通过该路径的所有服务器当前配置的访问控制进行访问。
-A 别名-U
-n 如果字符串不是空的,则为真
-z 如果字符串是空的,则为真
-T 如果字符串为空,””,””,”” 或 “”(不区分大小写),则为 False,否则为真
-R %{REMOTE_ADDR} -ipmatch ...相同,但效率更高

功能变量

名字 描述
req,http 获取 HTTP 请求标题;标头名称可以添加到 Vary 标头
req_novary 与 相同,但不会将标头名称添加到 Vary 标头中
resp 获取 HTTP 响应头(大多数响应标题在&ltIf>间尚未设置)
reqenv 查找请求环境变量(作为快捷方式,也可用于访问变量)
osenv 查找操作系统环境变量
note 查找请求说明
env 返回第一个匹配
tolower 将字符串转换为小写
toupper 将字符串转换为大写
escape 在 %hex 编码中转义特殊字符
unescape Unescape %hex 编码的字符串,单独留下编码的斜杠;如果找到 %00,则返回空字符串
base64 使用 base64 编码对字符串进行编码
unbase64 解码base64编码的字符串,如果找到0x00则返回截断的字符串
md5 使用 MD5 对字符串进行散列,然后使用十六进制编码对散列进行编码
sha1 使用 SHA1 对字符串进行散列,然后使用十六进制编码对散列进行编码
file 从文件中读取内容(包括行尾,如果存在)
filemod 返回文件的最后修改时间(如果文件不存在或不是常规文件,则返回 0)
filesize 返回文件的大小(如果文件不存在或不是常规文件,则返回 0)

模块

模块索引 - Apache HTTP 服务器 版本 2.4

核心与多处理模块(MPM)

core

始终可用的核心 Apache HTTP Server 功能

mpm_common

由多个多处理模块 (MPM) 实现的一组指令

event

MPM 的一种变体,其目标是仅为与活动处理工作者的连接消耗线程

mpm_netware

实现专为 Novell NetWare 优化的线程 Web 服务器的多处理模块

mpmt_os2

用于 OS/2 的混合多进程、多线程 MPM

prefork

实现一个非线程的、预分叉的 Web 服务器

mpm_winnt

为 Windows NT 优化的多处理模块

worker

实现混合多线程多进程 Web 服务器的多处理模块

其他模块

mod_access_compat

基于主机(名称或 IP 地址)的组授权

mod_actions

根据媒体类型或请求方法执行 CGI 脚本

mod_alias

提供在文档树中映射主机文件系统的不同部分和 URL 重定向

mod_allowmethods

轻松限制可以在服务器上使用的 HTTP 方法

mod_asis

发送包含自己的 HTTP 标头的文件

mod_auth_basic

基本 HTTP 身份验证

mod_auth_digest

使用 MD5 摘要身份验证的用户身份验证

mod_auth_form

表单认证

mod_authn_anon

允许“匿名”用户访问经过身份验证的区域

mod_authn_core

核心身份验证

mod_authn_dbd

使用 SQL 数据库进行用户身份验证

mod_authn_dbm

使用 DBM 文件进行用户身份验证

mod_authn_file

使用文本文件进行用户身份验证

mod_authn_socache

管理身份验证凭据缓存以减轻后端的负载

mod_authnz_fcgi

允许 FastCGI 授权器应用程序处理 Apache httpd 身份验证和授权

mod_authnz_ldap

允许使用 LDAP 目录来存储用于 HTTP 基本身份验证的数据库

mod_authz_core

核心授权

mod_authz_dbd

使用 SQL 进行组授权和登录

mod_authz_dbm

使用 DBM 文件的组授权

mod_authz_groupfile

使用纯文本文件的组授权

mod_authz_host

基于主机(名称或 IP 地址)的组授权

mod_authz_owner

基于文件所有权的授权

mod_authz_user

用户授权

mod_autoindex

自动生成目录索引,类似于 Unix 命令或 Win32 shell commandlsdir

mod_brotli

在将内容交付给客户端之前通过 Brotli 压缩内容

mod_buffer

支持请求缓冲

mod_cache

符合 RFC 2616 的 HTTP 缓存过滤器

mod_cache_disk

用于 HTTP 缓存过滤器的基于磁盘的存储模块

mod_cache_socache

基于共享对象缓存 (socache) 的存储模块,用于 HTTP 缓存过滤器

mod_cern_meta

CERN httpd 元文件语义

mod_cgi

CGI脚本的执行

mod_cgid

使用外部 CGI 守护程序执行 CGI 脚本

mod_charset_lite

指定字符集转换或重新编码

mod_data

将响应正文转换为 RFC2397 数据 URL

mod_dav

分布式创作和版本控制WebDAV 功能

mod_dav_fs

mod_dav 的文件系统提供程序

mod_dav_lock

mod_dav 的通用锁定模块

mod_dbd

管理 SQL 数据库连接

mod_deflate

在将内容交付给客户端之前对其进行压缩

mod_dialup

以各种旧调制解调器标准定义的带宽速率限制发送静态内容

mod_dir

提供”跟踪斜线”重定向和服务目录索引文件

mod_dumpio

根据需要将所有 I/O 转储到错误日志

mod_echo

一个简单的回显服务器来说明协议模块

mod_env

修改传递给 CGI 脚本和 SSI 页面的环境

mod_example_hooks

说明 Apache 模块 API

mod_expires

根据用户指定的标准生成和 HTTP 标头ExpiresCache-Control

mod_ext_filter

在传递给客户端之前通过外部程序传递响应正文

mod_file_cache

在内存中缓存静态文件列表

mod_filter

上下文敏感的智能过滤器配置模块

mod_headers

HTTP 请求和响应标题的自定义

mod_heartbeat

将带有服务器状态的消息发送到前端代理

mod_heartmonitor

mod_heartbeat源服务器的集中监视器

mod_http2

支持 HTTP/2 运输层

mod_ident

RFC 1413 标识查找

mod_imagemap

服务器侧图像映像处理

mod_include

服务器解析 html 文档(服务器侧包含)

mod_info

提供服务器配置的全面概述

mod_isapi

Apache for Windows 中的 ISAPI 扩展

mod_lbmethod_bybusyness

待定请求计数负载平衡器调度器算法mod_proxy_balancer

mod_lbmethod_byrequests

请求计算负载平衡器调度器算法mod_proxy_balancer

mod_lbmethod_bytraffic

加权流量计数负载平衡器调度器算法mod_proxy_balancer

mod_lbmethod_heartbeat

心跳流量计数负载平衡器调度器算法mod_proxy_balancer

mod_ldap

供其他 LDAP 模块使用的 LDAP 连接池和结果缓存服务

mod_log_config

记录向服务器提出的请求

mod_log_debug

额外的可配置调试日志记录

mod_log_forensic

对服务器发出的请求进行取证记录

mod_logio

记录每个请求的输入和输出字节

mod_lua

将 Lua 挂钩提供到 httpd 请求处理的各个部分

mod_macro

在 apache httpd 运行时配置文件中提供宏

mod_md

跨虚拟主机管理域,通过 ACME 协议提供证书

mod_mime

将请求的文件名的扩展名与文件的行为(处理程序和过滤器)和内容(mime 类型、语言、字符集和编码)相关联

mod_mime_magic

通过查看文件内容的几个字节来确定文件的 MIME 类型

mod_negotiation

提供内容协商

mod_nw_ssl

为 NetWare 启用 SSL 加密

mod_privileges

支持 Solaris 特权和在不同用户 ID 下运行虚拟主机

mod_proxy

多协议代理/网关服务器

mod_proxy_ajp

mod_proxy 的 AJP 支持模块

mod_proxy_balancer

mod_proxy负载平衡的扩展

mod_proxy_connect

用于请求处理的 mod_proxy 扩展CONNECT

mod_proxy_express

mod_proxy 的动态大规模反向代理扩展

mod_proxy_fcgi

用于 mod_proxy 的 FastCGI 支持模块

mod_proxy_fdpass

用于 mod_proxy 的 fdpass 外部进程支持模块

mod_proxy_ftp

mod_proxy 的 FTP 支持模块

mod_proxy_hcheck

对 mod_proxy 的 Balancer 成员(工作人员)进行动态健康检查

mod_proxy_html

重写 HTML 链接以确保它们可以从代理上下文中的客户端网络寻址

mod_proxy_http

mod_proxy 的 HTTP 支持模块

mod_proxy_http2

mod_proxy 的 HTTP/2 支持模块

mod_proxy_scgi

用于 mod_proxy 的 SCGI 网关模块

mod_proxy_uwsgi

用于 mod_proxy 的 UWSGI 网关模块

mod_proxy_wstunnel

用于 mod_proxy 的 Websockets 支持模块

mod_ratelimit

客户端带宽速率限制

mod_reflector

通过输出过滤器堆栈将请求正文反映为响应

mod_remoteip

将连接的原始客户端 IP 地址替换为代理或负载均衡器通过请求标头提供的用户代理 IP 地址列表

mod_reqtimeout

设置接收请求的超时和最小数据速率

mod_request

用于处理和提供可用 HTTP 请求正文的过滤器

mod_rewrite

提供基于规则的重写引擎来即时重写请求的 URL

mod_sed

使用语法过滤输入(请求)和输出(响应)内容

mod_session

会话支持

mod_session_cookie

基于 Cookie 的会话支持

mod_session_crypto

会话加密支持

mod_session_dbd

基于 DBD/SQL 的会话支持

mod_setenvif

允许根据请求的特征设置环境变量

mod_slotmem_plain

基于插槽的共享内存提供程序

mod_slotmem_shm

基于插槽的共享内存提供程序

mod_so

在启动或重新启动时将可执行代码和模块加载到服务器中

mod_socache_dbm

基于 DBM 的共享对象缓存提供程序

mod_socache_dc

基于 Distcache 的共享对象缓存提供程序

mod_socache_memcache

基于 Memcache 的共享对象缓存提供程序

mod_socache_redis

基于 Redis 的共享对象缓存提供程序

mod_socache_shmcb

基于 shmcb 的共享对象缓存提供程序

mod_speling

尝试通过忽略大小写或尝试更正各种小拼写错误来更正错误的 URL

mod_ssl

使用安全套接字层 (SSL) 和传输层安全 (TLS) 协议的强密码术

mod_status

提供有关服务器活动和性能的信息

mod_substitute

对响应体执行搜索和替换操作

mod_suexec

允许 CGI 脚本作为指定的用户和组运行

mod_systemd

为系统集成提供更好的支持

mod_unique_id

为每个请求提供一个具有唯一标识符的环境变量

mod_unixd

Unix 系列平台的基本(必需)安全性

mod_userdir

特定于用户的目录

mod_usertrack

站点上用户活动的点击流日志记录

mod_version

版本相关配置

mod_vhost_alias

提供动态配置的海量虚拟主机

mod_watchdog

为其他模块提供基础设施以定期运行任务

mod_xml2enc

增强了对基于 libxml2 的过滤器模块的字符集/国际化支持

[^更多请参考]: Apache HTTP 服务器 2.4 文档 - Apache HTTP 服务器 版本 2.4


文章作者: 0xdadream
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 0xdadream !
评论
  目录