我在 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/gallery
到http://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 来滥用这种设置进行拒绝服务,这会导致与/gallery
URL 部分彼此跟随一样多的内部代理连接。
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 8k
8096 个 ASCII 字符。尽管http2_max_field_size
已过时,快速测试curl
显示,默认情况下,Nginx 可以通过 HTTP/2 提供长达 11157 个字符的 URL。无论限制是多少,您的代理都会允许/gallery
URL 中出现 1011 到 1394 次,然后才会出现错误414 Request-URI Too Large
。
限制worker_connections
如果没有从默认值增加,则可能首先受到攻击512
。这将导致500 Internal Server Error
错误日志行包含以下内容:
512 worker_connections are not enough while connecting to upstream