【问题标题】:Use apache http server reverse-proxy to send a request expected not to return a response使用 apache http server reverse-proxy 发送预期不返回响应的请求
【发布时间】:2018-07-02 23:37:30
【问题描述】:

需要有人将我推向正确的方向。

我们正在使用 apache http 服务器 (http1) 反向代理向另一个 http 服务器 (http2) 发送请求。挑战在于 http2 不会在响应中将 HTML 页面发送回 http1。

http2 日志确实显示了进来的请求。但是,http1 日志导致 HTTP 502 错误:

内部错误(具体信息不可用):[client] AH01102: error reading status line from remote server localhost:9001 [proxy:error] [client] AH00898: 从 /app/myContext/LogMessage 返回的远程服务器读取错误

这是返回 HTTP 状态 200 的 http2 日志:

“GET /app/myContext/LogMessage HTTP/1.1”200 -

请注意,那些生成 HTML 页面的请求可以正常工作。

您认为这里应该采用什么方法?对于这种类型的请求,也许使用反向代理不是一个好的选择?

我们以这种方式在 http1 上设置了 httpd.conf:

ProxyPass "/app/myContext/" 
http://localhost:9001/app/myContext/"
ProxyPassReverse "/app/myContext/" 
http://localhost:9001/app/myContext/"

【问题讨论】:

  • 我想知道 http1 实际上从 http2 收到了什么。无论如何要附加数据包嗅探器?
  • 是的,我会这样做并告诉你进展如何。谢谢。
  • 要检查的一件事是http2 是否在发送\r\n\r\n 之后发送200,因为这会关闭响应。另一件要考虑的事情是,如果没有内容,让http2 发送204,因为在现代网络浏览器中,接收没有任何正文的 200 会引发错误。
  • 已验证没有从 http2 发送响应。使用 snoop(在 Solaris 上)进行数据包嗅探。很遗憾,我们无法对 http2 进行更改。
  • 作为另一种可能的解决方案:研究抑制 error_log 中的错误(通过 httpd.conf 中的 ErrorLog 指令配置)。到目前为止发现了如何抑制 access_log 日志记录而不是 error_log。

标签: apache proxy reverse-proxy httpserver


【解决方案1】:

完全禁用 http1 上的 ErrorLog:

ErrorLog /dev/null

您是否尝试过使用mod_log_confighttp1 忽略?根据示例,格式字符串可能是:

CustomLog expr=%{REQUEST_STATUS} -eq 502 && %{REQUEST_URI} =~ /app\/myContext/ ...

或者 LogFormat 字符串也可以工作:

LogFormat %!502...

(h/t 到 Avoid logging of certain missing files into the Apache2 error log

http1 向请求者发送 502 是您的问题吗?在这种情况下,也许使用<If> 和自定义ErrorDocument

<If %{REQUEST_URI} =~ /app\/myContext/>ErrorDocument 502 'OK'</If>

【讨论】:

  • 感谢您的回复。这个问题在 Prod 中。不确定在那里禁止记录是否是个好主意。
  • 那么你将不得不忍受它,因为没有响应的错误符合协议
  • 好吧,严格来说,http2 确实在响应中发送了 HTTP 200 状态(基于 http2 日志)。只是不知道为什么 http1 不将其视为(或可能未收到)合法响应。
  • 哦,有趣。我将删除此答案,因为我正在阅读它,因为 http2 根本不返回任何内容。
  • 感谢您重新发布此答案。接下来会尝试。我的电话不好:http2 日志显示 HTTP 200 状态,但 snoop 证明没有发送响应。
【解决方案2】:

采用以下解决方案:在 http2 中重新路由 LogMessage 调用以获取空白 html 页面: 1. 在/htdocs 目录下创建blankfile.html。 2. 在 httpd.conf 添加这一行: 重写规则 ^.(app/myContext/LogMessage)。 /blankfile.html [L]

这对我们有用,因为 LogMessage 的全部目的是将请求记录在 http2 access_log 中。

只是想感谢@cowbert 在这方面与我一起努力工作!

【讨论】:

    猜你喜欢
    • 2019-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-26
    • 2018-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多