nginx 如果服务器在负载均衡器后面,那么向当前服务器私有IP发送的PHP post请求是否会通过负载均衡器?

2w2cym1i  于 2023-08-03  发布在  Nginx
关注(0)|答案(1)|浏览(118)

我在WordPress中有一个功能,用于向特定的Web服务器发送POST请求,称为ALLOWED_SERVERS,这些服务器都位于私有IP范围内。这些ALLOWED_SERVERS都在负载均衡器后面。然而,我遇到了一个问题,我开始更新https://dev.com上的帖子,请求没有正确设置。

define(
    'ALLOWED_SERVERS',
    [
        '192.168.0.1',
        '192.168.0.2',
    ]
);

function create_purge_request_data($server_ip): array
{
    $url = parse_url(home_url());

    return [
        'url' => "{$url['scheme']}://{$server_ip}/wp-json/cache/v1/purge/",
        'type' => 'POST',
        'headers' => [
            'Content-Type' => 'application/json',
            'Host' => $url['host']
        ],
        'data' => json_encode(['host' => $url['host']])
    ];
}

function send_purge_cache_request()
{
    $request_data = array_map('create_purge_request_data', ALLOWED_SERVERS);
    Requests::request_multiple($request_data);
}

add_action('post_updated', 'send_purge_cache_request');

字符串

  • 我检查了第一台服务器(www.example.com)上的nginx日志192.168.0.1,但注意到访问IP已更改为同一台服务器的公网IP。理想情况下,它应该保持为192.168.0.1,因为请求是发送到同一台服务器的。此外,请求URL已被修改为“https://testdev.com//wp-json/cache/v1/purge/”。(我使用命令“ssh testdev.com”访问第一个服务器)。
0.245 101.108.225.123 - - [02/Aug/2023:17:48:50 +0900] "POST //wp-json/cache/v1/purge/ HTTP/1.1" 404 164 "https://testdev.com//wp-json/cache/v1/purge/" "php-requests/1.7-3470169" "-" "-" "testdev.com"

  • 我也检查了第二台服务器(192.168.0.2)上的nginx日志,但我注意到访问IP和URL与第一台服务器上的不同。我期望主机结果是dev.com,我从那里发送了一个请求,而不是testdev.com。
0.000   192.168.0.1     -       [01/Aug/2023:14:20:48 +0900]    "POST /wp-json/cache/v1/purge/ HTTP/1.1"        301     162     "http://192.168.0.2/wp-json/cache/v1/purge/"    "php-requests/1.7-3470169"      "-"
     "-"     "testdev.com"     "-"


问题是,为什么nginx日志中显示的请求表明它是从testdev.com发送的,而不是实际的源dev.com,根据上面的代码?

h6my8fg2

h6my8fg21#

为什么nginx日志中显示的请求表明它是从testdev.com发送的,而不是实际的源dev.com,按照上面的代码?
不会的
您的日志条目不符合标准格式。我怀疑这里报告的是处理请求的虚拟主机。
由于您正在使用HTTP请求的IP地址,因此这将绕过负载均衡器并直接进入Web服务器。它 * 看起来 *,你正在与请求瞄准的wordpress安装运行在一个虚拟主机上,而不是默认。
至于你应该怎么做……这是一个更复杂的问题。
一般来说,硬编码的IP地址是不好的。如果您的站点位于负载均衡器之后,则这种方法不会扩展到单个站点。OTOH你没有提供任何关于负载均衡器和nginx的细节。
如果是我,我会在nginx配置和负载均衡器上为每个节点创建特定的别名,例如:如果您的站点是'www.example.com',我会在nginx配置中设置server_name www.example.com www*.example.com;,或者在负载均衡器Map中:

www.example.com: 192.168.0.1
www.example.com: 192.168.0.2
www-1.example.com: 192.168.0.1
www-2.example.com: 192.168.0.2

字符串
...或在DNS中添加直接指向源主机的特定记录。
并在$ALLOWED_SERVERS中使用特定别名。
......而且由于您可能需要一个访问控制机制来防止滥用,您可能会限制访问/wp-json/cache/v1/purge -但如果不知道这是什么样子,我不能建议您这样做。

相关问题