HTTP服务(修改版1.0)

本文详细介绍了HTTP服务的工作原理,包括HTTP协议的版本特性、请求处理过程、状态码以及服务器配置。重点讨论了HTTP/1.0、HTTP/1.1和HTTP/2.0的区别,如持久连接和多路复用。此外,还阐述了HTTP服务的配置,包括虚拟主机、路径别名、身份验证和日志设定。最后,提到了HTTPS的实现及httpd服务器的反向代理配置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Web服务

Internet上主机之间的通讯需要有两个重要的标志:IP和端口号,两者合称为套接字地址 socket address

客户端主机套接字地址定义了一个唯一的客户进程(端口号可随机)

服务器套接字地址定义了一个唯一的服务器进程(端口号需要固定)

端口号总范围是0-65535,但是0-1023范围内端口号是系统端口或叫特权端口,只限管理员使用


HTTP(Hyper Text Transfer Protocol)是应用于TCP/IP协议的应用层的超文本传输协议,基于TCP协议,默认端口号为80

HTTP服务通信的过程:(服务端S、客户端C)

html是超文本的编辑语言,使得文本内容更加美观,基本运用的格式如下:

<html>

<head>

<title>输入定义的网页标签名

</title>

</head>

<body>

<img src=“输入调用的图片、logo等文件路径”>    

<h1>“要输入的字符内容”</h1>

<p><a href=超链接地址>需要被连接的字符</a>不需要超链接的字符</p>

</body>

</html>

这些html语言编辑的文件一般存放在默认的httpd服务的默认站点/var/www/html/目录下并以.html结尾

为了能够实现多媒体的传输,HTTP协议就利用MIME(Multipurpose Internet Mail Extensions)多用途的邮件扩展协议来支持,在CentOS系统中 /etc/mime.types 文件中可查看支持的多媒体类型


HTTP协议

目前市面上正常使用的协议为三种:http/1.0、http/1.1(主流)、http/2.0

http/1.0:

每个TCP协议连接中只能发送一个请求,发送数据完毕,连接就关闭;若还需要获取其他资源,则需要另外建立新的TCP连接

支持多种method方法指令:GET(请求数据)、POST(上传数据)、HEAD(查看http报文首部)

http/1.1:(在http/1.0协议基础上升级)

引入持久连接,即TCP连接建立之后,默认不关闭,客户端可以发送多个请求,在多数浏览器中,支持同时开启6个持久连接

新增了一些其他method指令:PUT、PATCH、OPTIONS、DELETE,但是不常用

存在的缺点是,每个TCP连接中,数据通信是按照次序进行,可能会造成请求排队堵塞

http/2.0:(在http/1.1协议基础上升级)

每个TCP连接中,客户端与浏览器可以同时发送多个请求与回应

服务器可以未经请求情况下,主动推送资源给客户端

TCP连接在这三种协议中,从开始的每次单个连接只能执行一次请求===>升级到按照顺序单个连接可处理客户端的多个请求===>再到可不按照顺序客户端和服务端同时发送多个请求或回应

 

http协议是属于无状态协议,服务器是无法跟踪访问者来源的,为解决此问题,一般是通过如下方法:

cookie与session的结合 (每个服务器会设置cookie的数量)

工作机制:当客户端访问某个服务器网站时,服务器端会自动的生成一个cookie信息,发送给客户端并设定唯一的一个编号,客户端会将此cookie信息存储在文件中,若是客户端在此访问相同的服务器网站,会携带此带编号的cookie信息,服务端则通过此编号,在session中将客户端此前相关访问信息与之关联,从而记录下来,实现跟踪

 

HTTP经常使用的状态码以及相关含义,如下:

200: 成功,请求数据通过响应报文的entity-body部分发送;OK

301: 请求的URL指向的资源已经被删除;但在响应报文中通过首部Location指明了资源现在所处的新位置;Moved Permanently

302: 响应报文Location指明资源临时新位置 Moved Temporarily

304: 客户端发出了条件式请求,但服务器上的资源未曾发生改变,则通过响应此响应状态码通知客户端;Not Modified

401: 需要输入账号和密码认证方能访问资源;Unauthorized

403: 请求被禁止;Forbidden

404: 服务器无法找到客户端请求的资源;Not Found

500: 服务器内部错误;Internal Server Error

502: 代理服务器从后端服务器收到了一条伪响应,如无法连接到网关;Bad Gateway

503 : 服务不可用,临时服务器维护或过载,服务器无法处理请求

