Apache 学习笔记

Sections

Apaceh 快速入门

启动 Apache

$ sudo apachectl start

重启和关闭 Apache

$ sudo apachectl restart
$ sudo apachectl stop

当 Apache 运行时修改 httpd.conf,可以使用如下命令重新加载配置文件,而不必重启 Apache

$ sudo apachectl reload

查看 Apache 加载了哪些模块

$ apachectl -D DUMP_MODULES

-l 输出静态编译到 httpd 中的模块,如:

$ apachectl -l
Compiled in modules:
  core.c
  mod_so.c
  http_core.c

-M 输出已加载的静态或动态模块。

-t 检查配置文件的语法是否正确。

-v 查看 httpd 的版本号。

-V 查看 httpd 的编译时参数(以及版本号),如查看 httpd 运行时加载的配置文件:

$ apachectl -V | grep SERVER_CONFIG_FILE
   -D SERVER_CONFIG_FILE="conf/httpd.conf"

httpd 进程

httpd 是 Apaceh HTTP Server 的主程序。httpd 会 fork 子进程或创建线程来处理 HTTP 请求。我们通常通过 apachectl 来调用 httpd,而非直接调用它。

给 httpd 发送信号,使之启动、重启或停止运行:

-k start | restart | graceful | stop | graceful-stop

配置 Apache

Apache 的配置文件:

  • httpd.conf - 主配置文件
  • .htaccess - 子目录中的配置文件,可以覆盖 httpd.conf 中的配置选项

无论是用 yum 或下载源代码安装,初次启动前,都应该修改配置文件 httpd.conf。

配置的重点是:

  • DocumentRoot 的位置
  • 访问权限
  • 访问端口
  • 域名

如果网站支持 PHP,且默认访问页面为 index.php,应该修改配置:

<IfModule dir_module>
    DirectoryIndex index.html index.php
</IfModule>

如果没有 index.html 或 index.php 文件,Apache 可能把网站根目录下的所有文件和目录都列出来了,要拒绝列出文件和目录,把下面这行注释掉:

Options Indexes FollowSymLinks

如果在一个 IP 上部署了多个网站,就应该使用 VirtualHost,设置每一个网站的 DocumentRoot 位置、访问权限。

如果启用 https(默认 443 端口),要每个网站的证书和其 ServerName 是完全对应的,并确定防火墙开启了 443 端口。

如果是大版本的 Apache 升级(如从 2.2.x 升级到 2.4.x),首先要阅读升级日志,尤其注意配置选项的变化。上一次编译 Apache 的命令行参数,被保存在 config.nice 文件中,升级时可以重用,也可以在 config.log 中找到上一次的编译参数。

httpd.conf 文件

FollowSymLinks 表示如果一个路径是符号链接(symbol link),那么 follow 这个链接。

Indexes 表示如果一个路径下没有 index 文件,则以目录的形式显示。

AllowOverride 指令。这个指令只能出现在 <Directory> 中。

  • AllowOverride None 表示忽略 .htaccess 文件,Apache 根本不会读取任何 .htaccess 文件。
  • AllowOverride All 表示包含 .htaccess 文件的路径下,会使用 .htaccess 中的设置。

.htaccess 文件

.htaccess 的作用是可以基于一个路径来配置 Apache 的行为。

Apache 2.4 配置文件的变化

路径访问权限

新写法:

Require all granted

旧写法:

Order allow,deny
Allow from all

安装和配置 Apache

从 Apache 源码编译

编译 Apache 时加入第三方模块,有两种方式。

把模块静态链接到 Apache 中:

--with-module 

动态加载模块:

--enable-modules 

如果是动态加载的模块,应该在 httpd.conf 中添加 LoadModule 指令。

常见模块,都有简写的编译选项,如:

--with-ssl
--enable-ssl

Apache 常见编译选项:

--enable-so

开启动态库加载支持。

--enable-ssl

开启 HTTPS 支持。Apache 2.x 开始源码包中已携带 mod_ssl,不需要单独安装,只需在 configure 时添加 –enable-ssl 参数即可。注意系统需要有 OpenSSL 的开发包:

$ sudo yum install openssl-devel

如果 --enable-ssl 报错如:undefined reference to ap_thread_stacksize,可以尝试 make distclean,然后再次 configure。

--enable-rewrite

开启 Rewrite 模块

--with-mpm=worker

mpm(Multi Process Module),默认是 prefork,建议使用默认工作方式。

Apache 模块

modules 是 Apache 的模块文件(多为 .so 共享文件)。

手工编译 Apache 模块的方法:找到 Apache 模块路径,使用 apxs(APache eXtenSion tool)编译 Apache 扩展模块。Apache 模块路径在:download/httpd-x.x.x/modules 中,有几个类别。需要安装模块时 find 一下再用 apxs 安装即可。通常使用如下命令编译 Apache 模块:

$ apxs -cia mod_deflate.c

说明:

  • c 表示编译
  • i 表示安装,即将 .so 文件放入 Apache 可以找到的位置(即 modules 目录)
  • a 表示启动,即将模块加入 httpd.conf 中

Apache 常用功能配置

压缩页面传输

开启 Apache 压缩功能,这样能减少流量,加快页面传输速度:

# compress text, html, javascript, css, xml:
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