第9章 Apache服务器企业实战

Apache WEB服务器企业实战

万维网 (WORLD WIDE WEB,WWW)服务器,也称之为WEB服务器,主要功能是提供网上信息浏览服务。WWW是 Internet的多媒体信息查询工具,是Internet上飞快发展的服务,也是目前用的最广泛的服务。正是因为有了WWW软件,才使得近年来 Internet 迅速发展。

目前主流的WEB服务器软件包括:Apache、Nginx、Lighttpd、IIS、Resin、Tomcat、WebLogic、Jetty等。

 

本章向读者介绍Apache WEB服务器发展历史、Apache工作模式深入剖析、Apache虚拟主机、配置文件详解及Apache Rewrite企业实战等。

1.1 Apache WEB服务器入门简介

Apache HTTP Server是Apache软件基金会的一个开源的网页服务器,是世界使用排名第一的Web服务器软件,可以运行在几乎所有广泛使用的计算机平台上,由于其跨平台和安全性被广泛使用,是目前最流行的Web服务器端软件之一。

Apache服务器是一个多模块化的服务器,经过多次修改,成为目前世界使用排名第一的Web服务器软件。Apache取自“A Patchy Server”的读音,即充满补丁的服务器,因为Apache基于GPL发布,大量开发者不断为Apache贡献新的代码、功能、新的特性、修改原来的缺陷。

Apache服务器的特点是使用简单、速度快、性能稳定,可以做负载均衡及代理服务器来使用。

1.2 Prefork MPM工作原理

每辆汽车都有发动机引擎,不同的引擎,对车子运行效率也不一样,同样Apache也有类似工作引擎或者处理请求的模块,亦可称之为多路处理模块(Multi-Processing Modules,MPM),Apache WEB服务器有三种处理模块:Prefork MPM、Worker MPM、Event MPM。

在企业中最常用的处理模块为Prefork MPM和Worker MPM,Event MPM不支持HTTPS方式,官网也给出“This MPM is experimental, so it may or may not work as expected”提示,所以很少被使用。

默认Apache处理模块为Prefork MPM方式,Prefork采用的预派生子进程方式,Prefork用单独的子进程来处理不同的请求,进程之间是彼此独立的,所以比较稳定。

  Prefork的工作原理:控制进程Master在最初建立“StartServers”个进程后,为了满足MinSpareServers设置的最小空闲进程,所以需创建第一个空闲进程,等待一秒钟,继续创建两个,再等待一秒钟,继续创建四个,依次按照递增指数级创建进程数,最多每秒同时创建32个空闲进程,直到满足至少有MinSpareServers设置的值为止。

Apache的预派生模式(Prefork),基于预派生模式,不必在请求到来时再产生新的进程,从而减小了系统开销以增加性能,不过由于Prefork MPM引擎是基于多进程方式提供对外服务,每个进程占内存也相对较高。

1.3 Worker MPM工作原理

      相对于Prefork MPM,Worker方式是2.0版中全新的支持多线程和多进程混合模型的MPM,由于使用线程来处理,所以可以处理海量的HTTP请求,而系统资源的开销要小于基于Prefork多进程的方式。Worker也是基于多进程,但每个进程又生成多个线程,这样可以保证多线程可以获得进程的稳定性。

      Worker MPM工作原理:控制进程Master在最初建立“StartServers”个进程,每个进程会创建ThreadsPerChild设置的线程数,多个线程共享该进程内存空间,同时每个线程独立地处理用户的HTTP请求。为了不在请求到来时再生成线程,Worker MPM也可以设置最大最小空闲线程。

Worker MPM模式下同时处理的请求总数=进程总数xThreadsPerChild,也即等于MaxClients。如果服务器负载很高,当前进程数不满足需求,Master控制进程会fork新的进程,最大进程数不能超过ServerLimit数,如果需调整的StartServers进程数,需同时调整ServerLimit值。

