上节课讲了nginx代理服务器可以修改传递给后端服务器和客户端的请求报文,其中还有
proxy_pass_header field;---能够允许nginx把由后端被代理服务器发来的响应报文的指定首部和值直接传递给客户端。
proxy_pass_request_body on|off;
proxy_pass_request_headers on|off;---能否把请求报文的某些首部直接传递给后端服务器,默认on

nginx代理服务器:1、代理服务器本地没有缓存的时候,通过到后端服务器的网络IO和后端服务器的本地磁盘IO才能到达代理服务器2、后端服务器的文件结构是树状结构,通过根一级一级的去查找,而代理服务器的缓存数据结构虽然也是树状结构,但是是固定等级的路径,而每级路径的名字是哈希码
nginx代理服务器的缓存有两种:一种是内存中的hash表,根据用户请求来去hash表中查找,速度快,另外一种是磁盘上的多级目录1:1:2,如果hash表中有,就遍历
缓存空间要先定义后使用,多级目录也要先定义,哪一个地方放这些缓存
有些情况是不需要缓存的,例如:用户提交表单的post方法不需要,put上传文件不需要,delete删除文件不需要,f5+shift强刷(告诉代理服务器不要缓存),httpv1、httpv2等版本不同的缓存,ftp、http不同协议可能请求的url相同但是请求内容不同,也不需要缓存,后端服务器挂了也不能缓存,缓存满了也不能缓存,有些动态信息也不能缓存;

需不需要缓存,要看用户能不能接受过期的信息

接上节课的课件:
3、proxy_cache_path
定义可用于proxy功能的缓存;Context:http
4、proxy_cache zone | off
指明要调用的缓存,或关闭缓存机制;Context:http,server,location
5、proxy_cahe_key string;
缓存中用于"键"的内容;
默认值:proxy_cache_key $scheme$proxy_host$request_url;
6、proxy_cache_valid [code ...] time;
定义对特定响应码的响应内容的缓存时长;
定义在http{...}中;
proxy_cache_path /var/cache/nginx/proxy_cache levels=1:1:1 keys_zone=pxycache:20m max_size=1g;
定义在需要调用缓存功能的配置段,例如server{...};
proxy_cache pxycache;
proxy_cache_key $request_url;
proxy_cache_valid 200 302 301 1h;
proxy_cache_valid any 1m;
7、proxy_cache_use_state---定义对于那些过期的内容响应与否怎么响应,默认off,只要后端服务器联系不上就不能使用缓存来响应。
8、proxy_cache_methods GET|HEAD|POST...;---post没有必要缓存,默认是get和head,可以不用定义
9、proxy_hide_header field;
10、proxy_connect_timeout time;---定义向服务器一侧发请求(建立三次握手的连接)超时时间。
默认为60s,最长为75s;
11、proxy_read_timeout time;---定义两次重传之间的时间间隔,而不是多长时间完成请求,读取后端服务器给代理服务器的响应的超时时间
12、proxy_send_timeout time;---设置向服务端,向被代理服务端发请求报文时的超时时长,默认60s

ngx_http_headers_modules模块:
向由代理服务器响应给客户端的响应报文添加自定义首部,或修改指定首部的值;
1、add_header name value [always];
添加自定义首部;
add_header X-Via $server_addr;
add_header X-Accel $server_name;
2、expires [modified] time;
expires epoch | max|off;
用于定义Expire或Cache-Control首部的值;


下边是如何定义缓存的演示:
vim nginx.conf---放在http上下文中,添加下列一行
proxy_cache_paht /data/nginx/cache levels=1:1:1 keys_zone=pcache:10m max_size=2g;
定义缓存的存放目录,指明是几级子目录(每个子目录截取URL多少个字符),在内存中取个名字以及大小,存放缓存目录的磁盘空间最大是多少
mkdir -pv /data/nginx/cache---会自动按需创建缓存目录
nginx -s reload
然后编辑自定义的虚拟主机配置文件:
vim ilinux.conf
server {
listen 80;
server_name www.ilinux.io;
proxy_cache pcache;---使用pcache这个缓存,上边已经定义过了下边的两个location都生效。
proxy_cache_key $request_uri;
proxy_cache_method GET POST;
proxy_cache_min_uses 1;---缓存内部的缓存项在指定非活动时间内(默认10min)至少访问到几次认为是活动项,如果少于定义的次数,就把它清理掉,默认是1次
proxy_cache_valid 200 302 10m;
proxy_cache_valid 404 1m;
proxy_cache_use_state http_502;

location / {---没有root就没法提供web服务,但是我们是反代服务器,不需要web功能
    proxy_pass http://192.168.10.11:80;---可以是域名,可以是ip地址,后边要不要跟斜线,如果没有斜线,是把能匹配到的补到后边,如果有斜线,是替换斜线
    proxy_set_header X-Real-IP $remote_addr;---把客户端真实地址添加到报文首部发给后端主机
    add_header X-Via $server_addr;---把真实后端服务器地址发给客户端

}
location ~* \.(jpg|jpeg|png)$ {---这是另一台后端服务器了UPSS2,使用了正则表达式匹配的话,url后边不能加斜线
    proxy_pass http://192.168.10.12:80;
}

}
定义好缓存后,就可以进入到我们创建的缓存目录中,查看缓存的信息了
cat /data/nginx/cache/9/d/7/**---可以查看到缓存信息

httpd+php有两种方式:1、把php做成httpd的模块2、把php做成fpm server
而nginx只能用第二种方式fpm server

lnmp架构
lnamp也是不错的架构nginx apache+php mysql