从另一个子域代理 WordPress 页面

从另一个子域代理 WordPress 页面

我在 Ubuntu 服务器上安装了 Nginx,并且在 上安装了 WordPress blog.example.com

在 WordPress 上,我创建了一个画廊页面,可以从 访问blog.example.com/gallery

现在,当有人访问时,gallery.example.com它应该显示的内容blog.example.com/gallery。如何在 Nginx 中实现这一点?

以下是我在 nginx 服务器配置上尝试过的blog.example.com.config

   location /gallery {
        proxy_pass http://gallery.example.com/;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }

答案1

正确的配置

您的代理方向错误!它是从路径到子域的代理;最有可能是到路径所在的同一主机名。如果它是server_name gallery.example.com,则它当前代理从http://gallery.example.com/galleryhttp://gallery.example.com/

要使其成为从http://gallery.example.com到的代理http://blog.example.com/gallery

server {
    server_name gallery.example.com;    
    location / {
        proxy_pass http://blog.example.com/gallery;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

使用当前代理配置的拒绝服务攻击

完整的错误配置:

server {
    server_name gallery.example.com;    
    location /gallery {
        proxy_pass http://gallery.example.com/;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

这个错误配置与它所代理的子域位于同一子域上,这个细节使得它变得有趣,因为有人实际上可以通过访问 URL 来滥用这种设置进行拒绝服务,这会导致与/galleryURL 部分彼此跟随一样多的内部代理连接。

http://gallery.example.com/gallery/gallery/gallery/gallery/gallery/.../gallery
=> . . . 
=> http://gallery.example.com/gallery/gallery/gallery/gallery/gallery/gallery
=> http://gallery.example.com/gallery/gallery/gallery/gallery/gallery
=> http://gallery.example.com/gallery/gallery/gallery/gallery
=> http://gallery.example.com/gallery/gallery/gallery
=> http://gallery.example.com/gallery/gallery
=> http://gallery.example.com/gallery
=> http://gallery.example.com/

调用许多此类请求会导致服务器负载过高,并且这种负载在攻击停止后仍会持续很长时间,因为 Nginx 仍在尝试为所有这些嵌套代理连接提供服务。Nginx 还可能开始向合法用户显示502 Bad Gateway& 。500 Internal Server Error

甚至记录所有这些请求也可能成为一个问题:[alert] 1620#1620: *2748894 write() to "/var/log/nginx/access.log" was incomplete: 3421 of 4566 while logging request

如果这是一个https://服务器,所有这些 TLS 握手都会导致更高的负载。

单个 HTTP 请求可以引发多少个代理连接?

large_client_header_buffers控制最大请求行长度,默认为4 8k8096 个 ASCII 字符。尽管http2_max_field_size已过时,快速测试curl显示,默认情况下,Nginx 可以通过 HTTP/2 提供长达 11157 个字符的 URL。无论限制是多少,您的代理都会允许/galleryURL 中出现 1011 到 1394 次,然后才会出现错误414 Request-URI Too Large

限制worker_connections如果没有从默认值增加,则可能首先受到攻击512。这将导致500 Internal Server Error错误日志行包含以下内容:

512 worker_connections are not enough while connecting to upstream

相关内容