Prefork MPM与Worker MPM引擎区别小结如下:

  • Prefork MPM模式:使用多个进程,每个进程只有一个线程,每个进程在某个确定的时间只能维持一个连接,稳定,内存开销较高;
  • Worker MPM模式:使用多个进程,每个子进程包含多个线程,每个线程在某个确定的时间只能维持一个连接,内存占用量比较小,适合大并发、高流量的WEB服务器。Worker MPM缺点是一个线程崩溃,整个进程就会连同其任何线程一起挂掉。

1.4 Apache WEB服务器安装

从Apache官方分站点下载目前稳定版本httpd-2.2.32版本,目前最新版本为2.4版本,下载地址如下:

http://mirrors.hust.edu.cn/apache/httpd/httpd-2.2.32.tar.bz2

Apache WEB服务器安装步骤如下:

tar -xjvf httpd-2.2.32.tar.bz2

tar工具解压httpd包;

cd httpd-2.2.32/

进入解压后目录;

yum install apr apr-devel apr-util apr-util-devel -y

安装APR相关优化模块;

./configure –prefix=/usr/local/apache2/ –enable-rewrite –enable-so –enable-mpms-shared=all –with-mpm=event

预编译Apache,启用rewrite规则、启用动态加载库、开启Apache三种工作引擎,如果开启模块支持,需要添加配置:

#LoadModule mpm_prefork_module modules/mod_mpm_prefork.so

#LoadModule mpm_event_module modules/mod_mpm_event.so

#LoadModule mpm_worker_module modules/mod_mpm_worker.so

make

编译

make install

安装

Apache2.2.32安装完毕,如图10-1所示:

图10-1 Apache2.2.32安装图解

启动Apache服务,临时关闭selinux、firewalld防火墙:

/usr/local/apache2/bin/apachectl start

setenforce 0

systemctl stop firewalld.service

查看Apache服务进程,通过客户端浏览器访问http://192.168.111.131/,如图10-2(a)、10-2(b)所示:

图10-2(a) Apache启动及查看进程

图10-2(b) 浏览器访问Apache WEB服务器

1.5 Apache虚拟主机企业应用

企业真实环境中,一台WEB服务器发布单个网站会非常浪费资源,所以一台WEB服务器上会发布多个网站,少则3-5个,多则2-30个网站。

在一台服务器上发布多网站,也称之为部署多个虚拟主机,WEB虚拟主机配置方法有三种:

  • 基于单IP多个Socket端口;
  • 基于多IP地址一个端口;
  • 基于单IP一个端口不同域名。

其中基于同一端口不同域名的方式在企业中得到广泛的使用和应用,如下为基于一个端口不同域名,在一台Apache WEB服务器上部署多个网站,步骤如下:

  1. 创建虚拟主机配置文件httpd-vhosts.conf,该文件默认已存在,只需去掉httpd.conf配置文件中#号即可,如图10-3所示:

图10-3 httpd.conf配置文件开启虚拟主机

  1. 配置文件/usr/local/apache2/conf/extra/httpd-vhosts.conf中代码设置为如下:

NameVirtualHost *:80

<VirtualHost *:80>

ServerAdmin support@jfedu.net

DocumentRoot “/usr/local/apache2/htdocs/jf1”

ServerName www.jf1.com

ErrorLog “logs/www.jf1.com_error_log”

CustomLog “logs/www.jf1.com_access_log” common

</VirtualHost>

<VirtualHost *:80>

ServerAdmin support@jfedu.net

DocumentRoot “/usr/local/apache2/htdocs/jf2”

ServerName www.jf2.com

ErrorLog “logs/www.jf2.com_error_log”

CustomLog “logs/www.jf2.com_access_log” common

</VirtualHost>

Httpd-vhosts.conf参数详解:

NameVirtualHost *:80 开启虚拟主机,并且监听本地所有网卡接口的80端口;

<VirtualHost *:80> 虚拟主机配置起始;

ServerAdmin support@jfedu.net 管理员邮箱;

DocumentRoot “/usr/local/apache2/htdocs/jf1” 该虚拟主机发布目录;

ServerName www.jf1.com 虚拟主机完整域名;

