反向代理,缓存,upstream,fastcgi,session绑定:
反向代理:
   nginx:
        测试1:
            location / {
                proxy_pass http://192.168.112.110/;
                index index.html;
                }
               location /froum/ {
                proxy_pass http://192.168.112.110/bbs/;
                index index.html;
            }
            location /froum/ {
                proxy_pass http://192.168.112.110/;
                index index.html;
            }
            正则匹配注意:是直接加到后端url上的,而且跟上不能加任何url
                location ~* \.jpg$ {
                    proxy_pass http://192.168.112.110;
                    proxy_pass http://192.168.112.110/images/; --- 错误
                    index index.html;
                }
                http://192.168.112.110/a.jpg
                http://192.168.112.110/images/a.jpg
            如果出现重写,是被重写后的结果被代理到后端的。
           测试2:
                   Host 值 记录到  --> $Host
                   X-Real-IP 记录到   $remote_addr
                   前端:
                       location /froum/ {
                        proxy_pass http://192.168.112.110/;
                        proxy_set_header Host $host
                        proxy_set_header X-Real-IP $remote_addr
                        index index.html;
                    }
                   后端日志:
                       LogFormat "%{X-Real-IP}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
    nginx:
        测试1:
            location / {
                proxy_pass http://192.168.112.110/;
                index index.html;
                }
               location /froum/ {
                proxy_pass http://192.168.112.110/bbs/;
                index index.html;
            }
            location /froum/ {
                proxy_pass http://192.168.112.110/;
                index index.html;
            }
            正则匹配注意:是直接加到后端url上的,而且跟上不能加任何url
                location ~* \.jpg$ {
                    proxy_pass http://192.168.112.110;
                    proxy_pass http://192.168.112.110/images/; --- 错误
                    index index.html;
                }
                http://192.168.112.110/a.jpg
                http://192.168.112.110/images/a.jpg
            如果出现重写,是被重写后的结果被代理到后端的。
           测试2:
                   Host 值 记录到  --> $Host
                   X-Real-IP 记录到   $remote_addr
                   前端:
                       location /froum/ {
                        proxy_pass http://192.168.112.110/;
                        proxy_set_header Host $host
                        proxy_set_header X-Real-IP $remote_addr
                        index index.html;
                    }
                   后端日志:
                       LogFormat "%{X-Real-IP}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
  
缓存;
   proxy_cache_path :只能在http定义,可以定义多组,在不同的server中调用相同,或不同的
    缓存修剪:如果后端服务器数据更新,而且自己知道,每次访问,就删缓存,重新缓存
    cache_manager :只删除过期的,通过lru机制。
    nginx_http_fastcgi_module模块配置
        
        LNMP: 
            php主机:php-mysql、php-xcache
            
            思考?
                redis: php的redis扩展;
                memcached:php的memcached扩展;
                
ngx_http_proxy_module模块配置(http或https协议代理)
        
        (1) proxy_pass URL;
            应用上下文:location, if in location, limit_except
            
            proxy_pass后面的路径不带uri时,其会将location的uri传递给后端的主机;下面的示例会将/uri/传递给backend服务器;
                location  /uri/ {
                    proxy_pass http://hostname;
                }
                
            proxy_pass后面的路径是一个uri时,其会将location的uri替换为后端主机自己的uri;
                location  /uri/ {
                    proxy_pass http://hostname/new_uri/;
                }
                
            如果location定义其uri时使用的正则表达式模式匹配,则proxy_pass后的路径不能够使用uri;
                location  ~*  \.(jpg|gif|jpeg)$  {
                    proxy_pass  http://HOSTNAME;
                }
                
                此处的http://HOSTNAME后面不能有任何uri,哪怕只有/也不可以;
                
        (2) proxy_set_header field value;
            用于proxy server向backend server发请求报文时,将某请求首部重新赋值,或在原有值后面添加一个新的值; 也可以添加自定义首部; 
            
            示例:
                proxy_set_header  X-Real-IP  $remote_addr;
                proxy_set_header  X-Forwarded-For  $proxy_add_x_forwarded_for;
                    原有请求报文中如果存在X-Forwared-For首部,则将remote_addr以逗号分隔补原有值后,否则则直接添加此首部;
            
            实践作业:
                假如nginx有两个server(虚拟主机),且均反代至后端某一个主机,此主机亦有两个虚拟主机,虚拟主机名与nginx的相同;
                要求:用户请求nginx的哪一个虚拟主机,就将其代理后后端主机的对应的虚拟主机;                
                
                
        
