分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > IT知识

http协议理论及实验

发布时间:2023-09-06 01:21责任编辑:沈小雨关键词:http

http:超文本传输协议

html:超文本标记语言,编程语言

cookie携带本机自己信息

URI:统一资源标识,分为URL和URN

p2p:我为人人,人人为我。共享资源,下载的同时也在上传,从哪个机器上有就从哪下载

串行连接

并行连接

持久连接

管道连接

http协议是应用层协议

1客户端请求建立连接

http协议是应用层协议,在传输期间会被加上TCP报头,ip报头,数据链路报头。

2服务器端接收请求

3根据报文首部来实现处理请求

4访问资源 httpd在用户空间运行,系统调用发送到内核,再由内核发送到磁盘,回到内核的缓存区,最后发到http缓充区

5响应报文(数据封装响应报文的首部,http响应报头,TCP报头,ip报头,数据链路报头)

6发送响应,

7记录事物处理过程,日志

http从网络上读数据,基于打开socket文件 input(read) output

650) this.width=650;" src="https://s4.51cto.com/oss/201710/30/a02c79973d0c092bde438a5387a21b12.png" title="web服务请求处理步骤.png" alt="a02c79973d0c092bde438a5387a21b12.png" />

单进程I/O模型:启动一个进程处理用户请求,而且一次只处理一个,多个请求被串行响应(一个一个来)

多进程I/O模型:并行启动多个进程,每个进程响应一个连接请求(多个多个来)

复用I/O结构:启动一个进程,同时响应N个连接请求实现方法:多线程模型和事件驱动

(启动一个进程,生成N个线程来响应连接请求,请求先在连接池,确定访问资源了再分配线程。弊端,一个线程故障,会影响其他线程)

多线程模型:一个进程生成N个线程,每线程响应一个连接请求(处理线程1024)

事件驱动:一个进程处理N个请求

复用的多进程I/O模型:启动M个进程,每个进程响应N个连接请求,同时接收M*N个(启动多个进程,每个进程启动多个线程。)

http服务器程序:

httpd apache,nginx(只支持静态页面,不支持动态页面)

应用程序服务器:(处理动态页面)

IIS,.asp文件

tomcat .jsp文件

nginx tomcat 相互配合(静态,动态)

lamp()

php模块:打包进httpd模块

php服务(php server):<-php-->httpd(php client)<---client index.php

MPM工作模式:多路处理模块:确认方法:ps aux | grep httpd默认为/usr/sbin/httpd, 即prefork

prefork:多进程I/O模型,每个进程响应一个请求,默认模型一个主进程:生成和回收n个子进程,创建套接字,不响应请求多个子进程:工作work进程,每个子进程处理一个请求;系统初始时,预先生成多个空闲进程,等待请求,最大不超过1024个

worker:复用的多进程I/O模型,多进程多线程,IIS使用此模型一个主进程:生成m个子进程,每个子进程负责生个n个线程,每个线程响应一个请求,并发响应请求:m*n

event:事件驱动模型(worker模型的变种)一个主进程:生成m个子进程,每个进程直接响应n个请求,并发响

应请求:m*n,有专门的线程来管理这些keep-alive类型的线程,当有真实请求时,将请求传递给服务线程,执行完毕后,又允许释放。这样增强了高并发场景下的请求处理能力 httpd-2.2: event 测试版,centos6默认

httpd-2.4:event 稳定版,centos7默认

httpd功能特性

虚拟主机(在同一主机上各个资源分别放在不同的域名下,实现了增加并发连接下载连接数,加快了下载速度,可以以IP地址,端口号,域名进行区分类似于域名分片)

IP、Port、FQDN

650) this.width=650;" src="https://s1.51cto.com/oss/201710/30/1d9f458438c736a8a8d4a4e31c2814c4.png" title="http域名分片.png" alt="1d9f458438c736a8a8d4a4e31c2814c4.png" />

vCGI:Common Gateway Interface,通用网关接口(支持不同协议间的转化,如http处理不了Php,利用CGI转化为php协议)