ErrorLog “logs/www.jf1.com_error_log” 错误日志路径及文件名;

CustomLog “logs/www.jf1.com_access_log” common 访问日志路径及文件名;

</VirtualHost> 虚拟主机配置结束。

  1. 创建www.jf1.com及www.jf2.com发布目录,重启apache服务,并分别创建index.html页面:

mkdir -p /usr/local/apache2/htdocs/{jf1,jf2}/

/usr/local/apache2/bin/apachectl restart

echo “<h1> www.jf1.com Pages</h1>” >/usr/local/apache2/htdocs/jf1/index.html

echo “<h1> www.jf2.com Pages</h1>” >/usr/local/apache2/htdocs/jf2/index.html

  1. Windows客户端设置Hosts映射,将www.jf1.com、www.jf2.com与192.168.111.131 IP进行映射绑定,映射的目的将域名跟IP进行绑定,在浏览器可以输入域名,不需要输入IP地址,绑定方法是在“C:\Windows\System32\drivers\etc”文件夹中,使用记事本编辑hosts文件,加入如下代码,如图10-4所示:

192.168.111.131 www.jf1.com

192.168.111.131 www.jf2.com

图10-4 Windows主机Hosts配置

  1. 浏览器访问www.jf1.com、www.jf2.com如图10-5(a)、10-5(b)所示,至此Apache基于多域名虚拟主机配置完毕,如果还需添加虚拟主机,直接拷贝其中一个虚拟主机配置、修改WEB发布目录即可:

图10-5(a) www.jf1.com网站返回内容

图10-5(b) www.jf2.com网站返回内容

1.6 Apache常用目录学习

Apache可以基于源码安装、YUM安装,不同的安装方法,所属的路径特不同,如下为Apache常用路径的功能用途:

/usr/lib64/httpd/modules/ Apache模块存放路径;

/var/www/html/ YUM安装Apache网站发布目录;

/var/www/error/ 服务器设置错误信息,浏览器显示;

var/www/icons/ Apache小图标文件存放目录;

var/www/cgi-bin/ 可执行的CGI程序存放目录。

/var/log/httpd/ Apache日志目录;

/usr/sbin/apachectl Apache启动脚本;

/usr/sbin/httpd Apache二进制执行文件;

/usr/bin/htpasswd 设置Apache目录密码访问;

/usr/local/apache2/bin Apache命令目录;

/usr/local/apache2/build Apache构建编译目录;

/usr/local/apache2/htdocs/ 源码安装Apache网站发布目录;

/usr/local/apache2/cgi-bin 可执行的CGI程序存放目录;

/usr/local/apache2/include Apache引用配置文件目录;

/usr/local/apache2/logs Apache日志目录;

/usr/local/apache2/man Apache帮助文档目录;

/usr/local/apache2/manual Apache手册;

/usr/local/apache2/modules Apache模块路径。

1.7 Apache配置文件详解

Apache的配置文件是Apache WEB难点,读者需要掌握配置文件中每个参数的含义,才能理解并在日常运维中去解决Apache遇到的故障,如下为Apache配置文件详解:

ServerTokens OS 显示服务器的版本和操作系统内核版本;

ServerRoot “/usr/local/apache2/” Apache主配置目录;

PidFile run/httpd.pid PidFile进程文件;

Timeout 60 不论接收或发送,当持续连接等待超过60秒则该次连接就中断;

KeepAlive Off 关闭持续性的连接;

MaxKeepAliveRequests 100 当KeepAlive设置为On的时候,该数值可以决定此次连接能够传输的最大传输数量;

KeepAliveTimeout 65 当KeepAlive设置为On的时候,该连接在最后一次传输后等待延迟的秒数;

<IfModule prefork.c> Prefork MPM引擎配置段;

StartServers 8 默认启动Apache工作进程数;

MinSpareServers 5 最小空闲进程数;

MaxSpareServers 20 最大空闲进程数;

ServerLimit 4096 Apache服务器最多进程数;

MaxClients 4096 每秒支持的最大客户端并发;

MaxRequestsPerChild 4000 每个进程能处理的最大请求数;

