目录
引言
一、常见的http服务程序
(一)lls
(二)nginx
(三)Apache
(四)Tomcat
二、Apache特点
三、Apache服务的安装
(一)yum安装及配置文件
1.配置文件
(二)编译安装
四、HTTP配置
(一)指定服务器名称
(二)监听端口
(三)包含其它子配置文件
(四)隐藏服务器版本信息
(五)持久连接
(六)DSO
(七)MPM 多路处理模块
1.prefork模块
2.worker和event 模式相关的配置
(八)定义Main server的文档页面路径
(九)虚拟主机
1.基于IP地址
2.基于端口号
3.基于域名
(十)基于客户端 IP 地址实现访问控制
1.黑名单
2.白名单
引言
在互联网世界中,Web服务器扮演着至关重要的角色,它们是连接用户与网站内容的桥梁。其中,Apache HTTP Server(简称Apache)作为全球使用最为广泛的开源Web服务器软件之一,其影响力和普及度不容小觑。本文旨在带你走进Apache的世界,解析其核心功能,并探讨实际应用中的关键配置与优化实践。
一、常见的http服务程序
(一)lls
Windows 系统中默认 Web 服务程序是lIS(Internet Information Services),这是一款图形化的网站管理工具,IIS 程序不光能提供 Web 网站服务,还能够提供FTP、NMTP、SMTP 等服务功能,但只能在 Windows 系统中使用。
(二)nginx
nginx--最初于 2004年 10月4日为俄罗斯知名门户站点而开发的,作为一款轻量级的网站服务软件,因其稳定性和丰富的功能而深受信赖,但最最最被认可的是低系统资源、占用内存少且并发能力强,目前国内如新浪、网易、腾讯等门户站均使用。
(三)Apache
Apache--取自美国印第安人土著语 Apache,寓意着拥有高超的作战策略和无穷的耐性,由于其跨平台和安全性广泛被认可且拥有快速、可靠、简单的 API扩展。目前拥有很高的 Web 服务软件市场占用率,全球使用最多的 Web服务软件,开源、跨平台(可运行于Unix,linux,windows 中)。
·支持基于IP或域名的虚拟主机
·支持多种方式的 HTTP 认证
·集成代理服务器模块
·安全 Socket层(SSL)
·能够实时见识服务状态与定制日志
·多种模块的支持
(四)Tomcat
Tomcat--属于轻量级的Web服务软件,一般用于开发和调试JSP 代码,通常认为Tomcat是 Apache 的扩展程序。
总结来说Nginx程序作为 Web 服务软件届的后起之秀已经通过自身的努力与优势赢得了大批站长的信赖,但是 Apache 程序作为老牌的 Web 服务软件因其卓越的稳定性与安全性成为了红帽 RHEL7 系统中默认的网站服务软件。
二、Apache特点
apache 功能:
提供http协议服务
多个虚拟主机:IP、Port、FQDN
CGI:Common Gateway Interface,通用网关接口,支持动态程序
反向代理
负载均衡
路径别名
丰富的用户认证机制:basic,digest
支持第三方模块
apache特性:
高度模块化:core + modules
DSO:Dynamic Shared Object 动态加载/卸载
MPM:multi-processing module 多路处理模块
MPM multi-processing module 工作模式
prefork:多进程I/O模型,每个进程响应一个请求,CentOS 7 httpd默认模型一个主进程:生成和回收n个子进程,创建套接字,不响应请求多个子进程:工作 work进程,每个子进程处理一个请求;系统初始时,预先生成多个空闲进程,等待请求
Prefork MPM预派生模式,有一个主控制进程,然后生成多个子进程,每个子进程有一个独立的线程响应用户请求,相对比较占用内存,但是比较稳定,可以设置最大和最小进程数,是最古老的一种模式,也是最稳定的模式,适用于访问量不是很大的场景
优点:稳定
缺点:慢,占用资源,不适用于高并发场景
worker:复用的多进程I/O模型,多进程多线程,IIS使用此模型
一个主进程:生成m个子进程,每个子进程负责生个n个线程,每个线程响应一个请求,并发响应请求:m*n
worker MPM是一种多进程和多线程混合的模型,有一个控制进程,启动多个子进程,每个子进程里面包含固定的线程,使用线程程来处理请求,当线程不够使用的时候会再启动一个新的子进程,然后在进程里面再启动线程处理请求,由于其使用了线程处理请求,因此可以承受更高的并发。
优点:相比prefork 占用的内存较少,可以同时处理更多的请求
缺点:使用keep-alive的长连接方式,某个线程会一直被占据,即使没有传输数据,也需要一直等待到超时才会被释放。如果过多的线程,被这样占据,也会导致在高并发场景下的无服务线程可用。(该问题在prefork模式下,同样会发生)
event:事件驱动模型(worker模型的变种),CentOS8 默认模型
一个主进程:生成m个子进程,每个子进程负责生个n个线程,每个线程响应一个请求,并发响应请求:m*n,有专门的监控线程来管理这些keep-alive类型的线程,当有真实请求时,将请求传递给服务线程,执行完毕后,又允许释放。这样增强了高并发场景下的请求处理能力
event MPM是Apache中最新的模式,2012年发布的apache 2.4.X系列正式支持event 模型. 属于事件驱动模型(epoll),每个进程响应多个请求,在现在版本里的已经是稳定可用的模式。它和worker模式很像,最大的区别在于,它解决了keep-alive场景下,长期被占用的线程的资源浪费问题(某些线程因为被keep-alive,空挂在哪里等待,中间几乎没有请求过来,甚至等到超时)。event MPM中,会有一个专门的线程来管理这些keep-alive类型的线程,当有真实请求过来的时候,将请求传递给服务线程,执行完毕后,又允许它释放。这样增强了高并发场景下的请求处理能力event只在有数据发送的时候才开始建立连接,连接请求才会触发工作线程,即使用了TCP的一个选项,叫做延迟接受连接TCP_DEFER_ACCEPT,加了这个选项后,若客户端只进行TCP连接,不发送请求,则不会触发Accept操作,也就不会触发工作线程去干活,进行了简单的防攻击(TCP连接)
优点:单线程响应多请求,占据更少的内存,高并发下表现更优秀,会有一个专门的线程来管理keep-alive类型的线程,当有真实请求过来的时候,将请求传递给服务线程,执行完毕后,又允许它释放
缺点:没有线程安全控制
httpd-2.4:event 稳定版,centos7 以后默认
httpd-2.2:event 测试版,centos6 默认
我们在使用yum安装httpd的时候默认的是使用prefork工作模块
可以手动进行工作模式的切换
修改完毕之后,重启服务
可以看到,切换到event模式后,会开启很多线程,而prefork则没有线程
三、Apache服务的安装
(一)yum安装及配置文件
首先来讲解使用yum安装
yum install httpd -y
Apache服务的安装包名称叫做httpd,下载时需要注意
1.配置文件
/etc/httpd/conf/httpd.conf 主配置文件
[root@localhost data]#grep -i "^[a-z]" /etc/httpd/conf/httpd.conf
ServerRoot "/etc/httpd"
#指定了Apache服务器的根目录位置。
Listen 80
#指示Apache监听HTTP请求的端口号为80。
Include conf.modules.d./﹡.conf
#包含conf.modules.d目录下的所有.conf文件,这些通常用来加载和管理模块。
User apache
Group apache
#定义了Apache服务器运行时使用的系统用户和组账号。
ServerAdmin root@localhost
#设置管理员邮箱地址,当服务器发生错误时,可能会通过此地址发送通知邮件。
DocumentRoot "/var/www/html"
#指定网站的根目录(web根目录),网页文件将从这里提供给访问者。
ErrorLog "logs/error_log"
#设置错误日志文件的位置。
LogLevel warn
#定义了记录到日志中的信息级别,这里是“warn”级别,即记录警告及更严重级别的消息。
AddDefaultCharset UTF-8
#设置默认字符集为UTF-8,用于处理未明确声明字符集的文档。
EnableSendfile on
#启用sendfile系统调用,可能提高静态文件传输性能。
IncludeOptional conf.d/﹡.conf
#包含conf.d目录下的所有.conf文件,这些通常包含额外的配置或特定站点的虚拟主机配置。
/etc/httpd/conf.d/*.conf 子配置文件
在/etcs/httpd/conf.d/目录下新建以.conf结尾的文件,都会读取生效,且优先级大于主配置文件
在下面的优化中会进行演示
/etc/httpd/conf.d/conf.modules.d/ 模块加载的配置文件
00-base.conf
#基础模块配置文件,可能包含了启动时默认加载的基本模块配置。
00-dav.conf
#与WebDAV(Web-based Distributed Authoring and Versioning)相关的模块配置,允许用户通过HTTP协议对服务器上的文件进行远程管理。
00-lua.conf
#与Lua脚本语言集成相关的模块配置,如mod_lua,用于在Apache服务器上运行Lua脚本。
00-mpm.conf
#Multi-Processing Module (MPM) 配置文件,定义了Apache如何处理并发连接和多线程/多进程模型。
00-proxy.conf
#代理模块配置,如mod_proxy,用于设置Apache作为反向代理或正向代理,转发来自客户端的请求到其他服务器。
00-systemd.conf
#Systemd系统和服务管理器相关的配置,确保Apache服务与Systemd兼容并正确集成。
01-cgi.conf
#Common Gateway Interface (CGI) 模块配置,允许Apache通过CGI接口执行外部脚本程序(如Perl、Python等)以生成动态内容。
检查命令及配置语法:httpd -t
c | 在读取配置⽂件前,先执⾏选项中的指令 |
C | 在读取配置⽂件后,再执⾏选项中的指令 |
d<服务器根⽬录> | 指定服务器的根⽬录 |
D<设定⽂件参数> | 指定要传⼊配置⽂件的参数 |
f<设定⽂件> | 指定配置⽂件 |
h | 显示帮助 |
l | 显示服务器编译时所包含的模块 |
L | 显示httpd指令的说明 |
S | 显示配置⽂件中的设定 |
t | 测试配置⽂件的语法是否正确 |
v | 显示版本信息 |
V | 显示版本信息以及建⽴环境 |
X | 以单⼀程序的⽅式来启动服务器 |
M | 显示动态模块 |
服务单元文件:
/usr/lib/systemd/system/httpd.service
配置文件:/etc/sysconfig/httpd
站点网页文档根目录:/var/www/html
在访问httpd服务时,访问的目录为/var/www/html下的文件
在配置文件中可以进行修改
DocumentRoot "/path”
<directory /path>
Require all granted
</directory>
DocumentRoot指向的路径为URL路径的起始位置
/path 必须显式授权后才可以访问
这是因为在配置文件中制定了默认的文件名
比如在文件中条件其它自定义名称后,会按顺序进行查找
首先新建一个名为pla.test的文件
使用其它机器访问时就会默认匹配前面的文件名,将没有匹配到的默认文件名忽略
再建一个名为index.txt的文件
再进行访问时就会匹配最前面的自定义名称
模块文件路径:
/etc/httpd/modules
/usr/lib64/httpd/modules
一些模块配置,不需要去关注
(二)编译安装
编译安装可以指定工作模块,可以在官方文档中查看
下面提供几个下载地址,可以自己进行编译安装
https://downloads.apache.org/apr/apr-1.7.0.tar.bz2
https://downloads.apache.org//apr/apr-util-1.6.1.tar.bz2
https://downloads.apache.org//httpd/httpd-2.4.46.tar.bz2
四、HTTP配置
在修改配置文件之前养成好习惯,先进行备份
cp conf/httpd.conf conf/httpd.conf.bak
(一)指定服务器名称
之前在使用httpd -t检查配置文件时出现一条报错信息
可以将95行的注释信息开启,也可以自定义域名
再次进行检查就没有报错信息了,也就是指定域名
重新之后就会生效了
(二)监听端口
httpd默认的监听端口号是80
可以在主配置文件中修改
再次访问的时候会拒绝,因为默认是80,而httpd服务不再监听80端口
可以同时监听多个端口,在设置时,省略IP地址,表示监听本机的所有IP地址
添加一块临时网卡:ifconfig ens33:0 192.168.83.111/24
访问htppd服务时,无论访问哪一个IP地址的9527端口都可以
但是在访问10086端口时,只能访问192.168.83.40的10086端口
(三)包含其它子配置文件
为什么在/etc/httpd/conf.d/下新建一个以.conf结尾的文件,就可以当作配置文件生效?
这是因为,在主配置文件中也规定了
Include 和 IncludeOptional 指令用于包含其他配置文件或目录下的所有匹配的配置文件。
Include和IncludeOptional功能相同,都可以包括其它配置文件
但是当无匹配文件时,include会报错,IncludeOptional将继续加载其余配置,不会导致错误
(四)隐藏服务器版本信息
在Apache HTTP Server中,可以通过配置文件隐藏服务器版本信息以增强安全性,防止攻击者利用已知的软件漏洞。
可以在配置文件中添加ServerTokens字段来设置显示的版本信息
ServerTokens Major|Minor|Min[imal]|Prod[uctOnly]|OS|Full
选项 | 显示信息 |
ServerTokens Prod | Server: Apache |
ServerTokens Major | Server: Apache/2 |
ServerTokens Minor | Server: Apache/2.0 |
ServerTokens Min | Server: Apache/2.0.41 |
ServerTokens OS | Server: Apache/2.0.41 (Unix) |
ServerTokens Full | Server: Apache/2.0.41 (Unix) PHP/4.2.2 MyMod/1. |
ServerTokens Prod:只显示服务名称
ServerTokens Major:显示主要版本号
ServerTokens Minor:显示主要和次要版本号
ServerTokens Min:显示最小化但仍然包含具体版本信息的标识
ServerTokens OS:显示服务器软件、主要和次要版本号以及操作系统信息
此为默认值
ServerTokens Full:显示完整的服务器标识,包括服务器软件、完整版本号、操作系统及可能存在的其他模块版本信息
(五)持久连接
Persistent Connection:连接建立,每个资源获取完成后不会断开连接,而是继续等待其它的请求完成,默认开启持久连接。虽然效果比较好,但是对并发访问量大的服务器,持久连接会使有些请求得不到响应。可以通过设置限制条件来主动断开连接。
断开条件:
时间限制:以秒为单位, 默认5s,httpd-2.4 支持毫秒级
请求数量: 请求数达到指定值,也会断开
在客户端使用telnet进行测试
(六)DSO
DSO (Dynamic Shared Object):加载动态模块配置,不需重启即生效动态模块所在路径
查看静态编译的模块:httpd -l
查看静态编译及动态装载的模块:httpd -M
其模块存放位置在vim /etc/httpd/conf.modules.d目录下
想要禁用哪个模块,直接打开文件进行注释就可以,前提是了解好模块的作用再决定是否注释或启用
(七)MPM 多路处理模块
httpd 支持三种MPM工作模式:prefork, worker, event
vim /etc/httpd/conf.modules.d/00-mpm.conf
1.prefork模块
开启prefork模块
开启后重新启动服务:systemctl restart httpd
正常开启进程后,会开启五个子进程
注意:startservers与10之间只能有一个空格,否则会出现语法错误
重启服务后会发现,会同时开启10个子进程
StartServers | 最初始开启进程数 |
MinSpareServers | 空闲时最少预留 |
MaxSpareServers | 空闲时最大预留 |
ServerLimit | 最多进程数,最大值 20000 |
MaxRequestWorkers | 最大的并发连接数,默认256 |
MaxConnectionsPerChild | 子进程最多能处理的请求数量。在处理MaxRequestsPerChild 个请求之后,子进程 将会被父进程终止,这时候子进程占用的内存就会释放(为0时永远不释放) |
MaxRequestsPerChild | 从httpd.2.3.9开始被MaxConnectionsPerChild代替 |
2.worker和event 模式相关的配置
ServerLimit | 这个指令限制了服务器可以同时运行的子进程总数。默认情况下,它会设置为与 MaxRequestWorkers相同的值,但在某些情况下,用户可能需要增加此值以支持 更多的并发连接。注意:修改这个值通常需要重新编译Apache |
processes | 在Apache文档中并没有直接对应的processes配置项。但StartServers与此有关, 表示启动时创建的工作进程数量。 |
StartServers | 在worker或event模式下,StartServers指定了Apache启动时应启动多少个工作进程 。每个工作进程内包含多个线程来处理请求。 |
MaxRequestWorkers | 这个参数定义了Apache可以同时处理的最大请求数量,即最多能有多少个客户端请 求被并行服务。这包括所有正在处理和等待处理的请求总数。 |
simultaneously | 这不是一个Apache配置选项,但确实描述了MaxRequestWorkers的作用,即允许 Apache同时处理的请求数量。 |
MinSpareThreads | 指定在任何时刻系统至少要保持的空闲线程数。如果当前的空闲线程数低于这个值, Apache将会创建新的线程。 |
MaxSpareThreads | 定义了在任何时刻系统最多可以存在的空闲线程数。当达到这个数值时,Apache将 停止创建新的线程,即使有更多空闲。 |
ThreadsPerChild | 在worker或event模式下,每个工作进程中包含的线程数。这意味着每个工作进程能 够并行处理多个请求。 |
重启服务后,查看进程数量
(八)定义Main server的文档页面路径
在上面的配置文件中,已经讲解过文档页面路径以及重新定义的方法,下面说一说别名的定义
注释
因为只是做别名,并不需要重新指明文档默认路径,所以不需要在开头行加DocumentRoot而指向的路径为URL路径的起始位置
准备完毕后重启服务:systemctl restart httpd
使用客户机访问test时就相当于访问/data/http/
(九)虚拟主机
httpd 支持在一台物理主机上实现多个网站,即多虚拟主机
虚拟主机:在一台服务器中分出一定的磁盘空间供用户放置网站、存放数据等,仅提供基础的网站访问、数据存放与传输流量功能,能够极大的降低用户费用,也几乎不需要管理员维护除网站数据以外的服务,适合小型网站。
1.基于IP地址
首先,添加一个临时IP,也可以之间添加网卡
将/usr/share/doc/httpd-2.4.6/httpd-vhosts.conf模板文件中的大约23-38行复制到/etc/httpd/conf.d/目录下新建一个以.conf结尾的子配置文件当中
新建一个子配置文件
vim /etc/httpd/conf.d/vhost.conf
<Directory "/data/http">
AllowOverride None
# Allow open access:
Require all granted
</Directory>
#对/data/http目录进行授权
<VirtualHost 192.168.83.40>
#定义了这个虚拟主机监听的IP地址
ServerAdmin root@localhost
#设置服务器管理员邮箱地址,当发生错误时,可能会向这个邮箱发送通知
DocumentRoot "/data/http/nice"
#指定网站根目录的位置。访问者通过域名访问时,网页资源将从此路径提供
ServerName www.kysw.com
#设置虚拟主机的域名,任何指向www.accp.com的HTTP请求都将匹配到这个虚拟主机配置
ErrorLog "/data/http/nice/nice-error_log"
#配置错误日志文件的位置,所有与该虚拟主机相关的错误信息将被记录在这个文件中
CustomLog "/data/http/nice/nice-access_log" common
#设置访问日志文件位置,客户端对网站的所有访问请求都会按common格式记录在此日志文件内。
</VirtualHost>
<VirtualHost 192.168.83.200>
ServerAdmin root@localhost
DocumentRoot "/data/http/good"
ServerName www.kysw.com
ErrorLog "/data/http/good/good-error_log"
CustomLog "/data/http/good/good-access_log" common
</VirtualHost>
重启服务后进行测试:systemctl restart httpd
使用客户端进行测试
2.基于端口号
不需要添加网卡,只需要在IP地址后面添加不同的端口号即可
重启服务后进行测试:systemctl restart httpd
3.基于域名
将不同的路径的servername换成自定的不同的域名
重启服务后进行测试:systemctl restart httpd
在客户端/etc/hosts文件中添加域名解析,将服务端的IP地址与自定义的不同的域名添加进去,通过不同的域名,获取不同的信息
(十)基于客户端 IP 地址实现访问控制
1.黑名单
黑名单,不能有失效,至少有一个成功匹配才成功,即失败优先
在新建的子配置文件中添加以下内容
#这段配置内容描述了对/opt目录及其资源的访问控制规则,并设置了一个别名指向 /test
<directory /opt> #定义一个虚拟目录,这里的路径是服务器上的实际物理路径/opt
<RequireAll> #在此标签内定义的所有条件都必须满足时,用户才能被允许访问该目录
require all granted #表示允许所有用户访问/opt目录下的资源。
require not ip 192.168.83.100 #拒绝192.168.83.100这个IP地址访问
</RequireAll> #结束<RequireAll>标签块
</directory> #结束<directory /opt>标签块。
alias /test /opt/html #别名
在/opt下建立html目录。并在目录下添加一个index.html文件输入内容
拒绝的IP地址十无法访问的
其它地址都可以访问
2.白名单
白名单,多个语句有一个成功,则成功,即成功优先
将子配置文件中的黑名单信息替换为以下内容
#这段配置内容描述了对/opt目录及其资源的访问控制规则,并设置了一个别名指向 /test
<directory /opt> #定义一个虚拟目录,这里的路径是服务器上的实际物理路径/opt
<RequireAny> #在此标签内定义的所有条件都必须满足时,用户才能被允许访问该目录
require all denied #表示拒绝所有用户访问/opt目录下的资源。
require ip 192.168.83.100 #允许192.168.83.100这个IP地址访问
</RequireAny> #结束<RequireAny>标签块
</directory> #结束<directory /opt>标签块。
alias /test /opt/html #别名
所有IP地址都拒绝访问,只有白名单的IP地址可以访问