v 反向代理(正向代理,代理服务器,具有缓冲功能,节约网路带宽,也可以做一些策略)

v 负载均衡

v 路径别名

v 丰富的用户认证机制

basic

digest

v 支持第三方模块

Http安装:

CentOS 6: 2.2

CentOS 7: 2.4

安装方式:

rpm:centos发行版,稳定,建议使用

编译:定制或特殊需求

v CentOS 6程序环境:httpd-2.2

配置文件:

/etc/httpd/conf/httpd.conf主配置文件

/etc/httpd/conf.*.conf

检查配置语法:httpd -t

查看静态编译的模块:httpd -l

查看静态编译及动态装载的模块:httpd –M

服务脚本:/etc/rc.d/init.d/httpd

脚本配置文件:/etc/sysconfig/httpd

服务控制和启动:

chkconfig httpd on|off

service {start|stop|restart|status|configtest|reload} httpd

模块文件路径:

/etc/httpd/modules

/usr/lib64/httpd/modules 动态模块路径


CentOS 6 httpd程序环境:

主程序文件:

/usr/sbin/httpd

/usr/sbin/httpd.worker

/usr/sbin/httpd.event v

主进程文件:

/etc/httpd/run/httpd.pid v

日志文件目录:

/var/log/httpd

access_log: 访问日志

error_log:错误日志

帮助文档包:

httpd -manual(需要手动安装)

httpd配置文件的组成:

# grep "Section" /etc/httpd/conf/httpd.conf

### Section 1: Global Environment

### Section 2: ‘Main‘ server configuration

### Section 3: Virtual Hosts

v 配置格式:directive value

directive: 不区分字符大小写

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

显示服务器版本信息,建议使用:ServerTokens Prod

修改监听的IP和Port:Listen 192.168.1.100:8080 Listen [IP:]PORT

持久连接:KeepAlive On|Off

测试: telnet WEB_SERVER_IP PORT

GET /URL HTTP/1.1

Host: WEB_SERVER_IP

更换使用的httpd程序:/etc/sysconfig/httpd

HTTPD=/usr/sbin/httpd.worker

重启服务生效

pstree -p|grep httpd 查看进程和线程

Httpd 2.4 与之不同

以动态模块方式提供

配置文件:/etc/httpd/conf.modules.d/00-mpm.conf

httpd –M |grep mpm

重启服务生效

pstree -p|grep httpd 查看进程和线程

prefork的默认配置:

<IfModule prefork.c>

StartServers 8

MinSpareServers 5

MaxSpareServers 20

ServerLimit 256 最多进程数,最大20000

MaxClients 256 最大并发

MaxRequestsPerChild 4000 子进程最多能处理的请求数量。在处理MaxRequestsPerChild 个请求之后,子进程将会被父进程终止,这时候子进程占用的内存就会释放(为0时永远不释放)

</IfModule>

worker的默认配置:

<IfModule worker.c>

StartServers 4

MaxClients 300

MinSpareThreads 25

MaxSpareThreads 75

ThreadsPerChild 25

MaxRequestsPerChild 0 无限制

</IfModule>

DSO: Dynamic Shared Object

v 加载动态模块配置

/etc/httpd/conf/httpd.conf

配置指定实现模块加载格式:LoadModule <mod_name> <mod_path>

模块文件路径可使用相对路径:相对于ServerRoot(默认/etc/httpd)

示例:

LoadModule auth_basic_module

modules/mod_auth_basic.so

主站点:DocumentRoot "/app/data"

主页面:DirectoryIndex index.html index.html.var

注意:SELinux和iptables的状态

站点访问控制常见机制:

访问控制机制有两种:客户端来源地址,用户账号

文件系统路径:

<Directory “/path">

...

</Directory>【目录】

<File “/path/file”>

...

</File>【文件路径,支持通配符】

<FileMatch "PATTERN">

...

</FileMatch>【支持正则模糊匹配】

URL路径:

<Location "">

...

</Location>

<LocationMatch "">

...