缓存相关的选项(缓存要先定义,后调用):
        (3) proxy_cache_path path [levels=levels] [use_temp_path=on|off] keys_zone=name:size [inactive=time] [max_size=size]  目录属主属组nginx
            定义缓存;可用上下文为http; 
            levels:最多三层,每层名字几个字符表示 1:1:2 第一层 1个,第二层1个....
            keys_zone:开辟多大空间
            inactive:非活动时间,过期时间
            
        (4) proxy_cache zone | off; --- zone 名字
            调用缓存;可用上下文 为http, server和location;
            
        (5) proxy_cache_key string;
            定义缓存键;
            proxy_cache_key $scheme$proxy_host$request_uri;
                
        (6) proxy_cache_valid [code ...] time;
            对不同响应码的响应设定其可缓存时长;
            示例:
                proxy_cache_valid 200 302 10m;
                proxy_cache_valid 404      1m;    
                
        proxy_cache_use_stale error | timeout | invalid_header | updating | http_500 | http_502 | http_503 | http_504 | http_403 | http_404 | off ...;
        
跟连接相关的选项
        (7) proxy_connect_timeout time;
            定义与  后端服务器  建立连接的超时时长;默认为60s,不建议超出75s; 
            
        (8) proxy_send_timeout time;
            把请求发送给  后端服务器   的超时时长;默认为60s;
            
        (9) proxy_read_timeout time;
            等待   后端服务器   发送响应报文的超时时长;    
    
ngx_http_headers_module模块配置
        
        (1) add_header name value [always];
            向响应报文添加自定义首部,并为其赋值;
            
        (2) expires [modified] time;
              expires epoch | max | off;              
              允许或禁止向响应报文的Cache-Control或Expires首部添加新值或修改其值; 
       (3)proxy_hide_header:nginx响应给客户端,隐藏哪个首部
              
ngx_http_upstream_module模块配置
        用于将多个服务器定义成服务器组,而由proxy_pass, fastcgi_pass等指令进行引用;
        
        (1) upstream name { ... }
            定义一个后端服务器组,name为组名称;仅能用于http上下文 ;
            
        (2) server address [parameters];
            在upstream中定义一个服务器及其相关参数;仅能用于upstream上下文;
            
            常用参数:
                weight=number:定义服务器权重,默认为1;
                max_fails=number:最大失败连接尝试次数,失败连接超时时长由fail_timeout参数指定;
                fail_timeout=number:等待目标服务器发送响应的时长;
                backup:备用服务器,所有主服务器均故障时才启用此主机;
                down:手动标记其不再处理任何用户请求;
                
        使用方法:
            (a) 定义upstream服务器组
                upstream websrvs {
                    server 172.16.100.68 weight=2 max_fails=2 fail_timeout=6s;
                    server 172.16.100.6  weight=1 max_fails=2 fail_timeout=6s;
                }                
            
            (b) 在反代场景中(proxy_pass, fastcgi_pass, ...)进行调用;
                location / {
                    proxy_pass http://websrvs/;
                }
        
调度算法:        
        (3) ip_hash;
            源地址hash,把来自同一个ip地址的请求始终发往同一个backend server,除非此backend server不可用;
            
        (4) least_conn;
            最少连接;当各server权重不同时,即为加权最少连接;
            
        (5) health_check [parameters];
            健康状态检测机制;只能用于location上下文;
            
            常用参数:
                interval=time检测的频率,默认为5秒;
                fails=number:判定服务器不可用的失败检测次数;默认为1次;
                passes=number:判定服务器可用的失败检测次数;默认为1次;
                uri=uri:做健康状态检测测试的目标uri;默认为/;
                match=NAME:健康状态检测的结果评估调用此处指定的match配置块;
                
        
        (6) match name { ... }
            对backend server做健康状态检测时,定义其结果判断机制;只能用于http上下文;
                
            常用的参数:
                status  code[  code ...]: 期望的响应状态码;
                header  HEADER[operator  value]:期望存在响应首部,也可对期望的响应首部的值基于比较操作符和值进行比较;
                body:期望响应报文的主体部分应该有的内容;
                
        (7) hash key [consistent];
            指明基于hash方式进行调度时,其hash key;
                hash  $remote_addr相当于ip_hash;
                
            常用的hash key:
                $cookie_name:将一个用户的请求始终发往同一个backend server,能实现会话绑定的功能;此处的name为cookie某些参数的名称,此处常用的有cookie_username;
                $request_uri: 将对同一个uri的请求始终发往同一个backend server,后端为cache server时特别有用;
        
