Apache服务器性能调优

Apache配置对您的服务器的性能有重大影响。 提高服务器性能的最简单方法是关闭不需要的模块。 本指南涵盖Apache模块,关闭哪些模块以及其他Apache性能调整选项。

工具

有多种工具可以帮助确定是否需要更改资源设置,包括top命令和负载测试程序Siege。 使用以下命令查看使用统计信息

  1. echo [PID]  [MEM]  [PATH] &&  ps aux | awk ‘{print $2, $4, $11}’ | sort -k2rn | head -n 20
  2. ps -eo pcpu,pid,user,args | sort -k 1 -r | head -20

更详细用于帮助了解Apache资源使用情况的工具包括Apache mod_status和Apache2Buddy。

Apache mod_status

Apache mod_status通过生成详细的状态页面来显示与入站服务器连接相关的信息。示例如下:
1.打开您的网站的配置文件。 此文件位于Debian / Ubuntu系统上的/etc/apache2/sites-available/example.com.conf或CentOS / Fedora系统上的/etc/httpd/conf.d/vhost.conf。
2.将以下内容添加到块中:
/etc/apache2/sites-available/example.com.conf (Debian/Ubuntu)
/etc/httpd/conf.d/vhost.conf (CentOS/Fedora)

  1. <Location /server-status>
  2.   SetHandler server-status
  3.   Order Deny,Allow
  4.   Deny from all
  5.   Allow from localhost
  6. </Location>

3.Apache mod_status还提供了一个名为ExtendedStatus的选项,该选项提供有关向Apache发送的每个请求的额外信息。 要启用ExtendedStatus编辑您的Apache配置文件:
/etc/apache2/apache2.conf (Debian/Ubuntu)
/etc/httpd/confd/httpd.conf (CentOS/Fedora)

  1. ExtendedStatus On

4.重启Apache
Debian/Ubuntu:

  1. service apache2 restart

CentOS/Fedora:

  1. /bin/systemctl reload httpd.service

5.要查看生成的文件,请下载Lynx:
Debian/Ubuntu:

  1. apt-get install lynx

Fedora/CentOS:

  1. yum install lynx

6.查看状态页

  1. lynx http://localhost/server-status

Apache2Buddy

Apache2Buddy脚本与MySQLTuner类似,它检查您的Apache设置,并根据您的Apache进程内存和总体RAM提出建议。 虽然它是一个相当基本的程序,专注于MaxClients指令,不过Apache2Buddy相当有用,可以通过单个命令运行:

  1. curl -L http://apache2buddy.pl/ | perl

多处理模块

Apache提供两个多处理模块,三个(如果在Apache 2.4上),用于管理您的设置。
每个模块创建子进程,主要区别在于它们如何处理线程。

Prefork

prefork模块在启动时创建多个子进程,每个子进程只处理一个线程。 由于这些进程一次只处理一个线程,因此如果有太多的并发请求,请求速度就会受到影响。 如果发生这种情况,一些请求基本上必须等待处理。 要处理此问题,请增加生成的子进程数,但请注意,这会增加RAM使用量。 Prefork是最安全的模块,当使用不是线程安全的模块时使用。

Worker

Worker模块的子进程在每个进程中生成许多线程,每个线程都能处理请求。 这提升了服务器的并发能力,当然也能减少服务器内存使用量。 总的来说,工作模块提供了更高的性能,但是比prefork安全性更低,不能与不是线程安全的模块一起使用。

Event

Event模块仅在Apache 2.4上可用,并且基于Worker MPM。 和Worker一样,它为每个子进程创建多个线程,一个线程专用于KeepAlive连接,一旦请求发出,它就传递给子线程。 这对于多个并发连接很有用,特别是那些不是同时处于活动状态但却偶尔请求的连接。 在SSL连接的情况下,Event MPM的作用与Worker相同。

模块配置

一旦选择了MPM,您需要更改配置中的值。 这些设置位于Debian / Ubuntu上的/etc/apache2/apache2.conf文件和CentOS / Fedora上的/etc/httpd/conf/httpd.conf文件。 MPM配置如下:

  1. <IfModule mpm_prefork_module>
  2.     StartServers          4
  3.     MinSpareServers       20
  4.     MaxSpareServers      40
  5.     MaxClients           200
  6.     MaxRequestsPerChild  4500
  7. </IfModule>

对于其他MPM,分别将替换为或以使用Worker和Event。
重新配置Apache服务器的下一步是更改上述设置。 要做到这一点,你需要知道每个值的作用,以及如何更好地调节它。
同样,进行配置更改的最佳方法是进行增量更改,然后监视效果。

StartServers

StartServers值指示启动时创建的子进程数,并根据负载进行动态控制。 通常没有理由更改此数字,除非您的服务器频繁重新启动,并在重新启动时接收大量请求。

MinSpareServers

