本文完整阅读约需 7 分钟,如时间较长请考虑收藏后慢慢阅读~

最近因为需要进行大量的数值分析和科学计算,我在服务器的一台虚拟机上安装了Jupyter Notebook,并使用一台有公网IP的虚拟机对其进行反向代理,却在使用过程中遇到了Python终端无限重连的故障。

该故障如以下视频所示:

而通过开发者工具查看,发现并未出现预期中的连接错误,例如404、403、500、502等,但在Console中发现了大量的重连消息:

......
Starting WebSockets: wss://lurenjia.jupyter.live2.fun/api/kernels/3a80d6ea-6548-4ac5-9a4e-f7dbc719e4cc
kernel.js:103 Kernel: kernel_connected (3a80d6ea-6548-4ac5-9a4e-f7dbc719e4cc)
kernel.js:103 Kernel: kernel_disconnected (3a80d6ea-6548-4ac5-9a4e-f7dbc719e4cc)
kernel.js:562 Connection lost, reconnecting in 1 seconds.
kernel.js:103 Kernel: kernel_reconnecting (3a80d6ea-6548-4ac5-9a4e-f7dbc719e4cc)
kernel.js:459 Starting WebSockets: wss://lurenjia.jupyter.live2.fun/api/kernels/3a80d6ea-6548-4ac5-9a4e-f7dbc719e4cc
kernel.js:103 Kernel: kernel_connected (3a80d6ea-6548-4ac5-9a4e-f7dbc719e4cc)
kernel.js:103 Kernel: kernel_disconnected (3a80d6ea-6548-4ac5-9a4e-f7dbc719e4cc)
kernel.js:562 Connection lost, reconnecting in 1 seconds.
kernel.js:103 Kernel: kernel_reconnecting (3a80d6ea-6548-4ac5-9a4e-f7dbc719e4cc)
......

通过对比直接连接Jupyter Notebook与通过Nginx反向代理Jupyter Notebook的Jupyter Notebook部分访问日志,我发现了通过Nginx访问Notebook时所输出的HTTP版本为1.0,而直接访问Notebook时所输出的HTTP版本为1.1,其余请求均完全一致。

于是我在Nginx的反向代理配置文件中加入以下配置:

# Upgrade即允许Nginx对WebSocket进行反向代理
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;

# **将反向代理的HTTP版本设置为1.1**
proxy_http_version 1.1;

# WebSocket长连接超时设置,解决超时后客户端提示disconnected问题
proxy_read_timeout 3600m;
proxy_send_timeout 3600m;

重启Nginx后,再次连接,该问题解决!