Apache Web服务器

目前主流的Web服务器软件包括:Apache、Nginx、Lighttpd、IIS、Resin、Tomcat、WebLogic、Jetty等。
ApacheHTTP server是Apache 软件基金会的一个开源的网页服务器,可以运行在几乎所有广泛使用的计算机平台上,由于其跨平台和安全性被广泛使用,是目前最流行的Web服务器端软件之一。
Apache服务器是一个多模块化的服务器,经过多次修改,成为目前世界使用排名第一的Web服务器软件。Apache取自“a patchy server”的读音,即充满补丁的服务器,因为Apache基于GPL发布,大量开发者不断为Apache贡献新的代码、功能、新的特性、修改原来的缺陷。
Apache服务器的特点是使用简单、速度快、性能稳定,可以作为负载均衡及代理服务器来使用。
Apache服务器有三种处理模块:Prefork MPM、Worker MPM、Event MPM。
prefork模式:
prefork是Unix平台上的默认(缺省)MPM,使用多个子进程,每个子进程只有一个线程。每个进程在某个确定的时间只能维持一个连接,效率高,但内存占用量比较大。
这个多路处理模块(MPM)实现了一个非线程型的、预派生的web服务器,它的工作方式类似于Apache1.3。它适合于没有线程安全库,需要避免线程兼容性问题的系统。它是要求将每个请求相互独立的情况下最好的MPM,这样若一个请求出现问题就不会影响到其他请求。
worker模式:
worker使用多个子进程,每个子进程有多个线程,每个线程在某个确定的时间只能维持一个连接,内存占用量比较小,适合高流量的http服务器。缺点是假如一个线程崩溃,整个进程就会连同其任何线程一起”死掉”,所以要保证一个程式在运行时必须被系统识别为”每个线程都是安全的”。
此多路处理模块(MPM)使网络服务器支持混合的多线程多进程。由于使用线程来处理请求,所以可以处理海量请求,而系统资源的开销小于基于进程的MPM。但是它也使用了多进程,每个进程又有多个线程,以获得基于进程的MPM的稳定性。
prefork和worker模式的比较
prefork模式使用多个子进程,每个子进程只有一个线程。每个进程在某个确定的时间只能维持一个连接。在大多数平台上,PreforkMPM在效率上要比WorkerMPM要高,但是内存使用大得多。prefork的无线程设计在某些情况下将比worker更有优势:它可以使用那些没有处理好线程安全的第三方模块,并且对于那些线程调试困难的平台而言,它也更容易调试一些。
worker模式使用多个子进程,每个子进程有多个线程。每个线程在某个确定的时间只能维持一个连接。通常来说,在一个高流量的HTTP服务器上,WorkerMPM是个比较好的选择,因为Worker MPM的内存使用比Prefork MPM要低得多。但workerMPM也由不完善的地方,如果一个线程崩溃,整个进程就会连同其所有线程一起"死掉"。由于线程共享内存空间,所以一个程序在运行时必须被系统识别为"每个线程都是安全的"。
总的来说,prefork方式速度要稍高于worker,然而它需要的cpu和memory资源也稍多于woker。
 
Apache Web服务器安装:
yuminstall httpd -y  或者使用源码包安装如下:
wget http://mirrors.shu.edu.cn/apache//httpd/httpd-2.4.35.tar.bz2    下载压缩包
tar-xjvf httpd-2.4.35.tar.bz2     解压压缩包
cd httpd-2.4.35/       进入解压后目录
yuminstall apr apr-devel apr-util apr-util-devel -y  安装apr相关移植库模块
./configure--prefix=/usr/local/apache2/  --enable=rewrite  --enable-so   预编译Apache,启用rewrite规则、启用动态加载库
make   编译
makeinstall    安装
启动Apache服务,临时关闭SELinux、firewalld防火墙。
/usr/local/apache2/bin/apachectlstart
setenforce 0
systemctl  stop firewalld.service
yum 安装默认配置文件在/etc/httpd/conf
 
