Idle Works, Idle Thoughts

Apache 学习笔记

安装 Apache

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

配置的重点是:

当 Apache 运行时修改 httpd.conf,可以使用

apachectl reload

重新加载配置文件,而不必重启Apache。

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

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

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

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

把模块静态链接到Apache中:

--with-module 

动态加载模块:

--enable-modules 

如果是动态加载的模块,应该在httpd.conf中添加 LoadModule 指令。对常见模块,都有简写的编译选项,如:

--with-ssl
--enable-ssl

httpd.conf 文件

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

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

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

.htaccess 文件

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

httpd 进程

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

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

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

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

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

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

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

查看 httpd 的版本号:-v

查看 httpd 的编译时参数(以及版本号):-V

查看 httpd 运行时加载的配置文件:

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

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的压缩功能,这样能减少流量,加快页面传输速度。

# 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

常用的Rewrite规则

把http请求重定向到https:

RewriteEngine on
RewriteCond %{HTTPS} !on
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}

把example.com重定向到www.example.com,即SEO中重要的301重定向:

RewriteEngine on
RewriteCond %{HTTP_HOST} ^example\.com$ [NC]
RewriteRule ^(.*)$ http://www.example.com/$1 [R=301,L] 

如果你更钟爱example.com的形式,可以把www.example.com重定向到example.com:

RewriteEngine on
RewriteCond %{HTTP_HOST} ^www\.example\.com$ [NC]
RewriteRule ^(.*)$ http://example.com/$1 [R=301,L] 

说明:

RewriteCond指令

只有符合RewriteCond指令声明的条件,才会继续往下执行RewriteRule指令。

RewriteCond TestString CondPattern

一、TestString是条件判断的对象,常见的TestString:

二、CondPatter是用来匹配TestString的正则表达式,如果匹配成功,往下执行RewriteRule指令。

三、可以在CondPattern后附加[flags],如:

RewriteRule指令

RewriteRule指令会执行实际的URL改写:

RewriteRule Pattern Substitution [flags]

一、Pattern是正则表达式,用来匹配目标URL。

二、Substitution是你要用来替换目标URL的新URL,可以用:

三、flags

NE表示noescape,不对特殊字符转义,如:

RewriteRule /anchor/(.+) /page.html#$1 [NE,R]

以上配置会将/anchor/abc重定向到/page.html#abc,如果没有NE,#会被转为%23,这可不是你想要的。