热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

08-nginx的反向代理、缓存功能

nginx作为反向代理的工作模型相对于LVS工作在四层,nginx工作于应用层,所以它能够理解http请求报文中首部的请求方法、URL、http协议等信息。nginx收到请求报文后,这个报文源

nginx作为反向代理的工作模型

相对于LVS工作在四层,nginx工作于应用层,所以它能够理解http请求报文中首部的请求方法、URL、http协议等信息。

nginx收到请求报文后,这个报文源IP为客户端CIP,目标IP是nginx服务器所在的供外界访问的VIP。然后把用户的请求封装成新的报文发给后端服务器,发送的报文源IP为nginx所在服务器的DIP,目标IP为后端真实响应请求的RIP(为避免后端服务器暴露于外网中,DIP与RIP可以为私网地址)。

nginx_http_proxy_model模块实现反向代理,适用范围:location, if in location , limit_except  

常见用法

1) proxy_pass后面的路径不带uri时,其会将location的uri传递给后端主机;
        server {
            ...
            server_name HOSTNAME;
            location /uri/ {
                proxy  http://RIP[:port];
            }
            ...
        }

此时传递给后端的请求路径为:http://RIP/uri/,直接补充在REMOTE-IP之后;
http://HOSTNAME/uri --> http://RIP/uri

2)proxy_pass后面的路径是一个uri时,其会将location的uri替换为proxy_pass的uri;
        server {
            ...
            server_name HOSTNAME;
            location /uri/ {
                proxy http://RIP/new_uri/;
            }
            ...
        }

此时客户端请求被location的/uri/匹配到,跳转到后端请求路径将由/new uri/替换/uri/;
http://HOSTNAME/uri/ --> http://RIP/new_uri/

3)如果location定义其uri时使用了正则表达式的模式,则proxy_pass之后必须不能使用uri;
        server {
            ...
            server_name HOSTNAME;
            location ~|~* /uri/ {
                proxy http://RIP;
            }
            ...
        }

此时客户端请求时传递的uri将直接附加代理到的服务的之后;
http://HOSTNAME/uri/ --> http://host/RIP/

实验环境:

  nginx反向代理服务器centos7.2   VIP:9.110.187.120,DIP:10.1.1.120   安装nginx

  后端RealServer1 RIP:10.1.1.121  安装apache  提供测试页面

[root@controller2 html]# cat index.html
Hello,This is controller2
[root@controller2 html]# cat ./book/index.html 
This is controller  /book/index.html

    后端RealServer2 RIP:10.1.1.122  安装LAMP

  客户端为win7主机

实验一:

nginx 反代配置

重启服务后验证

实验二:

nginx 反代配置

实验三:


解决后端Web 服务器记录真实客户端IP

默认情况后端服务器记录的全是代理服务器的IP

此时需要用户proxy_set_header指令

nginx反向代理服务器server 配置段中添加配置  proxy_set_header  CIP  $remote_addr;

后端apache 配置文件中日志配置更改

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

利用proxy_set_header 指令,nginx向后端发送请求报文中添加CIP首部(名称自定义) 值为remote_addr真实客户端IP(这个是固定的)效果如下

Nginx 作为反向代理时,可以启用缓存机制。

1)proxy_cache_path
    path [levels=levels]  [use_temp_path=on|off] keys_zOne=name:size [inactive=time] [max_size=size]
    定义缓存,可用上下文为http; (与fastcgi的缓存定义相似)

2)proxy_cache zone | off;
    指明要调用的缓存,或关闭缓存机制;用于http, server, location 上下文

3)proxy_cache_key string;
    缓存中用于“键”的内容;默认值为:proxy_cache_key $scheme$proxy_host$request_uri;

4)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_uri;
        proxy_cache_valid 200 302 301 1h;
        proxy_cache_valid any 1m;

5)proxy_cache_use_stale
    定义当代理服务器与后端主机通信出现故障时在哪种情况下,可以向客户端直接用缓存中缓存项响应给客户端;如下;
    proxy_cache_use_stale error | timeout | invalid_header | updating | http_500 | http_502 | http_503 | http_504 | http_403 | http_404 | off ...;

6)proxy_cache_methods GET | HEAD | POST ...;
    定义为哪种请求方法使用缓存;默认GET|HEAD 其他的不建议使用

7)proxy_buffering on | off;
    是否启用代理服务器对后端服务器的发送缓冲和接收缓冲
    默认proxy_buffering on;

8)proxy_buffers number size;
    定义启用代理服务器对后端服务器的发送缓冲和接收缓冲的buffer的数量和每个buffer的类型
    默认proxy_buffers 8 4k|8k;
    用于http,server,locaton上下文