Apache 虚拟主机企业应用:
企业真实环境中,一台Web服务器发布单个网站非常浪费资源,所以一台Web服务器上会发布多个网站 ,在一台服务器上发布多网站,也称之为部署多个虚拟主机,Web虚拟主机配置方法有以下三种:
基于单IP多个socket端口;
基于多IP地址一个端口;
基于单IP一个端口不同域名。
基于同一端口不同域名的方式在企业中得到广泛应用,以下为基于一个端口不同域名,在一台Apache Web服务器上部署多个网站,步骤如下:
1、修改配置文件/etc/httpd/conf.d/httpd-vhosts.conf
NameVirtualHost*:80    开启虚拟主机,并且监听本地所有网卡接口的80端口
<VirtualHost*:80>    虚拟主配置起始
   ServerAdmin root@localhost    管理员邮箱
   DocumentRoot "/var/www/html"    虚拟主机发布目录
   ServerName "www.wuyutang.top"      虚拟主机完整域名
   ErrorLog"/var/log/httpd/www_error_log"    错误日志路径及文件名
   CustomLog"/var/log/httpd/www_access_log" common     访问日志路径及文件名
</VirtualHost>       虚拟主机配置结束
<VirtualHost*:80>
   ServerAdmin root@localhost
   DocumentRoot "/var/www/html2"
   ServerName "tang.wuyutang.top"
   ErrorLog"/var/log/httpd/tang_error_log"
   CustomLog"/var/log/httpd/tang_access_log" common
</VirtualHost>
创建两个网站的发布目录,重启Apache服务。
mkdir -p/var/www/{html,html2}
 
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模块路径
 
Apache 配置文件详解:
ServerTokensOS    显示服务器的版本和操作系统内核版本
ServerRoot"/etc/httpd/"    Apache主配置目录
PidFilerun/httpd.pid    PidFile进程文件
Timeout60  不论接收或发送,当持续连接等待超过60秒则该次连接就中断
KeepAliveOff   关闭持续性的连接
MaxKeepAliveRequests100    当KeepAlive设置为On的时候,访数值可以决定此次连接能够传输的最大传输数量
KeepAliveTimeout 65   当KeepAlive设置为On的时候,该连接在最后一次传输后等待延迟的秒数
<IfModuleprefork.c>     Prefork MPM引擎配置段
StartServers8    默认启动Apache工作进程数
MinSpareServers5    最小空闲进程数
MaxSpareServers20    最大空闲进程数
ServerLimit   4096 Apache服务器最多进程数
MaxClients   4096  每秒支持的最大客户端并发数
MaxRequestsPerChild4000    每个进程能处理的最大请求数
</IfModule>    定义模块,模块标签
<IfModuleworker.c>    Worker MPM引擎配置段
StartServers8    默认启动Apache工作进程数
MaxClients4000    每秒支持的最大客户端并发
MinSpareThreads   25    最小空闲线程数
MaxSpareThreads   75    最大空闲线程数
ThreadsPerChild  75     每个进程启动的线程数
MaxRequestsPerChild  0    每个进程能处理的最大请求数,0表示无限制
</IfModules>       定义模块,模块标签
LoadModulemod_version.so     静态加载Apache相关模块
ServerAdminroot@localhost    管理员邮箱,网站异常,错误信息会发到这该邮箱
DocumentRoot"/var/www/html"    Apache 网站默认发布目录
<Directory"/var/www/html">     设置该目录权限
AllowOverrideAll     加载发布目录中.htaccess文件
Options-Indexes  FollowSymLinks    禁止发布目录以目录方式被浏览
Orderallow ,deny     访问顺序,先检查允许设置,没有允许的设置都拒绝
Allowfrom all    允许所有客户端访问
</Directory>    定义目录,目录标签
AllowOverride   设置为None时,目录中.htaccess文件将被完全忽略,当指令设置为All时则生效
Options-Indexes FollowSymLinks   禁止浏览目录,去掉“-”,表示浏览目录,常用于下载站点
Orderallow,deny    默认情况下允许所有客户机访问
Order  deny,allow   默认情况下禁止所有客户机访问
Allowfrom all   允许所有客户机访问
 
