# 前言
大家都Jupyer Notebook是一个基于网页的交互式计算笔记本环境,实现了**文字和代码**的完美结合,你甚至可以**边学习边做笔记**,文本编辑还支持 Markdown 格式,插入各种**数学公式**也不在话下。
总所周知深度学习的算法往往都是在服务器上运行的,如何能够在本机利用服务器的算例完成交互呢?Jupyter Notebook的强大之处在于它是基于网页的,所以完全可以服务器端开启服务,本地电脑打开网页,运行各种服务器端的代码。
最后引出今天的问题:**怎么配置Jupyter远程连接服务器呢?**
笔者在网上看了很多帖子,也遇到了很多坑,故决定记录下来,也希望能帮到大家。
# 一.在服务器端
## 1.安装anaconda,jupyter notebook基础环境
[Anaconda 下载地址](https://www.anaconda.com/products/individual#download-section)
这一部分较为简单,直接搜索即可,基本没有什么坑。
## 2.服务器端的设置
### Step 1:添加配置文件
```bash
jupyter notebook --generate-config
```
通过这个命令创建就在**~/.jupyter/**下面生成了配置文件jupyter_notebook_config.py
**注意是在当前用户的家目录下。**
### Step 2:生成密码
可以手动输入设置密码,或者直接回车自动生成,一共有两种方法:
**eg1:利用ipyhton 内核**
打开ipython,在ipython环境下创建一个密文的密码:
```bash
In [1]: from notebook.auth import passwd
In [2]: passwd()
Enter password:
Verify password:
Out[2]: ‘sha1:ce23d945972f:34769685a7ccd3d08c84a18c63968a41f1140274’
```
把生成的密文‘sha:ce…’复制下来
**eg2:利用jupyter内核**
```bash
$ jupyter notebook password
Enter password: ****
Verify password: ****
[NotebookPasswordApp] Wrote hashed password to /Users/you/.jupyter/jupyter_notebook_config.json
```
这样就在~/.jupyter/下面生成了密码文件jupyter_notebook_config.json
### Step 3:修改配置文件
在配置文件~/.jupyter/jupyter_notebook_config.py中找到下面几行修改并且取消注释
```bash
vim ~/.jupyter/jupyter_notebook_config.py
```
```bash
c.NotebookApp.ip='*' # 星号代表任意ip,这个跟mysql的权限设置一样,所以说知识是互通的
c.NotebookApp.allow_remote_access = True # 允许远程连接
c.NotebookApp.password = u'sha1:...' # 复制的那个密码文件json的一串密码放到这里
c.NotebookApp.open_browser = False # 不自动打开浏览器
c.NotebookApp.port =8888 # 可自行指定一个端口, 访问时使用
c.NotebookApp.allow_root = True #允许使用root用户去运行jupyter
```
### Step 4:启动jupyter notebook
我们先创建一个工作目录workspace,以后每次都在这个目录下打开jupyter notebook,我们在网页中创建的文件夹,写的代码也都会在这个文件夹下
```bash
mkdir workspace
cd workspace
jupyter notebook
```
正常运行输出的结果:

# 二.在本地端
这个地方是容易出错的,尤其是服务器端采用docker管理时,更要注意ssh的端口和jupyter端口的映射关系。
# 1.服务器未采用Docker
此时不需要为ssh分配特定端口,默认的都22端口,故只需要指出jupeter的端口,我前面设置的88888,直接通过浏览访问:
```bash
http://[远程IP]:8888/tree
```
# 2.服务器采用Docker
此时需要特别指出Docker在主服务器上为ssh 分配的映射端口号,方法如下:
### step1:cmd打开dos命令窗口,敲入此句命令,将本地端口与服务器端相映射。
```bash
ssh -L [本地端口]:localhost:[远程端口] [远程用户名]@[远程IP] -p [ssh连接端口]
```
**注意:这里的远程端口是上面配置的端口号(例如我配置的是8888,这里就需要写8888),本地端口随便写一个就可以,我这里写的是8887**。
输入上面的命令之后,会提示输入远程连接的密码,输入密码不报错即连接成功
**在CMD中输入jupyter notebook**

### step2:浏览器访问
在浏览器中输入 localhost:8887 它会自动映射到服务器的jupyter服务,出现jupyter窗口,输入你设定的jupyter密码,即成功进入。

输入在服务器端设置的密码即可成功访问。