我的個人博客: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”。
4、如果這是我們第一次連接到此實例,PuTTY 會顯示安全警告對話框,詢問我們是否信任我們要連接到的主機。選擇是。此時會打開一個窗口并且我們連接到了我們的實例。
5、現在,要為我們的 EC2 實例設置 SSH 隧道,請右鍵單擊我們的實例的窗口左上角,如下所示。這將打開一個下拉菜單。從菜單中選擇“Change Settings”,以顯示“PuTTY Reconfiguration”屏幕。
導航到左側窗格中“SSH”下的“Tunnels”。填寫源端口和目標,如下所示。選擇端口轉發選項“Local”和“Auto”。最后,單擊“Add”,然后單擊“Apply”完成 SSH 隧道設置。
4、登陸
現在,我們已準備就緒,可登錄到 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
到此結束。