最近在云服务器部署了 Jupyter,跟其它服务都堆在一台主机上了,又不想暴露太多端口,所以就用 Nginx 搞了下反向代理。
首先,先为 Jupyter 分配一个域名,该域名指向 Nginx 所在主机。个人主页暂时用的是host.xxx.cn
,于是给 Jupyter 分配了个subhost.host.xxx.cn
,这个域名自己喜欢就好。
接着在 Nginx 中给 Jupyter 分配一个虚拟主机,虚拟主机文件jupyter.conf
配置如下:
# 负载均衡,当然,目前只有一台机,完全可以不用这个配置
upstream jupyterServer {
server 172.17.0.1:8889; # 这个就是 Jupyter 监听的 地址
# server2 host:port; # 如果有多台机器,就可以用这种形式继续配置
}
# map 根据客户端请求中的 $http_upgrade 值,构造改变 $connection_upgrade 值
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
server {
listen 80;
server_name subhost.host.xxx.cn; # 处理该域名下的请求
location / {
proxy_pass http://jupyterServer; # jupyterServer 就是以上的 upstream 配置
# 注意,以下首部一定要加,不然会出现问题。。因为反向代理之后 Host 首部不一样了,另外,还可能要用到其它协议
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
以上配置可以用来做负载均衡,当然也可以将upstream
模块去除,直接将 Jupyter 监听地址写到proxy_pass
中。服务器在接收到subhost.host.xxx.cn
的任何请求时,都将该请求转发给172.17.0.1:8889
处理。
将以上文件移动到 Nginx 默认配置目录中,并重启 Nginx。我用的是 Docker 中的 Nginx,如下操作:
$ docker cp jupyter.conf nginx:/etc/nginx/conf.d/jupyter.conf
$ docker restart nginx
现在访问http://subhost.host.xxx.cn:port
应该可以正常访问 Jupyter 服务了,port
指的是安全组允许通过的端口,而不是 Jupyter 本身监听的端口。这样就可以多个 Web 服务共用端口~
Jupyter 使用了 Websocket 服务,因此还要配置 map 模块以及相关首部,这个就不细说了,目前对 Websocket 协议不太了解。