30.7. Apache HTTP 服务器

Contributed by Murray Stokely.

30.7.1. 纵览

FreeBSD 被用于运行许多全球最为繁忙的 web 站点。 大多数 Internet 上的 web 服务器, 都使用 Apache HTTP 服务器Apache 软件包可以在您的 FreeBSD 安装盘上找到。 如果没有在首次安装时附带安装 Apache, 则可以通过 www/apache13www/apache22 port 来安装。

一旦成功地安装了 Apache, 就必须对其进行配置。

注意:

这一节介绍了 1.3.X 版本的 Apache HTTP 服务器 的配置, 因为它是随 FreeBSD 一同使用的最多的版本。 Apache 2.X 引入了很多新技术, 但在此并不讨论。 要了解关于 Apache 2.X 的更多资料, 请参见 http://httpd.apache.org/

30.7.2. 配置

主要的 Apache HTTP Server 配置文件, 在 FreeBSD 上会安装为 /usr/local/etc/apache/httpd.conf。 这是一个典型的 UNIX® 文本配置文件, 它使用 # 作为注释符。 关于全部配置选项的详尽介绍超出了本书的范围, 这里将只介绍最常被修改的那些。

ServerRoot "/usr/local"

这指定了 Apache 安装的顶级目录。 执行文件被放到服务器根目录 (server root) 的 binsbin 子目录中, 而配置文件则位于 etc/apache

ServerAdmin [email protected]

这个地址是在服务器发生问题时应发送电子邮件的地址, 它会出现在服务器生成的页面上, 例如错误页面。

ServerName www.example.com

ServerName 允许您配置发送回客户端的主机名, 如果您的服务器被用户以别的名字访问 (例如, 使用 www 而不是主机本身的真实名字)。

DocumentRoot "/usr/local/www/data"

DocumentRoot: 这个目录是您的文档所在的目录。 默认情况下, 所有的请求都会从这个位置去获取, 但也可以通过符号连接和别名指定其它的位置。

在修改配置之前备份 Apache 的配置文件永远是一个好习惯。 一旦对初始配置满意了, 就可以开始运行 Apache 了。

30.7.3. 运行 Apache

与许多其它网络服务不同, Apache 并不依赖 inetd 超级服务器来运行。 一般情况下会把它配置为一个独立的服务器, 以期在客户的 web 浏览器连入 HTTP 请求时, 能够获得更好的性能。 它提供了一个 shell 脚本来使启动、 停止和重新启动服务器变得尽可能地简单。 首次启动 Apache, 只需执行:

# /usr/local/sbin/apachectl start

可以在任何时候使用下面的命令来停止服务:

# /usr/local/sbin/apachectl stop

当由于某种原因修改了配置文件之后, 需要重启服务器:

# /usr/local/sbin/apachectl restart

要在重启 Apache 服务器时不中断当前的连接, 则应运行:

# /usr/local/sbin/apachectl graceful

更多的信息, 可以在 apachectl(8) 联机手册中找到。

要在系统启动时启动 Apache, 则应在 /etc/rc.conf 中加入:

apache_enable="YES"

或者对于Apache 2.2:

apache22_enable="YES"

如果您希望在系统引导时启动 Apache httpd 程序并指定其它一些选项, 则可以把下面的行加到 rc.conf

apache_flags=""

现在 web 服务器就开始运行了, 您可以使用 web 浏览器打开 http://localhost/。 默认显示的 web 页面是 /usr/local/www/data/index.html

30.7.4. 虚拟主机

Apache 支持两种不同类型的虚拟主机。 第一种方法是基于名字的虚拟主机。 基于名字的虚拟主机使用客户机发来的 HTTP/1.1 头来辨别主机名。 这使得不同的域得以共享同一个 IP 地址。

要配置 Apache 来使用基于名字的虚拟主机, 需要把类似下面的项加到您的 httpd.conf 中:

NameVirtualHost *

