• 反向代理


    反向代理:reverse proxy,指的是代理外网用户的请求到内部的指定的服务器,并将数据返回给用户的一种方式,这是用的比较多的一种方式。

    Nginx 除了可以在企业提供高性能的web服务之外,另外还可以将 nginx 本身不具备的请求通过某种预定义的协议转发至其它服务器处理,不同的协议就是Nginx服务器与其他服务器进行通信的一种规范,主要在不同的场景使用以下模块实现不同的功能。

    1.1.反向代理配置参数

    proxy_pass; 
    #用来设置将客户端请求转发给的后端服务器的主机,可以是主机名(将转发至后端服务做为主机头首部)、IP

    地址:端口的方式
    #也可以代理到预先设置的主机群组,需要模块ngx_http_upstream_module支持
     

    示例:
    10.0.0.8/web
     location /web {
       index index.html;
       proxy_pass http://10.0.0.18:8080;

    #8080后面无uri,即无 / 符号,需要将location后面url 附加到proxy_pass指定的url后面,此行为类似于root

    proxy_pass指定的uri不带斜线将访问的/web,等于访问后端服务器

    http://10.0.0.18:8080/web/index.html,即后端服务器配置的站点根目录要有web目录才可以被访问
        # http://nginx/web/index.html ==> http://10.0.0.18:8080/web/index.html
        
    proxy_pass http://10.0.0.18:8080/;   #8080后面有uri,即有 / 符号,相当于置换,即访问/web时实际返回proxy_pass后面uri内容.此行为类似于alias 
        #proxy_pass指定的uri带斜线,等于访问后端服务器的http://10.0.0.18:8080/index.html 内容返回给客户端
     }  # http://nginx/web/index.html ==> http://10.0.0.18:8080
     
    #重启Nginx测试访问效果:
    #curl -L http://www.kgc.org/web

    #如果location定义其uri时使用了正则表达式模式(包括~,~*,但不包括^~),则proxy_pass之后必须不能使用uri; 即不能有/ ,用户请求时传递的uri将直接附加至后端服务器之后
    server {
     ...
     server_name HOSTNAME;
     location ~|~* /uri/ {
     proxy_pass http://host:port; #proxy_pass后面的url 不能加/
     }
     ...
     }
     http://HOSTNAME/uri/ --> http://host/uri/
     
    proxy_hide_header field;
    #用于nginx作为反向代理的时候,在返回给客户端http响应时,隐藏后端服务器相应头部的信息,可以设置
    在http,server或location块
    #示例: 隐藏后端服务器ETag首部字段
     location /web {
       index index.html;
       proxy_pass http://10.0.0.18:8080/; 
       proxy_hide_header ETag;
     }
     
    proxy_pass_header field;
    #默认nginx在响应报文中不传递后端服务器的首部字段Date, Server, X-Pad, X-Accel等参数,如果
    要传递的话则要使用 proxy_pass_header field声明将后端服务器返回的值传递给客户端
    #field 首部字段大小不敏感
    #示例:透传后端服务器的Server和Date首部给客户端,同时不再响应报中显示前端服务器的Server字段
    proxy_pass_header Server;
    proxy_pass_header Date;


    proxy_pass_request_body on | off; 
    #是否向后端服务器发送HTTP实体部分,可以设置在http,server或location块,默认即为开启


    proxy_pass_request_headers on | off; 
    #是否将客户端的请求头部转发给后端服务器,可以设置在http,server或location块,默认即为开启

    1.2.反向代理单台web 服务器

    第一台代理服务器 
    vim /apps/nginx/conf.d/pc.conf
    server{
            listen 80;
            server_name  www.pc.com;
            root    /data/nginx/pc;
         location  / {
            proxy_pass http://192.168.190.10;
    }

    }

    第二台真实服务器 
    yum  install   httpd  -y
    cd  /var/www/html
    echo   "real  server 101"  > index.html

    建立大文件查看连接情况
    dd if=/dev/zero   of=test.img    count=1  bs=1G
    找台服务器访问
    curl www.pc.com
    wget --limit-rate=1024 www.pc.com/test.img

    systemctl   stop nginx
    systemctl    start httpd
     

    第三台客户机
    vim  /etc/hosts
    192.168.190.11 www.pc.com

    修改端口号
    真实服务器
    httpd  服务器修改端口号

    server{
            listen 80;
            server_name  www.pc.com;
            root    /data/nginx/pc;
         location  / {
            root  /data/nginx/pc;
            proxy_pass http://192.168.190.10:8080;
    }

    }

    在真实服务器上 做防火墙规则
    iptables -A INPUT  -s 192.168.190.10 -j DROP
    客户端再次访问  会出现504网关超时(有可能只是处理时间久,服务器不一定挂了),时间较长1分钟,没有定义代理超时时间

    iptables -A INPUT  -s 192.168.190.10 -j REJECT
    客户端再次访问  会出现502,一般出现502 代表后端真实服务器挂了

    1.3.反向代理示例:缓存功能

    proxy_cache zone_name | off; 默认off
    #指明调用的缓存,或关闭缓存机制;Context:http, server, location
    #zone_name 表示缓存的名称.需要由proxy_cache_path事先定义

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

    proxy_cache_valid [code ...] time;
    #定义对特定响应码的响应内容的缓存时长,定义在http{...}中
     示例:
     proxy_cache_valid 200 302 10m;
     proxy_cache_valid 404 1m;

    proxy_cache_path;
    #定义可用于proxy功能的缓存;Context:http   必须放在http语句中
    proxy_cache_path path [levels=levels] [use_temp_path=on|off] 
    keys_zone=zone_name:size [inactive=time] [max_size=size] [manager_files=number] 
    [manager_sleep=time] [manager_threshold=time] [loader_files=number] 
    [loader_sleep=time] [loader_threshold=time] [purger=on|off] 
    [purger_files=number] [purger_sleep=time] [purger_threshold=time];


    #示例:在http配置定义缓存信息
       proxy_cache_path /var/cache/nginx/proxy_cache #定义缓存保存路径,proxy_cache会自动创建
       levels=1:2:2 #定义缓存目录结构层次,1:2:2可以生成2^4x2^8x2^8=2^20=1048576个目录
       keys_zone=proxycache:20m #指内存中缓存的大小,主要用于存放key和metadata(如:使用次数),一般1M可存放8000个左右的key
       inactive=120s  #缓存有效时间  
       max_size=10g; #最大磁盘占用空间,磁盘存入文件内容的缓存空间最大值
       
       
    #调用缓存功能,需要定义在相应的配置段,如server{...};或者location等
    proxy_cache proxycache;
    proxy_cache_key $request_uri; #对指定的数据进行MD5的运算做为缓存的key
    proxy_cache_valid 200 302 301 10m; #指定的状态码返回的数据缓存多长时间
    proxy_cache_valid any 1m;   #除指定的状态码返回的数据以外的缓存多长时间,必须设置,否则不会缓存

    proxy_cache_use_stale error | timeout | invalid_header | updating | http_500 | http_502 | http_503 | http_504 | http_403 | http_404 | off ; #默认是off
    #在被代理的后端服务器出现哪种情况下,可直接使用过期的缓存响应客户端

    #示例
    proxy_cache_use_stale error http_502 http_503;


    proxy_cache_methods GET | HEAD | POST ...;
    #对哪些客户端请求方法对应的响应进行缓存,GET和HEAD方法总是被缓存

    清理缓存

    方法1: rm -rf 缓存目录
    方法2: 第三方扩展模块ngx_cache_purge
     

  • 相关阅读:
    C++对象模型(7)-- 数据语义学:成员变量偏移值、地址
    Python编程从入门到实践 第五章:if语句 练习答案记录
    洛谷题目题解详细解答
    Makefile中常见的gcc编译参数
    力扣:96.不同的二叉搜索树
    【C++项目】高并发内存池第六讲 当申请内存大于256K时的处理
    A-level计算机网络里的硬件详解
    LiveCharts.Wpf 的使用
    logstash/filebeat只接收最近一段时间的数据
    Socks5代理IP是什么?有何优点?如何使用?
  • 原文地址:https://blog.csdn.net/wys_jj/article/details/136369523