设置空闲子进程的最小数量。 如果进程数少于MinSpareServer数,则会在Apache 2.2或更低版本上以每秒一个的速率创建更多进程。 使用Apache 2.4,此速率呈指数增长,从1开始到每秒生成32个子进程。 这个值的作用是,当收到一个新请求时,它可以直接使用空闲线程而不需要新生成一个; 如果已经没有可用线程了,Apache会新生成一个子进程,不过这会消耗服务器资源以及延长请求处理时间。 注意,太多的空闲进程也会对服务器产生不利影响。

MaxSpareServers

设置空闲子进程的最大数量。 如果空闲进程超出这个值,多余的将会终止。 除非您的网站非常繁忙,否则此数字不应设置过高,因为即使空闲进程也会消耗资源。

MaxClients

可同时提供的最大请求数量,请求数超过限制时后来的请求将入队列。 如果这个设置太低,队列中的连接可能会超时; 但是,如果设置过高,则会导致内存不足出现swap。 如果此值增加超过256,则还必须增加ServerLimit值。
计算最佳值的一种方法是用服务器可用内存除以每个Apache进程使用的内存量,注意要为其他进程留出一些内存空间。 使用ApacheBuddy帮助确定这些值,或下面的命令。
要确定每个Apache进程使用的RAM,请在Debian或Ubuntu系统上将apache2替换为httpd:

  1. ps -ylC httpd –sort:rss

除以1024转为Mb
获取内存使用信息:

  1. free -m

Apache mod_alias设置路径别名

在许多情况下,Apache主机提供的所有资源都位于该主机的DocumentRoot中。 DocumentRoot是在配置块中指定的目录。 此目录用于表示用户在文件系统上通过HTTP访问的各种文件,目录和资源。 但是,管理员通常要对文件系统上不位于DocumentRoot中的资源提供HTTP访问。 虽然Apache在某些情况下将遵循符号链接,但这可能很难维护。 因此,Apache可以指定一个Alias以让请求中的路径使用另一个路径

创建Alias

通常,虚拟主机配置指定一个DocumentRoot,按照惯例会指定public_html/或public/命名的目录。 如果example.com虚拟主机的文档根目录是/srv/www/example.com/public_html/,则对http://www.example.com/index.htm的请求将返回位于/srv/www/example.com/public_html/index.htm。
如果管理员需要在code/资源请求访问/srv/git/public/下的文件,即可以在http://example.com/code/访问它,则需要设置别名。 如下示例:

  1. DocumentRoot /srv/www/example.com/public_html/
  2. Alias /code /srv/git/public
  3. <Directory /srv/git/public>
  4.     Order allow,deny
  5.     Allow from all
  6. </Directory>

如果没有Alias指令,对http://example.com/code/的请求将返回/srv/www/example.com/public_html/code/文件夹中的可用资源。 但是,别名将指示Apache提供来自/srv/git/public目录的内容。 配置块允许远程用户访问此目录。
使用Alias指令时需要考虑几个重要因素:
Directory配置块需要在Alias指令之后创建。 这使得可以允许访问和以其他方式配置那些目录。 在上面的示例中是/srv/git/public。
通常,在Alias指令中避免使用尾部斜杠。 如果请求http://example.com/code应用的是Alias /code/ /srv/git/public/指令,请求URL没有尾部斜杠,即没有匹配Alias,资源将从DocumentRoot提供。
Alias指令需要在根级服务器配置(例如httpd.conf)或配置块中创建。
除了Alias之外,Apache还提供了一个AliasMatch指令,它提供类似的功能。 AlaisMatch提供了将给定资源的一类请求别名到DocumentRoot之外的位置的额外功能。 让我们考虑另一个虚构的example.com虚拟主机配置:

  1. DocumentRoot /srv/www/example.com/public_html/
  2. AliasMatch /code/projects/(.+) /srv/git/projects/$1
  3. <DirectoryMatch "^/srv/git/projects/.+$">
  4.     Order allow,deny
  5.     Allow from all
  6. </Directory>

在此示例中,对http://example.com/code/projects/my_app和http://example.com/code/projects/my_app2等网址的请求将分别由/srv/git/projects/my_app和/srv/git/projects/my_app2提供资源。 然而,http://example.com/code/projects将从/srv/www/example.com/public_html/code/projects/而不是/srv/git/projects/提供,因为在别名中的/code/projects/(.+有尾部斜杠。
虽然Alias的用例有点少,但是该功能对于维护安全且易于维护的Web服务器非常有效。

Apache安装web应用防火墙mod_security

ModSecurity是Apache Web服务器的Web应用程序防火墙。 除了提供日志记录功能,ModSecurity可以实时监视HTTP流量,以便检测攻击。 ModSecurity还可作为Web入侵检测工具,允许您对Web系统中发生的可疑事件做出反应。

安装ModSecurity

Ubuntu / Debian

  1. sudo apt-get install libxml2 libxml2-dev libxml2-utils
  2. sudo apt-get install libaprutil1 libaprutil1-dev
  3. sudo apt-get install libapache-mod-security

CentOS / Fedora

1.通过逐个输入以下命令来安装GCC编译器和依赖关系:

  1. sudo yum install mod_security

2.通过输入以下命令重新启动Apache:

  1. sudo /etc/init.d/httpd restart

