【问题标题】:How to debug connection from computer to server, server-side如何调试从计算机到服务器的连接,服务器端
【发布时间】:2026-02-13 12:55:01
【问题描述】:

我的 Centos 7 服务器正在运行 apache 2.4.6,并且正在使用 mod_wsgi 提供一个 django webapp。我的问题是我无法从另一台计算机的浏览器访问服务器 url。我没有从 apache 得到任何错误,它的启动和运行没有问题。我已在 http.conf 文件中将错误日志设置为“调试”,但仍然没有错误。我知道服务器实际上是通过 ping 连接到互联网的,我知道它正在通过运行监听端口:80

netstat -tunlp | grep 80.

tcp        0      0 0.0.0.0:60080           0.0.0.0:*               LISTEN      3841/name-gu 
tcp6       0      0 :::80                   :::*                    LISTEN      13882/httpd  

我也暂时关闭了服务器端的所有防火墙

我的settings.py有ALLOWED_HOSTS下的url、ip地址和localhost

如何调试此问题,以便我可以查看错误?


日志: 让我知道是否需要更多信息 在服务器计算机上运行 tcpdump -nn tcp port 80 然后在我的机器上运行curl -v myurl.com 并在我的服务器上得到这些结果:

13:11:52.225076 IP 10.0.24.67.40658 > 10.0.26.20.80: Flags [S], seq 3327782620, win 29200, options [mss 1460,sackOK,TS val 36451589 ecr 0,nop,wscale 7], length 0
13:11:52.225355 IP 10.0.26.20.80 > 10.0.24.67.40658: Flags [S.], seq 1689726058, ack 3327782621, win 28960, options [mss 1460,sackOK,TS val 73904848 ecr 36451589,nop,wscale 7], length 0
13:11:52.225960 IP 10.0.24.67.40658 > 10.0.26.20.80: Flags [.], ack 1, win 229, options [nop,nop,TS val 36451590 ecr 73904848], length 0
13:11:52.226198 IP 10.0.24.67.40658 > 10.0.26.20.80: Flags [P.], seq 1:101, ack 1, win 229, options [nop,nop,TS val 36451590 ecr 73904848], length 100: HTTP: GET / HTTP/1.1
13:11:52.226448 IP 10.0.26.20.80 > 10.0.24.67.40658: Flags [.], ack 101, win 227, options [nop,nop,TS val 73904849 ecr 36451590], length 0
13:11:52.231414 IP 10.0.26.20.80 > 10.0.24.67.40658: Flags [P.], seq 1:286, ack 101, win 227, options [nop,nop,TS val 73904854 ecr 36451590], length 285: HTTP: HTTP/1.1 200 OK
13:11:52.232052 IP 10.0.24.67.40658 > 10.0.26.20.80: Flags [.], ack 286, win 237, options [nop,nop,TS val 36451596 ecr 73904854], length 0
13:11:52.232814 IP 10.0.24.67.40658 > 10.0.26.20.80: Flags [F.], seq 101, ack 286, win 237, options [nop,nop,TS val 36451597 ecr 73904854], length 0
13:11:52.233003 IP 10.0.26.20.80 > 10.0.24.67.40658: Flags [F.], seq 286, ack 102, win 227, options [nop,nop,TS val 73904856 ecr 36451597], length 0
13:11:52.233414 IP 10.0.24.67.40658 > 10.0.26.20.80: Flags [.], ack 287, win 237, options [nop,nop,TS val 36451597 ecr 73904856], length 0

【问题讨论】:

  • “无法访问服务器”是什么意思?您是否收到超时或 http 状态代码 >= 400 或带有空正文的 OK (200) 响应?您可以通过浏览器中的“检查/网络”或直接在服务器上通过命令行实用程序更好地检查它,而无需禁用防火墙。例如。通过命令curl -i http://mysite.example.com。你也可以在/var/log/http/access_log看到状态码。
  • 这十个数据包是一个小的HTTP GET请求的正常通信,响应很小。带有 [S] (syn)、ack (acknowledgment) 和 [F] (fin) 标志的数据包仅用于握手以初始化 TCP 连接、确认收到的数据包并正确关闭连接。只有两个数据包具有非零长度并且它们具有非常清晰的 cmets:HTTP: GET / HTTP/1.1HTTP: HTTP/1.1 200 OK。您可以通过浏览器发送相同的请求,并在此处仅保留此通信。
  • 我不明白您所说的“您可以通过浏览器发送相同的请求并在此处仅留下此通信”是什么意思。当我的浏览器不接受或向服务器发送请求时,如何向浏览器发送相同的请求?
  • 我写它是为了确定你的浏览器没有发送任何数据包,并且问题与 Apache、Django 或 CentOS 无关,甚至根本与服务器无关。文本“Blocked... unsecured network”表示它与某些安全策略有关。现在对我来说已经不在话题范围内了。对于您的网络管理员来说,这更像是一个问题。您可能也无法在浏览器中打开该网络上任何设备(如网络打印机)的 Web 界面。

标签: django apache centos7


【解决方案1】:

首先,我将重点验证您是否可以访问 Apache 服务器上的某些静态测试页面,因为它只侦听 IPv6 端口。 (这是在您的服务器上显示的最可疑的细节。也许您只为 IPv4 地址配置了 DNS,或者您还没有对 IPv6 地址进行 ping6。如果它是公共服务器,那么它可能应该最后在 IPv4 上监听。很明显,没有服务在监听 IPv4 tcp 端口 80,也没有代理。)如果不是问题,那么我将描述一种“调试”策略:

...太好了,您检查了一些有用的特定事实,但最有效的策略是尝试将一大片可能存在的问题平分到“一半”大小的区域,这些区域可以独立检查是否它们工作或不工作,以及如果该区域的任何东西被破坏,它将如何具体表现出来。

我会在 访问日志 /var/log/httpd/access_log(CentOS 上的默认 Apache 日志)中查看 Apache 已收到请求,状态代码是什么以及响应的大小为零或非零并且 Apache 和浏览器之间一切正常。在您开始怀疑防火墙等之前,首先通过来自同一服务器的一个请求轻松测试服务器会更有用,例如通过命令行实用程序wget -S -O - http://mysite.example.comcurl -i http://mysite.example.com 对其进行测试。如果您通过浏览器检查任何内容,您应该使用开发者工具检查 (Ctrl+Shift+I)、网络选项卡,查看问题是否仅与响应有关或仍与发送请求有关。 p>

我最终还将验证来自 Python/Django 的日志记录是否有效,并且您正在查看正确的 Python 日志,例如通过在models.py 的末尾添加log.info("something") 命令,不仅看不到任何错误。

文本“我无法从我的浏览器访问服务器 url”需要更多信息,这究竟是什么意思。从字面上看,这意味着问题与 Django/Python 无关,而是在 Apache 和浏览器之间,如果它真的无法开始连接并发送请求的标头。缺少响应需要主要考虑 Django/Python。即使是未配置的 Apache 也会显示一个测试页面,并且可以通过 ip 地址访问,无需有效的 DNS:http;//numeric.ip.address。您可以验证您是否可以在同一域上临时配置一个简单的测试静态站点...

编辑 调试通过 cmets 中的响应和建议以及在问题中添加格式化日志继续进行。逻辑过程比简历更重要。

【讨论】:

  • 如果您从公共互联网上收到来自ping6 mysite.com 的响应,那么您可能很快就会成功为自己配置服务器,但 IPv4 的需求最终也取决于您的用户。估计有 25% 的用户需要 IPv4。至于重定向,如果您在 Python 日志中没有看到重定向,则可能是由 Apache 配置引起的,或者如果您在那里看到重定向,则可能是由 Python 引起的......
  • 我仍然建议在生产服务器上配置一个测试静态站点 test.mysite.com,根目录中只有一个 index.html 文件,并且 DNS 仅解析为公共 IPv6 地址,如果您希望您的 Apache 仅在 IPv6 上侦听。通过host test.mysite.com 进行测试。当它开始可靠地工作时,继续 Django 的事情。
  • 从另一个网络或另一台计算机尝试它,也可以从具有更多诊断工具的 Linux 尝试,如果网络路由或防火墙有问题,请在两台计算机上安装“tcpdump”并运行例如tcpdump -nn tcp port 80 您正在从正确的计算机接收请求和响应数据包。
  • 我会接受这个答案,因为这是调试的正确方法,我的问题是你所说的安全策略......我需要一个合适的 ssl 证书
  • 感谢您有勇气尝试不愉快的步骤。我第一次在他们之后继续交流。当我读到“调试”这个词时,我相信了你的勇气。