504 : 网关超时


HTTP工作机制

客户端发送请求 request 《=====》response 服务器响应 (其中请求报文、响应报文两者的首部信息是不一样的)

 

HTTP请求处理过程:(发生在在DNS解析和TCP/IP协议的三次握手完成之后)(C:客户端 S:服务器)

1.建立连接,C向S发送资源报文请求,S接受或者拒绝请求

2.S接收请求:有如下几种接受请求的类型

  串行连接:S开启单进程一对一的响应每个TCP连接下C的请求

  并行连接:S开启多进程同时并发响应一个TCP连接下的C的多个请求

  复用结构:S开启一个进程响应N个连接请求或者一个进程生成N个线程一对一连接请求

  复用多进程结构:启动M个进程,每个进程响应N个连接请求

3.S处理请求

4.S发指令给内核,让内核去磁盘中寻找C发来的请求中需要的资源

5.S拿到资源后,构建响应报文

6.S发送响应报文给C,并记录每个连接的状态

7.S在事务结束后,记录日志

最后是TCP协议的四次挥手

HTTP协议中的一些术语

URI:Uniform Resource Identifier 统一资源标识,又分为URL和URN

URN:Uniform Resource Naming 统一资源命名

URL:Uniform Resource Locator 统一资源定位符,用于描述某服务器某特定资源位置

其中URL是经常使用的,其组成如下图:


HTTP服务(CentOS 7的rpm包安装环境下)

本文介绍的是apache服务器程序软件,apache只支持静态页面的访问来提供web服务

程序包名为:httpd

httpd是基于模块化的服务:核心模块Core + 一些其他模块Modules,支持DOS(Dynamic Shared Object)动态加载或卸载模块

httpd利用MPM(Multi-Processing Modules)多路处理模块,提供了以下三种工作模型:

prefork:多进程I/O模型(系统默认使用模型)

一个主进程 ---> N个子进程 ---> 一对一处理客户端请求

(并发连接数若达到10000,称为C10k,此时Apache的响应速度会受到严重影响)

worker:复用的多进程I/O模型

一个主进程 ---> N个子进程 ---> M个线进程 ---> 一对一处理客户端请求

(线程之间会存在相互影响的情况)

event:时间驱动模型

一个主进程 ---> N个子进程 ---> 一个N对应M个请求

修改工作模型,只需在配置文件 /etc/httpd/conf.modules.d/00-mpm.conf 启用相对应的模块,重启服务即可

 

httpd加载使用模块的配置文件存放在 /etc/httpd/conf.modules.d/ 目录下

httpd -M 可查看httpd服务启动后,已动态加载在内存中使用的模块

httpd其他的一些功能特性:

虚拟主机:表示可在一台服务器上搭建多个网站提供不同的服务

CGI(Common Gateway Interface) 通用网关接口:可实现动态程序,但是需要额外进行开发

反向代理:可作为调度器来实现客户端请求合理分配调度给后端服务器

以及负载均衡、路径别名、用户认证等


Httpd的配置 (CentOS 7的rpm包安装环境下)