9)proxy_buffer_size size;
    定义代理服务器对后端服务器的发送缓冲和接收缓冲的每个buffer的大小
    默认proxy_buffer_size 4k|8k;

定义缓存可以在http,server,location中,作用范围不同,下面是我的例子

    proxy_cache_path    /var/proxycache/             levels=1:1:1       keys_zOne=jpgcache:10m max_size=1g;
    server {
        listen       80 default_server;
        listen       [::]:80 default_server;
        server_name  _;
        # root         /usr/share/nginx/html;
        proxy_set_header        CIP     $remote_addr;
        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

        location / {
                proxy_pass      http://10.1.1.121;
                index           index.html;
                proxy_cache     jpgcache;
                proxy_cache_key $request_uri;
                proxy_cache_valid       200 301 302 1h;
                proxy_cache_valid       any     1m;
        }
[root@controller1 nginx]# tree /var/proxycache/
/var/proxycache/
├── 4
│   └── a
│       └── d
│           └── 880e10635371e8065a004e01fd401da4
└── 9
    └── d
        └── 9
            └── 35a63c8a85b1279a0f991ce8828fb9d9

6 directories, 2 files

缓存的文件和访问的文件(是一个图片)大小相同。

nginx_http_headers_module模块实现nginx响应报文中的首部定义

 

默认情况下,nginx不会传递 Date ,Server,X-Pad ,X-Accel等信息,避免后端服务器信息被泄露。示例

add_header      cache-test      $upstream_cache_status;
添加一个首部名称cache-test,值为nginx_upstream模块引入的一个变量,用于记录从后端服务器缓存的资源是否被命中。

nginx_http_upstream_module模块:用于把后端服务器定义成服务器组,实现负载均衡功能。

定义后端服务器组,会引入一个新的上下文;用于http上下文
    upstream httpdsrvs {
        server ...
        server...
        ...
    }

server address [parameters];在upstream中定义一个服务器及其相关参数;仅能用于upstream上下文;

upstream websrvs {
            server 10.1.1.121 weight=2 max_fails=2        fail_timeout=6s;
            server 10.1.1.122 weight=1 max_fails=2 down;
            server 10.1.1.123:8080 backup
     }    
          

负载均衡算法

least_conn:最少连接调度算法,当server拥有不同的权重时其为wlc;(当各server权重不同时,即为加权最少连接);最少连接算法通常只适用与那些长连接的协议;

ip_hash:源地址hash调度方法;把来自同一个ip地址的请求始终发往同一个backendserver,除非此backend server不可用;

hash key [consistent]:基于指定的key的hash表来实现对请求的调度,此处的key可以直接文本、变量或二者的组合;
常用的hash key:
     1) $COOKIE_name:
        将一个用户的请求始终发往同一个backendserver,能实现会话绑定的功能;此处的name为COOKIE某些参数的名称,此处常用的有COOKIE_username;
     2) $request_uri:
        将对同一个uri的请求始终发往同一个backend server,后端为cache server时特别有用;

match NAME { … }:对backendserver做健康状态检测时,定义其结果判断机制;只能用于http上下文;
常用的参数:
    status code[code ...]:期望的响应状态码;
    header HEADER[operator value]:期望存在响应首部,也可对期望的响应首部的值基于比较操作符和值进行比较;
    body:期望响应报文的主体部分应该有的内容;

health _ check [PARAMETERS]:健康状态检测机制;只能用于location上下文;
常用参数:
    interval=#:检测的频率,默认为5秒;
    fails=#:判定服务器不可用的失败检测次数;默认为1次;
    passes=#:判定服务器可用的失败检测次数;默认为1次;
    uri=uri:做健康状态检测测试的目标uri;默认为/;
    match=NAME:健康状态检测的结果评估调用此处指定的match配置块;

keepalive connections:为每个worker进程保留的空闲的长连接数量;

示例:

