正常情况下,CGI服务器会返回一个到多个STDOUT PDU,STDOUT的消息体是实际的数据内容,最大长度小于65536。需要将这些STDOUT的内容整合在一起,作为HTTP响应内容。需注意的是STDOUT内容中,也包含部分HTTP响应头信息,其格式遵循HTTP规范,每个响应头有key-value对构成,以rn换行符结束,响应头和响应体之间相隔一个空行rn。
全部STDOUT数据结束后,紧接着返回的是END_REQUEST PDU,其格式是8字节的FcgiHeader,加上8字节的消息体,其消息体定义如下:
typedef struct { uint32 app_status; uint8 protocol_status; uint8 reserved[3];} FCGI_EndRequest;/* Values for protocolStatus component of FCGI_EndRequest */#define FCGI_REQUEST_COMPLETE 0#define FCGI_CANT_MPX_CONN 1#define FCGI_OVERLOADED 2#define FCGI_UNKNOWN_ROLE 3
eJet服务器收到END_REQUEST时,就表示CGI服务器已经返回全部的响应数据了,将这些数据发送给客户端,即可结束当前处理。
10.4 FastCGI消息的实时转发
eJet系统将HTTP请求实时转发给CGI服务器,基本过程跟Proxy代理转发类似,包括实时转发、流量拥塞控制等。
其中在接收CGI服务器的响应数据时,需要解析以流式返回的STDOUT PDU的数据,但响应数据的总长度并未返回,eJet对这些响应数据的实时转发是采用Transfer-Encoding分块传输编码模式。为了减少响应数据的多次拷贝,FcgiCon中每次数据读就绪时,存入rcvstream缓冲区的数据,连同rcvstream一起移入到发起HTTP请求的源HTTPMsg内的res_rcvs_list列表中,并将解析成功的内容指针存入到res_body_chunk里,类似客户端访问本地文件一样,通过http_cli_send发送给客户端。
十一. HTTP Cache系统
11.1 HTTP Cache功能设置
HTTP Cache是指Web服务器充当HTTP Proxy代理服务器(包括正向代理和反向代理),通过HTTP协议向Origin服务器下载文件,然后转发给客户端,这些文件在转发给客户端的同时,缓存在代理服务器的本地存储中,下次再有相同请求时,根据相关缓存策略决定本地文件是否被命中,如果命中,则该请求无需向Origin服务器请求下载,直接将缓存中命中的文件读取出来返回给客户端,从而节省网络开销。
在配置文件中配置正向代理或反向代理的地方,都可以开启cache功能,并基于配置脚本动态设置缓存文件名等缓存选项。
location = { path = [ '^/view/([0-9A-Fa-f]{32})$', '~*' ]; type = proxy; passurl = http://cdn.yunzhai.cn/view/$1; # 反向代理配置缓存选项 root = /opt/cache/; cache = on; cache file = /opt/cache/${request_header[host]}/view/$1;}send request = { max header size = 32K; /* 正向代理配置的缓存选项 */ root = /opt/cache/fwpxy; cache = on; cache file =;}
在配置中启动了缓存功能后,还要根据Origin服务器返回的响应头指定的缓存策略,来决定当前下载文件是否保存在本地、缓存文件保存多长时间等。HTTP响应头中有几个头是负责缓存策略的:
Expires: Wed, 21 Oct 2020 07:28:00 GMT (Response Header)Cache-Control: max-age=73202 (Response Header)Cache-Control: public, max-age=73202 (Response Header)Last-Modified: Mon, 18 Dec 2019 12:35:00 GMT (Response Header)If-Modified-Since: Fri, 05 Jul 2019 02:14:23 GMT (Request Header) ETag: 627Af087-27C8-32A9E7B10F (Response Header)If-None-Match: 627Af087-27C8-32A9E7B10F (Request Header)
Proxy代理服务器需要处理Origin服务器返回的响应头,主要是Expires、Cache-Control、Last-Modified、ETag等。根据Cache-Control的缓存策略决定当前文件是否缓存:如果是no-cache或no-store,或者设定了max-age=0,或者设定了must-revalidate等都不能将当前文件保存到缓存文件中。如果设置了max-age大于0则根据max-age值、Expires值、Last-Modified值、ETag值来判断下次请求是否使用该缓存文件。