近几年,因为实验室项目的原因,经常会配置远程的jupyter notebook服务器来方便项目组内其他成员访问服务器,也算是有一些心得了,现在就想着总结一下写下来,方便以后自己查阅的同时,也希望能给有类似需求的同学带来一些帮助吧。
1.需求介绍
我们有一些一些服务器,这些服务器相互之间可通过内网访问,其中有少数的服务器有固定的外网ip,可以直接通过外网ip或者ip所绑定的域名访问。
对于没有固定外网ip的服务器,我们访问比较麻烦,但是结合nginx和jupyter notebook的话,访问和操作这些服务器还是很简单的。
2.解决方案
假设,我们有一台配有固定外网ip的服务器A,其外网ip是47.94.154.188
,域名是ywsun.site,内网ip是192.168.0.1
。我们还有一台没有外网ip的服务器B,其与服务器A在同一个局域网内,内网ip是192.168.0.2
。这里需要说明一下,域名不是必须的,但个人感觉有了更好,如果没有域名,接下来提到域名的地方直接换成外网ip就行了。
我们在服务器A上安装nginx服务器,然后通过nginx的反向代理功能将指定的请求转发到服务器B的指定端口(如8888端口)。服务器B的8888端口上运行的服务,在处理了请求后,将结果经由服务器A的nginx服务器返回给用户。
3.nginx的配置
关于nginx的安装,及其他的一些知识,本文就不再赘述了,有些东西其实我也不太明白,也没深入研究,反正能用就行了:joy:。
Ubuntu操作系统的nginx配置文件默认是在/etc/nginx/nginx.conf
。在这里多说一句,已开始我把配置文件全都写在了这个配置文件里,但是后来随着所配置内容的增多,感觉这个文件越来越乱了,就把新增的配置内容放在了/etc/nginx/conf.d/
文件夹下,文件的扩展名需要是.conf
。
先贴配置文件内容,然后解释吧。
server {
listen 80;
server_name ywsun.site;
client_max_body_size 10G;
access_log /home/ywsun/log/notebook/access.log;
error_log /home/ywsun/log/notebook/error.log;
location / {
proxy_pass http://192.168.0.2:8888;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_redirect off;
}
}
显然,server_name
就是访问服务所用的域名了,这里只是举例,就用了ywsun.site
,但是实际中,一个域名,我们一般不太可能只用来访问jupyter notebook,所以一般会采用一个二级域名,比如notebook.ywsun.site
,接下来我就会用这个二级域名来举例。access_log
和error_log
都是指定日志的存放位置,不指定也可,那样就会将日志存放在模型的日志文件中。我们需要访问的notebook服务器运行在B服务器的8888端口,因而,proxy_pass
我们就设置成了http://192.168.0.2:8888
。另外还有一点需要说明的是client_max_body_size
这个字段,这个字段的默认值很小,如果不设置这个字段的话,稍微大一点的文件就无法通过notebook服务中的upload功能上传。至于其他的,我也不是太明白,想了解的可以参考其他博客或者官方文档。
通过上面的配置,基本功能我们是实现了,但是可能又会有更深一步的需求。比如,我们在B服务器上运行了多个notebook服务,都希望都能够通过notebook.ywsun.site
这个域名访问,那么我们可以这样配置。
server {
listen 80;
server_name notebook.ywsun.site;
client_max_body_size 10G;
access_log /home/ywsun/log/notebook/access.log;
error_log /home/ywsun/log/notebook/error.log;
location /user_a {
proxy_pass http://192.168.0.2:8888;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_redirect off;
}
location /user_b {
proxy_pass http://192.168.0.2:8889;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_redirect off;
}
}
这样配置的效果就是,当我们在浏览器输入http://notebook.ywsun.site/user_a
之后,访问到的是服务器B的8888端口上的服务,输入http://notebook.ywsun.site/user_b
之后,访问到的是服务器B的8889端口的服务。当然,前提是我们把notebook的配置给弄好,否则也无法正常使用。
另外这两个配置中,proxy_pass
可以是服务器A能访问的任意服务器及其所对应的端口。例如,该局域网内,还有一台服务器C,内网ip是192.168.0.3
,其端口8888上也运行了配置好远程访问的notebook服务,那么proxy_pass
的值就是http://192.168.0.3:8888
。
配置完成后,可运行以下命令使配置生效:
nginx -s reload
4.jupyter notebook的配置
写这个的文章就很多了,在这里就把基本流程说下吧。
默认登录了服务器B,假设我们登录的用户名是user
。
4.1 生成配置文件
直接运行一下命令生成配置文件:
jupyter notebook --generate-config
生成的配置文件在:
/home/user/.jupyter/jupyter_notebook_config.py
4.2 修改配置文件内容
4.2.1 允许服务被远程访问
c.NotebookApp.ip = '*'
c.NotebookApp.allow_remote_access = True
c.NotebookApp.allow_origin = '*'
上述配置有的可能不需要,我没深入研究。
4.2.2 配置base_url
c.NotebookApp.base_url = '/user_a'
这在本文至关重要,配置了它,我们才可通过http://notebook.ywsun.site/user_a
访问,这个user_a
需要与nginx配置中的location
一致。
4.2.3 禁止自动打开浏览器
c.NotebookApp.open_browser = False
4.2.4 指定端口
c.NotebookApp.port = 8888
这里也需要与nginx配置中的端口一致。不过最好采用一个不常用的端口,一旦开启服务是8888端口已被占用,那么jupyter notebook会自动尝试启用新下一个端口,那么我们的配置也就失效了。
4.2.5 配置notebook服务的密码
c.NotebookApp.password = u'sha1:xxxxxx'
需要将密码通过sha1
加密后的结果填入这儿,不过我现在一般都是不设置该项。一般是先开启一下服务,在首次登陆的登录页面可以修改密码。但是修改后不会马上生效,关闭服务,然后重启,再登录就可以使用新密码了。
4.2.6 后台运行jupyter notebook
让服务在后台运行的方法很多,不过我习惯用nohup
:
nohup jupyter notebook &
执行该命令后,会在当前目录下生成nohup.out
文件,这是一个日志文件,可以查看服务的运行状态。
版权声明:本文为博主原创文章,遵循 CC 4.0 BY 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://ywsun.site/articles/17.html