注释掉之前的缓存配置段

  #  proxy_cache_path   /var/proxycache/             levels=1:1:1       keys_zOne=jpgcache:10m max_size=1g;
    upstream    testservers {
        server  10.1.1.121;
        server  10.1.1.122;
}


    server {
        listen       80 default_server;
        listen       [::]:80 default_server;
        server_name  _;
        # root         /usr/share/nginx/html;
        proxy_set_header        CIP     $remote_addr;
        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;
        add_header      cache-test      $upstream_cache_status;
        location / {
                #proxy_pass     http://10.1.1.121;
                proxy_pass      http://testservers;
                index           index.html;
        #       proxy_cache     jpgcache;
        #       proxy_cache_key $request_uri;
        #       proxy_cache_valid       200 301 302 1h;
        #       proxy_cache_valid       any     1m;
        }

在后端建立不同的index.html,刷新访问页面,可查看页面变化。

 


推荐阅读
  • 基于PgpoolII的PostgreSQL集群安装与配置教程
    本文介绍了基于PgpoolII的PostgreSQL集群的安装与配置教程。Pgpool-II是一个位于PostgreSQL服务器和PostgreSQL数据库客户端之间的中间件,提供了连接池、复制、负载均衡、缓存、看门狗、限制链接等功能,可以用于搭建高可用的PostgreSQL集群。文章详细介绍了通过yum安装Pgpool-II的步骤,并提供了相关的官方参考地址。 ... [详细]
  • LVS实现负载均衡的原理LVS负载均衡负载均衡集群是LoadBalance集群。是一种将网络上的访问流量分布于各个节点,以降低服务器压力,更好的向客户端 ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • 本文介绍了作者在开发过程中遇到的问题,即播放框架内容安全策略设置不起作用的错误。作者通过使用编译时依赖注入的方式解决了这个问题,并分享了解决方案。文章详细描述了问题的出现情况、错误输出内容以及解决方案的具体步骤。如果你也遇到了类似的问题,本文可能对你有一定的参考价值。 ... [详细]
  • 本文介绍了一些Java开发项目管理工具及其配置教程,包括团队协同工具worktil,版本管理工具GitLab,自动化构建工具Jenkins,项目管理工具Maven和Maven私服Nexus,以及Mybatis的安装和代码自动生成工具。提供了相关链接供读者参考。 ... [详细]
  • 达人评测 酷睿i5 12450h和锐龙r7 5800h选哪个好 i512450h和r75800h对比
    本文介绍了达人评测酷睿i5 12450h和锐龙r7 5800h选哪个好的相关知识,包括两者的基本配置和重要考虑点。希望对你在选择时提供一定的参考价值。 ... [详细]
  • CEPH LIO iSCSI Gateway及其使用参考文档
    本文介绍了CEPH LIO iSCSI Gateway以及使用该网关的参考文档,包括Ceph Block Device、CEPH ISCSI GATEWAY、USING AN ISCSI GATEWAY等。同时提供了多个参考链接,详细介绍了CEPH LIO iSCSI Gateway的配置和使用方法。 ... [详细]
  • 欢乐的票圈重构之旅——RecyclerView的头尾布局增加
    项目重构的Git地址:https:github.comrazerdpFriendCircletreemain-dev项目同步更新的文集:http:www.jianshu.comno ... [详细]
  • Vagrant虚拟化工具的安装和使用教程
    本文介绍了Vagrant虚拟化工具的安装和使用教程。首先介绍了安装virtualBox和Vagrant的步骤。然后详细说明了Vagrant的安装和使用方法,包括如何检查安装是否成功。最后介绍了下载虚拟机镜像的步骤,以及Vagrant镜像网站的相关信息。 ... [详细]
  • 本文介绍了响应式页面的概念和实现方式,包括针对不同终端制作特定页面和制作一个页面适应不同终端的显示。分析了两种实现方式的优缺点,提出了选择方案的建议。同时,对于响应式页面的需求和背景进行了讨论,解释了为什么需要响应式页面。 ... [详细]
  • 本文介绍了使用Spark实现低配版高斯朴素贝叶斯模型的原因和原理。随着数据量的增大,单机上运行高斯朴素贝叶斯模型会变得很慢,因此考虑使用Spark来加速运行。然而,Spark的MLlib并没有实现高斯朴素贝叶斯模型,因此需要自己动手实现。文章还介绍了朴素贝叶斯的原理和公式,并对具有多个特征和类别的模型进行了讨论。最后,作者总结了实现低配版高斯朴素贝叶斯模型的步骤。 ... [详细]
  • Android日历提醒软件开源项目分享及使用教程
    本文介绍了一款名为Android日历提醒软件的开源项目,作者分享了该项目的代码和使用教程,并提供了GitHub项目地址。文章详细介绍了该软件的主界面风格、日程信息的分类查看功能,以及添加日程提醒和查看详情的界面。同时,作者还提醒了读者在使用过程中可能遇到的Android6.0权限问题,并提供了解决方法。 ... [详细]
  • Ubuntu 用户安装 Linux Kernel 3.15 RC1
    nsitionalENhttp:www.w3.orgTRxhtml1DTDxhtml1-transitional.dtd ... [详细]
author-avatar
uplt_21631521023
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有