基于nginx的jupyter notebook服务器配置

近几年,因为实验室项目的原因,经常会配置远程的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_logerror_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

你可能感兴趣的:(基于nginx的jupyter notebook服务器配置)