配置文件分为 主:/etc/httpd/conf/httpd.conf 从:/etc/httpd/conf.d/*.conf(一般情况下是用来管理存放自定义的虚拟主机配置文件)

注意:从配置文件内修改的内容会优先主配置文件生效,因为在主配置文件最后另外指定了从配置文件路径,在主配置文件设置完成后,会继续读取从配置文件中的内容,若有冲突,则会被覆盖

主程序:/usr/bin/httpd ,可以通过“httpd -t”选项来检测配置文件的语法

默认的网页站点路径:/var/www/html/ 默认的日志存放路径:/var/lib/httpd/

进程编号文件:/etc/httpd/run/httpd.pid (只有在httpd服务启动时,才会存在)

 

配置文件中一些常用的配置选项:(基于httpd 2.4的介绍)

1.可在网页上保密使用的Apache版本信息

加入 ServerTokens Prod 选项  

    (在命令行使用 “curl -I IP地址”可查看)

2.修改监听端口

    Listen [IP:] PORT   ([ ]内的内容若是省略,表示PORT监听在本机所有IP地址上)

    Listen指令必须大于等于1个

3.持久连接

    连接建立的情况下,每个资源获取完成后不断开连接,可继续等待其他请求,但是因为有并发访问量大的情况,所以也应设置最大连接次数

    KeepAlive  On 启用持久连接

    KeepAliveTimeout VALUE 设置持久连接的超时时长,单位为毫秒

    MaxKeepAliveRequests VALUE 发送多少次请求连接后,断开持久连接

可使用telnet命令进行测试,测试方法如下:(若是单个指令结束后,可以继续输入下一个指令,则表示开启了持久连接)

telnet WEB_SERVER_IP PORT(指定httpd服务器地址和端口,进入交互式状态)

telnet> GET /index.html HTTP/1.1 (指定请求内容以及httpd服务所用协议)

telnet> HOST: RANDOM_IP (随机指定一个IP)

4.增加httpd服务的工作进程数

StartServers NUMBER 修改各工作模型下的工作进程数

5.网页的主页面路径

默认为 /var/www/html/,若需要修改,则修改如下选项 :

DocumentRoot /DIR (此时需要注意的是,在httpd 2.4版本中,还必须另外对 / 进行授权操作,基本格式如下:)

<Directory />

Require all granted

</Directory>

6.定义网页主页面的站点

默认是 /var/www/html/ 下的 index.html 文件,若是需要修改,操作如下:

DirectoryIndex  index.NAME1 index.NAME2 指定以“.NAME1”结尾的文件为默认站点页面,若找不到则会依次找后续设置

7.站点访问控制的机制,指定特定的用户访问

可针对磁盘文件 <File “”>                           <FileMatch “通配符”>

                              ………                                  ………

                              </File>                              </FileMatch>

目录                     <Directory /DIR >

                              ………

                              </Directory>

URL路径             <Location URL>             < LocationMatch “通配符”>

                              ………                                ………

                              </Location>                     </ LocationMatch >

其中“………”表示的是授权的内容,格式如下:(下面的“|”分隔了两种方式Any和All)

       <RequireAny|All>

        Require all denied|granted

        Require IP| not IP(表示该IP是在上面一个条件之外)

       </RequireAny|All>

8.Options选项

当不存在与网站主页面定义的资源文件时,会根据 Options选项 后接的指定参数将相关信息呈现给用户,其中有以下几种参数:

    Indexes 会显示网页站点目录下的文件列表

    FollowSymLinks 支持软连接指向

注意此选项若是需要生效,则需要将指定网页站点的文件(*.conf)和测试文件信息(welcome.conf)给移除

也可将options选项信息写入指定目录下的 .htaccess 文件中,并在配置文件中授权此目录为 AllowOverride all,效果和单独写入配置文件一样。

9.日至设定

默认的日志的存放路径: /var/log/httpd/ 下的 access_log(访问日志) 和 error_log(错误日志)

其中 access_log 的记录格式在配置文件中进行定义:

LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined

CustomLog "logs/access_log" combined

(其中“combined”只是一个代名词,实际生成可根据情况定义不同的日志记录内容,并贴上自定义标签)

上述日志定义过程中使用到的相关标志,代表的含义如下图所示:

 

具体的一些其他日志格式定义的内容,可参考文档:

http://httpd.apache.org/docs/2.2/mod/mod_log_config.html#formats

10.路径别名的设置

Alias URL /PATH 将访问的URL路径重新定向到指定的新的路径

需要注意的是,此时新路径的文件夹还必须要经过授权

12.身份验证

对指定文件或目录允许特定的虚拟账户访问设置,设置需要的选项如下:

AuthType Basic

AuthName "登录端口的描述信息"

AuthUserFile "账户密码的存放路径"

Require user 账户1 账户2 (特定某些账户可访问)(或者Require valid-user   表示所有设定的账户都可访问) 

其中可以通过下面这个命令来创建账户密码:

    htpasswd [options] 文件路径 USER_NAME

    options:

       -c     在文件不存在时自动创建,后续添加不需要

       -D     删除指定用户

       -d     crypt格式加密(默认)

       -p|m|s 分别表示明文密码、md5加密、sha加密

也可将创建的用户进行分组,针对某个组成员进行访问控制:

AuthGroupFile "设定的组文件存放路径" 注意在组文件中的格式为“GROUP_NAME:USER1 USER2”

Require group GROUP_NAME (指定某个组可进行访问)

13.用户家目录的共享

基于模块userdir_Module加载后才能实现(httpd –M可查看模块)

在自带的配置文件/etc/httpd/conf.d/userdir.conf中

       关闭选项   UserDir disabled 

       开启选项   UserDir DIR_NAME 指定用户家目录下的共享文件名

    需要对用户家目录设定给apache执行权限

       setfacl -m u:apache:x /home/用户

    切换至用户,在用户家目录下建立 DIR_NAME 文件夹,并创建*.html文件

 

为保证安全,可对创建文件夹进行虚拟账户登录的认证,只有指定用户可以访问,并且需要注意的是,要将原配置文件/etc/httpd/conf.d/userdir.conf中的通用目录权限设定示例注释掉。

14.状态页面的查看

<Location /status>

SetHandler server-status

Require all granted

</Location>

表示可通过此URL在页面上显示httpd服务的状态信息,基于安全,可指定特定用户可访问

15.虚拟主机的配置

配置的基本格式如下:

<VirtualHost IP:PORT>

ServerName FQDN

DocumentRoot “/path"

</VirtualHost>

(注意:在自定义/path时,需要对其目录进行授权操作)

 当实现基于IP分类站点标识时,保证PORT不变,IP根据需要填写对应的ip,FQDN和/path也写入对应的输入,即可实现。

 (ip的添加方法:ip a a ip_address/netmask dev DEVICE_NAME)

  举例如下:

        <VirtualHost 192.168.31.101:80>

         DocumentRoot /app/web1

         ServerName www.a.com

         <Directory /app/web1>

         Require all granted

         </Directory>

         </VirtualHost>

当实现基于PORT分类站点标识时,此时需要先对不同PORT进行listen,然后IP填写为“*”,FQDN此时是没有什么作用的,/path也写入对应的输入,即可实现。

    举例如下:

     listen 8001

     <VirtualHost *:8001>

     DocumentRoot /app/web1

     ServerName www.a.com

     <Directory /app/web1>

     Require all granted

      </Directory>

      </Virtualhost>

当实现基于FQDN分类站点标识时,IP填写为“*”,PORT指定为默认,此时的FQDN则需要根据不同写入不同的域名,/path也写入对应的输入,并且还需要根据DNS,即可实现。(这种方法实际生产中常用,为了便于观察每个站点不同的日志,可以进行日志分类)

    举例如下:

       <VirtualHost *:80>

        DocumentRoot /app/web1

        ServerName www.a.com

        ServerAlias  a.com *.a.com

        <Directory /app/web1>

         Require all granted

         </Directory>

          ErrorLog "logs/a_error_log"

          CustomLog "logs/a_access_log" combined

          </VirtualHost>


curl命令行工具的使用

curl -I WEB_SERVER 查看指定服务器端的响应报文首部信息

curl -A "USER_AGENT" WEB_SERVER 可假冒某个USER_AGENT浏览器来访问服务器

curl -e "Referer" WEB_SERVER 伪造跳转路径Referer

curl -L WEB_SERVER 当访问某服务器发生跳转时,会显示跳转之后的界面


https的实现(https启用的端口为443)

1.需要安装mod_ssl软件包

2.在httpd服务器上申请证书(httpd.key、httpd.csr)

3.在CA服务器上建立CA并且颁发httpd服务器证书,需要注意的是CA建立时的默认路径以及index.txt文件和序号文件serial,并且要将CA证书一并发送给httpd服务器

4.在配置文件/etc/httpd/conf.d/ssl.conf(由安装mod_ssl生成)中,编辑以下几处:

SSLCertificateFile httpd.crt的路径

SSLCertificateKeyFile   httpd.key的路径

SSLCACertificateFile   cacert.pem的路径

注意:SSL基于IP地址实现,单IP的主机仅可以使用一个https虚拟主机


https站点的启用

在配置文件/etc/httpd/conf.d/ssl.conf(由安装mod_ssl生成)中,重新指定https的网站站点路径:

DocumentRoot /DIR (默认与http下的站点路径一样)

 

http跳转至https的实现

1.若是跳转至别的网站,可在自定义的配置文件中加入如下选项:

Redirect [status] / https://跳转网站路径/

(其中status是根据需要填写不同的状态:temp临时、permanent永久)

2.若是需要跳转至本网站的https站点,在配置文件中加入下面:

RewriteEngine on

Rewritecond %{SERVER_PORT} !^443

RewriteRule ^(/.*)$ https://%{HTTP_HOST}$1 [redirect=301]([ ]里的内容可修改为301永久或者302临时 )


httpd可支持反向代理,基本配置选项如下:

ProxyPass "URL" "WEB_SERVER" 将客户端访问的URL转发给指定的服务器

ProxyPassReverse "URL" "WEB_SERVER"


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值