</LocationMatch>

v 示例:

<FilesMatch "\.(gif|jpe?g|png)$">

<Files “?at.*”> 通配符

<Location /status>

<LocationMatch "/(extra|special)/data">

<Directory>中“基于源地址”实现访问控制

ü (1) Options:后跟1个或多个以空白字符分隔的选项列表在选项前的+,- 表示增加或删除指定选项

常见选项:

Indexes:指明的URL路径下不存在与定义的主页面资源相符的资源文件时,返回索引列表给用户(控制是否可以显示列表)

FollowSymLinks:允许访问符号链接文件所指向的源文件

None:全部禁用

All: 全部允许

示例:在子配置文件中

<Directory /web/docs>

Options Indexes FollowSymLinks

</Directory>

<Directory /web/docs/spec>

Options +Includes

-Indexes

</Directory>

650) this.width=650;" src="https://s2.51cto.com/oss/201710/30/297694f7dcc6b7abd38430c31ad2f04f.png" title="图片1.png" alt="297694f7dcc6b7abd38430c31ad2f04f.png" />

AllowOverride

与访问控制相关的哪些指令可以放在指定目录下的.htaccess(由AccessFileName指定)文件中,覆盖之前的

配置指令

只对<directory>语句有效

AllowOverride All: 所有指令都有效

AllowOverride None:.htaccess 文件无效

AllowOverride AuthConfig Indexes 除了AuthConfig 和Indexes的其它指令都无法覆盖

order和allow、deny

放在directory, .htaccess中

order:定义生效次序;写在后面的表示默认法则

Order allow,deny

Order deny,allow

Allow from, Deny from

示例:

<files "*.txt">

order deny,allow

deny from 172.16. 100.100

allow from 172.16

</files>

650) this.width=650;" src="https://s5.51cto.com/oss/201710/30/ef768450e147e70fd7da4bd3d51484e8.png" title="httpd order图.png" alt="ef768450e147e70fd7da4bd3d51484e8.png" />

日志类型:

访问日志

错误日志

错误日志:

ErrorLog logs/error_log

LogLevel warn

loglevel 可选值: debug, info, notice, warn,error,crit, alert, emerg

访问日志:

定义日志格式:LogFormat format strings

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

使用日志格式:CustomLog logs/access_log combined

%h 客户端IP地址

%l 远程用户,启用mod_ident才有效,通常为减号“-”

%u 验证(basic,digest)远程用户,非登录访问时,为一个减号“-”

%t 服务器收到请求时的时间

%r First line of request,即表示请求报文的首行;记录了

此次请求的“方法”,“URL”以及协议版本

%>s 响应状态码

%b 响应报文的大小,单位是字节;不包括响应报文http首部

%{Referer}i 请求报文中首部“referer”的值;即从哪个页

面中的超链接跳转至当前页面的

%{User-Agent}i 请求报文中首部“User-Agent”的值;即

发出请求的应用程序

设置默认字符集

定义路径别名:

在子配置文件中:/etc/httpd/conf.d/test.conf编辑

Alias /bbs(对于/var/www/html)“/app/bbsdir”

基于用户的访问控制:响应码为401

认证的两种方式:

basic:明文

digest:消息摘要认证,兼容性差

用户的账号和密码(可用命令生成账户密码)

虚拟账号:仅用于访问某服务时用到的认证标识

存储:文本文件,SQL数据库,ldap目录存储,nis等

Basic认证配置示例:

在子配置文件中:/etc/httpd/conf.d/test.conf编辑

<Directory “/var/www/html/secret">

Options None(在这里可有可无)

AllowOverride None(在这里可有可无)

AuthType Basic

AuthName "String“

AuthUserFile "/etc/httpd/conf.d/.httpusers"

Require user http1,http2

</Directory>

在指定目录下/etc/httpd/conf.d/.httpusers生成账户密码

Htpasswd -c /etc/httpd/conf.d/.httpusers http1

使用专用命令完成此类文件的创建及用户管理

htpasswd [options] /PATH/HTTPD_PASSWD_FILE username

