我的个人博客:https://lixiaohui.live
1、打开服务器8888端口
要使用 Jupyter,我们需要打开实例防火墙上的端口 8888 (或者我们选择的任意端口)。我们也可以设置 SSL 证书和默认密码,这个可以自由选择。打开端口之后,我们将启动服务器,然后我们将通过 SSH 连接到服务器,并创建用于访问 Jupyter 的 Web 界面的隧道。
我们首先需要在安全组中添加8888端口的入站权限。
打开我们的 EC2 控制面板,在 Network & Security 部分选择 EC2 导航栏上的 Security Groups。在此页面上,列表中将显示一个或多个安全组。找到最新的安全组 (描述中包含时间戳),选择该安全组,选择 Inbound 选项卡,然后单击 Edit。然后单击 Add Rule。这会添加一个新行。使用以下信息填写字段:
类型:自定义 TCP
协议:TCP
端口范围:8888
源:Anywhere (0.0.0.0/0,::/0)
2、自定义 SSL 和服务器配置
在这里,我们将设置 Jupyter Notebook 以使用 SSL 和配置文件。
使用putty连接到 Amazon EC2 实例(见下方客户端连接教程),然后完成以下步骤。
2.1、创建 SSL 证书
$ cd ~
$ mkdir ssl
$ cd ssl
$ sudo openssl req -x509 -nodes -days 365 -newkey rsa:1024 -keyout "cert.key" -out "cert.pem" -batch
2.2、创建ipython密码
我们可以使用此密码从客户端登录 Jupyter Notebook 服务器,然后即可访问服务器上的笔记本。
打开 iPython 终端。
$ ipython
在 iPython 提示符处,运行passwd()
命令以设置密码。
$> from IPython.lib import passwd
$> passwd()
我们将获得密码哈希 (例如 sha1:examplefc216:3a35a98ed...)。
记录密码哈希。
退出 iPython 终端。
$ exit
2.3、编辑 Jupyter 配置文件
我们需要一个jupyter配置文件,以存储我们的密码和 SSL 证书信息。
在 ~/.jupyter 目录中找到 jupyter_notebook_config.py。如果我们使用的 DLAMI 没有默认 Jupyter 配置文件,则我们需要创建一个配置文件。
$ jupyter notebook --generate-config
打开 .config
文件。
$ vi ~/.jupyter/jupyter_notebook_config.py
将以下文本粘贴在文件末尾。我们需要提供密码哈希。
c = get_config() # Get the config object.
c.NotebookApp.certfile = u'/home/ubuntu/ssl/cert.pem' # path to the certificate we generated
c.NotebookApp.keyfile = u'/home/ubuntu/ssl/cert.key' # path to the certificate key we generated
c.NotebookApp.ip = '*' # Serve notebooks locally.
c.NotebookApp.open_browser = False # Do not open a browser window by default when using notebooks.
c.NotebookApp.password = 'sha1:fc216:3a35a98ed980b9...'
创建之后,遵循在配置文件中更新 SSL 信息的相同步骤。
这样就完成了 Jupyter 服务器配置。
3、配置 Windows Putty 客户端
设置 PuTTY
以下分步说明介绍如何使用 PuTTY (适用于 Windows 的免费 SSH 客户端) 连接到我们的 EC2 实例并设置 SSH 隧道。如果我们在尝试连接到实例时收到错误,请参阅 排查实例的连接问题。作为先决条件之一,请从 PuTTY 下载页面 下载并安装 PuTTY。如果我们安装的是旧版本的 PuTTY,建议我们下载最新版本。确保安装整个套件。
1、要使用 PuTTY 连接到我们的 EC2 实例,我们首先需要将 Amazon EC2 生成的私有密钥文件 (.pem) 转换成 PuTTY 可以识别的格式 (.ppk)。我们可以在使用 PuTTY(PuTTYgen)创建 .ppk 文件。
2、现在,打开 PuTTY 并导航至左侧窗格中的 Category 下的 Session。输入以下信息:
Connection type:SSH
Host Name: ubuntu@YourInstancePublicDNS
Port:22
确保为我们的 AMI 指定相应的用户名。例如:
对于 Amazon Linux AMI,用户名称是 ec2-user。
对于 RHEL AMI,用户名称是 ec2-user 或 root。
对于 Ubuntu AMI,用户名称是 ubuntu 或 root。
对于 Centos AMI,用户名称是 centos。
对于 Fedora AMI,用户名称是 ec2-user。
对于 SUSE,用户名称是 ec2-user 或 root。
3、现在,在左侧窗格中展开“Connection”。导航到“SSH”下的“Auth”。浏览并添加我们在步骤 1 中创建的 .ppk 文件。然后单击屏幕底部的“Open”。
2019-05-24-15-45-51.png4、如果这是我们第一次连接到此实例,PuTTY 会显示安全警告对话框,询问我们是否信任我们要连接到的主机。选择是。此时会打开一个窗口并且我们连接到了我们的实例。
2019-05-24-15-42-18.png5、现在,要为我们的 EC2 实例设置 SSH 隧道,请右键单击我们的实例的窗口左上角,如下所示。这将打开一个下拉菜单。从菜单中选择“Change Settings”,以显示“PuTTY Reconfiguration”屏幕。
2019-05-24-15-46-47.png导航到左侧窗格中“SSH”下的“Tunnels”。填写源端口和目标,如下所示。选择端口转发选项“Local”和“Auto”。最后,单击“Add”,然后单击“Apply”完成 SSH 隧道设置。
2019-05-24-15-43-34.png4、登陆
现在,我们已准备就绪,可登录到 Jupyter Notebook 服务器。
下一步是通过浏览器测试服务器连接。
在浏览器的地址栏中,键入以下 URL。
对于 macOS 和 Linux 客户端,请键入以下 URL。
http://127.0.0.1:8157
对于 Windows 客户端,请键入以下 URL。
http://127.0.0.1:8888
输入你在ipython中设置的密码即可,切记不是生成的sha口令,而是你敲入键盘的明文密码。
注意
https 仅在我们完成 自定义 SSL 和服务器配置 的额外步骤后才有效。这些示例使用 http,但我们配置 SSL 证书之后,我们可以切换到 https。
如果连接成功,我们将看到 Jupyter Notebook 服务器网页。此时,我们可能需要提供密码或令牌。如果我们进行了简单设置,但未配置 Jupyter,令牌将显示在我们用于启动服务器的终端窗口中。查找类似如下的内容:
Copy/paste this URL into your browser when you connect for the first time,to login with a token:
http://localhost:8888/?token=0d3f35c9e404882eaaca6e15efdccbcd9a977fee4a8bc083
现在,我们有权访问 DLAMI 上运行的 Jupyter Notebook 服务器。我们可以创建新的笔记本或运行提供的教程。
可能出现问题
1、错误提示
[I 07:01:40.594 NotebookApp] Use Control-C to stop this server and shut down allkernels (twice to skip confirmation).
ERROR:asyncio:Exception in callback BaseAsyncIOLoop._handle_events(4, 1)
handle: <Handle BaseAsyncIOLoop._handle_events(4, 1)>
Traceback (most recent call last):
File "/usr/lib/python3.6/asyncio/events.py", line 145, in _runself._callback(*self._args)
File "/usr/local/lib/python3.6/dist-packages/tornado/platform/asyncio.py", line 138, in _handle_eventshandler_func(fileobj, events)
File "/usr/local/lib/python3.6/dist-packages/tornado/netutil.py", line 273, inaccept_handlercallback(connection, address)
File "/usr/local/lib/python3.6/dist-packages/tornado/tcpserver.py", line 288,in _handle_connectiondo_handshake_on_connect=False,
File "/usr/local/lib/python3.6/dist-packages/tornado/netutil.py", line 605, inssl_wrap_socketcontext = ssl_options_to_context(ssl_options)
File "/usr/local/lib/python3.6/dist-packages/tornado/netutil.py", line 574, inssl_options_to_contextssl_options["certfile"], ssl_options.get("keyfile", None)
PermissionError: [Errno 13] Permission denied
ERROR:asyncio:Exception in callback BaseAsyncIOLoop._handle_events(4, 1)
handle: <Handle BaseAsyncIOLoop._handle_events(4, 1)>
Traceback (most recent call last):
File "/usr/lib/python3.6/asyncio/events.py", line 145, in _runself._callback(*self._args)
File "/usr/local/lib/python3.6/dist-packages/tornado/platform/asyncio.py", line 138, in _handle_eventshandler_func(fileobj, events)
File "/usr/local/lib/python3.6/dist-packages/tornado/netutil.py", line 273, inaccept_handlercallback(connection, address)
File "/usr/local/lib/python3.6/dist-packages/tornado/tcpserver.py", line 288,in _handle_connectiondo_handshake_on_connect=False,
File "/usr/local/lib/python3.6/dist-packages/tornado/netutil.py", line 605, inssl_wrap_socketcontext = ssl_options_to_context(ssl_options)
File "/usr/local/lib/python3.6/dist-packages/tornado/netutil.py", line 574, inssl_options_to_contextssl_options["certfile"], ssl_options.get("keyfile", None)
PermissionError: [Errno 13] Permission denied
这是notebook的问题,将notebook版本从5.7降低为5.6即可。在终端中输入:
sudo pip3 uninstall notebook
sudo pip3 install notebook=5.6.0
2、错误提示
[E 07:13:36.201 NotebookApp] Error while saving file: projects/joeseus/Untitled.ipynb [Errno 13] Permission denied: '/home/ubuntu/.local/share'Traceback (most recent call last): File "/usr/local/lib/python3.6/dist-packages/traitlets/traitlets.py", line 528, in getvalue = obj._trait_values[self.name]KeyError: 'notary'
During handling of the above exception, another exception occurred:
Traceback (most recent call last): File "/usr/local/lib/python3.6/dist-packages/traitlets/traitlets.py", line 528, in getvalue = obj._trait_values[self.name]KeyError: 'db_file'
During handling of the above exception, another exception occurred:
Traceback (most recent call last): File "/usr/local/lib/python3.6/dist-packages/traitlets/traitlets.py", line 528, in getvalue = obj._trait_values[self.name]KeyError: 'data_dir'
During handling of the above exception, another exception occurred:
Traceback (most recent call last): File "/usr/local/lib/python3.6/dist-packages/traitlets/traitlets.py", line 528, in getvalue = obj._trait_values[self.name]KeyError: 'data_dir'
During handling of the above exception, another exception occurred:
Traceback (most recent call last): File "/usr/local/lib/python3.6/dist-packages/notebook/services/contents/filemanager.py", line 470, in saveself.check_and_sign(nb, path) File "/usr/local/lib/python3.6/dist-packages/notebook/services/contents/manager.py", line 486, in check_and_signif self.notary.check_cells(nb): File "/usr/local/lib/python3.6/dist-packages/traitlets/traitlets.py", line 556, in __get__return self.get(obj, cls) File "/usr/local/lib/python3.6/dist-packages/traitlets/traitlets.py", line 535, in getvalue = self._validate(obj, dynamic_default()) File "/usr/local/lib/python3.6/dist-packages/notebook/services/contents/manager.py", line 65, in _notary_defaultreturn sign.NotebookNotary(parent=self) File "/usr/local/lib/python3.6/dist-packages/nbformat/sign.py", line 392, in __init__self.store = self.store_factory() File "/usr/local/lib/python3.6/dist-packages/nbformat/sign.py", line 340, in factoryreturn SQLiteSignatureStore(self.db_file) File "/usr/local/lib/python3.6/dist-packages/traitlets/traitlets.py", line 556, in __get__return self.get(obj, cls) File "/usr/local/lib/python3.6/dist-packages/traitlets/traitlets.py", line 535, in getvalue = self._validate(obj, dynamic_default()) File "/usr/local/lib/python3.6/dist-packages/nbformat/sign.py", line 351, in _db_file_defaultif not self.data_dir: File "/usr/local/lib/python3.6/dist-packages/traitlets/traitlets.py", line 556, in __get__return self.get(obj, cls) File "/usr/local/lib/python3.6/dist-packages/traitlets/traitlets.py", line 535, in getvalue = self._validate(obj, dynamic_default()) File "/usr/local/lib/python3.6/dist-packages/nbformat/sign.py", line 328, in _data_dir_defaultreturn app.data_dir File "/usr/local/lib/python3.6/dist-packages/traitlets/traitlets.py", line 556, in __get__return self.get(obj, cls) File "/usr/local/lib/python3.6/dist-packages/traitlets/traitlets.py", line 535, in getvalue = self._validate(obj, dynamic_default()) File "/usr/local/lib/python3.6/dist-packages/jupyter_core/application.py", line 93, in _data_dir_defaultensure_dir_exists(d, mode=0o700) File "/usr/local/lib/python3.6/dist-packages/jupyter_core/utils/__init__.py", line 13, in ensure_dir_existsos.makedirs(path, mode=mode) File "/usr/lib/python3.6/os.py", line 210, in makedirsmakedirs(head, mode, exist_ok) File "/usr/lib/python3.6/os.py", line 220, in makedirsmkdir(name, mode) PermissionError: [Errno 13] Permission denied: '/home/ubuntu/.local/share'
这是因为jupyter对/home/ubuntu/.local/share
没有写读权限,在终端中输入
sudo chown -R ubuntu:ubuntu ~/.local
到此结束。
网友评论