http访问模块
❶ node.js的http模块如何使用
安装好node后,自带了http模块,可以直接使用
-----------
var http = require('http');
http.createServer(function (request, response) {
response.writeHead(200, {'Content-Type': 'text/plain'});
response.end('Hello World\n');
}).listen(3000, '127.0.0.1');
❷ HTTP之多路处理模块MPM
MPM,是 Multi-Processing Moles 的缩写,就是多处理模块的意思,它是在 Apache 2.0 中引入的一个概念,引入目标是将 Apache 的结构能够模块化,把核心的任务处理作为一个可插拔的模块来运行,这样就容易根据不同的环境和应用来更有效的优化 Apache 的运行,他是 Apache 2.X 中最影响其性能的,最核心的特征,因为直接决定了 Apache 的工作方式,这里有一个问题是:它究竟怎么样影响了 Apache。
可以这么说:它决定了 Apache 以怎么样的方式接入外部请求。Apache内部怎么样处理这个请求过程,这当然是最核心的。比如它可以决定在处理外部请求的时候,需不需要启动多线程,如果是用多线程,最多可以多少个线程,一个进程可以产生最多多少个线程,类似于这种配置,都来自于MPM。MPM有一些指令可以专门用于调节父进程如何产生子进程,主要是StartServers,MinSpareServers,MaxClients 等,下面会介绍这些指令是什么意思。
prefork 控制进程在最初建立 “StartServers” 这个子进程后,为了满足MinSpareServers 设置的需要创建一个进程,等待一秒钟,继续创建两个,在等待一秒钟,继续创建四个····如此按指数级增加创建的进程数,最多达到每秒32个,直到满足 MinSpareServers 设置的值为止,这种模式可以不必在请求到来时再产生新的进程,从而减少了系统开销以增加性能。 MaxSpareServers 设置了最大的空闲进程数,如果空闲进程数大于这个值,Apache 会自动 kill 掉一些多余进程。这个值不要设置得过大,但如果设的值比 MinSpareServers 小, Apache 会自动把其调整为 MinSpareServers+1,如果站点负载较大,可考虑同时加大 MinSpareServers 和 MaxSpareServers。
MaxRequestsPerChild 设置的是每个子进程可处理的请求数,每个子进程在处理了 “MaxRequestsPerChild” 个请求后将自动销毁。 0 意味着无限,即子进程永不销毁。虽然缺省设为 0 可以使每个子进程处理更多请求,但如果设为非 0 值也有两点重要的好处:1、可防止意外的内存泄露。2、在服务器负载下降的时候会自动减少子进程数。因此,可根据服务器的负载来调整这个值。
MaxRequestWorkers 指令集同时将服务请求的数量上的限制。任何连接尝试在 MaxRequestWorkerslimit 将通常被排队,最多若干基于上 ListenBacklog 指令,在 Apache 2.3.13 以前的版本 MaxRequestWorkers 被被称为 MaxClients。
MaxRequestWorkers 是这些指令中最为重要的一个,设定的是 Apache 可以同时处理的请求,是对 Apache 性能影响最大的参数。其缺省值 150 是远远不够的,如果请求总数已达到这个值(可通过ps -ef|grep http|wc -l 来确认),那么后面的请求就要排队,直到某个已请求处理完毕。这就是系统资源还剩下很多而 HTTP 访问却很慢的主要原因。虽然理论上这个值越大,可以处理的请求就越多,但 Apache 默认的限制不能大于256。
Prefork 实现了一个非线程型的、预派生的 web 服务器,它的工作方式类似于 Apache 1.3。它合适于没有线程安全库,需要避免线程兼容性问题的系统。它是要求将每个请求相互独立的情况下最好的MPM,这样若一个请求出现问题就不会影响到其他请求。
Worker 由主控制进程生成 “StartServers” 个子进程,每个子进程中包含固定的 ThreadsPerChild 线程数,各个线程独立地处理请求。同样,为了不在请求到来时再生成线程, MinSpareThreads 和 MaxSpareThreads 设置了最少和最多的空闲线程数;
而 MaxRequestWorkers 设置了同时连入的 clients 最大总数,如果现有子进程中的线程总数不能满足负载,控制进程将派生新的子进程。例如: 5 StartServers x 25 ThreadsPerChild = 125 MaxRequestWorkers。
ThreadsPerChild 是 worker MPM 中与性能相关最密切的指令。ThreadsPerChild 的最大缺省值是 64,如果负载较大,64 也是不够的。这时要显式使用 ThreadLimit 指令,它的最大缺省值是20000。
Worker 模式下所能同时处理的请求总数是由子进程(StartServers)乘以 ThreadsPerChild 值决定的,应该大于等于 MaxRequestWorkers。如果负载很大,现有的子进程数不能满足时,控制进程会派生新的子进程。默认最大的子进程总数是 16,加大时也需要显式声明 ServerLimit(最大值是2000)。需要注意的是,如果显式声明了 ServerLimit,那么它乘以 ThreadsPerChild 的值必须大于等于 MaxRequestWorkers,而且 MaxRequestWorkers 必须是 ThreadsPerChild的整倍数,否则 Apache 将会自动调节到一个相应值。
Worker使网络服务器支持混合的多线程多进程。由于使用线程来处理请求,所以可以处理海量请求,而系统资源的开销小于基于进程的 MPM。但是,它也使用了多线程,每个进程又有多个线程,以获得基于进程的 MPM 的稳定性。
每个进程可以拥有的线程数量是固定的。服务器会根据负载情况增加或减少进程数量。一个单独的控制进程(父进程)负责子进程的建立。每个子进程可以建立 ThreadsPerChild 数量的服务线程和一个监听线程,该监听线程监听接入请求并将其传递给服务线程处理和应答。
以上两种稳定的MPM方式在非常繁忙的服务器应用下都有些不足。尽管 HTTP 的 Keepalive 方式能减少 TCP 连接数量和网络负载,但是 Keepalive 需要和服务进程或者线程绑定,这就导致一个繁忙的服务器会耗光所有的线程。 Event MPM 是解决这个问题的一种新模型,它把服务进程从连接中分离出来。在服务器处理速度很快,同时具有非常高的点击率时,可用的线程数量就是关键的资源限制,此时 Event MPM 方式是最有效的。一个以 Worker MPM 方式工作的繁忙服务器能够承受每秒好几万次的访问量(例如在大型新闻服务站点的高峰期时),而Event MPM 可以用来处理更高负载,值得注意的是, Event MPM 不能在安全HTTP(HTTPS)访问下工作。
❸ Express框架:内置模块之HTTP模块(HTTP协议部分)
网络是用于信息的传输与接收,共享的虚拟平台,通过它把各个点,面到网的信息都联系到一起,从而实现这些资源的共享
网络传输数据具有一定的规则,这些规则被称为协议,HTTP就是规则中的一种,而且是使用最为频繁的一种协议
HTTP协议是网络协议的一种,超文本传输协议的简写
超文本传输协议传输的内容就是超文本的标记语言(文字,图片,视频,音频)它是TCP/IP协议之上的一个应用层协议,用于定义Web浏览器与Web服务器之间的交换数据的过程以及数据本身的格式
HTTP协议是一种单纯的网络传输协议,采用的是请求/应答的方式传递数据,一次请求对应一次应答(响应)
HTTP协议的约束
所谓三次握手,就是指在一个TCP连接时,需要客户端和服务器发送三个包,主要的目的是连接服务器指定的端口去建立TCP连接,并同步连接双方的序列号和确认号并交换TCP窗口大小信息
客户端和服务器的传输过程,一般是无状态的传输方式,无状态的传输指的是你第一次去向服务器发送请求,服务器并不会记住这次请求。
TCP三次握手原理
http协议规定的服务器响应数据时的状态编码,就是状态码
1开头的
表示普通消息
2开头的
3开头的
4开头的
5开头的
第一步:检查浏览器缓存中是否缓存过该域名对应的IP地址
第二步:第二步:如果在浏览器缓存中没有找到IP,那么将继续查找本机系统是否缓存过IP
解析过程
text/html;charset=utf-8
字符串编码,node默认的字体编码是utf-8,浏览器的编码,默认是系统编码,简体中文编码,就是GBK编码,因此会出现乱码现象。
值是数字,字节的长度,一般不会设置,返回的内容就是个单纯的值
可以通过这个响应头解决跨域问题,设置为 * 号即可
HTTP中使用MIME类型代表文件的类型,服务器具体返回各种数据的能力,但是返回数据时,应该告诉浏览器返回的是一个什么类型的文件
MIME类型:文件类型的表述
❹ 07《Nginx 入门教程》Nginx 的 Http 模块介绍(上)
本部分内容将详细介绍 Nginx 中对 Http请求的 11 个处理阶段,分成 3 个小节讲解并进行相关实验操作。
Nginx 将一个 Http 请求分成多个阶段,以模块为单位进行处理。其将 Http请求的处理过程分成了 11 个阶段,各个阶段可以包含任意多个 Http 的模块并以流水线的方式处理请求。这 11 个 Http 阶段如下所示:
网上有人做了一个非常形象的图片,如下图所示。我们可以看到 11 个阶段的处理顺序,以及每个阶段中涉及到的相关模块以及模块之间的顺序。
POST_READ 阶段是 Nginx 接收到 Http 请求完整头部后的处理阶段,这里主要使用的是 realip 模块获取用户的真实地址,方便后续对该 IP 进行限速或者过滤其请求等。
SERVER_REWRITE 和后面的 REWRITE 阶段一般是使用 rewrite 模块修改 Http请求的 uri,实现请求的控制。
FIND_CONFIG 阶段只是做 location 的匹配项。
PREACCESS、ACCESS 和 POST_ACCESS 是和 Http 请求访问权限相关的阶段。PREACCESS 阶段是在连接之前要做的访问控制, 这个阶段有 limit_conn 和 limit_req 等模块工作。ACCESS 阶段是解决用户能不能访问,比如根据用户名、密码限制用户访问(auth_basic 模块)、根据 ip 限制用户访问(access 模块)以及第三方模块认证限制用户的访问(auth_request模块)。POST_ACCESS 是在 ACCESS 之后要做的一些工作。
TRY_FILES 阶段为访问静态文件资源而设置的。有时候又称之为 PRECONTENT 阶段,即在 CONTENT 阶段之前做的事情。主要是 try_files 模块在此阶段工作。
最重要的 CONTENT 是处理 Http 请求内容的阶段,大部分 HTTP 模块介入这个阶段,比如 index、autoindex、concat 以及反向代理的模块都是在这里生效的。
LOG 是处理完请求后的日志记录阶段,如 access_log 模块。
realip 模块是在 postread 阶段生效的,它的作用是: 当本机的 nginx 处于一个反向代理的后端时获取到真实的用户 ip。 如果没有 realip 模块,Nginx 中的 $remote_addr 可能就不是客户端的真实 ip 了,而是代理主机的 ip。
realip模块的配置实例如下:
set_real_ip_from 是指定我们信任的后端代理服务器,real_ip_header 是告诉 nginx 真正的用户 ip 是存在 X-Forwarded-For 请求头中的。
当 real_ip_recursive 设置为 off 时,nginx 会把 real_ip_header 指定的 Http头中的最后一个 ip 当成真实 ip;
而当 real_ip_recursive 为 on 时,nginx 会把 real_ip_header 指定的 Http头中的最后一个不是信任服务器的 ip (前面设置的set_real_ip_from)当成真实 ip。通过这样的手段,最后拿到用户的真实 ip。
rewrite 模块可以看到它在 SERVER_REWRITE 和 REWRITE 阶段都有介入。rewrite 模块的主要功能是改写请求的 uri。它是 Nginx 默认安装的模块。rewrite 模块会根据正则匹配重写 uri,然后发起内部跳转再匹配 location, 或者直接做30x重定向返回客户端。rewrite 模块的指令有 break, if, return, rewrite, set 等,这些都是我们常用到的。
return 指令返回后,Http 请求将在 return 的阶段终止,后续阶段将无法进行,所以许多模块得不到执行。
1、将 regex 指定的 url 替换成 replacement 这个新的 url,可以使用正则表达式及变量提取。
2、当 replacement 以 http:// 或者 https:// 或者 $schema 开头,则直接返回 302 重定向
3、替换后的 url 根据 flag 指定的方式进行处理
if 指令的条件表达式:
location 匹配是在 FIND_CONFIG 阶段进行的,我们需要掌握 location 的匹配规则和匹配顺序。
有一个简单总结如下:
即:
realip 模块默认没有被编译进 Nginx 的,我们需要在源码编译阶段使用–with-http_realip_mole,将 realip 模块编译进来后方可使用。接下来,我们做个简单测试,首先准备一个 server 块如下:
首先,我们将 real_ip_recursive 设置为 off,然后做一次请求:
这里返回的是头部参数 X-Forwarded-For 中最后一个 ip,如果将 real_ip_recursive 设置为 on,此时,由于 set_real_ip_from 中设置218.19.206.164为信任的方向代理 ip,那么 Nginx 会往前找一位,认为 1.1.1.1 是用户的真实ip。
我们写一个简单配置如下:
先测试if指令,当请求方法为 POST 时,我们能得到 ‘post request!’ 这样的字符串输出。GET 请求时候,针对 404 情况,会跳转到/403.html,我们准备一个 403.html 页面,里面写上’403, forbidden!’ 这一行内容,开始下面的 Http 请求:
如果我们打开 return 405 这行指令,则 error_page 将不会生效,连同后面的 location 匹配也不会生效。无论我们发送如何请求,都会返回405的错误信息。这是因为 server 中的 return 指令是在 SERVER_REWRITE中执行的,而 location 匹配则是在下一个阶段 FIND_CONFIG 中执行的,所以上一个阶段在 return 后,根本不会进入后面的阶段执行。
首先,我们准备环境,首先是新建一个目录 third(全路径为/root/test/third),再该目录下新建一个文件 3.txt, 里面只有一行内容 ‘hello, world’。接下来,我们准备一个 server 块,加到 Http 指令块中:
上述配置中,要打开 rewrite_log指令,这样我们可以看到 rewrite 指令的相应日志,方便查看结果。
当我们在 /second 配置中,使用 break 时,请求命令:
如果是不使用 break 标识,则请求结果如下:
首先是 /first/3.txt 请求在 /first 中匹配,并被替换为 /second/3.txt, last 标识表示将继续进行匹配,在 /second 中,uri 又被 rewrite 成 /third/3.txt, 如果后面跟了 break 标识,表示 rewrite 到此结束,不会执行后面的 return 指令,直接请求静态资源 /third/3.txt,得到其内容’hello, world’;如果是没有 break 标识,则会在执行 return 指令后直接返回,并不会继续执行下去,最后返回’second!'字符串。
我们按照这样的 location 规则,进行匹配实验,结果如下:
这里介绍了 Nginx 处理 Http 请求的 11 个阶段,并重点介绍了 前三个阶段POST_READ、REWRITE以及FIND_CONFIG以及这些阶段中涉及到的模块和指令。前面讲到的指令都是 Nginx 中的高频指令,必须要熟练掌握。
❺ http模块与http程序处理程序有什么区别具体点
ASP.NET HTTP 处理程序是响应对 ASP.NET Web 应用程序的请求而运行的过程(通常称为“终结点”)。最常用的处理程序是处理 .aspx 文件的 ASP.NET 页处理程序。用户请求 .aspx 文件时,页通过页处理程序来处理请求。您可以创建自己的 HTTP 处理程序将自定义输出呈现给浏览器。
HTTP 模块是一个在每次针对应用程序发出请求时调用的程序集。HTTP 模块作为 ASP.NET 请求管道的一部分调用,它们能够在整个请求过程中访问生命周期事件。HTTP 模块使您可以检查传入和传出的请求并根据该请求进行操作。
自定义 HTTP 处理程序通常具有以下用途:
RSS 源 若要为网站创建 RSS 源,可以创建一个可发出 RSS 格式 XML 的处理程序。 然后可以将文件扩展名(如 .rss)绑定到此自定义处理程序。当用户向站点发送以 .rss 结尾的请求时,ASP.NET 将调用您的处理程序来处理请求。
图像服务器 如果希望 Web 应用程序能够提供不同大小的图像,可以编写一个自定义处理程序来调整图像大小,然后将调整后的图像作为处理程序的响应发送给用户。
HTTP 模块通常具有以下用途:
安全 因为您可以检查传入的请求,所以 HTTP 模块可以在调用请求页、XML Web services 或处理程序之前执行自定义的身份验证或其他安全检查。 在以集成模式运行的 Internet 信息服务 (IIS) 7.0 中,可以将 Forms 身份验证扩展到应用程序中的所有内容类型。
统计信息和日志记录 因为 HTTP 模块是在每次请求时调用的,所以,您可以将请求统计信息和日志信息收集到一个集中的模块中,而不是收集到各页中。
自定义的页眉或页脚 因为您可以修改传出响应,所以可以在每一个页面或 XML Web services 响应中插入内容,如自定义的标头信息。
ASP.NET 页处理程序仅仅是一种类型的处理程序。ASP.NET 包括其他几种内置的处理程序,例如.asmx .aspx处理程序。比如,你可以为.rar类型的文件或.jpg的文件或.txt设置不同的处理程序.是下载,是打开还是处理里边的数据就由你自己决定了
HTTP 模块是一个在每次针对应用程序发出请求时调用的程序集。ASP.NET HTTP模块针对所有请求调用,可以检查传入的请求并根据该请求进行操作。它们还使您可以检查传出的响应并修改它。
❻ HTTP缓存与header模块
HTTP缓存分为缓存控制和缓存校验,缓存控制有Cache-Control和Pragma
Pragma是旧产物,已经逐步抛弃,有些网站为了向下兼容还保留了这两个字段。如果一个报文中同时出现Pragma和Cache-Control时,以Pragma为准。同时出现Cache-Control和Expires时,以Cache-Control为准。即优先级从高到低是 Pragma -> Cache-Control -> Expires
如果在请求header有如下参数
则Pragma的优先级更高
Cache-Control一般值为
缓存校验有Last-Modified和ETag
如果请求Cache-Control值为max-age=0,表示客户端要去服务端做资源校验,校验通过会发生304,使用本地缓存的资源,校验不通过的话,服务端将数据返回给客户端
服务端在响应时候会有响应头Last-Modified,这是一个格林威治时间,表示资源最后的修改时间
客户端在刷新页面时候,会发一个请求头If-Modified-Since,表示收到的上一次服务端给的Last-Modified
当服务端会对比自己的Last-Modifed和客户端的If-Modified-Since,如果
If-Modified-Since >= Last-Modifed
那么服务端会直接响应304,响应body体长度为0,以下为一个304响应的nginx-access日志
但是Last-Modifed无法解决资源在一秒内连续修改的问题,一秒内连续修改后,客户端只会更新一次
更好的解决方法是ETag,服务器会响应一个根据资源算出来的字符,如
第二次客户端请求时候会携带If-None-Match请求头
如果
If-None-Match == ETag
表示资源没有修改,服务端响应304
如果同时有ETag和Last-Modify,则ETag的优先级会更高
但是ETag也有问题,如果服务端是多节点集群,那么有可能A节点算出来的ETag和B节点的ETag可能不同,造成无法正常304响应,在nginx中可以关闭ETag
200状态码会发生于浏览器第一次加载页面、强制刷新、304校验失败、资源缓存过期、浏览器禁用缓存情况
如果是浏览器第一次加载,那么请求头不会有 Cache-Control 、 If-None-Match 、 If-Modified-Since
服务端正常响应200,正常将数据传给客户端
如果是强制刷新,那么浏览器会强制加请求头
表示需要服务端响应真实数据,不用做校验
如果浏览器禁用了缓存Disable Cache,那么也会强制加请求头no-cache
304状态码会发生于刷新页面情况
刷新情况浏览器会强制加请求头
表示需要浏览器校验,校验成功就是304,校验失败就是200
发生过程
由于访问静态资源,服务端通常都会响应Cache-Control:max-age,表示需要客户端缓存这个静态资源多长时间,如
同一个浏览器新窗口再次访问会发生from disk cache
from disk cache情况服务端不会收到请求
响应码为 200 , 201 , 206 , 301 , 302 , 303 , 307 , 308 情况下会发这个响应头
参数可以是正数或者负数,如果为负,则发送的头为
可以配置max,这样响应的就是,可以认为是永久缓存
off参数可以禁用添加或者修改expire和Cache-Control响应
响应码为200、201、204、206、301、302、303、304、307、308则添加指定的响应头
如果当前级别没有add_header,则从上一个级别继承,仅仅当前级别没有的话
如果定义了always,则不管响应码为多少都添加header