Apache HTTP服务器

翻译自Fedora 17文档System Administrator's Guide中的Web Servers一节。

目录

1 新功能
2 显著变化
3 升级配置文件
4 运行httpd服务
4.1 运行服务
4.2 停止服务
4.3 重启服务
4.4 检查服务状态
5 编辑配置文件
5.1 常见httpd.conf指令
5.2 常见ssl.conf指令
5.3 常见多处理模块指令
6 使用模块
6.1 加载一个模块
6.2 写一个模块
7 设置虚拟主机
8 建立一个SSL服务器
8.1 证书和安全概览
8.2 启用mod_ssl模块
8.3 使用现有密钥和证书
8.4 生成新密钥和证书
9 其他资源
9.1 已安装文档
9.2 有用的网站

HTTP(Hypertext Transfer Protocol,超文本传输协议)服务器,或web服务器,是一种通过网络向客户端提供内容的服务。内容通常是网页,但也能提供其他文档。

这一节我们关注包含在Fedora17中的Apache HTTP服务器2.2版,一个由Apache软件基金会开发的,健壮的,全功能的开源web服务器。本节介绍httpd服务的基本配置,还覆盖了一些高级主题如添加服务器模块(server module)、设置虚拟主机(virtual host)、或设置安全的HTTP服务器(secure HTTP server)。

1 新功能

Apache HTTP服务器2.2版引入了以下增强功能:

  • 改进了缓存模块mod_cache和mod_disk_cache。
  • 通过mod_proxy_balancer模块支持代理负载均衡。
  • 在32位架构下支持大文件,允许web服务器处理大于2G的文件。
  • 支持新的鉴定(authentication)和授权(authorization)结构,代替先前版本所提供的鉴定模块。

2 显著变化

从2.0版本开始,默认的httpd服务配置做出了一些变化:

  • mod_cern_meta和mod_asis模块默认不再加载。
  • mod_ext_filter模块默认加载。

3 升级配置文件

给Apache HTTP服务器2.0升级配置文件,遵循以下步骤:

  1. 确认所有模块名称都是正确的,因为它们可能会改变。为所有重命名的模块调整对应的LoadModule指令。
  2. 在尝试加载前,重新编译所有第三封模块。通常是鉴定和授权模块。
  3. 如果你使用mod_userdir模块,确认使用UserDir指令给出了一个目录名(通常是public_html)。
  4. 如果你使用Apache HTTP安全服务器,编辑/etc/httpd/conf.d/ssl.conf启用SSL(Secure Sockets Layer,安全套接层)协议。

可以使用命令检查配置文件错误:

service httpd configtest

从Apache HTTP服务器2.0版升级到2.2版的更多信息,参考http://httpd.apache.org/docs/2.2/upgrading.html

4 运行httpd服务

本节介绍如何运行、停止、重启,及检查Apache HTTP服务器的当前状态。为了能使用httpd服务,确认你已安装httpd。可以root用户身份运行命令进行安装:

yum install httpd

获取更多Fedora中runlevel概念和管理系统服务的一般性信息,参考Chapter 8, Services and Daemons

4.1 运行服务

要运行httpd服务,以root用户身份运行命令:

systemctl start httpd.service

如果想要系统启动时自动运行服务,使用命令:

systemctl enable httpd.service

参考Chapter 8, Services and Daemons获取在Fedora配置服务的更多信息。

使用安全服务器:如果要把Apache HTTP服务器用作安全服务器,并用到了加密SSL Key文件,系统启动后可能会要求输入一个密码。

4.2 停止服务

要停止正在运行的httpd服务,以root用户身份运行命令:

systemctl stop httpd.service

如果要阻止系统启动时自动运行服务,使用命令:

systemctl disable httpd.service

参考Chapter 8, Services and Daemons获取在Fedora配置服务的更多信息。

4.3 重启服务

有两种不同的方式重启正在运行的httpd服务:

  1. 完全重启,以root用户身份运行:
    systemctl restart httpd.service

    这会停止运行中的httpd服务,然后重新运行它。在安装或删除一个动态加载的模块如PHP后,使用这个命令。

  2. 只重新加载配置文件,以root用户身份运行:
    systemctl reload httpd.service

    这会让运行中的httpd服务重新加载配置文件。所有正在处理的请求会被中断,可能导致客户端浏览器显示一条错误信息或只显示不完整的页面。

  3. 重新加载配置文件,不影响活动请求,以root用户身份运行:
    service httpd graceful

    这会让运行中的httpd服务重加载配置文件。注意当前正在处理的请求会使用旧的配置。

参考Chapter 8, Services and Daemons获取在Fedora配置服务的更多信息。

4.4 检查服务状态

要检查服务是否正在运行,使用下面命令:

systemctl is-active httpd.service

参考Chapter 8, Services and Daemons获取在Fedora配置服务的更多信息。

5 编辑配置文件

httpd服务启动时,默认会读取下表位置中的配置文件。

路径 描述
/etc/httpd/conf/httpd.conf 主配置文件.
/etc/httpd/conf.d/ 配置文件辅助目录,被包含在主配置文件中。

尽管默认配置应该在大多数情况下都适用,至少熟悉一些比较重要的配置选项也是一个不错的主意。要让修改生效,需要重启web服务器。参考4.3 重启服务获取重启httpd服务的更多信息。

要检查配置是否有错,运行下面命令:

service httpd configtest

为了让恢复正确设置变得简单,建议编辑前先备份原始文件。

5.1 常见httpd.conf指令

下述指令通常用在/etc/httpd/conf/httpd.conf文件中:

<Directory>
<Directory>指令允许你只在特定目录应用指令。它使用下面格式:

<Directory directory>
  directive
  …
</Directory>

directory(目录)可以是存在于本地文件系统的一个完整路径,或一个通配符表达式。

这个指令可用来配置位于ScriptAlias指定目录之外,用于服务端脚本的额外的cgi-bin目录。在这个情况下,必须提供ExecCGI和AddHandler指令,目标目录的权限也要正确设置(设置为0755)。
示例:使用<Directory>指令

<Directory /var/www/html>
  Options Indexes FollowSymLinks
  AllowOverride None
  Order allow,deny
  Allow from all
</Directory>
<IfDefine>
IfDefine允许只有在命令行提供了特定的参数时,才应用其内部给出的指令。它的格式是:

<IfDefine [!]parameter>
  directive
  …
</IfDefine>

可在命令提示符下使用“-D参数”提供上述格式中要求的parameter(参数,例如httpd -DEnableHome)。如果那个可选的叹号(!)存在,只有在未提供上述格式中指定的参数时,才会使用Ifdefine内部给出的指令。

示例:使用<IfDefine>指令
<IfDefine EnableHome>
  UserDir public_html
</IfDefine>
<IfModule>
<IfModule>指令允许只当特定模块加载了以后再使用某些指令。它的格式是:

<IfModule [!]module>
  directive
  …
</IfModule>

module(模块)可以其名称或其文件名指定。如果可选的叹号(!)存在,其内部包括的指令只有当模块未加载时才会使用。