OWASP ModSecurity核心规则集

对于基本配置,我们将使用OWASP核心规则集。 安装说明在SpiderLabs GitHub项目中:
https://github.com/SpiderLabs/owasp-modsecurity-crs/blob/master/INSTALL

配置ModSecurity

你可能需要用到modsecurity_10_crs_config,我们从示例中复制一份

  1. cp modsecurity_crs_10_setup.conf.example modsecurity_crs_10_setup.conf

有五个规则目录:
activated_rules
base_rules
experimental_rules
optional_rules
slr_rules
有两种方式配置ModSecurity:使用基本规则集,或使用符号链接。 以下章节说明如何使用这两种方法。

使用基本规则集

如果您准备使用基本规则集,而不想使用符号链接配置文件,请执行以下步骤:
1.修改httpd.conf文件,如下所示:
/etc/apache2/httpd.conf (Debian / Ubuntu):

  1. <IfModule security2_module>
  2. Include modsecurity-crs/.conf Include modsecurity-crs/base_rules/.conf
  3. </IfModule>

/etc/httpd/conf/httpd.conf (CentOS / Fedora)

  1. <IfModule security2_module>
  2. Include modsecurity-crs/.conf Include modsecurity-crs/base_rules/.conf
  3. </IfModule>

2.在modsecurity crs_20_protocol_violations.conf文件中,将REQBODY_ERROR变量重命名为REQBODY_PROCESSOR_ERROR。
3.重新启动Apache以使更新生效:
Debian / Ubuntu:

  1. /etc/init.d/apache2 restart

CentOS / Fedora:

  1. /etc/init.d/httpd restart

使用符号链接

如果您希望以符号方式将这些配置文件链接到activated_rules目录,请执行以下步骤:
1.编辑Apache配置文件,使IfModule看起来像这样:
/etc/apache2/httpd.conf (Debian / Ubuntu):

  1. <IfModule security2_module>
  2. Include modsecurity-crs/modsecurity_crs_10_config.conf Include modsecurity-crs/activated_rules/*.conf </IfModule>

/etc/httpd/conf/httpd.conf (CentOS / Fedora):

  1. <IfModule security2_module>
  2. Include modsecurity-crs/modsecurity_crs_10_config.conf Include modsecurity-crs/activated_rules/*.conf </IfModule>

2.在重新启动Apache之前创建符号链接。 下面列出几个示例。
要将所有base_rules复制到activated_rules: > > for f in ls base_rules/ ; do ln -s /usr/local/apache/conf/crs/base_rules/$f activated_rules/$f ; done >
要将评论垃圾邮件规则从可选规则目录复制到activated_rules目录:>> for f in ls optional_rules/ | grep comment_spam ; do sudo ln -s /usr/local/apache/conf/crs/optional_rules/$f activated_rules/$f ; done >
3.重新启动Apache以使更新生效:
Debian / Ubuntu:

  1. /etc/init.d/apache2 restart

CentOS / Fedora:

  1. /etc/init.d/httpd restart

在Apache服务器使用mod_rewrite模块重定向URL

在Web开发中,通常设置HTTP能在URL不映射文件系统中的文件时访问资源。 虽然可以在某种程度上使用重定向语句来解决这个问题,但是许多部署对于URL重写具有更复杂的需求。 Apache的mod_rewrite提供重写功能,以便用户使用简洁明了的URL进行交互,同时仍然能够为管理员提供他们认为合适的网站目录架构。

重写URL

在块或.htaccess文件中,使用以下行启用mod_rewrite:

  1. RewriteEngine on

您可以创建任意数量的重写规则。 这些规则提供了服务器比较入站请求的模式。 如果请求与重写模式匹配,则服务器按照规则所述修改请求,并处理该请求。 下面是一个重写规则的例子:

  1. RewriteRule ^post-id/([0-9]+)$ /posts/$1.html

让我们解析这条规则:首先,请注意,第一个字符串是匹配传入请求的模式。 第二个字符串指定要提供的实际文件。 Mod_rewrite模式使用正则表达式语法:^匹配字符串的开头,$匹配字符串的结尾,这意味着重写引擎不会重写与模式部分匹配的字符串。
上面的例子会重写指定以/post-id/开头的路径的所有URL,并包含一个或多个数字(例如[0-9]+),在/posts/目录中提供相应的.html文件。 模式中的括号术语指定了作为$1,$2,$3等传递给第二个字符串的变量。
您可以创建和应用多个重写规则,但这些规则是顺序匹配的。 表示RewriteRules的顺序可以影响匹配的规则。
或者,您可以插入RewriteBase指令来修改重写规则的行为。 让我们假设:
这些指令是为/srv/www/example.com/public_html/目录指定的。
某些用户以http://example.com/post-id/200形式发送请求,其中200可能是长于一位数的任何数字。
某些用户以http://example.com/page/title-of-page的形式发送请求,其中“title of page”可能代表任何字符串。
这些文件位于/srv/www/example.com/public_html/objects/上,匹配请求文件名称,扩展名为.html。

  1. RewriteEngine on
  2. RewriteBase /objects
  3. RewriteRule ^post-id/([0-9]+)$ $1.html
  4. RewriteRule ^page/([^/]+)$ $1.html

上面的重写规则集作用如下:
http://example.com/post-id/200/,提供位于/srv/www/example.com/public_html/objects/200.html的文件
http://example.com/page/free-the-toast/,提供位于/srv/example.com/public_html/objects/free-the-toast.html的文件

在特定条件下重写URL

使用RewriteCond参数,您可以限制使用RewriteRule的条件。 让我们从WordPress应用程序的默认重写规则中获取以下示例:

  1. RewriteEngine On
  2. RewriteBase /
  3. RewriteCond %{REQUEST_FILENAME} !-f
  4. RewriteCond %{REQUEST_FILENAME} !-d
  5. RewriteRule . /index.php [L]

在此示例中,以上下文的顶层开始的所有请求都受重写规则的影响。 这由RewriteBase /指令指定。 上下文由在虚拟主机,目录块或.htaccess文件中指定伪指令的位置决定。
RewriteCond语句指示Apache仅当满足条件时才应用遵循的规则。 在上述示例中,匹配请求的文件名称在文件系统上不存在(例如,!-f),或者目录不存在(例如!-d)的请求。
简而言之,如果两者都为真,并且文件和目录都不存在,则Web服务器将请求附加到index.php。 也就是说,f用户请求http://example.com/?post=123或http://example.com/post/123,服务器将返回index.php?post=123或index.php/post/123。

mod_rewrite设置响应码

最后,有一些代码,你可以附加到一个RewriteRule,修改重写的行为。 在前面的例子RewriteRule ./index.php [L],我们看到代表“最后规则”的[L]选项。 这阻止Apache应用任何其他重写规则。 最常见的附加选项包括:
F告诉客户端该URL被禁止,用HTTP代码403响应。
N强制mod_rewrite重新开始重写过程,并允许多阶段重写。
R告诉客户端所请求的页面已经移动,具有用于临时重定向的HTTP代码302。 要表示该网页已永久移动,请指定“R=301”。
您可以在RewriteRule结尾处指定多个选项,用逗号分隔它们,如:[L,R=301]

Apache配置结构

Directory选项

块指的是文件系统中的目录,并指定Apache对于该目录的行为。 此目录块以角括号括起,并以单词“ Directory”开头,并指向文件系统中目录的路径。 目录块中设置的选项适用于指定的目录及其子目录。 以下是目录块的示例:

  1. <Directory /srv/www/example.com/public_html/images>
  2.     Order Allow,Deny
  3.     Allow from all
  4.     Deny 55.1
  5. </Directory>

关于块的附加注释:
目录块不能彼此嵌套。
目录块可以嵌套在块中。
目录块中包含的路径可以包含通配符。 星号(例如*)将匹配任何系列的字符,而问号(例如?)将匹配任何单个字符。 如果需要控制所有虚拟主机的DocumentRoot的选项,这可能很有用。 如下行:

  1. <Directory /srv/www/*/public_html>

