4.3 http web服务器
web服务器也称为WWW(WORLD WIDE WEB)服务器,主要功能是提供网上信息浏览服务:向发出请求的浏览器提供文档的程序。最常用的Web服务器是
Apache、Nginx和Microsoft的Internet信息服务器(Internet Information Services,IIS)
。
4.3.1 提供http web服务的应用程序
客户端:IE、火狐、Chrome等浏览器,属于http web服务的客户端应用程序。
服务器端:
httpd
– Apache开发的一款服务器端web服务应用程序。其他服务器端应用程序比如
nginx、lighttpd、IIS
等。
只能处理静态页面(html),如需解析动态页面(jsp),可以通过反向代理将请求发送到后端的服务器完成动态页面处理,例如tomcat、IIS等。
httpd、nginx
tomcat
擅长解析动态页面(JSP),tomcat本身也支持html,只是性能不如httpd。
流行的动态页面有:JSP、ASP、PHP、PERL等。
:微软开发的服务器端http web服务应用程序。只支持windows系统,付费。
IIS
apache httpd、nginx
:开源的,支持linux、windows等。
web服务器市场占有率统计:
www.netcraft.com
4.3.2 httpd
1995开源社区发布Apache(a patchy server),后来发展状态成立了ASP(apache software foundation)。
1、httpd特性:
- 高度模块化:
。需要用什么模块加载什么模块。core + modules
- DSO: Dynamic Shared Object 动态加/卸载。
- MPM:multi-processing module多路处理模块。 MPM有三种工作模式,不同模式对应了不同的web响应模型。
2、MPM工作模式小结:
prefork
模式:多进程I/O模型,每个进程响应一个请求,默认模型。
一个主进程:生成和回收n个子进程,创建套接字,不响应请求;
多个子进程:工作work进程,每个子进程处理一个请求;系统初始时,预先生成多个空闲进程,等待请求,最大不超过1024个。
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyZuBnL3UTNzIWOkR2NwETNwQTN5YTZwQTO2AzNhRGMlRWZ2U2Lc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
prefork模式
worker
模式:复用的多进程I/O模型,多进程多线程,IIS使用此模型。
一个主进程:生成m个子进程,每个子进程负责生个n个线程,每个线程响应一个请求,并发响应请求:m*n。
worker模式
event
模式:事件驱动模型(worker模型的变种)。
一个主进程:生成m个子进程,每个进程直接响应n个请求,并发响应请求:m*n,有专门的线程来管理这些keep-alive类型的线程,当有真实请求时,将请求传递给服务线程,执行完毕后,又允许释放。这样增强了高并发场景下的请求处理能力。 event
模式httpd-2.4才成为稳定版。
event模式
处理请求中,进程角色切换模型:
进程角色切换
3、httpd功能概述
- 虚拟主机,一个主机可以创多个虚拟机,从而支持多个web网站。可以通过
区分。IP、Port、FQDN
FQDN:(Fully Qualified Domain Name)完全限定域名:同时带有主机名和域名的名称。(通过符号“.”)例如:主机名是,域名是
bigserver
,那么FQDN就是
mycompany.com
。
bigserver.mycompany.com
-CGI:Common Gateway Interface,通用网关接口。
html网页动态内容,需要在服务器端执行脚本后返回执行结果,则需要CGI转换。
- 反向代理:httpd服务器可以作为反向代理服务器(一个调度器),根据客户端请求类型,调度后台服务器完全请求处理。不是httpd擅长的,nginx性能更好。
- 负载均衡:httpd不擅长,有这个功能。
4、httpd安装
使用使用centos7发行版自带的httpd版本rpm方式安装:
yum install -y httpd
。 如有特殊需求需要装指定版本,可采用编译方式安装。
:查看httpd是否已安装。
rpm -q httpd
:装完后,查看httpd的文件列表。
rpm -ql httpd
:查询httpd的概要信息。
rpm -qi httpd
:查看哪些模块已经被加载了,分为静态编译模块和动态加载模块,动态加载模块不需要重启即时生效。 查看静态编译模块:
httpd -M
httpd -l
。
模块文件路径:
,
/etc/httpd/modules
动态加载的模块路径:
/usr/lib64/httpd/modules
。
/usr/lib64/httpd/modules
- 启动服务:
。启动服务后,查看端口监听service httpd start
,有80端口,说明服务启动了。ss -ntl
启动服务后,查看系统中httpd服务进程,可以看到已经跑了8个worker进程和一个主进程,支持用户响应,占光了再生成新的进程。
pstree -p| grep httpd
可以查看这个进程打开了多少个文件。
ll /proc/进程id/fd
httpd服务进程
- httpd服务控制和启动配置:
配置2、3、4、5模式开机服务是否启动:;查看当前配置状态:
chkconfig httpd on|off
chkconfig --list httpd
。
开机状态服务控制:
service {start|stop|restart|status|configtest|reload} httpd
-站点网页文档根目录:
/var/www/html
。在该目录下新建一个
index.html
文件,则在浏览器输入本机IP,就初始化创建了一个网站。
- 服务脚本:
。脚本配置文件:/etc/rc.d/init.d/httpd
。/etc/sysconfig/httpd
http2.2通过配置脚本,可切换MPM模式,重启服务生效。如下图切换为worker模式。Httpd2.4通过动态模块方式配置:
/etc/sysconfig/httpd
/etc/httpd/conf.modules.d/00-mpm.conf
,重启服务生效。
如下图切换为worker模式的进程树(
pstree -p| grep httpd
)。prefork是一个进程响应一个请求。而worker模式,一个master进程生成若干个子进程,一个子进程再生产若干个线程处理请求,
查看httpd进程:
ps aux | grep httpd
httpd脚本切换worker模式
worker_模式进程树
- 主程序文件: 对应MPM三种模式,默认
,/usr/sbin/httpd
模式。更改配置文件可切换MPM模式。prefork
– 默认主程序
/usr/sbin/httpd
。worker模式下的主程序。
/usr/sbin/httpd.worker
。event模式下的主程序。
/usr/sbin/httpd.event
- 主进程文件:
查看httpd主进程编号cat /etc/httpd/run/httpd.pid
- 日志文件目录:
/var/log/httpd
- 帮助文档包:httpd-manual。本地安装帮助文档包方便在未联网状态下查看帮助。
- 配置文件:
主配置文件:
/etc/httpd/conf/httpd.conf
。个人配置不建议在主配置文件修改。
个人配置:
。对于个人的配置,建议在
/etc/httpd/conf.d/
目录下新增,只要是
/etc/httpd/conf.d/
结尾的就行。如果有
.conf
Include conf.d/*.conf
行,说明是支持这种操作的。
检查配置语法是否正确:
。
httpd -t
支持个人配置文件
5、常见配置:
/etc/httpd/conf/httpd.conf
。PS:修改配置后重新加载服务生效
service httpd reload
httpd配置文件的组成:
directive value
,类似于key-value对,一个配置项对应一个配置。
directive
不区分字符大小写,
value
为路径时,是否区分大小写,取决于文件系统。
- 配置端口监听: 格式-
,表示监听指定IP的指定端口,如果不指定IP,表示监听本机的所有端口。注意:Listen指令至少一个,可监听多个(即可定义多行Listen,监听多个端口)。Listen [IP:]PORT
例如:,监听本机所有IP的80端口。配置完成后,通过
Listen 80
查看80端口是否处于监听状态。
ss -ntl
- 显示httpd版本信息:
查看当前配置。grep "ServerTokens" /etc/httpd/conf/httpd.conf
可设置为。一般设置为
ServerTokens Major|Minor|Min[imal]|Prod[uctOnly]|OS|Full
隐藏具体的版本。
ServerTokens Prod
- 配置持久连接:
。当一个请求三次握手建立连接后,是否请求完成,连接就马上断开。如果请求需要获取多个资源的场景很多,打开长连接效率较高。当然还可以配置最大连接时间KeepAlive off|on
和最大请求次数KeepAliveTimeout
后断开连接。MaxKeepAliveRequests
测试:使用telnet测试httpd的开启和关闭长连接,获取资源的差异: yum install telnet
。
请求:telnet WEB_SERVER_IP PORT
头部信息:
GET /URL HTTP/1.1
Host: WEB_SERVER_IP
telnet 198.168.8.102 80 # 连接主机198.168.8.102的80端口。
GET /index.html HTTP/1.1
host: 8.8.8.8 # 通过端口访问,host字段的值没用,随便填
...
GET /test.html HTTP/1.1
host: 8.8.8.8
- 配置文档路径映射:
。很重要,DocumentRoot指向的路径为URL路径的起始位置。例如:DocumentRoot /path
DocumentRoot "/app/data“
"https://HOST:PORT/test/index.html" --> /app/data/test/index.html
- 定义站点主页:
DirectoryIndex index.html index.html.var
- 访问|错误日志配置:
错误日志目录:
Errorlog logs/error_log
。logs是配置的httpd root目录。
日志级别:
日志格式:
LogLever warn
。配置中给定了多个日志格式对应的变量。需要的时候直接参考apache的帮助文档说明。
LogFormat
日志配置
4.3.3 虚拟主机配置方法
默认一个主机上只有一个网站,即当前主机IP对应的网站。虚拟主机:即一个主机配置多个虚拟的主机,对应多个网站。不同主机通过唯一标识进行区分。有三种方式配置虚拟主机:
IP区分,PORT端口相同。
PORT区分,IP相同。
FQDN不同。请求报文首部。FQDN比较普遍的方法。
方法一:IP区分,建立三个虚拟主机
1、准备IP:
按前述nmcli方法,在一个网卡上配三个IP:192.168.8.11,192.168.8.12,192.168.8.13
2、准备数据:
- 配置站点主页路径,假设在
下创建三个目录,对应三个网站。/app
mkdir website1;mkdir website2;mkdir website3;
- 在各站点下创建各自的首页:
,echo "website1 Main page" > website1/index.html
,echo "website2 Main page" > website2/index.html
echo "website3 Main page" > website3/index.html
3、配置虚拟主机配置项:
注意,还是之前说的原则,在个人配置文件/etc/httpd/conf.d/目录下创建配置文件进行配置,假设创建的个人配置文件为
my_vhost.conf
。参考主配置文件/etc/httpd/conf/httpd.conf配置虚拟主机的格式,一般在主配置文件末尾:
tail -f /etc/httpd/conf/httpd.conf
。如果没有
grep VirtualHost /etc/httpd/conf/httpd.conf
。
配置虚拟主机格式
vim /etc/httpd/conf.d/my_vhost.conf
;按下图示例配置虚拟主机:
IP区分方式配置三个虚拟主机示例
配置完成后:重新加载服务
service httpd reload
,
ss -ntl
,查看端口监听。
登陆其他主机使用curl命令测试三个网站是否可以访问:
curl 192.168.8.11;curl 192.168.8.12;curl 192.168.8.13
。默认都是80端口,所以不需要指定端口号。
方法二:端口区分,建立三个虚拟主机
很简单,方法一的配置基础上,在配置文件把IP改为*,增加端口,并增加端口监听即可,
vim /etc/httpd/conf.d/my_vhost.conf
,如下图所述:
端口区分方式配置三个虚拟主机
修改完成后重新加载服务
service httpd reload
,
ss -ntl
,查看端口监听。
登陆其他主机使用curl命令测试三个网站是否可以访问:
curl 192.168.8.11:8001;curl 192.168.8.11:8002;curl 192.168.8.11:8003
。
实际生产环境中,不可能让用户输入不同的非默认端口号来区分访问不同的网站,更习惯用名字区分。所以FQDN方法应该更广泛。
方法三:FQDN区分,建立三个虚拟主机
1、首先,解决DNS问题: 搭建三个网站,比如:
www.test1.com
,唯一限定名/域名,域名需要DNS来解析,还要搭建DNS服务器。测试使用/etc/hosts模拟DNS解析,如下图,配置三个域名
www.a.com,www.b.net,www.c.org
。
模拟配置DNS域名
2、配置文件: 打开基于名称的虚拟主机开关,主配置文件默认是注释掉的:
cat /etc/httpd/conf.d/my_vhost.conf |grep VirtualHost
查看。
打开使用基于名称的虚拟主机开关
把这一行粘贴到个人配置文件中,并取消注释。FQDN区分,则不需要端口监听、不需要IP,要增加域名配置,最终配置如下图。
FQDN配置虚拟主机
3、修改完成后重新加载服务
service httpd reload
,登陆其他主机使用curl命令测试三个网站是否可以访问:
curl www.a.com;curl www.b.net;curl www.c.org
。
4、使用telnet测试不同主机名获取资源,注意,使用域名区分虚拟主机,这个时候请求头的host必须对应为确定的主机名了:
使用telnet测试host
注意:FQDN,如果仍然按IP访问,则在配置文件中配置在最前面的是默认的访问网站
-
站点访问控制配置:
参考链接