Nginx反向代理
2015 年 02 月 16 日
nginx

    代理通常用来在多个后端服务器进行 负载均衡,或者通过HTTP等协议进行请求转发。

  • 传递请求到后端服务器

  • 当NGINX代理一个请求时,会将请求转发到特定的后端服务器,然后获取到响应,将其返回给客户端。 该请求可能被转发到HTTP服务器(另一个NGINX服务器或其他服务器)或者使用特定协议的非HTTP服务器(由特定框架开发的 ,如PHP,Python等)。支持的协议包括 FastCGIuwsgiSCGImemcached

  • 为了转发请求到后端服务器, proxy_pass指令需要定义在location块内,如
  • location /some/path/ {
        proxy_pass http://www.example.com/link/;
    }
            
  • 若客户端访问/some/path/page.html, 将被代理到http://www.example.com/link/page.html
  • 为了将请求转发到一个非HTTP后端服务器,需要用到 **_pass directive* 指令
  • 1. fastcig_pass传递请求到FastCGI服务器。
    2. uwsgi_pass传递请求到uwsgi服务器。
    3. scgi_pass传递SCGI服务器。
    4. memcached_pass传递请求到memcached服务器。

  • 传递请求头

  • 默认,NGINX会重新定义请求头中的两个字段 HostConnection, 并且忽略空字符串的字段。Host被设置为$proxy_host, Connection被设置为关闭的。

  • 我们可以通过指令proxy_set_header设置请求头, 该指令可以用在http, server, location块中。如
  • location /some/path/ {
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_pass http://localhost:8000;
    }
            
  • 如果你想阻止某个请求头传递给后端服务器,可以将其设置为空字符串。
  • location /some/path/ {
        proxy_set_header Accept-Encoding "";
        proxy_pass http://localhost:8000;
    }
            
  • 配置缓冲区

  • 默认,NGINX会为后端服务器的响应提供缓冲区。一个响应被存放在内部缓冲区中, 直到整个响应被接收到,然后发送给客户端。缓冲区 针对一些慢客户端(如果响应被NGINX同步地返回,将浪费后端服务器的时间)可以提高性能。然而, 如果NGINX开启了缓冲区,将使得后端服务器快速地处理响应,而当客户端需要下载它们时,NGINX会存储 响应尽可能久的时间。

  • 我们可以使用proxy_buffers 来为每一个请求设置缓冲区的大小和数量。响应的第一部分被存在单独的缓冲区内,其大小通过 proxy_buffer_size指令设置 这部分通常包含一些比较小的响应头,并且比剩下的响应缓冲区更小。如
  • location /some/path/ {
        proxy_buffers 16 4k;    # 16个缓冲区,每个缓冲区4K(默认为一个内存页,可通过getconf PAGE_SIZE获取)
        proxy_buffer_size 2k;   # 用于存放响应的第一个部分信息, 比普通缓冲区4K更小
        proxy_pass http://localhost:8000;
    }
            
  • 如果缓冲区禁用了,当NGINX接收到后端服务器的响应时,会同步地发送给客户端。 这种情况可能在一些快速客户端交互(需要尽可能快接收响应)中会使用。 如果你想使某个location禁用缓冲区,可以使用proxy_buffering off指令。
  • location /some/path/ {
        proxy_buffering off;
        proxy_pass http://localhost:8000;
    }
            
好人,一生平安。