File选项

如果需要进一步控制服务器上目录中的特定文件,可以使用指令。 这控制Web服务器关于单个文件的行为。 指令将应用于具有指定名称的任何文件。 例如,以下示例指令将匹配文件系统中名为roster.htm的任何文件:

  1. <Files roster.htm>
  2.      Order Allow,Deny
  3.      Deny from all
  4. </Files>

如果包含在块中,将应用于DocumentRoot中名为roster.htm的所有文件或位于该主机的DocumentRoot中的目录。 如果指令包含在块中,则指定的选项将应用于目录中名为roster.htm的所有文件,或指定的目录的子目录中。

Location选项

虽然和块控制Apache关于文件系统中位置的行为,但指令控制Apache关于客户端请求的特定路径的行为。 如果用户请求http://www.example.com/webmail/inbox/,网络服务器将在DocumentRoot下的webmail /inbox /目录中查找,例如/srv/www/example.com/public_html/webmail/inbox/。 此功能的一个常见用途可能是允许脚本处理对给定路径发出的请求。 例如,以下块将指定路径的所有请求都定向到一个mod_python脚本:

  1. <Location /webmail/inbox>
  2.     SetHandler python-program
  3.     PythonHandler modpython
  4.     PythonPath "[‘/srv/www/example.com/application/inbox’] + sys.path"
  5. </Location>

htaccess选项

除了上面讨论的配置方法,默认情况,Apache会从位于该目录中的文件读取目录的配置选项。 此文件通常称为.htaccess。 在您的httpd.conf和连接的文件中查找以下配置选项:

  1. AccessFileName .htaccess
  2.  
  3. <Files ~ "^.ht">
  4.     Order allow,deny
  5.     Deny from all
  6. </Files>

第一行告诉Apache在.htaccess文件中查找可公开访问的目录中的配置选项。 第二个指令指示Apache拒绝名称以.ht开头的文件的所有请求。 这将阻止访问者访问配置选项。
您可以更改AccessFileName以指定其他Apache可以查找这些配置选项的名称。 如果更改此选项,请务必更新指令以防止无意中的公开访问。 出于安全原因,不建议这样做。
块中的任何选项,都可以在.htaccess文件中配置。 .htaccess文件使得没有服务器权限的普通用户可以自己配置部署Apache选项。

“Match”指令和正则表达式

除了上述基本指令之外,Apache还允许服务器管理员在指定目录,文件和位置方面有一些额外的灵活性。 这些“Match”块和正则表达式定义的指令块允许管理员为一类目录,文件和位置定义一组配置选项。 这里是一个例子:

  1. <DirectoryMatch "^.+/images">
  2.     Order Allow,Deny
  3.     Allow from all
  4.     Deny 55.1
  5. </DirectoryMatch>

此配置块指定与正则表达式^+ images匹配的目录的多个选项。 换句话说,以多个字符开头并以图片结尾的任何路径都将与这些选项匹配,包括以下路径:/srv/www/example.com/public_html/images/,/srv/www/example.com/public_html/objects/images和/home/username/public/www/images。

  1. <Directory ~ "^.+/images">
  2.     Order Allow,Deny
  3.     Allow from all
  4.     Deny 55.1
  5. </Directory>

Apache提供类似的功能,可以在Location,Files使用正则表达式匹配一类目录或文件。 如下配置:

  1. <Files ~ "^..+">
  2.     Order allow,deny
  3.     Deny from all
  4. </Files>
  5.  
  6. <FilesMatch "^..+">
  7.     Order allow,deny
  8.     Deny from all
  9. </FilesMatch>
  10.  
  11. <Location ~ "inbox$">
  12.     Order Deny,Allow
  13.     Deny from all
  14.     Allow 192.168
  15. </Location>
  16.  
  17. <LocationMatch "inbox$">
  18.     Order Deny,Allow
  19.     Deny from all
  20.     Allow 192.168
  21. </LocationMatch>

注意,上述和指令是等效的,和指令也是同样的。

Apache基于规则的访问控制

Apache提供了许多工具,允许管理员控制对服务器提供的特定资源的访问。 您可能已经熟悉基于身份验证的访问控制,这需要访问者在访问资源之前对服务器进行身份验证。
相比之下,Apache的基于规则的访问控制允许您指定哪些访问者在非常细微的级别访问哪些资源。 您可以创建规则,阻止来自Web服务器的指定IP范围,或者访问特定资源,甚至访问特定的虚拟主机。
基于规则的访问控制的最基本的使用是对通过网络连接可访问的资源施加严格的限制。 在默认Apache配置中,Web服务器拒绝所有用户访问系统上的所有文件。 然后Apache允许管理员允许访问特定资源。
这些访问规则的附加用途包括阻止恶意流量的特定IP范围,并且在许多其他可能性中将对给定资源或资源组的访问限制为“内部用户”。

基于规则的访问控制的示例

下面是一个基本规则的例子:

  1. Order Deny,Allow
  2. Deny from all
  3. Allow from 192.168.2.101

Order Deny,Allow指令告诉Web服务器在Allow规则之前应该处理“Deny”规则。
Deny from all指令告诉Web服务器所有用户被拒绝访问给定资源。 此规则优先执行。
Allow from指令告诉Web服务器应该允许源自IP地址192.168.2.101的请求。 这是最后处理,并表示拒绝所有规则的例外。
简而言之,除192.168.2.101之外的所有主机都被拒绝访问此资源。

其他访问控制规则

您可以通过修改和扩展上面的示例为资源指定精细的访问控制规则。 以下注释和建议提供了对这些访问控制系统可能实现的一些更高级功能的深入了解。

控制指定范围IP的访问

如果要控制指定范围IP地址的访问,而不是单个地址,Apache允许使用以下语法:

  1. Order Deny,Allow
  2. Deny from all
  3. Allow from 192.168
  4. Allow from 10

上述语句允许以192.168和10开头的所有地址。这些IP范围通常保留给本地网络,不是公共可路由地址。 如果使用这些访问控制规则,将只允许来自本地的流量。
这是访问规则的另一个示例:

  1. Order Allow,Deny
  2. Allow from all
  3. Deny from 185.201.1

此规则允许任何人访问给定资源,然后拒绝以185.201.1开头的所有IP地址的访问。 此语句将覆盖源自185.201.1.0到185.201.1.255的IP地址范围的所有流量。
当创建访问控制规则时,特别是那些使用Allow from all指令的规则,应该非常确定这些指令位于正确的上下文中。

高级访问控制

尽管基于IP地址设置访问控制规则是控制访问的最简单的方法,但Apache提供了许多其他方法。
首先,Apache允许管理员根据请求者的主机名来允许或拒绝访问。 这会强制Apache对执行请求的主机名执行反向DNS(rDNS)查找,然后根据此信息允许或拒绝访问。 考虑这个例子:

  1. Order Deny,Allow
  2. Deny from all
  3. Allow from hostname.example.com

