frp对JupyterNotebook远程代理出错
事件前提
之前一直使用frp,将搭建的jupyter-notebook 暴露到外网,以供笔者远程使用。但有一天突然笔者的jupyter-notebook页面打不开了
报错日志
于是笔者到实验室服务器查看错误日志:
2020/01/22 16:02:46 [E] [proxy.go:581] [2049e55e5b93dab3] [http] connect to local service [127.0.0.1:8888] error: dial tcp 127.0.0.1:8888: connect: connection refused
错误定位与解决
-
笔者首先怀疑frp版本问题,更新,无果
-
以为是frp停用,于是下载ngrok进行代理,无果
-
由于jupyter-notebook一直运行在后台,笔者停止了这个进程,并且重新打开,浏览器端继续访问代理的目标地址,发现notebook日志:
[W 16:24:57.847 NotebookApp] 403 GET /static/base/images/logo.png?v=641991992878ee24c6f3826e81054a0f (127.0.0.1) 4.74ms referer=http://106.13.xxx.175:8888/tree?
[W 16:24:58.146 NotebookApp] Blocking request with non-local 'Host' 106.13.xxx.175 (106.13.xxx.175:8888). If the notebook should be accessible at that name, set NotebookApp.allow_remote_access to disable the check.
问题
可以看出,JupyterNotebook本身配置文件的NotebookApp.allow_remote_access
需要设置成True
才能进行远程访问。之前可能笔者重新生成了配置文件,于是配置遭到覆盖,所以远程失效。
解决方案
-
(可选) 如果您从来没生成Notebook配置文件,执行
jupyter notebook --generate-config
若root用户执行以上命令会提示Running as root it not recommended. Use --allow-root to bypass.
只需加上 --allow-root 选项即可
执行成功后提示以下信息:
Writing default config to: /home/username/.jupyter/jupyter_notebook_config.py
-
(可选)生成密码
服务器端命令行输入:
jupyter notebook password
此时会提示输入密码及确认密码,密码设置完成后提示将生成的密码写入/home/username/.jupyter/jupyter_notebook_config.json,注意username视用户而定,会直接出现在提示信息中。
$ Jupyter notebook password Enter password: **** Verify password: **** [NotebookPasswordApp] Wrote hashed password to /home/username/.jupyter/jupyter_notebook_con
打开存储密码的json文件,可以看到:
“password”: “sha1:8d076d7433e6:7f0ed1c8e081133cec66f78748b01d7e27bdfec3”
复制此密文
-
修改配置文件
在/home/username/.jupyter/jupyter_notebook_config.py中找到以下行,修改为:
c.NotebookApp.ip='*' #允许访问的IP地址,设置为*代表允许任何客户端访问 c.NotebookApp.password = u'sha1:8d...刚才生成密码时复制的密文' c.NotebookApp.open_browser = False c.NotebookApp.port =8888 #可自行指定一个端口, 访问时使用该端口 c.NotebookApp.allow_remote_access = True
事后一支烟
反思本次遭遇到的错误,实际上是由于另一个错误导致的,因此进行错误排查时要看多方的日志报告,笔者一直以为是frp的问题,最后才发现是Notebook配置的问题,便立此文,以警后人。
参考
https://www.jianshu.com/p/42956ad62088