session会话保持:
        1 session sticky:基于ip, ngix还可基于请求报文首部中的多种信息,例如cookie, uri;
        2 session cluster:每个server均把创建和维护session同步集群中的其它主机;仅适用于较小规模的环境;
        3 session server:使用一个共享的存储服务存储session信息;
        
        location ~* \.php$ {
            proxy_pass
        }
        
        location / {
            proxy_pass
        }
        
    课外实践:
        (1) http 重定向至https; 
        (2) gzip效果测定;
        (3) 各种调度算法测试;
            hash $request_uri
            hash $cookie_username            
        (4) 动静分离;
        (5) 做方法分离;
        
    
                SNAT模式的Client:
        4 基于sticky实现session绑定;
            常用方法:
                sticky:
                route:
                clearn:1.7版本之后
    least_conn:调度算法,会考虑upstream server的权重调度
    非httpd服务器才使用:keepalive,否则会影响并发
    health_check; 健康监测(应用层实现),请求特定资源,给出特定的健康监测
        注:
            location中把日志访问功能关闭
            interval 多长时间监听一次
            passes 检查多少次,才算检查康
            fails:检查多少次,才算不健康
            uri:
            match:指定资源中含有什么才算监测成功
    add_header:自定义首部
    proxy_cache_path :只能在http定义,可以定义多组,在不同的server中调用相同,或不同的
    缓存修剪:如果后端服务器数据更新,而且自己知道,每次访问,就删缓存,重新缓存
    cache_manager :只删除过期的,通过lru机制。
    nginx_http_fastcgi_module模块配置
        
        LNMP: 
            php主机:php-mysql、php-xcache
            
            思考?
                redis: php的redis扩展;
                memcached:php的memcached扩展;
                
ngx_http_proxy_module模块配置(http或https协议代理)
        
        (1) proxy_pass URL;
            应用上下文:location, if in location, limit_except
            
            proxy_pass后面的路径不带uri时,其会将location的uri传递给后端的主机;下面的示例会将/uri/传递给backend服务器;
                location  /uri/ {
                    proxy_pass http://hostname;
                }
                
            proxy_pass后面的路径是一个uri时,其会将location的uri替换为后端主机自己的uri;
                location  /uri/ {
                    proxy_pass http://hostname/new_uri/;
                }
                
            如果location定义其uri时使用的正则表达式模式匹配,则proxy_pass后的路径不能够使用uri;
                location  ~*  \.(jpg|gif|jpeg)$  {
                    proxy_pass  http://HOSTNAME;
                }
                
                此处的http://HOSTNAME后面不能有任何uri,哪怕只有/也不可以;
                
        (2) proxy_set_header field value;
            用于proxy server向backend server发请求报文时,将某请求首部重新赋值,或在原有值后面添加一个新的值; 也可以添加自定义首部; 
            
            示例:
                proxy_set_header  X-Real-IP  $remote_addr;
                proxy_set_header  X-Forwarded-For  $proxy_add_x_forwarded_for;
                    原有请求报文中如果存在X-Forwared-For首部,则将remote_addr以逗号分隔补原有值后,否则则直接添加此首部;
            
            实践作业:
                假如nginx有两个server(虚拟主机),且均反代至后端某一个主机,此主机亦有两个虚拟主机,虚拟主机名与nginx的相同;
                要求:用户请求nginx的哪一个虚拟主机,就将其代理后后端主机的对应的虚拟主机;                
                
                
        
缓存相关的选项(缓存要先定义,后调用):
        (3) proxy_cache_path path [levels=levels] [use_temp_path=on|off] keys_zone=name:size [inactive=time] [max_size=size]  目录属主属组nginx
            定义缓存;可用上下文为http; 
            levels:最多三层,每层名字几个字符表示 1:1:2 第一层 1个,第二层1个....
            keys_zone:开辟多大空间
            inactive:非活动时间,过期时间
            
        (4) proxy_cache zone | off; --- zone 名字
            调用缓存;可用上下文 为http, server和location;
            
        (5) proxy_cache_key string;
            定义缓存键;
            proxy_cache_key $scheme$proxy_host$request_uri;
                
        (6) proxy_cache_valid [code ...] time;
            对不同响应码的响应设定其可缓存时长;
            示例:
                proxy_cache_valid 200 302 10m;
                proxy_cache_valid 404      1m;    
                
        proxy_cache_use_stale error | timeout | invalid_header | updating | http_500 | http_502 | http_503 | http_504 | http_403 | http_404 | off ...;
        
跟连接相关的选项
        (7) proxy_connect_timeout time;
            定义与  后端服务器  建立连接的超时时长;默认为60s,不建议超出75s; 
            
        (8) proxy_send_timeout time;
            把请求发送给  后端服务器   的超时时长;默认为60s;
            
        (9) proxy_read_timeout time;
            等待   后端服务器   发送响应报文的超时时长;    
    
