[技术技巧]腾讯云服务器搭建jupyter的反向代理设置(真的有坑)


云端服务器搭建 jupyter lab(jupyter notebook)已经有很多现成的教程了,下面只是简单讲一下步骤:

1、下载安装 anaconda3

前往清华大学开源软件镜像站(https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/)或者其他任意正规站点下载合适的版本
输入如下代码安装:

bash Anaconda3-XXX-Linux-x86_64.sh

然后一路enter,没有什么特别的事项

2、将 anaconda 加入环境变量

打开配置文件:

sudo vi /etc/profile

编辑配置文件,文件末尾加入如下代码:

#Anacanda
export PATH="/root/anaconda3/bin:$PATH"

保存后重新加载配置文件:

source /etc/profile

3、生成 jupyter lab(jupyter notebook)配置文件和访问密码

生成配置文件:

jupyter notebook --generate-config

下面会显示:
Writing default config to: /root/.jupyter/jupyter_notebook_config.py
这就是配置文件的名字和路径。
创建访问密码:

jupyter notebook password

进入 Ipython生成访问密码的hash密码:

In [1]: from notebook.auth import passwd                                                                              
In [2]: passwd()                                                                                                      
Enter password: 
Verify password: 
Out[2]: XXXX
In [3]: exit

按照以上步骤生成 hash 密码(Out[2])并保存。

4、修改配置文件

终端窗口、宝塔面板后台或者 sftp 软件打开编辑均可

vim /root/.jupyter/jupyter_notebook_config.py
c.NotebookApp.password = XXX
#就是刚才需要记下的哈希密码

c.NotebookApp.port = 8888  
#指定jupyter lab(jupyter notebook)运行端口,写一个不冲突的端口即可

c.NotebookApp.allow_remote_access = True
# 允许远程访问 

c.NotebookApp.ip='*'  
# 就是设置所有ip皆可访问  

c.NotebookApp.open_browser = False
# 禁止自动打开浏览器
访问端口需要在腾讯云等服务器的安全组规则或类似模块设置放行,使用宝塔面板的需同时在后台防火墙放行

5、服务端开启 jupyter lab(jupyter notebook)并访问

后台保持jupyter notebook开启的命令:

nohup jupyter notebook --allow-root > jupyter.log 2>&1 &

后台保持jupyter lab开启的命令:

nohup jupyter lab --allow-root > jupyter.log 2>&1 &

这时你已经可以通过http://ip:8888(或你设置的端口)进行访问了,并且关闭终端后仍可后台运行。

到目前为止,jupyter已经完成搭建并访问,但是ip访问不易记忆且需要输入端口不够简洁,那么如何设置域名访问

本人使用宝塔面板,下面操作均基于宝塔面板可视化操作,通过终端命令行设置反向代理同理,只要相关代码录入即可。

正常设置反向代理

按照如图所示配置即可:

相关域名需提前在相关NS服务商做好解析

这时候,你已经可以通过域名访问了。

我原本以为这样就结束了,但是这里却有一个大坑

现在你已经可以正常打开 jupyter 并且新建笔记本、打开终端等一系列操作,但是你敲入代码是不会运行的,就像这样:

然后我查了资料,有说 python 版本问题的、有说 anaconda 版本不对的、有说 tornado 版本过高的等等的,我都试了一遍甚至重新安装了 anaconda 均无效。
因为自己不是专业的,我就去淘宝上找人处理这个问题,谁知道也是个坑货,花了30元钱也没解决啥问题,因为当时不知道域名访问使用 ip 访问可以使用,以为是整个 jupyter 坏掉了,所以得知ip访问能正常运行代码以后就还是把钱付了。
那么问题到底出在哪?最后还是只能靠自己,继续 google、google、google

终于让我给找到了原因和解决办法

原因就是一句话:jupyter 使用了 websocket 协议,所以需要配置支持 websocket。
解决办法就是在反向代理配置文件中加入以下代码(Nginx环境下):

# WebSocket support
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";



这时候再运行代码就已经可以显示输出结果了,内核显示空闲,不再是未连接的状态:

为什么说这是一个大坑,因为网上搜到的99%的教程里面关于jupyter域名访问、方向代理设置里面均未提到 websocket 协议及设置的事情,这些文章作者除了天下文章一大抄连一点实操都没有,否则不可能不发现这样的问题。

不负责任的技术博主真的要不得啊!!!

声明:Sawyer's Blog|版权所有,违者必究|如未注明,均为原创|本网站采用BY-NC-SA协议进行授权

转载:转载请注明原文链接 - [技术技巧]腾讯云服务器搭建jupyter的反向代理设置(真的有坑)


Sawyer Cheung的杂记博客