天天看点

计算机网路基础7--http web服务器搭建

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

等。

httpd、nginx

只能处理静态页面(html),如需解析动态页面(jsp),可以通过反向代理将请求发送到后端的服务器完成动态页面处理,例如tomcat、IIS等。

tomcat

擅长解析动态页面(JSP),tomcat本身也支持html,只是性能不如httpd。

流行的动态页面有:JSP、ASP、PHP、PERL等。

IIS

:微软开发的服务器端http web服务应用程序。只支持windows系统,付费。

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个。

计算机网路基础7--http web服务器搭建

prefork模式

worker

模式:复用的多进程I/O模型,多进程多线程,IIS使用此模型。

一个主进程:生成m个子进程,每个子进程负责生个n个线程,每个线程响应一个请求,并发响应请求:m*n。
计算机网路基础7--http web服务器搭建

worker模式

event

模式:事件驱动模型(worker模型的变种)。

一个主进程:生成m个子进程,每个进程直接响应n个请求,并发响应请求:m*n,有专门的线程来管理这些keep-alive类型的线程,当有真实请求时,将请求传递给服务线程,执行完毕后,又允许释放。这样增强了高并发场景下的请求处理能力。

event

模式httpd-2.4才成为稳定版。
计算机网路基础7--http web服务器搭建

event模式

处理请求中,进程角色切换模型:

计算机网路基础7--http web服务器搭建

进程角色切换

3、httpd功能概述

  • 虚拟主机,一个主机可以创多个虚拟机,从而支持多个web网站。可以通过

    IP、Port、FQDN

    区分。
FQDN:(Fully Qualified Domain Name)完全限定域名:同时带有主机名和域名的名称。(通过符号“.”)例如:主机名是

bigserver

,域名是

mycompany.com

,那么FQDN就是

bigserver.mycompany.com

-CGI:Common Gateway Interface,通用网关接口。

html网页动态内容,需要在服务器端执行脚本后返回执行结果,则需要CGI转换。
  • 反向代理:httpd服务器可以作为反向代理服务器(一个调度器),根据客户端请求类型,调度后台服务器完全请求处理。不是httpd擅长的,nginx性能更好。
  • 负载均衡:httpd不擅长,有这个功能。

4、httpd安装

使用使用centos7发行版自带的httpd版本rpm方式安装:

yum install -y httpd

。 如有特殊需求需要装指定版本,可采用编译方式安装。

rpm -q httpd

:查看httpd是否已安装。

rpm -ql httpd

:装完后,查看httpd的文件列表。

rpm -qi httpd

:查询httpd的概要信息。

httpd -M

:查看哪些模块已经被加载了,分为静态编译模块和动态加载模块,动态加载模块不需要重启即时生效。 查看静态编译模块:

httpd -l

模块文件路径:

/etc/httpd/modules

/usr/lib64/httpd/modules

动态加载的模块路径:

/usr/lib64/httpd/modules

  • 启动服务:

    service httpd start

    。启动服务后,查看端口监听

    ss -ntl

    ,有80端口,说明服务启动了。
启动服务后,

pstree -p| grep httpd

查看系统中httpd服务进程,可以看到已经跑了8个worker进程和一个主进程,支持用户响应,占光了再生成新的进程。

ll /proc/进程id/fd

可以查看这个进程打开了多少个文件。
计算机网路基础7--http web服务器搭建

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通过

/etc/sysconfig/httpd

配置脚本,可切换MPM模式,重启服务生效。如下图切换为worker模式。Httpd2.4通过动态模块方式配置:

/etc/httpd/conf.modules.d/00-mpm.conf

,重启服务生效。

如下图切换为worker模式的进程树(

pstree -p| grep httpd

)。prefork是一个进程响应一个请求。而worker模式,一个master进程生成若干个子进程,一个子进程再生产若干个线程处理请求,

查看httpd进程:

ps aux | grep httpd

计算机网路基础7--http web服务器搭建

httpd脚本切换worker模式

计算机网路基础7--http web服务器搭建

worker_模式进程树

  • 主程序文件: 对应MPM三种模式,默认

    /usr/sbin/httpd

    prefork

    模式。更改配置文件可切换MPM模式。

/usr/sbin/httpd

– 默认主程序

/usr/sbin/httpd.worker

。worker模式下的主程序。

/usr/sbin/httpd.event

。event模式下的主程序。
  • 主进程文件:

    cat /etc/httpd/run/httpd.pid

    查看httpd主进程编号
  • 日志文件目录:

    /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

计算机网路基础7--http web服务器搭建

支持个人配置文件

5、常见配置:

/etc/httpd/conf/httpd.conf

。PS:修改配置后重新加载服务生效

service httpd reload

httpd配置文件的组成:

directive value

,类似于key-value对,一个配置项对应一个配置。

directive

不区分字符大小写,

value

为路径时,是否区分大小写,取决于文件系统。

  • 配置端口监听: 格式-

    Listen [IP:]PORT

    ,表示监听指定IP的指定端口,如果不指定IP,表示监听本机的所有端口。注意:Listen指令至少一个,可监听多个(即可定义多行Listen,监听多个端口)。
例如:

Listen 80

,监听本机所有IP的80端口。配置完成后,通过

ss -ntl

查看80端口是否处于监听状态。
  • 显示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 /path

    。很重要,DocumentRoot指向的路径为URL路径的起始位置。例如:
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

日志格式:

LogFormat

。配置中给定了多个日志格式对应的变量。需要的时候直接参考apache的帮助文档说明。
计算机网路基础7--http web服务器搭建

日志配置

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

计算机网路基础7--http web服务器搭建

配置虚拟主机格式

vim /etc/httpd/conf.d/my_vhost.conf

;按下图示例配置虚拟主机:

计算机网路基础7--http web服务器搭建

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

,如下图所述:

计算机网路基础7--http web服务器搭建

端口区分方式配置三个虚拟主机

修改完成后重新加载服务

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

计算机网路基础7--http web服务器搭建

模拟配置DNS域名

2、配置文件: 打开基于名称的虚拟主机开关,主配置文件默认是注释掉的:

cat /etc/httpd/conf.d/my_vhost.conf |grep VirtualHost

查看。

计算机网路基础7--http web服务器搭建

打开使用基于名称的虚拟主机开关

把这一行粘贴到个人配置文件中,并取消注释。FQDN区分,则不需要端口监听、不需要IP,要增加域名配置,最终配置如下图。

计算机网路基础7--http web服务器搭建

FQDN配置虚拟主机

3、修改完成后重新加载服务

service httpd reload

,登陆其他主机使用curl命令测试三个网站是否可以访问:

curl www.a.com;curl www.b.net;curl www.c.org

4、使用telnet测试不同主机名获取资源,注意,使用域名区分虚拟主机,这个时候请求头的host必须对应为确定的主机名了:

计算机网路基础7--http web服务器搭建

使用telnet测试host

注意:FQDN,如果仍然按IP访问,则在配置文件中配置在最前面的是默认的访问网站

  • 站点访问控制配置:

    参考链接