我收到错误:
Bad Request
Request Line is too large (6060 > 4094)
Run Code Online (Sandbox Code Playgroud)
当我像这样访问服务器上的特定 url 时:
/api/categorize?packages=package1,package2,...packageN
Run Code Online (Sandbox Code Playgroud)
在 nginx.conf 我有:
large_client_header_buffers 8 16k;
client_header_buffer_size 8k;
Run Code Online (Sandbox Code Playgroud)
我找不到有关该特定问题的文档, large_client_header_buffers 的文档提到 400 Bad request,但将“large_client_header_buffers”从 4 8k 更改为;或 8 8k;或 8 16;没有解决问题。
我们很难在我们的网站上调试 400 个错误。我们有很多这样的错误:
10.0.0.1 - - [08/Oct/2018:14:28:07 +0200]
"GET /les-news/palmares/detail/article/la-lettre-de-motivation-ideale-pour-une-demande-de-stage-5224/
HTTP/1.1" 400 131844
"https://www.google.com/"
"Mozilla/5.0 (Linux; Android 7.0; TECNO K7 Build/NRD90M) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.91 Mobile Safari/537.36"
Run Code Online (Sandbox Code Playgroud)
一位用户通过电子邮件报告了这个问题,并通过在他的浏览器中重置它的 cookie 来修复它,其他重置 cookie 是不够的(但我们不能确定它是否正确完成)。
该平台非常复杂,由F5 负载均衡器处理,具体取决于请求转发到不同服务器的路径。
我首先想要的是能够重现错误,因为在访问 URL 时,我们没有任何 URL 并且一切正常。
我们注意到大部分错误来自 Android/Chrome:大约 85% 的所有 400 个错误。
这是一个完整的日志:
timestamp October 8th 2018, 16:26:52.000
version 1
_id BmQSVGYB5vF-Dw_g1gVi
_index f5_access-2018.10.08
_score -
t _type doc
t agent Mozilla/5.0 (Linux; Android 8.1.0; MI 8 Build/OPM1.171019.026) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.91 Mobile …Run Code Online (Sandbox Code Playgroud) 我们运行一个 Apache2 Web 服务器,它每天提供大约 2-3 百万个页面(Lighttpd 仅提供 HTML+CSS+Javascript、图像和其他内容)。我们的每日logwatch电子邮件每天输出 3-5 个“400 个错误请求”项目。它主要是每天针对相同的 URL,但每个 URL 很少超过 1 次。列出的 URL 主要用于我们网站上的标准页面浏览(几乎每个用户都会访问的 URL)。
当 grep 中error.log列出的 IPaccess.log收到错误时,结果总是[error] [client xxx.xxx.xxx.xxx] request failed: error reading the headers, referer: xxx。
我的假设是这些没有什么可担心的,至少当它们很少出现时。
我们在这里看到的错误数量是由断开的连接产生的还是类似的?我应该检查什么才能弄清楚?我应该让它一个人呆着吗?
我认为我所要求的有点难以理解,所以,我试图让它更简单......
当我的服务器收到带有格式错误的主机标头的请求时,我需要它有一个自定义的 400 错误页面。
我理想中想要的是 ErrorDocument 400 \somepage.php
我可以通过访问诸如 之类的页面来生成 400 个错误http:\\myserver\bla%bla,这将很好地转到我的脚本中。同样,我可以将该\somepage.php部分更改为Test textApache 将返回该文本。
但是,如果 400 错误是由格式错误的主机标头引起的,它将适用于文本而不是网页。
任何人都可以对此有所了解并在我松开所有头发之前提供可行的解决方案吗?!(已经为此失去了很多!)。
最近,我将我的服务器从一个提供商移到另一个提供商,并开始在 apache 错误日志中收到此消息:
“请求失败:读取标题时出错”
错误示例和相应的访问 apache 日志:
ApacheServer$ cat error_log
ApacheServer [Tue Jan 20 11:07:44 2015] [error] [client x.x.x.x] request failed: error reading the headers
ApacheServer$ cat access_log
x.x.x.x - - [20/Jan/2015:11:06:44 +0200] "GET SomeRandomRequest HTTP/1.1" 400 226 "-" "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.3; WOW64; Trident/7.0; .NET4.0E; .NET4.0C; .NET CLR 3.5.30729; .NET CLR 2.0.50727; .NET CLR 3.0.30729; BRI/2; MAARJS)" "-"
Run Code Online (Sandbox Code Playgroud)
我必须承认,除了 php 版本(从 5.3 到 5.4)之外,没有任何变化。
我没有看到与某些特定浏览器或某些特定请求的任何关系,这完全是随机的。
这也不是交换机问题,因为我在其他不共享同一交换机的 apache 服务器上也遇到了同样的问题。
直到现在我尝试:
- 更新网卡驱动程序
- 将 RX 从 256 …
我一直在尝试测试如下所示的设置:
网站:Http GET 请求 -> Nginx -> HAProxy -> .Net 应用程序
我将 Nginx 和 HAProxy 放在同一台 Debian 机器上。但是,HAProxy 不断返回“Bad Request (Invalid Host)”。我已经确定 HAProxy 有问题,首先将请求直接从网站发送到 .Net 应用程序,该应用程序有效。将 Nginx 链接到 .Net 应用程序也有效。但是,当我尝试使用 HAProxy 进行测试时,我开始收到错误消息。.Net 应用程序是否实际在 HAProxy 后面运行并不重要,我总是收到错误消息。
我尝试发送的消息的一个示例是http://192.168.7.119:81/a:diff1. 预期的回复是 JPG 图像。当发送到 HAProxy(Apache、Nginx、应用程序)以外的任何东西时,这似乎工作正常,但 HAProxy 只是说“错误请求”。奇怪的是,我的日志文件中没有看到任何错误。
以下是日志文件中的示例:
Feb 2 15:10:08 companyDebian haproxy[5566]: 192.168.7.114:51105 [02/Feb/2015:15:10:08.415] renderfarm renderfarm/renderA 0/0/0/1/1 400 212 - - ---- 1/1/0/1/0 0/0 "GET /a:diff1 HTTP/1.1"
Feb 2 15:10:08 companyDebian haproxy[5566]: 192.168.7.114:51105 [02/Feb/2015:15:10:08.417] renderfarm renderfarm/renderA 73/0/0/4/77 400 212 - - ---- …Run Code Online (Sandbox Code Playgroud) 我在 Apache 2.4 服务器前面使用 nginx 作为 TLS 终止符。
我add_header X-Content-Type-Options nosniff;在 nginx 中使用此标头添加到每个响应中。
如果 Apache 返回的 HTTP 状态代码低于 400,则标头设置正确,但如果状态大于或等于 400,则标头被忽略。
gzip 模块也是如此。如果状态代码低于 500,gzip 模块会自动压缩响应正文。但是,如果 Apache 获取的 HTTP 状态代码大于或等于 500,则 gzip 模块将不执行任何操作。
我的 nginx 配置的一些相关部分:
proxy_intercept_errors off;
proxy_ignore_client_abort off;
proxy_http_version 1.1;
proxy_hide_header X-Powered-By;
proxy_set_header Connection ""; #for keepalive to backend
add_header X-Content-Type-Options nosniff;
### gzip ###
gzip on;
gzip_min_length 20; #default: 20
gzip_comp_level 9;
gzip_proxied any;
gzip_vary on;
gzip_types *;
gunzip on;
Run Code Online (Sandbox Code Playgroud)
我可以采取什么措施来停用此行为并将标头添加到 HTTP 错误响应甚至 gzip HTTP 500 响应中?
400 ×7
apache-2.2 ×3
http ×3
bad-request ×2
nginx ×2
500-error ×1
apache-2.4 ×1
centos ×1
haproxy ×1
http-headers ×1
logging ×1
proxy ×1
web ×1
web-server ×1