目前主流的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]