-c:自动创建文件,仅应该在文件不存在时使用

-m:md5格式加密,默认方式

-s: sha格式加密

-D:删除指定用户

方法二:

在/var/www/html/secret下创建.htaccess文件

AuthType Basic

AuthName "String“

AuthUserFile "/etc/httpd/conf.d/.httpusers"

Require user http1,http2

子配置文件test.conf增加:AllowOverride authconfig

基于组账号进行认证:

在子配置文件中:/etc/httpd/conf.d/test.conf编辑

<Directory “/var/www/html/secret">

Options None(在这里可有可无)

AllowOverride None(在这里可有可无)

AuthType Basic

AuthName "String“

AuthUserFile "/etc/httpd/conf.d/.httpusers"

AuthUserfile “/etc/httpd/conf.d/.httpgroups”

Require httpgroup2

Require user http1,http2

</Directory>

在/etc/httpd/conf.d/.httpgroups配置

Vim /etc/httpd/conf.d/.httpgroups

Httpgroup1 http1 http2

Httpgroup2 http1 http3

虚拟主机:一个站点相当于一个主机

根据IP地址区分:

准备站点:

vim /app/site1/index.html

vim /app/site2/index.html

vim /app/site3/index.html

/etc/httpd/conf.d/test.conf编辑

<VirtualHost 192.168.109.10:80>

DocumentRoot “/app/site1"

</VirtualHost>

<VirtualHost 192.168.109.20:80>

DocumentRoot “/app/site2"

</VirtualHost>

<VirtualHost 192.168.109.30:80>

DocumentRoot “/app/site3"

</VirtualHost>

修改/etc/hosts文件

192.168.109.10 www.a.com

192.168.109.20 www.b.com

192.168.109.30 www.c.com

Curl www.a.com

Curl www.b.com

Curl www.c.com

根据端口号区分:

/etc/httpd/conf.d/test.conf编辑

Listen 8001

Listen 8002

Listen 8003

<VirtualHost *:8001>

DocumentRoot “/app/site1"

</VirtualHost>

<VirtualHost *:8002>

DocumentRoot “/app/site2"

</VirtualHost>

<VirtualHost *:8003>

DocumentRoot “/app/site3"

</VirtualHost>

基于名称FQDN的虚拟主机:

650) this.width=650;" src="https://s5.51cto.com/oss/201710/30/5892df633ad591b1980e9d3a33c41aaf.png" title="http FQDN虚拟主机.png" alt="5892df633ad591b1980e9d3a33c41aaf.png" />

修改/etc/hosts文件

192.168.37.106 www.a.comwww.b.comwww.c.com

/etc/httpd/conf.d/test.conf编辑

650) this.width=650;" src="https://s2.51cto.com/oss/201710/30/985bcedee4664ca9d1b2630b132c8b9a.png" title="http fqdn.png" alt="985bcedee4664ca9d1b2630b132c8b9a.png" />

谁排第一谁就是默认站点

http协议:

理论上http协议属于无状态的协议,stateless 无状态

解决http协议无状态方法:

Cookie 客户端存放

Session 服务器存放

650) this.width=650;" src="https://s2.51cto.com/oss/201710/30/90204b4385bf7bf5a5ec552169c30a21.png" title="http cookie.png" alt="90204b4385bf7bf5a5ec552169c30a21.png" />

重cookie:所有信息都存到cookie,不合理,浪费带宽

轻cookie:只存用户的UID 和服务器上存放的session表结合使用

650) this.width=650;" src="https://s2.51cto.com/oss/201710/30/555d2f882ea7230dd25b128b9e698de2.png" title="http cookie2.png" alt="555d2f882ea7230dd25b128b9e698de2.png" />

Http请求报文结构:

650) this.width=650;" src="https://s2.51cto.com/oss/201710/30/7274fbce5457a5495a3eadd7d5ad352b.png" title="http 求情报文首部.png" alt="7274fbce5457a5495a3eadd7d5ad352b.png" />

由客户端决定:

request报文

<method> <request-URL> <version>

<headers>

<entity-body>

method: 请求方法,标明客户端希望服务器对资源执行的动作GET、HEAD、POST等

GET:从服务器获取一个资源

HEAD:只从服务器获取文档的响应首部

POST:向服务器输入数据,通常会再由网关程序继续处理

PUT:将请求的主体部分存储在服务器中,如上传文件

DELETE:请求删除服务器上指定的文档

TRACE:追踪请求到达服务器中间经过的代理服务器

OPTIONS:请求服务器返回对指定资源支持使用的请求方法

version: HTTP/<major>.<minor> HTTP/

Http响应报文:

650) this.width=650;" src="https://s3.51cto.com/oss/201710/30/672e060275712fbb2ed6963b8ceacd4d.png" title="http 响应报文.png" alt="672e060275712fbb2ed6963b8ceacd4d.png" />

由服务器决定格式

response报文

<version> <status> <reason-phrase>

<headers>

<entity-body>

status:三位数字,如200,301, 302, 404, 502; 标记请求处理过程中发生的情况

reason-phrase:状态码所标记的状态的简要描述

headers:每个请求或响应报文可包含任意个首部;每个首部都有首部名称,后面跟一个冒号,而后跟一个可选空格,接着是一个值 HOST:2.2.2.2|www.a.com

status(状态码):

v 1xx:100-101 信息提示

v 2xx:200-206 成功

v 3xx:300-305 重定向

v 4xx:400-415 错误类信息,客户端错误

v 5xx:500-505 错误类信息,服务器端错误

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

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

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

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

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

v 403: 请求被禁止;Forbidden

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

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

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

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

v 504 – 网关超时

http协议首部:

通用首部

ü 请求首部

ü 响应首部

ü 实体首部

ü 扩展首部

通用首部:

Date: 报文的创建时间

Connection:连接状态,如keep-alive, close

Via:显示报文经过的中间节点(代理,网关)

Cache-Control:控制缓存,如缓存时长

MIME-Version:发送端使用的MIME版本

请求首部:

Accept:通知服务器自己可接受的媒体类型

Accept-Charset: 客户端可接受的字符集

Accept-Encoding:客户端可接受编码格式,如gzip

Accept-Language:客户端可接受的语言

Client-IP: 请求的客户端IP

Host: 请求的服务器名称和端口号

Referer:跳转至当前URI的前一个URL

User-Agent:客户端代理,浏览器版本

响应首部:

信息性:

Age:从最初创建开始,响应持续时长

Server:服务器程序软件名称和版本

协商首部:某资源有多种表示方法时使用

Accept-Ranges:服务器可接受的请求范围类型

Vary:服务器查看的其它首部列表

安全响应首部:

Set-Cookie:向客户端设置cookie

Set-Cookie2: 以上面相似

WWW-Authenticate:来自服务器对客户端的质询列表

实体首部:

Allow: 列出对此资源实体可使用的请求方法

Location:告诉客户端真正的实体位于何处

Content-Encoding:对主体执行的编码

Content-Language:理解主体时最适合的语言

Content-Length: 主体的长度

Content-Location: 实体真正所处位置

Content-Type:主体的对象类型,如text

缓存相关:

ETag:实体的扩展标签

Expires:实体的过期时间

Last-Modified:最后一次修改的时间

Curl工具:

curl是基于URL语法在命令行方式下工作的文件传输工具,它支持FTP, FTPS, HTTP, HTTPS, GOPHER, TELNET, DICT, FILE及LDAP等协议。curl支持HTTPS认证,并且支持HTTP的POST、PUT等方法, FTP上传, kerberos认证,HTTP上传,代理服务器,cookies,用户名/密码认证, 下载文件断点续传,上载文件断点续传, http代理服务器管道( proxy =tunneling),还支持IPv6,socks5代理服务器,通过http代理服务器上传文件到FTP服务器等,功能十分强大。

语法:curl [options] [URL...]

-A/--user-agent <string> 设置用户代理发送给服务器

