问题
大约 150 个服务器客户端(位于不同位置,具有不同的网络设置)中,有 1 个未通过我的 Apache 服务重定向。我需要知道问题出在哪里,但无法找出原因。
所有客户端访问虚拟主机并向代理发送相同的请求:
<VirtualHost *:80>
ServerName update.***.tld
ServerAdmin [email protected]
CustomLog /var/log/apache2/update.***.tld_access.log combined
ErrorLog /var/log/apache2/update.***.tld_error.log
# redirect all http request to https
RewriteEngine on
Options +FollowSymLinks
RewriteCond %{SERVER_PORT} !^443$
RewriteRule ^.*$ https://%{SERVER_NAME}%{REQUEST_URI} [L,R]
</VirtualHost>
<VirtualHost *:443>
ServerName update.***.tld
LogLevel warn
SSLEngine on
SSLCertificateFile /etc/ssl/certs/wildcard.***.tld.cert
SSLCertificateKeyFile /etc/ssl/private/wildcard.***.tld.key
SSLCertificateChainFile /etc/ssl/certs/wildcard.***.tld.combined.cert
CustomLog /var/log/apache2/update.***.tld_access.log combined
ErrorLog /var/log/apache2/update.***.tld_error.log
TimeOut 3600
KeepAlive On
AddDefaultCharset UTF-8
SSLProxyEngine on
ProxyPreserveHost Off
SetEnv force-proxy-request-1.0 1
SetEnv proxy-nokeepalive 1
ProxyTimeout 15
ProxyRequests Off
ProxyPass / https://***-***-prod.aws.tld/
ProxyPassReverse / https://***-***-prod-prod.aws.tld/
<Proxy *>
AddDefaultCharset UTF-8
Require all granted
</Proxy>
</VirtualHost>
调试
- 将客户端更改为使用 Google DNS 服务器的静态 IP 设置
- 检查日志文件
- 似乎来自该特殊客户端的所有请求均未正确重定向
- 来自该客户端的请求记录在 default_access.log 中,并且没有到达我的自定义日志,所以我猜测转发不起作用,但是为什么其他 150 个客户端却不起作用呢?
- 默认访问日志:clientipaddress - - [23/Jul/2020:20:23:17 +0200] "GET /api/agent/ping HTTP/1.1" 400 301 "-" "-"
- 当我从客户端向端口 443 上的代理发送 wget 时,它会被正确转发到虚拟主机并记录在我的自定义日志中
- 我检查了 tcpdump,发现客户端尝试使用正确的端口(443)发送到正确的服务器
损坏的客户端上的 tcpdump:
tcpdump -i eth0 -vvv host update.***.tld > dump
https://gist.github.com/herz0g/e02ef883688c904667164a175955ecc0
结论
我猜测这是客户端网络的问题,否则它将无法为其他 150 个客户端工作,但我不确定如何证明这一点或者可以进一步调试什么。
答案1
您实际上部分回答了您自己的问题:
当我从客户端向端口 443 上的代理发送 wget 时,它会被正确转发到虚拟主机并记录在我的自定义日志中
您遇到的问题是由于您依赖于明确的端口号,而这种情况并不常见,因此 Apache 重定向不正确。
重写条件 %{SERVER_PORT} !^443$
这表明客户端在 API 调用的 URI 中没有端口号,并且当不存在时它会失败。
尝试将 Apache 中的重定向配置更改为此处的建议回答
答案2
正如 @PatrickMevzek 所说,这不是网络或 DNS 问题。我检查了启用了调试级别的日志,并注意到此错误:
[Fri Jul 24 12:33:11.463639 2020] [ssl:info] [pid 9792:tid 139651482162944] [client clientip:26294] AH01964: Connection to child 441 established (server default.virtual.host:443)
[Fri Jul 24 12:33:11.463917 2020] [ssl:debug] [pid 9792:tid 139651482162944] ssl_engine_kernel.c(2096): [client clientip:26294] AH02043: SSL virtual host for servername update.***.tld found
[Fri Jul 24 12:33:11.612839 2020] [core:debug] [pid 9792:tid 139651482162944] protocol.c(1158): [client clientip:26294] AH02427: Request header value is malformed: TOKEN ******\r
[Fri Jul 24 12:33:11.612873 2020] [core:debug] [pid 9792:tid 139651482162944] protocol.c(1318): [client clientip:26294] AH00567: request failed: error reading the headers
似乎我的客户端配置文件因某种原因被搞砸了,但文件内的内容与我的其他代理相同,而且权限和所有者也正确。我删除了该文件并创建了一个新文件。现在一切都正常了。
感谢您为我指明正确的方向。