Jupyter 服务器可从外部访问但拒绝本地主机连接
Jupyter Server Reachable from outside but refuse localhost connection
我在计算机 A 上设置了一个 Jupyter 笔记本服务器,配置如下:
c.NotebookApp.certfile = '.jupyter/mycert.pem'
c.NotebookApp.ip = 'MY_IP_ADDRESS'
c.NotebookApp.keyfile = '.jupyter/mykey.key'
c.NotebookApp.notebook_dir = 'Dropbox/GitHub'
c.NotebookApp.password = 'MY_HASHED_PASSWORD'
c.NotebookApp.port = 8888
当服务器启动时,计算机 B 可以通过 https://MY_IP_ADDRESS:8888
访问此服务器。
但计算机 A 无法以任何方式访问自身
# ERR_CONNECTION_REFUSED
https://localhost:8888/
https://127.0.0.1:8888/
# ERR_CONNECTION_TIMED_OUT
https://MY_IP_ADDRESS:8888/
值得一提的是,当我注释掉分配IP地址的行时,localhost
和127.0.0.1
工作正常,但我无法从外部连接(计算机B)
我试过切换端口、切换浏览器、配置 /etc/hosts
和 /etc/resolv.conf
以及 ~/.jupyter/jupyter_notebook_config.py
中的一些其他选项
但其中 none 似乎有效
如有任何建议,我们将不胜感激。
更新 1
经过进一步调查,发现这与jupyter notebook无关。我 运行 一个简单的 python HTTP 服务器,带有以下代码段:
import sys
from http.server import SimpleHTTPRequestHandler
import http.server
def test(HandlerClass=SimpleHTTPRequestHandler,
ServerClass=http.server.HTTPServer):
protocol = "HTTP/1.0"
host = 'MY_IP_ADDRESS'
port = 8888
if len(sys.argv) > 1:
arg = sys.argv[1]
if ':' in arg:
host, port = arg.split(':')
port = int(port)
else:
try:
port = int(sys.argv[1])
except:
host = sys.argv[1]
server_address = (host, port)
HandlerClass.protocol_version = protocol
httpd = ServerClass(server_address, HandlerClass)
sa = httpd.socket.getsockname()
print("Serving HTTP on", sa[0], "port", sa[1], "...")
httpd.serve_forever()
if __name__ == "__main__":
test()
结果是一样的。我猜这实际上是一种正常行为,但我不喜欢:(
所以这会导致两种情况:
自连
- 绑定 IP 地址:“”(空字符串)
- 使用本地主机或 127.0.0.1
- (但其他客户端将无法连接)
其他客户端连接
- 绑定 IP 地址:"MY_IP_ADDRESS"
- 使用MY_IP_ADDRESS:8888
- (但服务器本身无法连接)
我添加了一些新标签,希望大家对此有所提示><
我将回答我自己的古老问题。
为了在每个地址绑定服务,使用0.0.0.0特殊地址。
我在计算机 A 上设置了一个 Jupyter 笔记本服务器,配置如下:
c.NotebookApp.certfile = '.jupyter/mycert.pem'
c.NotebookApp.ip = 'MY_IP_ADDRESS'
c.NotebookApp.keyfile = '.jupyter/mykey.key'
c.NotebookApp.notebook_dir = 'Dropbox/GitHub'
c.NotebookApp.password = 'MY_HASHED_PASSWORD'
c.NotebookApp.port = 8888
当服务器启动时,计算机 B 可以通过 https://MY_IP_ADDRESS:8888
访问此服务器。
但计算机 A 无法以任何方式访问自身
# ERR_CONNECTION_REFUSED
https://localhost:8888/
https://127.0.0.1:8888/
# ERR_CONNECTION_TIMED_OUT
https://MY_IP_ADDRESS:8888/
值得一提的是,当我注释掉分配IP地址的行时,localhost
和127.0.0.1
工作正常,但我无法从外部连接(计算机B)
我试过切换端口、切换浏览器、配置 /etc/hosts
和 /etc/resolv.conf
以及 ~/.jupyter/jupyter_notebook_config.py
但其中 none 似乎有效
如有任何建议,我们将不胜感激。
更新 1
经过进一步调查,发现这与jupyter notebook无关。我 运行 一个简单的 python HTTP 服务器,带有以下代码段:
import sys
from http.server import SimpleHTTPRequestHandler
import http.server
def test(HandlerClass=SimpleHTTPRequestHandler,
ServerClass=http.server.HTTPServer):
protocol = "HTTP/1.0"
host = 'MY_IP_ADDRESS'
port = 8888
if len(sys.argv) > 1:
arg = sys.argv[1]
if ':' in arg:
host, port = arg.split(':')
port = int(port)
else:
try:
port = int(sys.argv[1])
except:
host = sys.argv[1]
server_address = (host, port)
HandlerClass.protocol_version = protocol
httpd = ServerClass(server_address, HandlerClass)
sa = httpd.socket.getsockname()
print("Serving HTTP on", sa[0], "port", sa[1], "...")
httpd.serve_forever()
if __name__ == "__main__":
test()
结果是一样的。我猜这实际上是一种正常行为,但我不喜欢:(
所以这会导致两种情况:
自连
- 绑定 IP 地址:“”(空字符串)
- 使用本地主机或 127.0.0.1
- (但其他客户端将无法连接)
其他客户端连接
- 绑定 IP 地址:"MY_IP_ADDRESS"
- 使用MY_IP_ADDRESS:8888
- (但服务器本身无法连接)
我添加了一些新标签,希望大家对此有所提示><
我将回答我自己的古老问题。
为了在每个地址绑定服务,使用0.0.0.0特殊地址。