当前位置: 首页 > 教程 > Nginx >

Nginx反向代理

精华
小牛编辑
162浏览
2023-03-14

本文介绍代理服务器的基本配置。 您将学习如何通过不同协议将NGINX请求传递给代理的服务器,修改发送到代理服务器的客户端请求标头,以及配置来自代理服务器的响应缓冲。

代理服务器的基本配置目录

  • 代理服务器介绍
  • 将请求传递给代理的服务器
  • 传递请求标头
  • 配置缓冲区
  • 选择传出IP地址

1. 代理服务器介绍

代理通常用于在多个服务器之间分配负载,无缝地显示来自不同网站的内容,或者通过HTTP以外的协议将请求传递给应用服务器。

2. 将请求传递给代理的服务器

当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处理的所有请求传递到指定地址(http://www.example.com/link/)处的代理服务器。该地址可以指定为域名或IP地址。 该地址还可能包括一个端口:

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

请注意,在上述第一个示例中,代理服务器的地址后面是URI为 /link/。 如果URI与地址一起指定,它将替换与location参数匹配请求URI的部分。 例如,这里使用/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服务器

请注意,在这些情况下,指定地址的规则可能不同。 您可能还需要向服务器传递其他参数(有关详细信息,请参阅参考文档)。

proxy_pass指令也可以指向一组命名的服务器。 在这种情况下,根据指定的方法在组中的服务器之间分配请求。

3. 传递请求标头

默认情况下,NGINX在代理请求“Host”“Connection”中重新定义了两个头字段,并消除了其值为空字符串的头字段。 “Host”设置为$proxy_host变量,“Connection”设置为关闭(close)。

要更改这些设置,以及修改其他header字段,请使用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;
}

4. 配置缓冲区

默认情况下,NGINX缓存来自代理服务器的响应。 响应存储在内部缓冲区中,并且不会发送到客户端,直到收到整个响应。 缓冲有助于通过慢客户端优化性能,如果响应从NGINX同步传递到客户端,这可能会浪费代理服务器时间。 然而,当启用缓冲时,NGINX允许代理服务器快速处理响应,而NGINX存储响应时间与客户端需要下载的时间一样长。

负责启用和禁用缓冲的指令是proxy_buffering。 默认情况下,它被设置为开启且缓冲已启用。

proxy_buffers指令控制分配给请求的缓冲区的大小和数量。 来自代理服务器的响应的第一部分存储在单独的缓冲区中,其大小由proxy_buffer_size指令设置。 这部分通常包含一个比较小的响应头,并且可以比其余的响应的缓冲区小。

在以下示例中,缓冲区的默认数量增加,并且响应的第一部分的缓冲区的大小小于默认值。

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

如果缓存被禁用,则在从代理服务器接收缓冲时,响应将同步发送到客户端。 对于需要尽快开始接收响应的快速交互式客户端,此行为可能是可取的。

要禁用特定位置的缓冲,请在location块中将proxy_buffering伪指令设置为off,如下所示:

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

在这种情况下,NGINX只使用由proxy_buffer_size配置的缓冲区来存储响应的当前部分。

5. 选择传出IP地址

如果您的代理服务器有多个网络接口,有时您可能需要选择特定的源IP地址才能连接到代理服务器或上游。 如果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/;
}