示例:使用<IfModule>指令
<IfModule mod_disk_cache.c>
  CacheEnable disk /
  CacheRoot /var/cache/mod_proxy
</IfModule>
<Location>
<Location>指令允许只把一些指令应用于特定的URL。它的格式是:

<Location url>
  directive
  …
</Location>

url可以是相对于DocumentRoot所设置目录的一个相对路径(例如,/server-info),或一个外部URL如http://esample.com/server-info。

示例:使用<Location>指令
<Location /server-info>
  SetHandler server-info
  Order deny,allow
  Deny from all
  Allow from .example.com
</Location>
<Proxy>
<Proxy>指令允许把一些指令只应用于代理服务器。其格式如下:

<Proxy pattern>
  directive
  …
</Proxy>

pattern(模式)可以是外部URL或通配符表达式(如,http://example.com*)。

示例:使用<Proxy>指令
<Proxy *>
  Order deny,allow
  Deny from all
  Allow from .example.com
</Proxy>
<VirtualHost>
<VirtualHost>指令允许把一些指令只应用于特定虚拟主机。其格式为:

<VirtualHost address[:port]…>
  directive
  …
</VirtualHost>

address(地址)可以是IP地址,完整的域名,或下表所描述的特殊形式。

选项 描述
* 代表所有IP地址。
_default_ 代表未匹配的IP地址。
示例:使用<VirtualHost>指令
<VirtualHost *:80>
  ServerAdmin webmaster@penguin.example.com
  DocumentRoot /www/docs/penguin.example.com
  ServerName penguin.example.com
  ErrorLog logs/penguin.example.com-error_log
  CustomLog logs/penguin.example.com-access_log common
</VirtualHost>
AccessFileName
AccessFileName指令允许你指定调整每个目录访问控制信息的文件的文件名。它的格式是:

AccessFileName filename

filename(文件名)是在请求的目录中要查找的文件的名字。默认是.htaccess。

为安全起见,这个指令通常跟随一个Files标签,用来阻止以.ht打头的文件(包括.htaccess和.htpasswd)被web客户端访问到。

示例:使用AccessFileName指令
AccessFileName .htaccess

<Files ~ "^\.ht">
  Order allow,deny
  Deny from all
  Satisfy All
</Files>
Action
Action指令允许指定一个CGI脚本,当请求某媒体类型(media type)时执行这个脚本。它的格式是:

Action content-type path

content-type必须是一个有效的MIME类型如text/html、image/png,或application/pdf。path是CGI脚本的路径,这个路径必须相对于DocumentRoot指令给出的目录(例如,/cgi-bin/process-image.cgi)。

示例:使用Action指令
Action image/png /cgi-bin/process-image.cgi
AddDescription
AddDescription指令允许你为一个文件写一段简短的描述,当显示服务器生成的目录列表时会显示这个描述。它的格式是:

AddDescription "description" filename

description(描述)必须是在双引号(")中括起来的一段文本。filename(文件名)可以是完整的文件名、文件扩展名,或通配符表达式。

示例:使用AddDescription指令
AddDescription "GZIP compressed tar archive" .tgz
AddEncoding
AddEncoding指令允许你为特定的文件扩展名指定一个编码(encoding)类型。它的格式是:

AddEncoding encoding extension

encoding(编码)必须是有效的MIME编码,如x-compress、x-gzip等等。extension(扩展名)是一个区分大小写的文件扩展名,通常以点打头(例如.gz)。

这个指令通常用来告诉web浏览器,当某些类型的文件被下载下来的时候,对它们解压缩。

示例:使用AddEncoding指令
AddEncoding x-gzip .gz .tgz
AddHandler
AddHandler指令允许你把一些文件扩展名映射到选定的处理程序(handler)。它的格式是:

AddHandler handler extension

handler(处理程序)必须是先前已经定义过的一个处理程序名。extension(扩展名)是一个区分大小写的文件扩展名,通常以点打头(例如.gz)。

这个指令通常用于把扩展名为.cgi的文件当作CGI脚本处理,而不管它在哪个目录里。另外,它也广泛用于处理服务器端解析(server-parsed)HTML和image-map文件。

示例:使用AddHandler选项
AddHandler cgi-script .cgi
AddIcon
AddIcon指令允许你为一个文件指定一个图标,当显示服务器生成的目录列表时会显示这个图标。它的格式是:

AddIcon path pattern

path(路径)是图标文件的路径,这个路径必须相对于DocumentRoot指令给出的目录(例如,/icons/folder.png)。pattern(模式)可以是文件名、文件扩展名、通配符表达式,或下表描述的特殊形式:

选项 描述
^^DIRECTORY^^ 代表一个目录。
^^BLANKICON^^ 代表一个空行。
示例:使用AddIcon指令
AddIcon /icons/text.png .txt README
AddIconByType
AddIconByType允许为特定编码类型指定一个图标,当显示服务器生成的目录列表时会显示这个图标。它的格式是:

AddIconByEncoding path encoding

path(路径)是图标文件的路径,这个路径必须相对于DocumentRoot指令给出的目录(例如,/icons/compressed.png)。编码必须是有效的MIME编码,如x-compress、x-gzip等等。

示例:使用AddIconByType指令
AddIconByEncoding /icons/compressed.png x-compress x-gzip
AddIconByType
AddIconByType指令允许为特定媒体类型指定一个图标,当显示服务器生成的目录列表时会显示这个图标。它的格式是:

AddIconByType path content-type

path(路径)是图标文件的路径,这个路径必须相对于DocumentRoot指令给出的目录(例如,/icons/text.png)。content-type(内容类型)必须是一个有效的MIME类型(如text/html、image/png),或一个通配符表达式如text/*、image/*,等等。

示例:使用AddIconByType指令
AddIconByType /icons/video.png video/*
AddLanguage
AddLanguage指令允许把一个文件扩展名与特定的语言联系起来。它的格式如下:

AddLanguage language extension

language(语言)必须是有效的MIME语言如cs、en,或fr。extension(扩展名)是一个区分大小写的文件扩展名,通常以点打头(例如.cs)。

这个指令,对根据客户端的语言设置,提供多个语言内容的web服务器特别有用。

示例:使用AddLanguage指令
AddLanguage cs .cs .cz
AddType
AddType指令允许定义或覆盖特定文件扩展名的媒体类型。它的格式是:

AddType content-type extension

content-type(内容类型)必须是一个有效的MIME类型如text/html、image/png等等。extension(扩展名)是一个区分大小写的文件扩展名,通常以点打头(例如.cs)。

示例:使用AddType指令
AddType application/x-gzip .gz .tgz
Alias
Alias指令允许引用不在DocumentRoot指令指定目录中的,其他文件和目录。它的格式是:

Alias url-path real-path

url-path(url路径)必须相对于DocumentRoot指令给出的目录(例如,/images/)。real-path(真实路径)是本地文件系统上一个文件或目录的完整路径。

这个指令后通常跟随着Directory标签,为目标目录附加额外的访问权限。默认情况下会创建/icons/别名,以便/var/www/icon/目录中的图标能显示在服务器生成的目录列表中。

示例:使用Alias指令
Alias /icons/ /var/www/icons/

<Directory "/var/www/icons">
  Options Indexes MultiViews FollowSymLinks
  AllowOverride None
  Order allow,deny
  Allow from all
<Directory>
Allow
Allow指令允许指定哪一个客户端有访问某个给定目录的权限。它的格式是:

Allow from client

client(客户端)可以是域名、IP地址(完整的或部分的)、网络/掩码对,或代表所有客户端的all。

示例:使用Allow指令
Allow from 192.168.1.0/255.255.255.0
AllowOverride
AllowOverride指令允许指定.htaccess文件里允许哪些指令覆盖默认配置。它的格式是:

AllowOverride type

type(类型)必须是下表描述的可用分组选项中的一个:

Option Description
All .htaccess中允许使用所有指令覆盖早先的配置。
None 不允许在.htaccess中使用指令覆盖早先的配置。
AuthConfig 允许使用授权指令如AuthName, AuthType, or Require.
FileInfo 允许使用文件类型(file type)、元数据(metadata)、和mod_rewrite指令如DefaultType、RequestHeader,RewriteEngine,还有Action
Indexes 允许使用目录索引(directory indexing)指令,如AddDescriptionAddIcon,或FancyIndexing
Limit 允许使用主机访问(host access)指令,AllowDeny、和Order
Options[=option,…] 允许使用Options指令。此外,你还可以提供一个逗号(,)分隔的选项列表,限定哪些选项允许使用。
示例:使用AllowOverride指令
AllowOverride FileInfo AuthConfig Limit
BrowserMatch
BrowserMatch允许根据客户端web浏览器类型修改服务器行为。它的格式是:

BrowserMatch pattern variable

patter(模式)是一个正则表达式,用来匹配HTTP头的User-Agent区域。variable(变量)是一个环境变量,当头部区域与模式相匹配时设定。

这个指令默认用来拒绝有问题的浏览器进行连接,以及禁止浏览器(已知对这些行为有问题的浏览器)的keepalive(保持连接)和HTTP头冲刷(HTTP header flush)行为。

示例:使用BrowserMatch指令
BrowserMatch "Mozilla/2" nokeepalive
CacheDefaultExpire
CacheDefaultExpire选项允许设置一个文档缓存多久。此设置针对没有任何过期时间或没有指定上次修改时间的文档。它的格式是:

CacheDefaultExpire time

time(时间)单位是秒,默认值是3600(一小时)。

示例:使用CacheDefaultExpire指令
CacheDefaultExpire 3600
CacheDisable
CacheDisable指令允许禁止对一些URL缓存。它的格式是:

CacheDisable path

path(路径)必须相对于DocumentRoot指令给出的目录(例如,/files/)。

示例:使用CacheDisable指令
CacheDisable /temporary
CacheEnable
CacheEnable指令允许给URL指定一个缓存类型。它的格式是:

CacheEnable type url

type(类型)必须是下表中描述的有效类型。url可以是一个相对于DocumentRoot指令所给出目录的路径(例如,/images/),一个协议(例如ftp://),或一个外部URL如http://example.com/。

类型 描述
mem 基于内存的存储管理器。
disk 基于磁盘的存储管理器。
fd 文件描述符缓存。
示例:使用CacheEnable指令
CacheEnable disk /
CacheLastModifiedFactor
CacheLastModifiedFactor指令允许调整文档的缓存时间。针对没有指定任何过期时间,但提供了上次修改时间信息的文档。它的格式是:

CacheLastModifiedFactor number

number(数字)是一个系数,用来乘以文档自上次修改到现在经过的时间。默认值是0.1(十分之一)。

示例:使用CacheLastModifiedFactor指令
CacheLastModifiedFactor 0.1
CacheMaxExpire
CacheMaxExpire指定对文档进行缓存的最长时间。它的格式是:

CacheMaxExpire time

time(时间)单位是秒。默认值是86400(一天)。

示例:使用CacheMaxExpire指令
CacheMaxExpire 86400
CacheNegotiatedDocs
CacheNegotiatedDocs指定允许根据缓存内容协商文档。它的格式是:

CacheNegotiatedDocs option

option(选项)必须是下表描述的一个有效关键字。由于内容协商文档会随时间的变化或随请求者输入的不同产生改变,其默认选项是Off。

选项 描述
On 启用缓存内容协商文档。
Off 禁用缓存内容协商文档。
示例:使用CacheNegotiatedDocs指令
CacheNegotiatedDocs On
CacheRoot
CacheRoot指令允许指定存储缓存文件的目录。它的格式是:

CacheRoot directory

directory(目录)必须是存在于本地文件系统的一个完整路径。默认值是/var/cache/mod_proxy/。

示例:使用CacheRoot指令
CacheRoot /var/cache/mod_proxy
CustomLog
CustomLog指令允许指定日志文件名和日志文件格式。它的格式是:

CustomLog path format

path(路径)是日志文件的路径,必须相对于ServerRoot指令给出的目录(默认是/etc/httpd)。format(格式)或者是明确的格式字符串,或者是先前使用LogFormat指令定义的一个格式名。

示例:使用CustomLog指令
CustomLog logs/access_log combined
DefaultIcon
DefaultIcon指令允许指定一个图标,当服务端生成的目录列表中的文件没有与其相关联的图标时,显示这个图标。其格式是:

DefaultIcon path

path(路径)指向一个现有的图标文件。路径必须相对于DocumentRoot指令给出的目录(例如,/icons/unknow.png)。

示例:使用DefaultIcon指令
DefaultIcon /icons/unknown.png
DefaultType
DefaultType指令允许指定一个媒体类型,当服务器无法决定合适的MIME类型时,使用这个类型。它的格式是:

DefaultType content-type

content-type(内容类型)必须是一个有效的MIME类型,如text/html、image/png、application/pdf,等等。

示例:使用DefaultType指令
DefaultType text/plain
Deny
Deny指令允许指定某个客户端禁止访问给定的目录。它的格式是:

Deny from client

client(客户端)可以是域名、IP地址(完整或不完整)、网络/掩码对,或代表所有客户端的all。

示例:使用Deny指令
Deny from 192.168.1.1
DirectoryIndex
DirectoryIndex指令允许指定一个文档,当客户端请求一个目录时(URL以/结尾),会把这个文档提供给客户端。它的格式是:

DirectoryIndex filename

filename(文件名)是在被请求的目录中要查找的文件名。默认是index.html以及index.html.var。

示例:使用DirectoryIndex指令
DirectoryIndex index.html index.html.var
DocumentRoot
DocumentRoot指令允许指定服务器所提供内容的主目录。它的格式是:

DocumentRoot directory

directory(目录)必须是本地文件系统上某个目录的完整路径。默认选项是/var/www/html/。

示例:使用DocumentRoot指令
DocumentRoot /var/www/html
ErrorDocument
ErrorDocument指令允许指定显示的文档或显示的信息,作为对某特定的错误的回应。它的格式是:

ErrorDocument error-code action

error-code(错误代码)必须是有效的代码,比如403(禁止访问)、404(未找到),或500(服务器内部错误)。action(行为)可以是URL(本地或外部),或双引号(")括起来的消息字符串。

示例:使用ErrorDocument指令
ErrorDocument 403 "Access Denied"
ErrorDocument 404 /404-not_found.html
ErrorLog
ErrorLog指令允许指定记录服务器错误信息的文件。它的格式是:

ErrorLog path

path(路径)指向一个日志文件,可以是绝对路径,也可以是相对于ServerRoot指令所给出目录(默认是/etc/httpd/)的相对路径。默认值是logs/error_log。

示例:使用ErrorLog指令
ErrorLog logs/error_log
ExtendedStatus
ExtendedStatus指令允许启用详细的服务器状态信息。它的格式是:

ExtendedStatus option

option(选项)必须是下表所描述的有效关键字。默认选项是Off。

选项 描述
On 启用生成详细服务器信息。
Off 禁用生成详细服务器信息。
示例:使用ExtendedStatus指令
ExtendedStatus On
Group
Group指令允许指定httpd服务运行于哪个用户组。它的形式是:

Group group

group(组)必须是已存在的一个UNIX用户组。默认值是apache。

注意Group已不能再在<VirtualHost>中使用,SuexecUserGroup指令替换了它。

示例:使用Group指令
Group apache
HeaderName
HeaderName指令允许制定一个文件,其内容显示在服务器生成的目录列表起始处。它的格式是:

HeaderName filename

filename(文件名)是在所请求的目录中要查找的文件名。服务器默认查找HEADER.html。

示例:使用HeaderName指令
HeaderName HEADER.html
HostnameLookups
HostnameLookups指令允许启用IP地址自动解析。它的格式是:

HostnameLookups option

option(选项)必须是下表所描述的有效关键字。为节约服务器系统资源,默认值是Off。

选项 描述
On 允许为每个连接解析IP地址,这样可在日志中记录主机名。然而,这会显著增加处理负担。
Double 允许执行双反DNS查找(double-reverse DNS lookup)。与上一选项相比,这会增加更多处理负担。
Off 禁止为每个连接解析IP地址。
注意如果必须在日志中记录主机名,通常可以使用某个日志分析工具,用它们进行DNS查找更有效率。
示例:使用HostnameLookups指令
HostnameLookups Off
Include
Include指令允许包含其他配置文件。它的格式是:

Include filename

filename(文件名)可以是绝对路径,相对于ServerRoot指令所给出目录的相对路径,或一个通配符表达式。所有/etc/httpd/conf.d/目录中的配置文件默认都会加载。

示例:使用Include指令
Include conf.d/*.conf
IndexIgnore
IndexIgnore允许指定一个文件名的列表,在显示服务端生成的目录列表时,不会显示这些文件。它的格式是:

IndexIgnore filename

filename(文件名)选项可以是完整的文件名,或通配符表达式。

示例:使用IndexIgnore指令
IndexIgnore .??* *~ *# HEADER* README* RCS CVS *,v *,t
IndexOptions
IndexOptions指令允许调整服务端生成目录列表的行为。它的格式是:

IndexOptions option

option(选项)必须是下表所描述的有效关键字。默认选项有Charset=UTF-8,FancyIndexing,HTMLTable,NameWidth=*,以及VersionSort。

选项 描述
Charset=encoding 指定生成网页的字符集。encoding必须是有效的字符集,如UTF-8ISO-8859-2
Type=content-type 指定生成网页的媒体类型。content-type必须是有效的MIME类型,如text/htmltext/plain
DescriptionWidth=value 指定描述列的宽度。value可以是一些字符,或星号(*,表示自动调整宽度)。
FancyIndexing 允许高级功能,如给某些文件使用不同的图标,或点击列名重排目录列表的顺序。
FolderFirst 先列出目录,文件列在目录下面。
HTMLTable 使用HTML表格显示目录列表。
IconsAreLinks 把图标作为链接。
IconHeight=value 指定图标高度。value是表示像素的一个数字。
IconWidth=value 指定图标宽度。value是表示像素的一个数字。
IgnoreCase 允许以大小写敏感方式对文件和目录排序。
IgnoreClient 禁止接受客户端的质询变量(Disables accepting query variables from a client)。
NameWidth=value 指定文件名列的宽度。value 可以是一些字符串,或星号(*,表示自动调整宽度)。
ScanHTMLTitles 当未使用AddDescription指令提供描述信息时,允许分析文件作为描述(title元素)。
ShowForbidden 允许列出在其他情况下限制访问的文件。
SuppressColumnSorting 禁止点击列名重排目录列表。
SuppressDescription 禁止为文件描述保留空白。
SuppressHTMLPreamble 当存在使用HeaderName指令指定的文件时,禁止使用标准HTML前言(preamble)。
SuppressIcon 禁止在目录列表使用图标。
SuppressLastModified 禁止在目录列表显示最后修改时间。
SuppressRules 禁止在目录列表使用水平线。
SuppressSize 禁止在目录列表显示文件大小。
TrackModified 允许在HTTP头部返回Last-ModifiedETag值。
VersionSort 允许包含版本号的文件按预期方式排序(意思应该是按版本号排序——译者注)。
XHTML 允许使用XHTML 1.0,代替默认的HTML 3.2。
示例:使用IndexOptions指令
IndexOptions FancyIndexing VersionSort NameWidth=* HTMLTable Charset=UTF-8
KeepAlive
KeepAlive指令允许启用持久连接。它的格式是:

KeepAlive option

option(选项)必须是下表中描述的有效关键字。默认值是Off。

选项 描述
On 允许持久连接。在这种情况下,每个连接服务器都要接受一个以上请求。
Off 禁止keep-alive连接。

注意当持久连接启用后,在一个忙碌的服务器上,子进程的数量会迅速增加,最终达到最大限制,显著拖慢服务器。为降低风险,推荐把KeepAliveTimeout设置为一个比较低的数值,并小心监视/var/log/httpd/logs/error_log。

示例:使用KeepAlive指令
KeepAlive Off
KeepAliveTimeout
KeepAliveTimeout指令允许指定关闭一个连接前,需要等待另一个请求多长时间。它的格式是:

KeepAliveTimeout time

time(时间)单位是秒,默认值15。

示例:使用KeepAliveTimeout指令
KeepAliveTimeout 15
LanguagePriority
LanguagePriority指令允许调整语言的优先级。它的格式是:

LanguagePriority language

language(语言)必须是有效的MIME语言,如cs、en,或fr。

这一指令对根据客户端语言设置提供多种语言内容的web服务器特别有用。

示例:使用LanguagePriority指令
LanguagePriority sk cs en
Listen
Listen指令允许指定监听的IP地址或端口。它的格式是:

Listen [ip-address:]port [protocol]

ip-address(IP地址)是可选的,除非指定,服务器会从port(端口)接收所有IP的传入请求。由于protocol(协议)是根据端口号自动决定的,通常可省略。默认是监听80端口。

注意如果服务器设置为监听小于1024的端口,只有超级用户才能运行httpd服务。

示例:使用Listen指令
Listen 80
LoadModule
LoadModule指令允许加载动态共享目标(DSO,Dynamic Shared Object)模块。它的格式是:

LoadModule name path

name(名称)必须是所加载模块的有效标识符。path(路径)指向一个已存在的模块文件,必须相对于存放库文件的目录(默认情况下,32位系统是/usr/lib/httpd/,64位系统是/usr/lib64/httpd/)。

参考6 使用模块获取Apache HTTP服务器DSO支持的更多信息。

示例:使用LoadModule指令
LoadModule php5_module modules/libphp5.so
LogFormat
LogFormat指令允许指定日志文件格式。它的格式是:

LogFormat format name

format(格式)是一个字符串,包括下表所描述的选项。name(名称)可用在CustomLog指令中,代替格式字符串。

选项 描述
%b 代表回应(response)的大小,单位字节。
%h 代表客户端IP地址或主机名。
%l Represents the remote log name if supplied. If not, a hyphen (that is, -) is used instead.
%r Represents the first line of the request string as it came from the browser or client.
%s Represents the status code.
%t Represents the date and time of the request.
%u If the authentication is required, it represents the remote user. If not, a hyphen (that is, -) is used instead.
%{field} Represents the content of the HTTP header field. The common options include %{Referer} (the URL of the web page that referred the client to the server) and %{User-Agent} (the type of the web browser making the request).
示例:使用LogFormat指令
LogFormat "%h %l %u %t \"%r\" %>s %b" common
LogLevel
LogLevel指令允许调整错误日志的详细程度。它的格式是:

LogLevel option

option(选项)必须是下表所描述的有效关键字。默认值是warn。

选项 描述
emerg 只有服务器不能执行其工作的紧急状况会被记录。
alert 所有需要立即做出操作的状况会被记录。
crit 所有关键情形会被记录。
error 所有错误信息会被记录。
warn 所有警告信息会被记录。
notice 更为普通,但仍然重要的情形会被记录。
info 各种信息性消息会被记录。
debug 各种调试消息会被记录。
示例:使用LogLevel指令
LogLevel warn
MaxKeepAliveRequests
MaxKeepAliveRequests指令允许为一个持久连接指定最大请求数量。它的格式是:

MaxKeepAliveRequests number

比较高的number(数字)可以改进服务器的性能。注意使用0允许无限数量的请求。默认值是100。

示例:使用MaxKeepAliveRequests指令
MaxKeepAliveRequests 100
NameVirtualHost
NameVirtualHost指令允许为基于名称的虚拟主机指定IP地址和端口号。它的格式是:

NameVirtualHost ip-address[:port]

ip-address(IP地址)可以是完整的IP地址,或星号(*),代表所有接口。注意IPv6地址必须括在方括号([和])内。port(端口)是可选的。

基于名称的虚拟主机允许一个Apache HTTP服务器为多个域名提供网站,而不需要使用多个IP地址。

使用安全HTTP连接:基于名称的虚拟主机只能用于不安全的HTTP连接。在安全服务器上请使用基于IP的虚拟主机。

示例:使用NameVirtualHost指令
NameVirtualHost *:80
Options
Options指令允许指定在某个特定目录下哪些服务器特性是可用的。它的格式是:

Options option

option(选项)必须是下表所描述的有效关键字。

选项 描述
ExecCGI 允许执行CGI脚本。
FollowSymLinks 允许跟随(follow)目录下的符号链接。
Includes 允许服务器端包含。
IncludesNOEXEC 允许服务器端包含,但不允许执行命令。
Indexes 允许服务器生成的目录列表。
MultiViews 允许内容协商的“多视图(MultiViews)”。
SymLinksIfOwnerMatch 当符号连接和其指向的目标是同一个所有者时,允许跟随目录下的符号链接。
All 允许上述所有特性(除MultiViews之外)。
None 禁止上述所有特性。
示例:使用Options指令
Options Indexes FollowSymLinks
Order
Order指令允许指定Allow和Deny指令的计算顺序。它的格式是:

Order option

option(选项)必须是下表所描述的有效关键字。默认值是allow, deny。

选项 描述
allow,deny 先计算Allow指令。
deny,allow 先计算Deny指令。
示例:使用Order指令
Order allow,deny
PidFile
PidFile指令允许指定存储服务器进程ID(PID,process ID)的文件。它的格式是:

PidFile path

path(路径)指向一个pid文件。这个路径可以是绝对路径,或ServerRoot指令所指定目录(默认是/etc/httpd/)的相对路径。默认值是run/httpd.pid。

示例:使用PidFile指令
PidFile run/httpd.pid
ProxyRequests
ProxyRequests指令允许启用转发(forward)代理请求。它的格式是:

ProxyRequests option

option(选项)必须是下表所描述的有效关键字。默认值Off。

选项 描述
On 允许转发代理请求。
Off 禁止转发代理请求。
示例:使用ProxyRequests指令
ProxyRequests On
ReadmeName
ReadmeName指令允许指定一个文件,会被附加在服务器生成的目录列表结尾。它的格式是:

ReadmeName filename

filename(文件名)是在被请求目录下查找的文件名称。服务器默认查找README.html。

示例:使用ReadmeName指令
ReadmeName README.html
Redirect
Redirect指令允许把客户端重定向到其他URL。它的格式是:

Redirect [status] path url

status(状态)是可选的,如果提供,必须是下表所描述的有效关键字。path(路径)指向旧的位置,必须相对于DocumentRoot指令所给出目录(例如/docs)。url指向内容的当前位置(例如,http://docs.example.com)。

状态 描述
permanent 指出被请求的资源已经永久转移。301(永久转移)状态代码会返回给客户端。
temp 指出被请求的资源只是临时转移。302(找到)状态代码会返回给客户端。
seeother 指出被请求的资源已被替换。303(看其他的)状态代码会返回给客户端。
gone 指出被请求的资源已经永久移除。410(永久移除)状态代码会返回给客户端。

注意,要使用更高级的重定向技术,可以使用mod_rewrite模块(随Apache HTTP服务器安装)。

示例:使用Redirect指令
Redirect permanent /docs http://docs.example.com
ScriptAlias
ScriptAlias指令允许指定CGI脚本的位置。它的格式是:

ScriptAlias url-path real-path

url-path(url路径)必须相对于DocumentRoot指令所指定的目录(例如,/cgi-bin/)。real-path(真实路径)是本地文件系统上一个文件或目录的完整路径。

这一指令之后通常跟随一个Directory标签,为目标目录添加额外的访问许可。默认会创建/cgi-bin/,这样/var/www/cgi-bin/目录内的脚本便可以访问。

ScriptAlias指令由于安全原因使用,它阻止CGI脚本被当作普通文本文档查看。

示例:使用ScriptAlias指令
ScriptAlias /cgi-bin/ /var/www/cgi-bin/

<Directory "/var/www/cgi-bin">
  AllowOverride None
  Options None
  Order allow,deny
  Allow from all
</Directory>
ServerAdmin
ServerAdmin指令允许指定服务器管理员的邮箱地址,这一地址会显示在服务器生成的目录列表中。它的格式是:

ServerAdmin email

默认值是root@localhost。

这一指令通常设置为webmaster@hostname。hostname是服务器地址。一旦设置,在/etc/aliases文件中把对web服务器负有责任的人的别名设置为webmaster,并以超级管理员身份,执行newaliases命令。

示例:使用ServerAdmin指令
ServerAdmin webmaster@penguin.example.com
ServerName
ServerName指令允许指定web服务器的主机名和端口号。它的格式是:

ServerName hostname[:port]

hostname(主机名)必须是服务器的完整域名(FQDN,fully qualified domain name)。port(端口)是可选的,如果提供,必须与Listen指令指定的端口号相匹配。

如果使用了这个指令,请确定IP地址和主机名对包含在/etc/hosts文件里。

示例:使用ServerName指令
ServerName penguin.example.com:80
ServerRoot
ServerRoot指令允许指定服务器操作(operate)目录。它的格式是:

ServerRoot directory

directory(目录)必须是本地文件系统某目录的完整路径。默认值是/etc/httpd/。

示例:使用ServerRoot指令
ServerRoot /etc/httpd
ServerSignature
ServerSignature指令允许在服务器生成的文档中显示服务器信息。它的格式是:

ServerSignature option

option(选项)必须是下表中描述的有效的关键字。默认值是On。

选项 描述
On 允许在服务器生成的页面上附加服务器名和版本。
Off 禁止在服务器生成的页面上附加服务器名和版本。
EMail 允许在服务器生成的页面上附加服务器名、版本,以及使用ServerAdmin指令指定的系统管理员的电子邮箱。
示例:使用ServerSignature指令
ServerSignature On
ServerTokens
ServerTokens指令允许调整何种信息会被包含在服务器回应的头中(server response header)。它的格式是:

ServerTokens option

option(选项)必须是下表描述的有效关键字。默认值是OS。

选项 描述
Prod 只包含产品名( 也就是Apache)。
Major 包含产品名和服务器主版本号(major version,例如2)。
Minor 包含产品名和服务器辅版本号(minor version,例如2.2)。
Min 包含产品名和服务器最小版本号(minimal version,例如2.2.15)。
OS 包含产品名、服务器最小版本号,以及服务器当前运行的操作系统类型(例如Red Hat)。
Full 包含上述所有信息,以及已加载模块列表。
示例:使用ServerTokens指令
ServerTokens Prod
SuexecUserGroup
SuexecUserGroup指令允许指定运行CGI脚本的用户及用户组。它的格式是:

SuexecUserGroup user group

user(用户)必须是一个已存在的用户,group(组)必须是有效的UNIX组。

由于安全原因,CGI脚本不应以root权限运行。注意在<VirtualHost>中,SuexecUserGroup代替了User和Group指令。

示例:使用SuexecUserGroup指令
SuexecUserGroup apache apache
Timeout
Timeout指令允许指定在关闭一个连接前,需要等待一个事件多久。它的格式是:

Timeout time

time(时间)单位秒,默认值60。

示例:使用Timeout指令
Timeout 60
TypesConfig
TypesConfig指令允许指定MIME类型配置文件的位置。它的格式是:

TypesConfig path

path(路径)指向一个已存在的MIME类型配置文件,可以是绝对路径,或相对于ServerRoot指令指定目录(默认是/etc/httpd/)的相对路径。默认值是/etc/mime.types。

注意,在为Apache HTTP服务器添加MIME类型映射的时候,推荐使用AddType指令,而不是编辑/etc/mime.types。

示例:使用TypesConfig指令
TypesConfig /etc/mime.types
UseCanonicalName
UseCanonicalName允许指定服务器提到它自己(refer to itself)的方式。它的格式是:

UseCanonicalName option

option(选项)必须是下表描述的有效关键字。默认值是Off。

选项 描述
On 允许使用ServerName指令指定的名称。
Off 禁止使用ServerName指令指定的名称,代之以客户端请求所提供的主机名和端口号。
DNS 禁止使用ServerName指令指定的名称,代之以用反向DNS解析(reverse DNS lookup)出的主机名。
示例:使用UseCanonicalName指令
UseCanonicalName Off
User
User指令允许指定允许httpd服务的用户。它的格式是:

User user

user(用户)必须是已存在的UNIX用户。默认值是apache。

由于安全原因,httpd服务不应运行于root权限。注意<VirtualHost>中不再支持使用User指令,可用SuexecUserGroup代替。

示例:使用User指令
User apache
UserDir
UserDir指令允许在用户家目录提供网站内容。它的格式是:

UserDir option

option(选项)可以是要在用户家目录查找的目录名(通常是public_html),或下表所描述的有效关键字。默认值是disabled。

选项 描述
enabled user 允许给定的用户在家目录提供网站内容。
disabled [user] 不允许在用户家目录提供网站内容,可以禁止所有用户;如果给出了空格隔开的用户列表,则只禁止给定的用户。

设置正确的权限:为了让web服务器访问内容,相应目录和文件的权限必须正确设置。要确保所有用户都能访问家目录,并且可访问及读取UserDir指令所指定目录中的内容。例如,为了允许访问用户joe家目录中的public_html/目录,在终端以root用户运行下面命令:

~]# chmod a+x /home/joe/
~]# chmod a+rx /home/joe/public_html/
示例:使用UserDir指令
UserDir public_html

5.2 常见ssl.conf指令

安全套接层(SSL,Secure Socketss Layer)指令允许调整Apache HTTP安全服务器的行为。在大多数情况下,安装过程中它们就已被适当地设置了。调整这些选项必须小心,因为错误的配置可使安全性变得脆弱。

下述指令在/etc/httpd/conf.d/ssl.conf较常用:

SetEnvIf
SetEnvIf指令允许根据接入连接的头部(header)设置环境变量。它的格式是:

SetEnvIf option pattern [!]variable[=value]…

option(选项)可以是HTTP头部区域、先前定义的环境变量名,或下表描述的有效关键字。pattern(样式)是一个正则表达式。variable(变量)是一个环境变量,当选项与样式相匹配时,设置此环境变量。如果可选的叹号(!)存在,把环境变量移除,而不是设置。

选项 描述
Remote_Host 查阅(refer to)客户端主机名。
Remote_Addr 查阅客户端IP地址。
Server_Addr 查阅服务器主机名。
Request_Method 查阅请求方式(例如GET)。
Request_Protocol 查阅协议名和版本号(例如,HTTP/1.1)。
Request_URI 查阅请求的资源。

SetEnvIf指令用于禁用HTTP保持连接(keepalive),还有允许SSL不需要从客户端浏览器收到关闭通知就关闭连接。对于不能可靠关闭SSL连接的浏览器,这是必要的。

示例:使用SetEnvIf指令
SetEnvIf User-Agent ".*MSIE.*" \
         nokeepalive ssl-unclean-shutdown \
         downgrade-1.0 force-response-1.0

注意安装了mod_ssl才会有/etc/httpd/conf.d/ssl.conf。参考8 建立一个SSL服务器,获取安装及设置SSL服务器的更多信息。

5.3 常见多处理模块指令

多处理模块(MPM,Multi-Processing Module)指令允许调整针对MPM的特定服务器池(server-pool)的行为。由于不同MPM的特征会有差别,指令内嵌于IfModule中。默认情况下,服务器池为prefork MPM和worker MPM所设置。

下述MPM指令常用于/etc/httpd/conf/httpd.conf:

MaxClients
MaxClients指令允许指定同一时间需要处理的同时连接客户端的最大数量。它的格式是:

MaxClients number

更高的number(数值)可以改进服务器性能,然而不建议在使用prefork MPM时超过256。

示例:使用MaxClients指令
MaxClients 256
MaxRequestsPerChild
MaxRequestsPerChild指令允许指定在子进程死亡前,可以处理的客户端请求的最大值。它的格式是:

MaxRequestsPerChild number

把number(数值)设置为0,允许无限数量的请求。

MaxRequestsPerChild指令用于阻止长时间存活的进程产生内存泄漏。

示例:使用MaxRequestsPerChild指令
MaxRequestsPerChild 4000
MaxSpareServers
MaxSpareServers指令允许指定空闲子进程的最大数量。它的格式是:

MaxSpareServers number

这一指令仅用于prefork MPM。

示例:使用MaxSpareServers指令
MaxSpareServers 20
MaxSpareThreads
MaxSpareThreads指令允许指定空闲服务器线程的最大数量。它的格式是:

MaxSpareThreads number

number(数字)必须大于或等于MinSpareThreads和ThreadsPerChild之和。这一指令仅用于worker MPM。

示例:使用MaxSpareThreads指令
MaxSpareThreads 75
MinSpareServers
MinSpareServers指令允许指定空闲子进程的最小数量。它的格式是:

MinSpareServers number

注意高number(数值)会产生很重的服务器处理负载。这一指令仅用于prefork MPM。

示例:使用MinSpareServers指令
MinSpareServers 5
MinSpareThreads
MinSpareThreads指令允许指定空闲服务器线程的最小数量。它的格式是:

MinSpareThreads number

这一指令只用于worker MPM。

示例:使用MinSpareThreads指令
MinSpareThreads 75
StartServers
StartServers指令允许指定在服务开始运行时创建多少子进程。它的格式是:

StartServers number

由于子进程是根据当前通信量负载动态创建及终止,通常没必要更改此数值。

示例:使用StartServers指令
StartServers 8
ThreadsPerChild
ThreadsPerChild指令允许指定一个子进程可以创建的线程数量。它的格式是:

ThreadsPerChild number

这一指令仅用于work MPM。

示例:使用ThreadsPerChild指令
ThreadsPerChild 25

6 使用模块

作为一个模块化应用程序,httpd服务自带有许多动态共享对象(DSO,Dynamic Shared Objects),它们可根据需要在运行时被动态加载或卸下。这些模块默认存放在/usr/lib/httpd/modules(32位系统)和/usr/lib64/httpd/modules/(64位系统。

6.1 加载一个模块

要加载一个DSO模块,使用5.1 常见httpd.conf指令所描述的LoadModule指令。注意单独的软件包所提供的模块通常在/etc/httpd/conf.d/目录有自己的配置文件。

LoadModule ssl_module modules/mod_ssl.so

设置好以后,重启web服务器以便重新加载配置文件。参考4.3 重启服务获取重启httpd服务的更多信息。

6.2 写一个模块

如果打算创建一个新的DSO模块,请确认安装了httpd-devel软件包。root用户在终端使用下面命令进行安装:

yum install httpd-devel

这一软件包包括包含文件(include file)、头文件,以及编译一个模块需要的APache eXtenSion(apxs)工具。

模块写好后,可使用下面命令构建:

apxs -i -a -c module_name.c

如果构建成功,可以使用加载Apache HTTP服务器自带其他模块的方式加载它。

7 设置虚拟主机

Apache HTTP服务器内建的虚拟主机允许服务器根据客户端请求的IP地址、主机名,或端口号提供不同信息。

要建立基于名称的虚拟主机,在/etc/httpd/conf/httpd.conf找到虚拟主机容器,把它作为一个例子,移除每行前面的井号(#),根据你的要求调整其设置:

NameVirtualHost penguin.example.com:80

<VirtualHost penguin.example.com:80>
    ServerAdmin webmaster@penguin.example.com
    DocumentRoot /www/docs/penguin.example.com
    ServerName penguin.example.com:80
    ErrorLog logs/penguin.example.com-error_log
    CustomLog logs/penguin.example.com-access_log common
</VirtualHost>

注意ServerName必须是分配给机器的一个有效的DNS名称。<VirtualHost>容器具有高定制性,可以接受服务器主配置文件中绝大多数指令。这一容器不支持的指令包括User和Group,它们已被SuexecUserGruop取代。

更改端口号:如果设置虚拟主机监听非默认端口,请在/etc/httpd/conf/httpd.conf全局设置部分相应更新Listen指令

8 建立一个SSL服务器

安全套接层(SSL,Secure Sockets Layer)是一个加密协议,允许客户端和服务器安全通信。对其进行了扩展和改进的版本称为传输层安全(TLS,Transport Layer Security),它们一起保证了隐私和数据完整。Apache HTTP服务器结合mod_SSL(使用OpenSSL工具集提供SSL/TLS支持),通常被称为SSL服务器。

常规HTTP连接能被任何可对其进行拦截的人读取甚至修改,使用mod_ssl可阻止对传输内容的检视或修改。本节提供在Apache HTTP服务器配置中启用这一模块的基本信息,并且指导你生成私钥及自签名证书。

8.1 证书和安全概览

安全通信基于密钥的使用。在传统或对称加密(symmetric cryptography)中,通信双方都拥有并使用相同的密钥,可对每一方的传输进行解密。在公共或非对称加密(asymmetric cryptography)中,两个密钥共同存在:一个私钥保守秘密,一个公钥通常公开分享。公钥加密的数据只能由私钥解密,私钥加密的数据只能由公钥解密。

为了使用SSL提供安全通信,SSL服务器必须使用由证书授权机构(CA,Certificate Authority)签名的数字证书。证书列出了服务器的诸多属性(包括主机名、公司名、位置等等),签名使用CA的私钥产生。这一签名确保某一证书授权机构发行了证书,且证书未被修改。

当web浏览器创建新的SSL连接时,会检查服务器提供的证书。如果证书不包含某一可信CA的签名,或证书列出的主机名与建立连接的主机名不匹配,浏览器会拒绝与服务器通信,并且通常给用户显示适当的错误提示信息。

大多数浏览器默认设置为相信一组广泛使用的证书授权机构。因此,设置安全服务器时应该选择合适的CA,这样目标用户即可信任此连接。否则他们会看到错误信息,并需要手动接受证书。由于鼓励用户手动接受数字证书以避免错误会使得攻击者可拦截通信,你应尽可能使用可信的CA。更多信息请查看下表,常见浏览器的CA列表:

Web浏览器 连接
Mozilla Firefox Mozilla root CA list.
Opera The Opera Rootstore.
Internet Explorer Windows root certificate program members.

设置一个SSL服务器时,需要生成一个证书请求和一个私钥,然后把证书请求、公司身份证明,以及费用,发给一个证书授权机构。当CA核实了证书请求和你的身份后,会发给你一个签名的证书,你可以把它用在服务器上。作为另一种选择,你可以创建一个自签名证书,它不包含CA签名,因此只应该用于测试目的。

8.2 启用mod_ssl模块

如果你打算建立一台SSL服务器,需要安装mod_ssl(mod_ssl模块)和openssl(OpenSSL工具集)软件包。使用root账户通过以下命令进行安装:

yum install mod_ssl openssl

这将会创建mod_ssl的配置文件/etc/httpd/conf.d/ssl.conf(默认包含在主Apache HTTP服务器配置文件中)。为加载此模块,按4.3 重启服务的说明,重启httpd服务。

8.3 使用现有密钥和证书

如果你以前创建了密钥和证书,可以不生成新的,让SSL服务器使用它们。在两种情况下这是不可行的:

  1. 你改变了IP地址或域名。
    证书是为特定IP地址和域名的组合发行的。如果其中的某一个值产生改变,证书会失效。
  2. 你有一个VeriSign的证书,但你更换了服务器软件。
    VeriSign是一个广泛使用的证书机构,他们为特定的软件产品、IP地址,以及域名发行证书。改变软件产品使得证书失效。

不管是上述两种情况的哪一种,你都需要获取一个新证书。更多信息参考8.4 生成新密钥和证书

如果想使用现有的密钥和证书,把相应文件放到/etc/pki/tls/private/和/etc/pki/tls/certs/目录。可以用root用户运行命令进行操作:

mv key_file.key /etc/pki/tls/private/hostname.key
mv certificate.crt /etc/pki/tls/certs/hostname.crt

然后把下面几行内容添加到/etc/httpd/conf.d/ssl.conf文件中:

SSLCertificateFile /etc/pki/tls/certs/hostname.crt
SSLCertificateKeyFile /etc/pki/tls/private/hostname.key

要加载更新后的配置文件,按4.3 重启服务的说明,重启httpd服务。

示例:使用Red Hat安全Web服务器的密钥和证书。

~]# mv /etc/httpd/conf/httpsd.key /etc/pki/tls/private/penguin.example.com.key
~]# mv /etc/httpd/conf/httpsd.crt /etc/pki/tls/certs/penguin.example.com.crt

8.4 生成新密钥和证书

为了生成一对新的密钥和证书,系统必须安装有crypto-utils软件包。以root用户身份运行下面命令进行安装:

yum install crypto-utils

这个软件包提供生成和 管理SSL证书及私钥的一套工具。其中包括genkey,Red Hat密钥生成工具,引导你走过生成密钥的过程。

替换已有的证书。如果服务器已经有了有效的证书,但你要用新的替换它,指定一个不同的序列号。这确保客户端浏览器会收到改变的通知,按预期方式更新新的证书,并且不会导致页面访问失败。使用定制序列号创建新证书,以root身份,运行下面命令(不使用genkey):

openssl req -x509 -new -set_serial number -key hostname.key -out hostname.crt

移除先前创建的密钥。如果已经有了为系统特定主机名创建的key文件,genkey会拒绝运行。在这个情况下,用root用户身份运行下面命令移除已存在的文件:

rm /etc/pki/tls/private/hostname.key

要运行这一工具,以root身份,执行genkey命令,其后给出合适的主机名(例如penguin.example.com):

genkey hostname

要完成密钥和证书的创建,执行下面步骤:

  1. 确认密钥和证书的存储目录。
    apache-mod_ssl-genkey-01
    使用Tab键选择Next按钮,按Enter键进入下一屏幕。
  2. 使用上下方向键选择合适的密钥大小。注意尽管大密钥增加了安全性,但也增加了服务器的反应时间。因此,建议选择1024 bits。
    apache-mod_ssl-genkey-02
    设置好后,使用Tab键选择Next按钮,按Enter键初始化随机比特的生成过程。取决于所选择密钥的大小,这可能要花些时间。
  3. 决定是否希望发送一个证书请求给证书授权机构。
    apache-mod_ssl-genkey-03
    用Tab键选择Yes构建一个证书请求,选择No生成一个自签名证书,按Enter键确认你的选择。
  4. 用空格键启用([*])或禁用([ ])私钥加密。
    apache-mod_ssl-genkey-04
    使用Tab键选择Next按钮,按Enter键进入下一屏幕。
  5. 如果启用了私钥加密,输入相应的密码。注意由于安全原因,输入时屏幕不会有显示。密码长度至少需要5个字符。
    apache-mod_ssl-genkey-05
    使用Tab键选择Next按钮,按Enter键进入下一屏幕。
    不要忘记密码。输入正确的密码后服务器才能启动。如果忘记密码,你需要生成一个新的密钥和证书。
  6. 调整证书细节信息。
    apache-mod_ssl-genkey-06
    使用Tab键选择Next按钮,按Enter键结束密钥的生成。
  7. 如果先前选择了生成证书请求,这里会提示把它发给证书授权机构。
    apache-mod_ssl-genkey-07
    按Enter键返回命令提示符。

密钥和证书生成后,把它们的位置添加到/etc/httpd/conf.d/ssl.conf文件中:

SSLCertificateFile /etc/pki/tls/certs/hostname.crt
SSLCertificateKeyFile /etc/pki/tls/private/hostname.key

最后,按4.3 重启服务的说明,重启httpd服务,以便加载修改后的配置文件。

9 其他资源

获取Apache HTTP服务器的更多信息,参考下面资源。

9.1 已安装文档

http://localhost/manual/
Apache HTTP服务器的官方文档,包含指令和可用模块的完整描述。注意要安装httpd-manual软件包,并且正在运行web服务器,才能访问这一文档。
man httpd
httpd服务的手册页,包含它命令行选项的完整列表。
man genkey
genkey的手册月,包含其使用方法的完整文档。

9.2 有用的网站

http://httpd.apache.org/
Apache HTTP服务器的官方网站,里面有其所有指令和默认模块的文档。
http://www.modssl.org/
mod_ssl模块的官方网站。
http://www.openssl.org/
OpenSSL的主页,包含更深入的文档、常见问题回答、邮件列表链接,以及其它有用资源。

点击量:35