我在一台物理服务器上运行着 Apache 和 WebDav 服务器 (PyWebDav3)。这是一台 Ubuntu 14.04 服务器,因此配备了所有图形工具。
WebDav 服务器以默认配置启动:
davserver -D /tmp -n
文档显示可以使用不同的主机:
-H, --host 监听的主机(默认:localhost)
我需要一个 FQDN。因此我执行:
bernard@p7:~$ hostname -f
p7
bernard@p7:~$
并在启动 WebDav 时使用它:
bernard@p7:/etc$ davserver -D /tmp -n -H "p7"
2016-07-27 15:42:32,716 WARNING Authentication disabled!
Listening on p7 (8008)
我可以使用 Firefox 在 URL 栏中输入“localhost”来本地访问此服务器。也可以使用 URL 栏中的“192.168.1.101”来远程访问此服务器。
我可以在本地通过 Firefox localhost:8008 进行访问。并使用 Nautilus 作为 WebClient 作为文件服务器。效果很好。
我使用ufw禁用了服务器上的防火墙,现在ufw状态为禁用:
bernard@p7:~$ sudo ufw status
Status: inactive
bernard@p7:~$
我使用以下命令检查哪个端口是开放的:
bernard@p7:~$ sudo netstat -plnt
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 127.0.1.1:53 0.0.0.0:* LISTEN 1087/dnsmasq
tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN 701/cupsd
tcp 0 0 127.0.1.1:8008 0.0.0.0:* LISTEN 3465/python3
tcp6 0 0 :::80 :::* LISTEN 1131/apache2
tcp6 0 0 ::1:631 :::* LISTEN 701/cupsd
bernard@p7:~$
因此 PyWebDav3(一个 Python 程序)似乎在端口 8008 上打开,但在使用“p7”作为主机后,仅适用于 127.0.1.1
使用时:
davserver -H 192.168.1.101 -D /tmp -n
并测试:
bernard@p7:~$ sudo netstat -plnt 活动的互联网连接(仅服务器) Proto Recv-Q Send-Q 本地地址 外部地址 状态 PID/程序名称 tcp 0 0 127.0.1.1:53 0.0.0.0:* LISTEN 1087/dnsmasq
tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN 701/cupsd
tcp 0 0 192.168.1.101:8008 0.0.0.0:* LISTEN 3743/python3
tcp6 0 0 :::80 :::* LISTEN 1131/apache2
tcp6 0 0 ::1:631 :::* LISTEN 701/cupsd
bernard@p7:~$
远程 telnet 调用:
bernard@vbox11:~$ telnet 192.168.1.101 8008
telnet: Unable to connect to remote host: Connection timed out
bernard@vbox11:~$
远程我无法使用 Firefox 作为客户端访问 192.168.1.101:8008,它似乎挂了。使用 Firefox 访问与我在服务器上执行的操作相同,并且在服务器上有效。
然后我在服务器上检查发生了什么(来自 PyWebDav3 的消息):
Exception happened during processing of request from ('192.168.1.66', 42801)
Traceback (most recent call last):
File "/usr/lib/python3.4/socketserver.py", line 617, in process_request_thread
self.finish_request(request, client_address)
File "/usr/lib/python3.4/socketserver.py", line 344, in finish_request
self.RequestHandlerClass(request, client_address, self)
File "/usr/lib/python3.4/socketserver.py", line 673, in __init__
self.handle()
File "/usr/lib/python3.4/http/server.py", line 398, in handle
self.handle_one_request()
File "/usr/lib/python3.4/http/server.py", line 368, in handle_one_request
self.raw_requestline = self.rfile.readline(65537)
File "/usr/lib/python3.4/socket.py", line 374, in readinto
return self._sock.recv_into(b)
ConnectionResetError: [Errno 104] Connection reset by peer
----------------------------------------
因此,PyWebDav3 服务器似乎无法处理该请求。
在服务器的 /var/log/auth.log 中看不到有关此拒绝的消息。
两个问题:
- 导致拒绝的原因
- 如何解决
答案1
有 2 件事需要确认/尝试:首先确认端口确实打开并正在为远程地址提供服务。似乎在下面的文件中定义了一个主机名...我猜你不是想通过输入“localhost”从远程机器访问 webdav,所以我想解决方案是:
通过以下方式将主机名更新为有效的 FQDN:
sudo nano <pywebdavroot>/server/config.ini
您可以使用 netstat 确认哪个地址/端口是开放的:
sudo netstat -plnt
如果这有帮助的话请告诉我。
答案2
尝试运行它就像监听所有接口一样:
davserver -D /tmp -H 0.0.0.0 -n
我无法重现最初描述的问题,将 -H 设置为我的网络接口确实使其按照 netstat 在正确的 ip:port 上监听,类似地,将 -H 设置为我的主机名也可以工作,但我确实设置了我的主机文件以确保默认情况下解析外部 ip,通常主机名将解析为 Linux 机器上的本地主机。
在所有界面上运行上述操作,我从另一台计算机使用 wget 连接服务器时没有遇到任何问题,虽然这不是很有趣,但确实获得了索引页,不用担心,并且服务器记录了请求。所以它对我来说是有效的。
ps. 我是 Pywebdav3 的维护者,它是 pywebdav 到 python 3 的直接移植,所有功能在两个项目上都应该完全相同。