Apache rewrite规则实战:
rewrite规则也称为规则重写,主要功能是实现浏览器访问HTTP URL的跳转,其规则表达式是基于Perl语言,rewrite URL规则重写的用途如下:
对搜索引擎优化(SEO)友好,利于搜索引擎抓取网站页面;
隐藏网站URL真实地址,浏览器显示更加美观;
网站变更升级,可以基于rewrite临时重定向到其他页面。
ApacheWeb服务器如需使用rewrite功能,须添加rewrite模块,基于源码安装是指定参数“--enable-rewrite”,除了安装rewrite模块之外,还需在httpd.conf中的全局配置段或虚拟主机配置段添加:
RewriteEngineon
rewrite规则使用中有三个概念:
rewrite结尾标识符、rewrite规则常用表达式、Apache rewrite变量。
1、Apache rewrite结尾标识符,用于rewrite规则末尾,表示规则的执行属性。
R[=code](force redirect)   强制外部重定向
G(forceURL to be gone)   强制URL为gone,返回410 HTTP状态码
P(forceproxy)   强制使用代理转发
L(lastrule)    匹配当前规则为最后一条匹配规则,停止匹配后持续规则
N(nextround)    重新从第一条规则开始匹配
C(chainedwithnext rule)    与下一条规则关联
T=MIME-type(forceMIME type)   强制MIME类型
NC(nocase)    不区分大小写
2、Apache rewrite规则常用表达式,主要用于匹配参数、字符串及过滤设置。
.     匹配任何单字符
[word]     匹配字符串word
[^word]     不匹配字符串word
tang|TANG   可选择字符串tang|TANG
?    匹配0到1个字符
*    匹配0到多个字符
+    匹配1到多个字符
^      字符串开始标志
$      字符串结束标志
\      转义符标志
3、Apache rewrite变量,常用于匹配HTTP请求头信息、浏览器主机名、URL等
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      日
4、rewrite规则实战案例,以下配置均配置在httpd.conf 或者vhosts.conf中,企业中常用案例如下:
将wuyutang.top 跳转至www.wuyutang.top说明如下:
RewtiteEngineon     启用rewrite引擎
RewriteCond%{HTTP_HOST} ^wuyutang.top [NC]    匹配以wuyutang.top开头的域名,NC忽略大小写
RewriteRule^/(.*)$http://www.wuyutang.top/$1 [L] (.*)表示任意字符串,$1表示引用(.*)中任意内容
将www.tang1.com、www.tang2.com跳转至www.wuyutang.top,OR含义表示或者,代码如下:
RewriteEngineON
RewriteCond% {HTTP_HOST}  www.tang1.com  [NC,OR]
RewriteCond% {HTTP_HOST}  www.tang2.com  [NC,OR]
RewriteCond% {HTTP_HOST}  ^wuyutang.top          [NC]
RewtiteRule  ^/(.*)$ http://www.wuyutang.top/$1       [L]
访问www.wuyutang.top首页,跳转至www.wuyutang.top/newindex/,R=301表示永久重定向。
RewriteEngine  ON
RewriteRule  ^/$ http://www.wuyutang.top/newindex/   [L,R=301]
访问/newindex/plus/view.php?aid=71跳转至http://www.wuyutang.top/linux/。
RewriteEngineon
RewriteCond% {QUERY_STRING} ^tid=(.+)$      [NC]
RewriteRule^/forum\.php$ /wuyutang/thread -new-%1.html? [R=301,L]
访问www.wuyutang.top首页,内容访问www.wuyutang.top/newindex/,但浏览器URL地址不改变。
RewriteEngine  ON
RewriteCond% {HTTP_HOST}  ^www.wuyutang.top  [NC]
RewriteRule^/$  /newindex/       [L]
访问/forum.php?tid=107258跳转至/wuyutang/thread-new-107258.html。
RewriteEngineon
RewriteCond% {QUERY_STRING} ^tid=(.+)$       [NC]
RewriteRule^/forum\.php$ /wuyutang/thread-new-%1.html?  [R=310,L]
访问/xxx/123456  跳转至/xxx?id=123456。
RewriteEngine  on
RewriteRule  ^/(.+)/(\d+)$ /$1?id=$2    [L,R=301]
判断是否使用移动端访问网站,移动端访问跳转至m.wuyutang.top。
RewriteEngineon
RewriteCond% {HTTP_USER_AGENT}  ^iPone       [NC,OR]
RewriteCond% {HTTP_USER_AGENT}  ^Android   [NC,OR]
RewriteCond% {HTTP_USRE_AGENT}  ^WAP         [NC]
RewriteRule^/$   http://m.wuyutang.top/index.html    [L,R=301]
RewriteRule^/(.*)/$  http://m.wuyutang.top/$1         [L,R=301]
访问/10690/wuyutang/123 跳转至/index.php?tid/10690/items=123,[0-9]表示任意一个数字,+表示多个,(.+)表示任何多个字符。
RewriteEngineon
RewriteRule  ^/([0-9]+)/wuyutang/(.+)$   /index.php?tid/$1/items=$2      [L,R=301]