NGINX反向代理

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处理的所有请求传递到指定地址的代理服务器。该地址可以指定为域名或IP地址。该地址可能还包含端口:

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

    请注意,在上面的第一个示例中,代理服务器的地址后跟一个URI /link/。如果URI和地址一起指定,它将替换请求URI中与location参数匹配的部分。例如,此处带有/some/path/page.htmlURI 的请求将被代理到http://www.example.com/link/page.html。如果指定的地址没有URI,或者无法确定URI的要替换的部分,则将传递完整的请求URI。
    要将请求传递到非HTTP代理服务器,应使用适当的**_pass指令:

  • fastcgi_pass 将请求传递给FastCGI服务器
  • uwsgi_pass 将请求传递给uwsgi服务器
  • scgi_pass 将请求传递给SCGI服务器
  • memcached_pass 将请求传递到内存缓存服务器
    请注意,在这些情况下,用于指定地址的规则可能会有所不同。您可能还需要将其他参数传递给服务器。
    该proxy_pass指令还可以指向一组命名的服务器。在这种情况下,请求将根据指定的方法在组中的服务器之间分配。

3. 传递请求报头

    默认情况下,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;
}

4. 配置缓冲区(Buffers)

    默认情况下,NGINX缓冲来自代理服务器的响应。响应存储在内部缓冲区中,直到接收到整个响应后才发送给客户端。缓冲有助于优化慢速客户端的性能,如果响应从NGINX同步传递到客户端,则这可能会浪费代理服务器的时间。但是,启用缓冲后,NGINX允许代理服务器快速处理响应,而NGINX将响应存储的时间与客户端下载响应所需的时间一样长。
    负责启用和禁用缓冲的指令是proxy_buffering。默认情况下将其设置为on并启用缓冲。
    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地址以连接到被代理的服务器或upstream服务器。如果NGNIX背后的被代理的服务器被配置为接受来自特定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/;
}

参考文档

https://docs.nginx.com/nginx/admin-guide/web-server/reverse-proxy/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值