Apache仅允许来自具有hostname.example.com的有效rDNS的计算机的请求访问此配置中的资源。
其次,可以在HTTP会话中围绕环境变量构建访问规则。 这允许您根据变量(例如浏览器(用户代理)和引荐来源)允许和拒绝对资源的访问。 让我们来看下面的例子:
SetEnvIf Referer searchenginez.com search_traffic
Order Deny,Allow
Deny from all
Allow from env=search_traffic
此访问控制规则与Apache的mod_setenvif结合使用。 首先,如果请求referrer匹配searchenginez.com,则设置环境变量search_traffic。 接下来,拒绝所有主机访问资源。 最后,设置了允许访问资源环境变量为search_traffic的请求。 有关设置和使用环境变量的更多信息,请参考mod_setenvif的官方Apache文档。

使用Apache Web服务器重定向URL

当HTTP资源或网页更改位置时,提供某些方法来提醒用户这些资源已移动通常很重要。 HTTP协议提供了通过与客户端应用通信的多个“重定向”状态码用于实现此目的而不影响用户体验。
Apache提供了许多“重定向”配置指令,允许管理员在配置文件中指定资源以重定向到另一个URL。 当请求被重定向时,服务器返回该请求的结果,该结果指示客户端发起针对目标资源的新位置的第二请求。
重定向可以告诉客户端所请求的页面已临时或永久移动。 Apache提供了轻松支持这些功能的工具。 本指南介绍了重定向配置指令,介绍如何设置各种重定向选项,以及如何将资源请求类重定向到新位置。

Redirect指令

重定向配置指令可以位于“主”服务器配置文件中,但我们建议您将它们保留在虚拟主机条目或目录块中。 也可以在.httaccess文件中声明重定向语句。 以下是Redirect指令的示例:
Apache配置选项:

  1. Redirect /username http://team.example.com/~username/

如果没有给出参数,则发送临时(例如302)重定向状态。 在这种情况下,客户端(用户代理)被通知在/username的可用资源已临时移动到http://team.example.com/~username/。
要指定特定的HTTP重定向状态,请指定以下状态之一:

  1. Redirect permanent /username http://team.example.com/~username/
  2. Redirect temp /username http://team.example.com/~username/
  3. Redirect seeother /username http://team.example.com/~username/
  4. Redirect gone /username

此重定向告诉客户端资源已永久移动,这对应于HTTP状态301.“temp”状态是默认行为,指定重定向仅是临时的; 这对应于HTTP状态302.“另一个”状态发送表示所请求的资源已被另一个资源替换的信号(HTTP状态303)。 最后,“gone”状态告诉客户端资源已被删除(永久); 这发送HTTP状态410,作为不可用的“404”状态的替代。 在“已离开”重定向的情况下,请忽略最终到达网址。
您还可以指定特定的HTTP代码,如下所示。

  1. Redirect 301 /username http://team.example.com/~username/
  2. Redirect 302 /username http://team.example.com/~username/
  3. Redirect 303 /username http://team.example.com/~username/
  4. Redirect 410 /username

Apache还提供了两个额外的永久和临时重定向指令,这些指令更清楚一些。 它们如下:

  1. RedirectPermanent /username/bio.html http://team.example.com/~username/bio/
  2. RedirectTemp /username/bio.html http://team.example.com/~username/bio/

此外,Apache还可以使用RedirectMatch指令使用正则表达式重定向一类请求到新地址。 例如:

  1. RedirectMatch (.*).jpg$ http://static.example.com$1.jpg

此指令与对具有.jpg扩展名的文件的任何请求进行匹配,并将其替换为第二个域上的位置。 因此:
http://www.example.com/avatar.jpg的请求将重定向到http://static.example.com/avatar.jpg和对http://www.example.com/images/avatar.jpg的请求将被重定向到http://static.example.com/images/avatar.jpg。

Apache设置文件访问密码保护

虽然大多数Web服务器内容创建为可供公众使用,但您可能希望将某些或所有网站限制为特定用户或组。 HTTP Auth允许您轻松创建这些限制。
本文介绍基于凭证和基于规则的Apache访问控制工具。

Apache访问控制

要为目录启用密码,请将以下行插入Apache配置文件的相应部分。 您还可以在.htaccess文件或虚拟主机配置部分中插入身份验证信息。 所需的指令是:
Apache配置文件:

  1. AuthType Basic
  2. AuthUserFile /var/www/example.com/.htpasswd
  3. AuthName "Sign In Here To Gain Access To the Site"
  4. Require valid-user

Apache在与客户端连接时用AuthType指令指定应使用的认证方法。 Basic类型要求密码作为明文在网络上发送。 因此,我们不建议使用此来保护敏感资源。
AuthUserFile指定存储密码的密码文件的路径(完整)。 在本例中,我们使用路径/var/www/example.com/.htpassword。 这是public_html文件夹之上的一个目录,防止意外暴露文件。 默认情况下,以.ht开头的所有文件在Apache的大多数默认配置中都不是Web可访问的,但不应假定。
AuthName指令包含用于浏览器通知用户服务器正在验证什么资源的提示。 该值是任意的。
Require valid-user告诉Apache任何有效的用户都可以进行身份验证。

生成HTTP AUTH密码

要生成密码,我们需要htpasswd工具。 对于许多发行版,此工具可能在您安装Apache本身时已安装。 Debian和Ubuntu用户必须使用以下命令安装apache2-utils软件包:

  1. sudo apt-get install apache2-utils

要指定用户创建文件,执行以下命令:

  1. htpasswd -c /var/www/example.com/.htpasswd username

在本例中,我们使用-c选项创建一个新的AuthUserFile。 该文件位于/var/www/example.com/.htpasswd,用户名为username。 htpasswd将提示您输入密码,然后确认密码。 如果文件存在,请用-c选项覆盖。
-b选项允许您把密码作为命令的最后一个参数,如下例所示:

  1. htpasswd -b /srv/auth/.htpasswd username 5t1ck6

AuthUserFile类似如下:
/var/www/example.com/.htpasswd

  1. hobby:isiA3Q4djD/.Q
  2. admin:{SHA}x9VvwHI6dmgk9VTE0A8o6hbCw2s=
  3. username:$apr1$vVzQJxvX$6EyHww61nnZr6IdQv0pVx/

带组的访问控制列表

在Require指令中,我们指定了valid-user。 这告诉Apache,任何可以对AuthUserFile中指定的用户进行身份验证的用户都可以访问该网站。 虽然可以为不同的资源维护单独的密码文件,但对于具有复杂身份验证需求的部署,这是很难维护的。
为了满足这一需求,Apache允许您使用单个AuthUserFile,包含需要向服务器进行身份验证的所有用户。 要将有效凭据集限制到.htpasswd文件中列出的特定用户子集,我们必须在Require配置参数中指定用户。 只有在Require user指令后指定的用户才能被允许访问指定的资源。 例如:
Apache配置文件选项:

  1. Require user username admin

给定这个指令,用户username和admin将能够登录资源。 可以在Require行上指定任何用户子集。 Apache还提供了将用户组织成组的能力,然后允许基于组成员资格访问资源。 此设置的配置指令如下所示:
Apache配置文件:

  1. AuthType Basic
  2. AuthUserFile /srv/auth/.htpasswd
  3. AuthGroupFile /srv/auth/.htgroup
  4. Require group Authorized

在这个例子中,我们引用了相同的AuthUserFile,但是我们添加了一个指定用户组的AuthGroupFile。 组文件包含用户组列表和与每个组相关联的用户名。 htgroup文件(如htpasswd文件)可以位于文件系统上的任何位置。 为了清晰起见,我们建议htgroup与htpasswd文件在同一目录中。 这里是一个htgroup文件的例子:
/var/www/example.com/.htgroup:

  1. Authorized: username username2
  2. Team: admin hobby

给定此htgroup文件,只有用户username和username2将有权访问上面列出的资源。 组文件的语法遵循一个简单的[groupname]:[username 1] [username 2] […]。 您可以将您的AuthUserFile中的任何用户名作为特定资源所需的组条目。

Debian 7 (Wheezy)安装配置Apache mod_fastcgi PHP-FPM

本文介绍如何在Debian 7系统上配置和安装使用Apache mod_fastcgi和PHP-FPM。 Apache的默认配置使用mod_php而不是mod_fastcgi,mod_php使用大量的系统资源。
mod_php使用更多资源的主要原因是因为它即使为非PHP文件(如纯HTML和JavaScript文件)也加载。 FastCGI进程管理器(PHP-FPM)通过强制Web服务器充当代理并且仅将以php文件扩展名结尾的文件传递给PHP-FPM来帮助减少所使用的系统资源量。
此外,使用PHP-FPM允许将每个虚拟主机配置为作为单独用户运行PHP代码。 以前,这只能通过使用suPHP。

安装mod_fastcgi和PHP-FPM

mod_fastcgi和PHP-FPM都在Debian 7官方软件库,安装方法如下:
1.更新软件库

  1. sudo apt-get update && sudo apt-get upgrade –show-upgraded

2.看看mod_fastcgi是否可用。 默认情况下,Debian 7不包括安装mod_fastcgi所需的软件库,因为它是一个contrib模块,并且是non-free的(就Debian的许可限制而言)。

  1. sudo apt-cache search libapache2-mod-fastcgi

3.如果不可用,您需要编辑/etc/apt/sources.list文件,以允许将contrib和non-free软件加载到软件库列表中。 您的源文件应如下所示:
/etc/apt/sources.list:

  1. deb http://ftp.es.debian.org/debian stable main contrib non-free
  2. deb-src http://ftp.es.debian.org/debian stable main contrib non-free
  3.  
  4. deb http://ftp.debian.org/debian/ wheezy-updates main contrib non-free
  5. deb-src http://ftp.debian.org/debian/ wheezy-updates main contrib non-free
  6.  
  7. deb http://security.debian.org/ wheezy/updates main contrib non-free
  8. deb-src http://security.debian.org/ wheezy/updates main contrib non-free

4.更新apt-get软件库

  1. sudo apt-get update && sudo apt-get upgrade –show-upgraded

5.安装mod_fastcgi和PHP-FPM

  1. sudo apt-get install libapache2-mod-fastcgi php5-fpm

配置Apache使用PHP-FPM

我们现在将配置Apache将PHP文件的所有请求(带有PHP文件扩展名)通过FastCGI传递给PHP wrapper。
1.激活mod_actions模块

  1. sudo a2enmod actions

2.配置PHP-FPM使用UNIX套接字而不是TCP。 在这个命令中,我们将使用grep来确定套接字是否已被使用。

  1. sudo grep -E ‘^s*listens*=s*[a-zA-Z/]+’ /etc/php5/fpm/pool.d/www.conf

你会看到如下输出:
listen = /var/run/php5-fpm.sock
如果你看到如上输出,请跳到第6步。
3.如果没有看到以上输出,更改如下文件:
etc/php5/fpm/pool.d/www.conf

  1. listen = /var/run/php5-fpm.sock

4.找到如下行并删除
/etc/php5/fpm/pool.d/www.conf:

  1. listen = 127.0.0.1:9000

5.重启php5-fpm生效配置

  1. sudo service php5-fpm restart

6.检查Apache版本

  1. apache2 -v

7.根据Apache版本,编辑对应的文件
Apache 2.2或更早版本
/etc/apache2/mods-enabled/fastcgi.conf:

  1. <IfModule mod_fastcgi.c>
  2.  AddType application/x-httpd-fastphp5 .php
  3.  Action application/x-httpd-fastphp5 /php5-fcgi
  4.  Alias /php5-fcgi /usr/lib/cgi-bin/php5-fcgi
  5.  FastCgiExternalServer /usr/lib/cgi-bin/php5-fcgi -socket /var/run/php5-fpm.sock -pass-header Authorization
  6. </IfModule>

Apache 2.4或更高版本
/etc/apache2/mods-enabled/fastcgi.conf

  1. <IfModule mod_fastcgi.c>
  2.  AddType application/x-httpd-fastphp5 .php
  3.  Action application/x-httpd-fastphp5 /php5-fcgi
  4.  Alias /php5-fcgi /usr/lib/cgi-bin/php5-fcgi
  5.  FastCgiExternalServer /usr/lib/cgi-bin/php5-fcgi -socket /var/run/php5-fpm.sock -pass-header Authorization
  6.  <Directory /usr/lib/cgi-bin>
  7.   Require all granted
  8.  </Directory>
  9. </IfModule>

8.保存文件并检查配置错误

  1. sudo apache2ctl configtest

9.只要你看到Syntax OK输出,重启Apache服务

  1. sudo service apache2 restart

如果没有看到Syntax OK,检查下配置哪里出错了
10.通过创建和访问具有phpinfo()显示的页面来检查PHP是否正常工作。 以下命令将在/var/www(Apache中网站的默认目录)中创建info.php:

  1. sudo echo "<?php phpinfo(); ?>" > /var/www/info.php

CentOS 6安装配置Apache Web服务器

安装Apache

1.安装Apache HTTP服务器

  1. sudo yum install httpd

2.编辑Apache配置文件调整资源占用配置。下面的配置适合2GB内存服务器使用。
/etc/httpd/conf/httpd.conf:

  1. KeepAlive Off
  2.  
  3.  
  4. <IfModule prefork.c>
  5.     StartServers        4
  6.     MinSpareServers     20
  7.     MaxSpareServers     40
  8.     MaxClients          200
  9.     MaxRequestsPerChild 4500
  10. </IfModule>

配置Apache虚拟主机

1.在/etc/httpd/conf.d目录创建vhost.conf文件。把example.com域名替换为你的
/etc/httpd/conf.d/vhost.conf:

  1. <VirtualHost *:80>
  2.      ServerAdmin [email protected]
  3.      ServerName example.org
  4.      ServerAlias www.example.org
  5.      DocumentRoot /srv/www/example.org/public_html/
  6.      ErrorLog /srv/www/example.org/logs/error.log
  7.      CustomLog /srv/www/example.org/logs/access.log combined
  8. </VirtualHost>

2.创建相关目录

  1. sudo mkdir -p /srv/www/example.org/public_html
  2. sudo mkdir -p /srv/www/example.org/logs

3.启动Apache

  1. sudo service httpd start

4.设置Apache开机启动

  1. sudo chkconfig httpd on

Apache模块及脚本

安装Apache模块

默认情况下,模块位于/etc/httpd/modules/目录中。 默认模块的配置指令位于/etc/httpd/conf/httpd.conf中,而使用yum安装的可选模块的配置选项通常位于/etc/httpd/conf.d/中的.conf文件中。
1.列出可用Apache模块

  1. sudo yum search mod_

2.安装所需模块

  1. sudo yum install mod_[module-name]

安装脚本支持

下面的命令安装相应模块以使Apache支持服务端脚本语言PHP,Python和Perl。
Perl支持:

  1. sudo yum install mod_perl

Python支持:

  1. sudo yum install mod_wsgi

PHP支持:

  1. sudo yum install php php-pear