</IfModule>

<IfModule worker.c> Worker MPM引擎配置段;

StartServers 8 默认启动Apache工作进程数;

MaxClients 4000 每秒支持的最大客户端并发;

MinSpareThreads 25 最小空闲线程数;

MaxSpareThreads 75 最小空闲线程数;

ThreadsPerChild 75 每个进程启动的线程数;

MaxRequestsPerChild 0 每个进程能处理的最大请求数,0表示无限制;

</IfModule>

LoadModule mod_version.so 静态加载apache相关模块;

ServerAdmin support@jfedu.net 管理员邮箱,网站异常,错误信息会发生至该邮箱;

DocumentRoot “/usr/local/apache2/htdocs/” Apache网站默认发布目录;

<Directory “/data/webapps/www1”> 设置/data/webapps/www1目录权限;

AllowOverride All

Options -Indexes FollowSymLinks

Order allow,deny

Allow from all

</Directory>

AllowOverride 设置为None时,目录中.htaccess 文件将被完全忽略,当指令设置为All时,.htaccess文件生效;

Options -Indexes FollowSymLinks 禁止浏览目录,去掉”-“,表示浏览目录,常用于下载站点;

Order allow,deny 默认情况下禁止所有客户机访问;

Order deny,allow 默认情况下允许所有客户机访问;

Allow from all 允许所有客户机访问。

1.8 Apache Rewrite规则实战

Rewirte规则也称为规则重写,主要功能是实现浏览器访问HTTP URL的跳转,其正则表达式是基于Perl语言。通常而言,几乎所有的WEB服务器均可以支持URL重写。Rewrite URL规则重写的用途:

  • 对搜索引擎优化(Search Engine Optimization,SEO)友好,利于搜索引擎抓取网站页面;
  • 隐藏网站URL真实地址,浏览器显示更加美观;
  • 网站变更升级,可以基于Rewrite临时重定向到其他页面。

Apache WEB服务器如需要使用Rewrite功能,须添加Rewrite模块,基于源码安装是指定参数“–enable-rewrite”,还有一种方法可以动态添加模块,以DSO模式安装Apache,利用模块源码和Apache apxs工具完成Rewrite模块的添加。

使用Apache Rewrite,除了安装Rewrite模块之外,还需在httpd.conf中的全局配置段或者虚拟主机配置段设置如下指令来开启Rewrite功能:

RewriteEngine on

Apache Rewrite规则使用中有三个概念需要理解,分别是:Rewrite结尾标识符、Rewrite规则常用表达式、Apache Rewrite变量,如下为三个概念的详解:

  1. Apache Rewrite结尾标识符,用于Rewrite规则末尾,表示规则的执行属性。

R[=code](force redirect) 强制外部重定向;

G(force URL to be gone) 强制URL为GONE,返回410HTTP状态码;

P(force proxy) 强制使用代理转发;

L(last rule) 匹配当前规则为最后一条匹配规则,停止匹配后续规则;

N(next round) 重新从第一条规则开始匹配;

C(chained with next rule) 与下一条规则关联;

T=MIME-type(force MIME type) 强制MIME类型;

NC(no case) 不区分大小写。

  1. Apache Rewrite规则常用表达式,主要用于匹配参数、字符串及过滤设置。

. 匹配任何单字符;

[word] 匹配字符串:word;

[^word] 不匹配字符串:word;

jfedu|jfteach 可选择的字符串:jfedu|jfteach;

? 匹配0到1个字符;

* 匹配0到多个字符;

+ 匹配1到多个字符;

^ 字符串开始标志;

$ 字符串结束标志;

\n 转义符标志。

  1. Apache Rewrite变量,常用于匹配HTTP请求头信息、浏览器主机名、URL等。

HTTP headers:HTTP_USER_AGENT, HTTP_REFERER, HTTP_COOKIE, HTTP_HOST, HTTP_ACCEPT;

connection & request: REMOTE_ADDR, QUERY_STRING;

server internals: DOCUMENT_ROOT, SERVER_PORT, SERVER_PROTOCOL;

