美文网首页转载部分linux
Nginx代理服务1--正反向代理及缓冲

Nginx代理服务1--正反向代理及缓冲

作者: 青衣敖王侯 | 来源:发表于2019-05-21 09:08 被阅读67次

      代理服务是Nginx的核心所在,早期在没有代理的时候,客户端直接和服务端进行交互,如下图所示:



      当有了代理之后,客户端和服务端直接的交互方式有了改变,代理负责对请求和响应进行转发。代理可以过滤请求也可以对响应做相应的改变,让服务端发挥的空间更大


    有代理

    代理的分类:

    -正向代理

      正向代理可以帮助客户端访问无法直接访问的资源,当用户想访问国外无法直接访问的资源时,可以先去访问代理,然后由代理去帮忙寻找资源,然后返回给客户端,所以它和客户端的关系好~~如下图所示:


    正向代理

    -反向代理

      反向代理是为服务端服务的,当用户通过域名去访问某个资源的时候,代理会自动的寻找服务端的某台机器上的资源,这些都是对客户端透明的,客户端感知就只有一个服务端机器。


    反向代理

    正向代理和反向代理的区别:

      正向代理和反向代理在形式上服务的对象不一样。正向代理代理的对象是客户端,为客户端服务,反向代理的对象是服务端,为服务端服务。

    Nginx可支持的代理协议

      Nginx支持的代理协议很多,有HTTP、Websocket、GRPC等等,我们会对常用的HTTP、Websocket、GRPC、HTTPS协议。我们可以通过下图看到目前Nginx支持的代理协议:


    Nginx可支持的代理协议

      常见的Nginx作为反向代理支持协议有HTTP、HTTPS、WS、GRPC,Nginx支持这些协议所使用的模块如下图所示:




    总结下来反向代理模式对应的Nginx配置模块可以用一个表格表示成这样:
    反向代理模式 Nginx配置模块
    http、websocket、https ngx_http_proxy_module
    fastcgi ngx_http_fastcgi_module
    uwsgi ngx_http_uwsgi_module
    grpc ngx_http_v2_module

    Nginx作为反向代理支持的协议很多,但是它作为正向代理支持的常见协议很少,往往是HTTP协议,不能支持HTTPS协议,如下图所示:


    Nginx作为正向代理支持的协议

    反向代理实战篇

    语法:proxy_pass URL;可以在location,if in location ,limit_except中配置,URL可以配置成:http://localhost:8000/uri/ https://ip:port/uri http://unix:/tmp/backend.socket:/uri/
    测试:我们在其中一台服务器的nginx.conf配置文件中配置:

        location ~ /indexzzm.html$ {
            proxy_pass http://123.206.36.54;
        }
    

    凡是以indexzzm.html结尾的访问都到123.206.36.54上面去访问。
    我们在47.100.199.15上对indexzzm.html的访问发生了跳转,说明我们的反向代理配置成功。


    结果

    正向代理实战篇

    现在我们有两台服务器,一台服务器的IP是http://47.100.199.15,另外一台是http://123.206.36.54,现在我们希望只能通过123.206.36.54作为代理的机器才能访问47.100.199.15中的页面。下面我们通过Nginx来完成这个步骤:
    步骤1:配置47.100.199.15的配置文件,只允许123.206.36.54才能访问。

    location / {
            if ( $remote_addr !~* "^123\.206\.36\.54") {
                return 403;
            }
            root   /usr/share/nginx/html;
            index  index.html index.htm;
        }
    

    步骤2:验证配置是否成功。我们在自己本机的电脑上去访问http://47.100.199.15,会出现以下结果:


    被禁止

    步骤3:在123.206.36.54上配置代理

        location / {
            proxy_pass http://$http_host$request_uri;
        }
    

    步骤4:在google中配置代理:


    配置代理

    步骤5:访问


    访问结果

    Nginx缓冲使用

      如果禁止缓冲,那么当Nginx一收到后端的反馈就同时传给客户端。nginx不会从被代理的服务器读取整个反馈信息
    proxy_buffering
    语法: proxy_buffering on|off
    默认值: proxy_buffering on
    上下文: http, server, location

    这个参数用来控制是否打开后端响应内容的缓冲区,如果这个设置为off,那么proxy_buffers和proxy_busy_buffers_size这两个指令将会失效。 但是无论proxy_buffering是否开启,对proxy_buffer_size都是生效的。

    proxy_buffering开启的情况下,nignx会把后端返回的内容先放到缓冲区当中,然后再返回给客户端(边收边传,不是全部接收完再传给客户端)。 临时文件由proxy_max_temp_file_size和proxy_temp_file_write_size这两个指令决定的。如果响应内容无法放在内存里边,那么部分内容会被写到磁盘上。

    如果proxy_buffering关闭,那么nginx会立即把从后端收到的响应内容传送给客户端,每次取的大小为proxy_buffer_size的大小,这样效率肯定会比较低。
    nginx不尝试计算被代理服务器整个响应内容的大小,nginx能从服务器接受的最大数据,是由指令proxy_buffer_size指定的.
    proxy_buffers
    语法: proxy_buffers the_number is_size;
    默认值: proxy_buffers 8 4k/8k;
    上下文: http, server, location该指令设置缓冲区的大小和数量,从被代理的后端服务器取得的响应内容,会放置到这里. 默认情况下,一个缓冲区的大小等于内存页面大小,可能是4K也可能是8K,这取决于平台。
    proxy_buffers由缓冲区数量和缓冲区大小组成的。总的大小为number*size。
    若某些请求的响应过大,则超过_buffers的部分将被缓冲到硬盘(缓冲目录由_temp_path指令指定), 当然这将会使读取响应的速度减慢, 影响用户体验。
    proxy_busy_buffers_size
    语法: proxy_busy_buffers_size size;
    默认值: proxy_busy_buffers_size proxy_buffer_size * 2;
    上下文: http, server, location, if
    proxy_busy_buffers_size不是独立的空间,他是proxy_buffers和proxy_buffer_size的一部分。nginx会在没有完全读完后端响应的时候就开始向客户端传送数据,所以它会划出一部分缓冲区来专门向客户端传送数据(这部分的大小是由proxy_busy_buffers_size来控制的,建议为proxy_buffers中单个缓冲区大小的2倍),然后它继续从后端取数据,缓冲区满了之后就写到磁盘的临时文件中。

    Nginx跳转重定向

    语法:proxy_redirect redirect replacement;可以用在http,server,location中

    Nginx头信息

    语法:proxy_set_header field value;
      经过反向代理后,由于在客户端和web服务器之间增加了中间层,因此web服务器无法直接拿到客户端的ip,通过remote_addr变量拿到的将是反向代理服务器的ip地址”。这句话的意思是说,当你使用了nginx反向服务器后,在web端使用request.getRemoteAddr()(本质上就是获取remote_addr),取得的是nginx的地址,即remote_addr变量中封装的是nginx的地址,当然是没法获得用户的真实ip的,但是,nginx是可以获得用户的真实ip的,也就是说nginx使用remote_addr变量时获得的是用户的真实ip,如果我们想要在web端获得用户的真实ip,就必须在nginx这里作一个赋值操作,如下:
    proxy_set_header X-real-ip $remote_addr;
    其中这个X-real-ip是一个自定义的变量名,名字可以随意取,这样做完之后,用户的真实ip就被放在X-real-ip这个变量里了,然后,在web端可以这样获取:
    request.getAttribute("X-real-ip")

    Nginx超时设置

    语法:proxy_connect_timeout time;
    默认:proxy_connect_timeout 60s;
    上下文:http,server,location
    此配置意思是,每个从Nginx分发的请求,连接到后台(tomcat X)的连接如果超过60秒,则视为连接失败
    proxy_read_timeout
    nginx接收upstream server数据超时, 默认60s, 如果连续的60s内没有收到1个字节, 连接关闭
    proxy_send_timeout
    nginx发送数据至upstream server超时, 默认60s, 如果连续的60s内没有发送1个字节, 连接关闭
    附一个Nginx中对上述语法的配置:


    常见配置

    相关文章

      网友评论

        本文标题:Nginx代理服务1--正反向代理及缓冲

        本文链接:https://www.haomeiwen.com/subject/vyuqzqtx.html