-e/--referer <URL> 来源网址

--cacert <file> CA证书 (SSL)

-k/--insecure 允许忽略证书进行 SSL 连接

--compressed要求返回是压缩的格式

-H/--header <line>自定义首部信息传递给服务器

-i 显示页面内容,包括报文首部信息

-I/--head 只显示响应报文首部信息

-D/--dump-header <file>将url的header信息存放在指定文件中

--limit-rate <rate> 设置传输速度

--basic 使用HTTP基本认证

-u/--user <user[:password]>设置服务器的用户和密码

-L 如果有3xx响应码,重新发请求到新位置

-o <file> 将网络文件保存为指定的文件中

-O 使用URL中默认的文件名保存文件到本地

-0/--http1.0 使用HTTP 1.0

-L 选项进行强制重定向

-C - 选项可对文件使用断点续传功能

-c/--cookie-jar <file name> 将url中cookie存放在指定文件中

-x/--proxy <proxyhost[:port]> 指定代理服务器地址

-X/--request <command> 向服务器发送指定请求方法

-U/--proxy-user <user:password> 代理服务器用户和密码

-T 选项可将指定的本地文件上传到FTP服务器上

--data/-d 方式指定使用POST方式传递

mod_deflate模块

使用mod_deflate模块压缩页面优化传输速度

适用场景:

(1) 节约带宽,额外消耗CPU;同时,可能有些较老浏览器不支持

(2) 压缩适于压缩的资源,例如文本文件

启用压缩

SetOutputFilter DEFLATE

DeflateCompressionLevel 9(压缩级别)

AddOutputFilterByType DEFLATE text/plain

AddOutputFilterByType DEFLATE text/html


实验:在centos6.9编译httpd2.4.28

Httpd2.4版本要依赖apr1.4版本以上才行,所以先编译安装apr

Yum remove httpd

Rz

Apr-1.6.2.tar.gz

Apr-util-1.6.0.tar.gz

httpd-2.4.25.tar.gz

Tar xvf apr-1.6.2

Tar xvf Apr-util-1.6.0.tar.gz

Yum insatall Development tools

相关包:pcre-devel,openssl-devel expat-devel

安装apr-1.4+

cd apr-1.6.2

./configure --prefix=/app/apr

make && make install

v 安装apr-util-1.4+

cd ../apr-util-1.6.0

./configure --prefix=/app/apr-util --withapr=/app/apr/

make -j 2 && make install

编译安装httpd-2.4

cd ../httpd-2.4.27

./configure --prefix=/app/httpd24 --enable-so --

enable-ssl --enable-cgi --enable-rewrite --with-zlib

--with-pcre --with-apr=/app/apr/ --with-aprutil=/app/apr-util/ --enable-modules=most --enablempms-shared=all --with-mpm=prefork

make -j 4 && make install

centos6 编译安装httpd-2.4方法二

cp -av apr-util-1.6.0 httpd-2.4.27/srclib/apr-util

v cp -av apr-1.6.2 httpd-2.4.27/srclib/apr

v cd httpd-2.4.27/

./configure --prefix=/usr/local/httpd24 /

--enable-so /

--enable-ssl /

--enable-cgi /

--enable-rewrite /

--with-zlib /

--with-pcre /

--with-included-apr /

--enable-modules=most --enable-mpms-shared=all /

--with-mpm=prefork

make && make install

修改进程名:daemon------apache

查看是否有apache用户

修改 vim /app/httpd24/conf/httpd.conf

User deamon---apache

添加服务:

cd /etc/init.d cp httpd http24

修改Vim httpd24 修改为自己编译的http的路径

650) this.width=650;" src="https://s1.51cto.com/oss/201710/30/d4865e67667df0bd47ee327f468bfcde.png" title="图片2.png" alt="d4865e67667df0bd47ee327f468bfcde.png" />

Chkconfig --add httpd24

Httpd2.4修改工作模式

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

测试性能命令:

Ab -c 100 -n 2000 http://192.168.109.166/m.txt