system stuff: TIME_YEAR, TIME_MON, TIME_DAY。

详解如下:

HTTP_USER_AGENT 用户使用的代理,例如浏览器;

HTTP_REFERER 告知服务器,从哪个页面来访问的;

HTTP_COOKIE 客户端缓存,主要用于存储用户名和密码等信息;

HTTP_HOST 匹配服务器ServerName域名;

HTTP_ACCEPT 客户端的浏览器支持的MIME类型;

REMOTE_ADDR 客户端的IP地址

QUERY_STRING URL中访问的字符串;

DOCUMENT_ROOT 服务器发布目录;

SERVER_PORT 服务器端口;

SERVER_PROTOCOL 服务器端协议;

TIME_YEAR 年;

TIME_MON 月;

TIME_DAY 日;

  1. Rewrite规则实战案例,以下配置均配置在httpd.conf或者vhosts.conf中,企业中常用的Rewrite案例如下:
  2. 将jfedu.net跳转至www.jfedu.net。

RewriteEngine on 启用rewrite引擎;

RewriteCond %{HTTP_HOST} ^jfedu.net [NC] 匹配以jfedu.net开头的域名,NC忽略大小写;

RewriteRule ^/(.*)$ http://www.jfedu.net/$1 [L] (.*)表示任意字符串,$1表示引用(.*)的中任意内容。

  1. 将www.jf1.com www.jf2.com jfedu.net跳转至www.jfedu.net,OR含义表示或者。

RewriteEngine on

RewriteCond %{HTTP_HOST} www.jf1.com [NC,OR]

RewriteCond %{HTTP_HOST} www.jf2.com [NC,OR]

RewriteCond %{HTTP_HOST} ^jfedu.net [NC]

RewriteRule ^/(.*)$ http://www.jfedu.net/$1 [L]

  1. 访问www.jfedu.net首页,跳转至www.jfedu.net/newindex/,R=301表示永久重定向。

RewriteEngine on

RewriteRule ^/$ http://www.jfedu.net/newindex/ [L,R=301]

  1. 访问/newindex/plus/view.php?aid=71跳转至http://www.jfedu.net/linux/。

RewriteEngine on

RewriteCond %{QUERY_STRING} ^tid=(.+)$ [NC]

RewriteRule ^/forum\.php$ /jfedu/thread-new-%1.html? [R=301,L]

  1. 访问www.jfedu.net首页,内容访问www.jfedu.net/newindex/,但是浏览器URL地址不改变。

RewriteEngine on

RewriteCond %{HTTP_HOST} ^www.jfedu.net [NC]

RewriteRule ^/$ /newindex/ [L]

  1. 访问/forum.php?tid=107258跳转至/jfedu/thread-new-107258.html。

RewriteEngine on

RewriteCond %{QUERY_STRING} ^tid=(.+)$ [NC]

RewriteRule ^/forum\.php$ /jfedu/thread-new-%1.html? [R=301,L]

  1. 访问/xxx/123456跳转至/xxx?id=123456。

RewriteEngine on

rewriteRule ^/(.+)/(\d+)$ /$1?id=$2 [L,R=301]

  1. 判断是否使用移动端访问网站,移动端访问跳转至m.jfedu.net。

RewriteEngine on

RewriteCond %{HTTP_USER_AGENT} ^iPhone [NC,OR]

RewriteCond %{HTTP_USER_AGENT} ^Android [NC,OR]

RewriteCond %{HTTP_USER_AGENT} ^WAP [NC]

RewriteRule ^/$ http://m.jfedu.net/index.html [L,R=301]

RewriteRule ^/(.*)/$ http://m.jfedu.net/$1 [L,R=301]

  1. 访问/10690/jfedu/123跳转至/index.php?tid/10690/items=123,[0-9]表示任意一个数字,+表示多个,(.+)表示任何多个字符。

RewriteEngine on

RewriteRule ^/([0-9]+)/jfedu/(.+)$ /index.php?tid/$1/items=$2 [L,R=301]