如果您的 web 服务器的名字是 www.domain.tld, 而您希望建立一个 www.someotherdomain.tld 的虚拟域, 则应在 httpd.conf 中加入:

<VirtualHost *>
ServerName www.domain.tld
DocumentRoot /www/domain.tld
</VirtualHost>

<VirtualHost *>
ServerName www.someotherdomain.tld
DocumentRoot /www/someotherdomain.tld
</VirtualHost>

您需要把上面的地址和文档路径改为所使用的那些。

要了解关于虚拟主机的更多信息, 请参考官方的 Apache 文档, 这些文档可以在 http://httpd.apache.org/docs/vhosts/ 找到。

30.7.5. Apache 模块

有许多不同的 Apache 模块, 它们可以在基本的服务器基础上提供许多附加的功能。 FreeBSD 的 Ports Collection 为安装 Apache 和常用的附加模块提供了非常方便的方法。

30.7.5.1. mod_ssl

mod_ssl 这个模块使用 OpenSSL 库, 来提供通过 安全套接字层 (SSL v2/v3) 和 传输层安全 (TLS v1) 协议的强加密能力。 这个模块提供了从某一受信的证书签署机构申请签名证书所需的所有工具, 您可以藉此在 FreeBSD 上运行安全的 web 服务器。

如果您未曾安装 Apache, 也可以直接安装一份包含了 mod_ssl 的版本的 Apache 1.3.X, 其方法是通过 www/apache13-modssl port 来进行。 SSL 支持已经作为 Apache 2.X 的一部分提供, 您可以通过 www/apache22 port 来安装后者。

30.7.5.2. 语言绑定

Apache对于一些主要的脚本语言都有相应的模块。 这些模块使得完全使用某种脚本语言来写 Apache 模块成为可能。 他们通常也被嵌入到服务器作为一个常驻内存的解释器, 以避免启动一个外部解释器对于下一节将描述的动态网站所需时间和资源上的开销。

30.7.6. 动态网站

在过去的十年里,越来越多的企业为了增加收益和暴光率而转向了互联网。 这也同时增进了对于互动网页内容的需求。有些公司,比如 Microsoft® 推出了基于他们专有产品的解决方案,开源社区也做出了积极的回应。 比较时尚的选择包括 Django,Ruby on Rails, mod_perl, and mod_php.

30.7.6.1. Django

Django 是一个以 BSD 许可证发布的 framework, 能让开发者快速写出高性能高品质的 web 应用程序。 它提供给一个对象关系映射组件,数据类型可以被当 Python 中的对象,和一组丰富的动态数据库访问 API, 使开发者避免了写 SQL 语句。它同时还提供了可扩展的模板系统, 让应用程序的逻辑部分与 HTML 的表现层分离。

Django 依赖与 mod_pythonApache, 和一个可选的 SQL 数据库引擎。 在设置了一些恰当的标志后,FreeBSD 的 Port 系统将会帮助你安装这些必需的依赖库。

例 30.3. 安装 Django,Apache2, mod_python3,和 PostgreSQL
# cd /usr/ports/www/py-django; make all install clean -DWITH_MOD_PYTHON3 -DWITH_POSTGRESQL

在安装了 Django 和那些依赖的软件之后, 你需要创建一个 Django 项目的目录,然后配置 Apache,当有对于你网站上应用程序的某些指定的 URL 时调用内嵌的 Python 解释器。

例 30.4. Django/mod_python 有关 Apache 部分的配置

你需要在 Apache 的配置文件 httpd.conf 加入以下这几行, 把对某些 URL 的请求传给你的 web 应用程序:

<Location "/">
    SetHandler python-program
    PythonPath "['/dir/to/your/django/packages/'] + sys.path"
    PythonHandler django.core.handlers.modpython
    SetEnv DJANGO_SETTINGS_MODULE mysite.settings
    PythonAutoReload On
    PythonDebug On
</Location>

30.7.6.2. Ruby on Rails