修改主站点:与httpd2.2不同,转换的主站点要有权限

650) this.width=650;" src="https://s1.51cto.com/oss/201710/30/484f4f805fac854b1b61549470c88a0d.png" title="图片3.png" alt="484f4f805fac854b1b61549470c88a0d.png" />

不允许特定主机: httpd2.4默认是不允许

650) this.width=650;" src="https://s2.51cto.com/oss/201710/30/37e873465fba9d5dca6799dcff2c051c.png" title="图片4.png" alt="37e873465fba9d5dca6799dcff2c051c.png" />

Httpd2.4基于FQDN实现访问,注意权限。其他一样

650) this.width=650;" src="https://s2.51cto.com/oss/201710/30/7a8dce49d90c8b3a9705c75afe4f90c2.png" title="图片5.png" alt="7a8dce49d90c8b3a9705c75afe4f90c2.png" />

Httpd2.4实现跳转https 简单方法

Cd /etc/pki/tls/crets

Make httpd.pem

证书文件和私钥文件放在一起了,要分开!

Httpd.crt和httpd.key

修改 vim /etc/httpd/conf.d/ssl.conf 证书路径和私钥路径

Make httpd.crt 证书文件和私钥文件已分开

Sendfile功能 简单的说就是 数据可以直接从内核到协议栈了,不用再转发到用户包装包装发到内核再发给协议栈了

一般网络应用通过读硬盘数据,写数据到 socket 来完成网络传输,底层执行过程:

v 1 系统调用 read() 产生一个上下文切换:从 user mode 切换到 kernel mode,

然后 DMA 执行拷贝,把文件数据从硬盘读到一个 kernel buffer 里。

v 2 数据从 kernel buffer 拷贝到 user buffer,然后系统调用 read() 返回,这时

又产生一个上下文切换:从kernel mode 切换到 user mode

v 3 系统调用 write() 产生一个上下文切换:从 user mode 切换到 kernel mode,

然后把步骤2读到 user buffer 的数据拷贝到 kernel buffer(数据第2次拷贝到

kernel buffer),不过这次是个不同的 kernel buffer,这个 buffer和 socket

相关联。

v 4 系统调用 write() 返回,产生一个上下文切换:从 kernel mode 切换到 user

mode(第4次切换),然后DMA从 kernel buffer 拷贝数据到协议栈(第4次拷贝)

v 上面4个步骤有4次上下文切换,有4次拷贝,如果能减少切换次数和拷贝次数将会

有效提升性能

在kernel 2.0+ 版本中,系统调用 sendfile() 就是用来简化上面步骤提升性能的。sendfile() 不但能减少切换次数而且还能减少拷贝次数

不用 sendfile 的传统网络传输过程:

硬盘 >> kernel buffer >> user buffer >> kernel socket buffer >> 协议栈

用 sendfile() 来进行网络传输的过程:

硬盘 >> kernel buffer (快速拷贝到kernel socket buffer) >> 协议栈

系统调用 sendfile() 通过 DMA 把硬盘数据拷贝到 kernel buffer,然后数据被 kernel 直接拷贝到另外一个与 socket 相关的 kernel buffer。这里没有 user mode 和 kernel mode 之间的切换,在 kernel 中直接完成了从一个 buffer 到另一个 buffer 的拷贝。

2 DMA 把数据从 kernel buffer 直接拷贝给协议栈,没有切换,也不需要数据从 user mode 拷贝到 kernel mode,因为数据就在kernel 里

Httpd2.4反向代理

在代理机上编辑htppd的一个子配置文件就OK

ProxyPass "/" "192.168.109.166"

ProxyPassReverse "/" "192.168.109.166"

特定URL反向代理

修改子配置文件:

650) this.width=650;" src="https://s2.51cto.com/oss/201710/30/38fc097111271a2c9fc590efa14eb10f.png" title="图片6.png" alt="38fc097111271a2c9fc590efa14eb10f.png" />


http协议理论及实验

原文地址:http://13287454.blog.51cto.com/13277454/1977595

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved