【翻译】Nginx的反向代理

本文为翻译文,原文地址:https://docs.nginx.com/nginx/admin-guide/web-server/reverse-proxy/php


本文描述代理服务器的基本配置。你能学到如何将一个请求在不一样的协议上从nginx转发到被代理服务器,如何修改被转发到被代理服务器的客户端的请求头,如何配置来自被代理服务器的响应的缓存。html

介绍

代理一般用于将负载分发到几个服务器中,无缝地从不一样的网站获取内容,或者转发请求到不一样的服务器。nginx

转发请求到被代理服务器

当nginx代理一个请求,它发送这个请求到指定的被代理服务器,获取响应,而后发送响应会客户端。也可能使用特别的协议代理请求到一个HTTP服务器(其余nginx服务器或其余任意服务器)或一个非HTTP服务器(好比运行PHP或Pyhton开发的应用)。支持的协议包括FastCGI、uwsgi、SCGI、memcached。web

proxy_pass指令在一个location块中,用于转发一个请求到HTTP被代理服务器。好比:缓存

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

此配置表示代理在此location处理的所有请求到指定地址的被代理服务器。此地址能够用域名或IP表示,地址可能须要包含端口。性能优化

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

请注意上面的第一个示例,被代理服务器的地址后面跟着是一个URI(统一资源标识符),/link/。若是有URI被配置在地址中,它会替换匹配location的部分。好比,请求地址为/some/path/page.html,会被代理到http://www.example.com/link/page.html。若是地址没有URI,或者不能肯定替换的部分,整个请求URI被转发。服务器

**_pass指令用于转发请求到一个非HTTP被代理服务器:网络

  • fastcgi_pass
  • uwsgi
  • scgi_pass
  • memcached_pass

请注意在这些状况,指定地址的规则可能不相同。你可能须要转发其它参数到服务器(请查看这里更多细节)。app

proxy_pass指令能够转发到一个服务器组。在这些状况中,请求在服务器组中根据指定的机制被分发。ide

转发请求头

默认状况下,nginx在代理请求中重定义两个请求头,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会缓存被代理服务器的响应。响应会被储存在内部缓存中,直到整个响应接收完毕才发送到客户端。缓存有助于慢的客户端的性能优化,由于响应从nginx同步返回给客户端会浪费被代理服务器的时间。然而,当缓存启动后,nginx容许被代理服务器快速地返回响应,nginx存储响应使客户端有更多的时间下载响应。

broxy_buffering用于表示缓存是否开启,默认是开启的。

Proxy_buffers控制分配的缓存区的大小和数量。响应的第一部分会被存储在一个单独的缓存中,缓存的大小由proxy_buffer_size指令设置。这部分一般包含相对较小的响应头。

若是设置缓冲不可用,当接收被代理服务器的响应时,响应会同步地发送到客户端。此设置或许是但愿快速互动的客户所须要的。

想要设置缓冲不可用,将location下的proxy_buffering设为off便可,以下所示:

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

这种状况下,nginx只使用proxy_buffer_size配置的缓冲区去存储当前部分的响应。

选择一个流出的IP

若是你的代理服务器有几个网络接口,你或许须要选择一个特定的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/;}
相关文章
相关标签/搜索