美文网首页
NGINX Reverse Proxy

NGINX Reverse Proxy

作者: 我向你奔 | 来源:发表于2018-07-23 17:15 被阅读13次

    这篇文章介绍了一个代理服务器的基本配置。你将学习到如何通过不同的协议,从NGINX传递一个请求到一个代理服务器,修改传递到代理服务器的客户端的请求头,以及配置从代理服务器来的响应缓冲。

    介绍

    代理典型的应用场景是在多个服务器之间的流量负载,无缝显示来自不同网站的展示内容,或者是通过HTTP协议之外的请求将请求传递到应用服务器。

    传递一个Request到Proxy服务器

    当NGINX代理了一个请求后,它会把请求发送到一个指定的代理服务器,抓取到响应,然后将响应转发给客户端。使用指定的协议后,可以代理请求给HTTP服务器(另一个NGINX服务器或者任何其他的服务器),也可以代理请求给非HTTP服务器(可以在特定框架的基础上运行应用的服务器,例如PHP或者Python)。支持的协议包括FastCGI,uwsgi,SCGI,以及memcached。

    为了传递一个请求给一个HTTP代理服务器,在location内部有一个proxy_pass指令。

    location /some/path/ {
        proxy_pass http://www.example.com/link/;
    }
    
    

    这个示例配置结果,会把在当前location下的所有请求传递给给定地址对应的代理服务器。这个地址可以是domain,也可以是IP address。这个地址也可以包含端口号。

    location ~\.php {
        proxy_pass http://127.0.0.1:8000;
    }
    
    

    注意上面的第一个示例,代理服务器后面跟了一个URI,/link/.如果这个URI在地址中指定了,它会取代请求URI与location参数匹配的部分。
    例如,有一个请求实/some/path/page.html URI将会被代理到http://www.example.com/link/page.html。如果地址没有指明URI,或者它不能决定URI是否能被替代,整个URI将会被传递过去。

    为了传递一个请求到非HTTP代理服务器,合适的**_pass指令需要被使用:

    • fastcgi_pass 传递请求到FastCGI服务器
    • uwsgi_pass 传递请求到uwsgi服务器
    • scgi_pass 传递请求到SCGI服务器
    • memcached_pass 传递请求到一个memcached服务器

    注意在这些例子中,为地址赋值的规则可能不同。你也许需要传递额外的参数给服务器。(查阅reference文档获取更多细节)。

    proxy_pass指令将指向一个服务器named group。在这个例子中,组内的服务器会根据特定的方法去分发。

    传递请求头

    默认情况下,NGINX重定义了2个代理请求的报文头,"Host"和"Connection",并且消除了值为空字符串的报文头字段。"Host"被设置为$proxy_host变量,"Connection"被设置为close。

    为了改变这些设置,在修改其他报文头的时候,使用proxy_set_header指令。这个指令可以在location或者更高等级指定。它同样可以在一个特殊的server上下文或者http块中指定。例如:

    location /some/path/ {
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_pass http://localhost:8000;
    }
    
    

    在配置文件中,Host字段设置为$host变量。

    为了组织请求报文头被传递给代理服务器,可以像下面这样将其置为空:

    location /some/path/ {
        proxy_set_header Accept-Encoding "";
        proxy_pass http://localhost:8000;
    }
    
    

    配置缓冲

    默认情况下,NGINX可以从各个代理服务器缓冲响应。一个响应可以被储存在内部缓冲,而且直到整个响应收到以后才会被发送给客户端。Buffering帮助优化了慢客户端的性能,如果响应从NGINX传递到客户端是以同步的方式传递,它会浪费代理服务器的时间。然而,当缓冲允许NGINX使得代理服务器快速处理响应的时候,NGINX会预先存储响应一段时间,为client下载做准备。

    开启关闭缓冲的指令是proxy_buffering。默认情况下它会被设为on,缓冲未开启状态。

    proxy_buffers指令控制分配给buffer的size和number。代理服务器响应的第一部分会被存储在一个分离的缓冲,缓冲的size会在proxy_buffer_size设置。这一部分通常包含了一个相对较小的响应头,而且对于剩余的响应也会更小。

    在下面这例子中,默认的buffer数在增长,而且响应第一部分的buffer区大小比默认的更小。

    location /some/path/ {
        proxy_buffers 16 4k;
        proxy_buffer_size 2k;
        proxy_pass http://localhost:8000;
    }
    
    

    如果buffering被关闭了,当它接收到来自代理服务器的响应时,它将被同步发送到客户端。对于需要快速用户响应的客户端来说这是必须的。

    为了禁用buffering,将proxy_buffering指令设置为off即可。

    location /some/path/ {
        proxy_buffering off;
        proxy_pass http://localhost:8000;
    }
    
    

    在这个例子中,NGINX唯一使用了proxy_buffer_size去存储响应的一部分。

    另外一份反向代理的使用场景就是负载均衡。可以去看 Five Reasons to Choose a Software Load Balancer电子书。

    选择一个输出IP地址

    如果你的代理服务器有多个网络接口,有时你也许需要选择一个特殊的源IP地址,这是为了连接一个代理服务器或者是一个upstream。这将会很有用,如果在NGINX背后的代理服务器被配置为需要接受来自特定IP网络或者IP地址段的连接。

    指定proxy_bind指令和IP地址:

    location /app1/ {
        proxy_bind 127.0.0.1;
        proxy_pass http://example.com/app1/;
    }
    
    location /app2/ {
        proxy_bind 127.0.0.2;
        proxy_pass http://example.com/app2/;
    }
    
    

    IP地址可以被赋值给一个变量。例如,$server_addr变量中传了网络接口的IP地址去接收网络请求。

    location /app3/ {
        proxy_bind $server_addr;
        proxy_pass http://example.com/app3/;
    }
    

    相关文章

      网友评论

          本文标题:NGINX Reverse Proxy

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