Ruby on Rails 是另外一个开源的 web framework, 提供了一个全面的开发框架,能帮助 web 开发者工作更有成效和快速写出强大的应用。 它能非常容易的从 posts 系统安装。

# cd /usr/ports/www/rubygem-rails; make all install clean

30.7.6.3. mod_perl

Apache/Perl 集成计划, 将 Perl 程序设计语言的强大功能, 与 Apache HTTP 服务器 紧密地结合到了一起。 通过 mod_perl 模块, 可以完全使用 Perl 来撰写 Apache 模块。 此外, 服务器中嵌入的持久性解释器, 消除了由于启动外部的解释器为 Perl 脚本的启动所造成的性能损失。

mod_perl 通过多种方式提供。 要使用 mod_perl, 应该注意 mod_perl 1.0 只能配合 Apache 1.3 而 mod_perl 2.0 只能配合 Apache 2.X 使用。 mod_perl 1.0 可以通过 www/mod_perl 安装, 而以静态方式联编的版本, 则可以通过 www/apache13-modperl 来安装。 mod_perl 2.0 则可以通过 www/mod_perl2 安装。

30.7.6.4. mod_php

Written by Tom Rhodes.

PHP, 也称为 PHP: Hypertext Preprocessor, 是一种特别适合于 Web 开发的通用脚本语言。 它能够很容易地嵌入到 HTML 之中, 其语法接近于 C、 Java™, 以及 Perl, 以期让 web 开发人员的一迅速撰写动态生成的页面。

要获得用于 Apache web 服务器的 PHP5 支持, 可以从安装 lang/php5 port 开始。

在首次安装 lang/php5 port 的时候, 系统会自动显示可用的一系列 OPTIONS (配置选项)。 如果您没有看到菜单, 例如由于过去曾经安装过 lang/php5 port 等等, 可以用下面的命令再次显示配置菜单, 在 port 的目录中执行:

# make config

在配置选项对话框中, 选中 APACHE 这一项, 就可以联编出用于与 Apache web 服务器配合使用的可动态加载的 mod_php5 模块了。

注意:

由于各式各样的原因 (例如, 出于已经部署的 web 应用的兼容性考虑), 许多网站仍在使用 PHP4。 如果您需要 mod_php4 而不是 mod_php5, 请使用 lang/php4 port。 lang/php4 port 也支持许多 lang/php5 port 提供的配置和编译时选项。

前面我们已经成功地安装并配置了用于支持动态 PHP 应用所需的模块。 请检查并确认您已将下述配置加入到了 /usr/local/etc/apache/httpd.conf 中:

LoadModule php5_module        libexec/apache/libphp5.so
AddModule mod_php5.c
    <IfModule mod_php5.c>
        DirectoryIndex index.php index.html
    </IfModule>
    <IfModule mod_php5.c>
        AddType application/x-httpd-php .php
        AddType application/x-httpd-php-source .phps
    </IfModule>

这些工作完成之后, 还需要使用 apachectl 命令来完成一次 graceful restart 以便加载 PHP 模块:

# apachectl graceful

在未来您升级 PHP 时, make config 这步操作就不再是必需的了; 您所选择的 OPTIONS 会由 FreeBSD 的 Ports 框架自动保存。

在 FreeBSD 中的 PHP 支持是高度模块化的, 因此基本安装的功能十分有限。 增加其他功能的支持非常简单, 只需通过 lang/php5-extensions port 即可完成。 这个 port 提供了一个菜单驱动的界面来帮助完成 PHP 扩展的安装。 另外, 也可以通过对应的 port 来单独安装扩展。

例如, 要将对于 MySQL 数据库服务器的支持加入 PHP5, 只需简单地安装 databases/php5-mysql

安装完扩展之后, 必须重新启动 Apache 服务器, 来令其适应新的配置变更:

# apachectl graceful

本文档和其它文档可从这里下载: ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/.

如果对于FreeBSD有问题,请先阅读 文档,如不能解决再联系 <[email protected]>.

关于本文档的问题请发信联系 <[email protected]>.