ngx_http_headers_module模块配置
        
        (1) add_header name value [always];
            向响应报文添加自定义首部,并为其赋值;
            
        (2) expires [modified] time;
              expires epoch | max | off;              
              允许或禁止向响应报文的Cache-Control或Expires首部添加新值或修改其值; 
       (3)proxy_hide_header:nginx响应给客户端,隐藏哪个首部
              
ngx_http_upstream_module模块配置
        用于将多个服务器定义成服务器组,而由proxy_pass, fastcgi_pass等指令进行引用;
        
        (1) upstream name { ... }
            定义一个后端服务器组,name为组名称;仅能用于http上下文 ;
            
        (2) server address [parameters];
            在upstream中定义一个服务器及其相关参数;仅能用于upstream上下文;
            
            常用参数:
                weight=number:定义服务器权重,默认为1;
                max_fails=number:最大失败连接尝试次数,失败连接超时时长由fail_timeout参数指定;
                fail_timeout=number:等待目标服务器发送响应的时长;
                backup:备用服务器,所有主服务器均故障时才启用此主机;
                down:手动标记其不再处理任何用户请求;
                
        使用方法:
            (a) 定义upstream服务器组
                upstream websrvs {
                    server 172.16.100.68 weight=2 max_fails=2 fail_timeout=6s;
                    server 172.16.100.6  weight=1 max_fails=2 fail_timeout=6s;
                }                
            
            (b) 在反代场景中(proxy_pass, fastcgi_pass, ...)进行调用;
                location / {
                    proxy_pass http://websrvs/;
                }
        
调度算法:        
        (3) ip_hash;
            源地址hash,把来自同一个ip地址的请求始终发往同一个backend server,除非此backend server不可用;
            
        (4) least_conn;
            最少连接;当各server权重不同时,即为加权最少连接;
            
        (5) health_check [parameters];
            健康状态检测机制;只能用于location上下文;
            
            常用参数:
                interval=time检测的频率,默认为5秒;
                fails=number:判定服务器不可用的失败检测次数;默认为1次;
                passes=number:判定服务器可用的失败检测次数;默认为1次;
                uri=uri:做健康状态检测测试的目标uri;默认为/;
                match=NAME:健康状态检测的结果评估调用此处指定的match配置块;
                
        
        (6) match name { ... }
            对backend server做健康状态检测时,定义其结果判断机制;只能用于http上下文;
                
            常用的参数:
                status  code[  code ...]: 期望的响应状态码;
                header  HEADER[operator  value]:期望存在响应首部,也可对期望的响应首部的值基于比较操作符和值进行比较;
                body:期望响应报文的主体部分应该有的内容;
                
        (7) hash key [consistent];
            指明基于hash方式进行调度时,其hash key;
                hash  $remote_addr相当于ip_hash;
                
            常用的hash key:
                $cookie_name:将一个用户的请求始终发往同一个backend server,能实现会话绑定的功能;此处的name为cookie某些参数的名称,此处常用的有cookie_username;
                $request_uri: 将对同一个uri的请求始终发往同一个backend server,后端为cache server时特别有用;
        
session会话保持:
        1 session sticky:基于ip, ngix还可基于请求报文首部中的多种信息,例如cookie, uri;
        2 session cluster:每个server均把创建和维护session同步集群中的其它主机;仅适用于较小规模的环境;
        3 session server:使用一个共享的存储服务存储session信息;
        
        location ~* \.php$ {
            proxy_pass
        }
        
        location / {
            proxy_pass
        }
        
    课外实践:
        (1) http 重定向至https; 
        (2) gzip效果测定;
        (3) 各种调度算法测试;
            hash $request_uri
            hash $cookie_username            
        (4) 动静分离;
        (5) 做方法分离;
        
    
                SNAT模式的Client:
        4 基于sticky实现session绑定;
            常用方法:
                sticky:
                route:
                clearn:1.7版本之后
    least_conn:调度算法,会考虑upstream server的权重调度
    非httpd服务器才使用:keepalive,否则会影响并发
    health_check; 健康监测(应用层实现),请求特定资源,给出特定的健康监测
        注:
            location中把日志访问功能关闭
            interval 多长时间监听一次
            passes 检查多少次,才算检查康
            fails:检查多少次,才算不健康
            uri:
            match:指定资源中含有什么才算监测成功
    add_header:自定义首部
php无法作为nginx的模块
httpd支持php模块