JupyterHub ist ein Mechanismus zum Betreiben von Python usw. in einem WEB-Browser namens Jupyter Notebook. Es ist ein Mechanismus, um es verfügbar zu machen, aber da es keine Informationen gab, die fragmentiert, sondern organisiert waren, wie z. B. das Anmelden mit der GitHub-Authentifizierung und die gute Verbindung mit der Shell-Umgebung von Django, wird es zusammengefasst. Wir verwenden ELB / EC2 / RDS von AWS und Nginx für den Webserver.
Als Anwendungsfall habe ich bereits eine Django-Umgebung für die Verbindung mit Testdaten erstellt, aber ich möchte eine Umgebung, in der ich sie schnell vom WEB aus berühren kann. Ich möchte die Umgebung für jeden Benutzer trennen, aber einen komplizierten Authentifizierungsmechanismus erstellen Ich denke, es ist nützlich, wenn Sie nicht langweilig werden wollen.
Wenn Sie fertig sind, können Sie im WEB-Browser schnell Folgendes tun.
Grob gesagt sieht es wie folgt aus.
Ich denke, es gibt eine Möglichkeit, dies zu tun, aber wenn Sie eine https-Verbindung verwenden und SSL → nginx → Tornade auf Virtualenv für JupyterHub konfigurieren, kann die Verbindung nicht hergestellt werden, wenn Sie sie als Djangos Kernel in Notebook angeben. Ich tat. Es ist in Ordnung, auf http zuzugreifen, aber es scheint, dass etwas anderes festgelegt werden muss. Vielleicht muss JupyterHub mitgeteilt werden, dass es sich intern um http handelt. Da es Zugriff von außen gibt, wie zum Beispiel die Zusammenarbeit mit GitHub, sollte es https sein, aber es ist ein bisschen enttäuschend, dass es diesen Punkt nicht erreicht hat.
In der von mir verwendeten Umgebung wird die Datenbank des Produktionsservers mit Daily maskiert und in einem anderen RDS gespeichert. In der Test- / Staging-Umgebung kann die Masken-DB von Django aus bedient werden. In diesem Dokument soll die von Django betriebene Umgebung für die Ausführung des RDS über JupyterHub aktiviert werden.
/ var / www / jupyter.example.jp /
Es wird davon ausgegangen, dass die Django-Umgebung unter erstellt wird.
Einige der möglicherweise relevanten Verzeichnisstrukturen sind unten aufgeführt.
/var/www/jupyter.example.jp/
├── README.md
├── jupyter #Anwendungscode einfügen(Darunter verwalten.Da ist py)
├── requirements.txt
├── virtualenv
Wir gehen davon aus, dass Django bereits in der virtualenv-Umgebung enthalten ist und Django-Erweiterungen enthalten sind, um das Modell mit shell_plus zu laden.
Die virtuelle Umgebung ist wie folgt enthalten.
cd /var/www/jupyter.example.jp/
virtualenv --prompt "(jupyter)" virtualenv
Platzieren Sie außerdem die JupyterHub-Konfigurationsdatei unter "/ etc / jupyterhub".
JupyterHub wird vom Benutzer jupyterhub betrieben.
sudo useradd jupyterhub
sudo usermod -a -G shadow jupyterhub
sudo mkdir /etc/jupyterhub
sudo chown jupyterhub /etc/jupyterhub
Fahren Sie mit [jupyterhub / jupyterhub: Mehrbenutzerserver für Jupyter-Notebooks] fort (https://github.com/jupyterhub/jupyterhub).
sudo apt-get install npm nodejs-legacy
sudo npm install -g configurable-http-proxy
(Installieren Sie mit pip unter einer virtuellen Umgebung)
pip install ipython jupyterhub
(Wie man npm und node installiert und sich alt fühlt)
Erstellen einer JupyterHub-Konfigurationsdatei
jupyterhub --generate-config
/etc/jupyterhub/jupyterhub_config.Gehen Sie zu py und beheben Sie Folgendes
L.In der Nähe von 137
c.JupyterHub.ip = '127.0.0.1'
L.In der Nähe von 106
c.JupyterHub.cookie_secret_file = '/etc/jupyterhub/jupyterhub_cookie_secret'
c.JupyterHub.db_url = '/etc/jupyterhub/jupyterhub.sqlite'
Referenz: http://jupyterhub.readthedocs.io/en/latest/config-examples.html
Erstellen Sie Einstellungen, um sich mit Oauth von JupyterHub bei GitHub anzumelden.
pip install oauthenticator
Folgendes wurde zu ungefähr L.58 von jupyterhub_config.py hinzugefügt
c.JupyterHub.authenticator_class = 'oauthenticator.GitHubOAuthenticator'
c.GitHubOAuthenticator.oauth_callback_url = os.environ['OAUTH_CALLBACK_URL']
c.GitHubOAuthenticator.client_id = os.environ['GITHUB_CLIENT_ID']
c.GitHubOAuthenticator.client_secret = os.environ['GITHUB_CLIENT_SECRET']
Referenz: https://github.com/jupyterhub/oauthenticator
Spawner Ich habe kein tiefes Verständnis dafür, was Spawner ist, aber es scheint, dass ich einen Spawner für JupyterHub definieren muss, um den Prozess zu verwalten.
Referenz: http://jupyterhub.readthedocs.io/en/latest/spawners.html
pip install git+https://github.com/jupyter/sudospawner
Beschreiben Sie Folgendes in der Nähe von L.220 von jupyterhub_config.py
c.JupyterHub.confirm_no_ssl = True
c.JupyterHub.spawner_class = 'sudospawner.SudoSpawner'
c.Spawner.notebook_dir = '~/notebooks'
c.SudoSpawner.sudospawner_path = '/var/www/jupyter.example.jp/virtualenv/bin/sudospawner'
Fügen Sie am Ende Folgendes mit "sudo visudo" hinzu.
## Jupyterhub
# comma-separated whitelist of users that can spawn single-user servers
Runas_Alias JUPYTER_USERS =Zu verwendender GitHub-Benutzername(Durch Kommata abgetrennt)
# the command(s) the Hub can run on behalf of the above users without needing a password# the exact pa$
Cmnd_Alias JUPYTER_CMD = /var/www/jupyter.example.jp/virtualenv/bin/sudospawner
# actually give the Hub user permission to run the above command on behalf# of the above users without$
jupyterhub ALL=(JUPYTER_USERS) NOPASSWD:JUPYTER_CMD
Referenz: http://qiita.com/mt08/items/301f9fb93d01e78bda47
Mit den Einstellungen bis zu diesem Punkt können Sie den JupyterHub-Server starten. Erstellen Sie ein Startskript und starten Sie es.
sudo -u jupyterhub vi /etc/jupyterhub/launch_notebook.sh
#!/bin/bash
export OAUTH_CALLBACK_URL=http://jupyter.example.jp/hub/oauth_callback
export GITHUB_CLIENT_ID=xxx
export GITHUB_CLIENT_SECRET=xxx
source /var/www/jupyter.example.jp/virtualenv/bin/activate
jupyterhub -f /etc/jupyterhub/jupyterhub_config.py
Die für die GitHub-Integration erforderlichen CLIENT_ID und CLIENT_SECRET können wie folgt abgerufen werden. https://github.com/settings/applications/new
mit diesem
sudo -u jupyterhub /etc/jupyterhub/launch_notebook.sh
Wenn Sie ausführen, sollte JupyterHub unter http://127.0.0.1:8000/ beginnen.
Sobald JupyterHub startet, senden wir als nächstes den Zugriff von ELB. nginx erhält Zugriff auf Port 80 und verwendet ihn als Proxy, um ihn an Port 8000 zu senden, falls er von JupyterHub verarbeitet werden soll.
sudo vi vi /etc/nginx/nginx.conf
http {
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
...
Erstellen Sie eine conf-Datei, die die Einstellungen für jupyter.example.jp unter / etc / nginx / sites-enabled /
beschreibt. (Beispiel: jupyter.example.jp.conf)
server {
listen 80;
server_name jupyter.example.jp;
#Ich möchte die folgenden Einstellungen aktivieren, wenn eine HTTPS-Verbindungsumgebung erstellt wird
# add_header Strict-Transport-Security max-age=15768000;
# Managing literal requests to the JupyterHub front end
location / {
proxy_pass http://127.0.0.1:8000;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
# Managing WebHook/Socket requests between hub user servers and external proxy
location ~* /(api/kernels/[^/]+/(channels|iopub|shell|stdin)|terminals/websocket)/? {
proxy_pass http://127.0.0.1:8000;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# WebSocket support
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
}
}
Es ist in Ordnung, wenn Sie bereits denselben GitHub-Benutzernamen für Linux-Benutzer haben, aber wenn Sie keinen haben, müssen Sie einen erstellen.
USER=Zu verwendender GitHub-Benutzername
useradd -d /home/${USER} -m ${USER}
mkdir /home/${USER}/notebooks
chown ${USER}/home/${USER}/notebooks
Jupyter Notebook hat das Konzept ** Kernel **, mit dem Sie angeben können, welche Python-Umgebung zur Laufzeit verwendet werden soll. Standardmäßig ist dies die Python-Umgebung beim Start. Wenn Sie jedoch die Umgebung mit Djangos shell_plus darauf einstellen, ist dies sehr praktisch, da sie mit der bereits verbundenen Datenbank verwendet und der Modellimport abgeschlossen werden kann.
Wenn Sie Jupyter Hub in Ihrer Virtualenv-Umgebung haben, können Sie eine Konfigurationsdatei erstellen mit: WARNUNG ist aus, aber ...
% jupyter kernelspec install-self --user
[InstallNativeKernelSpec] WARNING | `jupyter kernelspec install-self` is DEPRECATED as of 4.0. You probably want `ipython kernel install` to install the IPython kernelspec.
[InstallNativeKernelSpec] Installed kernelspec python3 in /home/your_user/.local/share/jupyter/kernels/python3
Wenn Sie es in den globalen Bereich stellen, ohne es in die Virtualenv-Umgebung zu stellen, können Sie dies möglicherweise wie folgt tun.
% python -m ipykernel install
Installed kernelspec python3 in /usr/local/share/jupyter/kernels/python3
Verschieben Sie dann die erstellten Einstellungsdateien.
% cd /usr/local/share
% sudo mv /home/your_user/.local/share/jupyter ./
% sudo chmod 775 jupyter
% sudo chown -R root:root jupyter
% cd /usr/local/share/jupyter/kernels
% ls /usr/local/share/jupyter/kernels
python3
% sudo mv python3 django
% ls /usr/local/share/jupyter/kernels/django
kernel.json logo-32x32.png logo-64x64.png
sudo vi django/kernel.json
Ich denke, dass es wie folgt ist, also modifiziere es wie später beschrieben.
{
"language": "python",
"argv": [
"/var/www/jupyter.example.jp/virtualenv/bin/python3.4",
"-m",
"ipykernel",
"-f",
"{connection_file}"
],
"display_name": "Python 3"
}
↓
{
"display_name": "Django",
"language": "python",
"codemirror_mode": {
"version": 3,
"name": "ipython"
},
"argv": [
"/var/www/jupyter.example.jp/virtualenv/bin/python",
"/var/www/jupyter.example.jp/jupyter/manage.py",
"shell_plus",
"--settings=jupyter.settings",
"--kernel",
"--connection-file",
"{connection_file}"
]
}
※--settings=jupyter.Einstellungen wird verwaltet.Geben Sie den Pfad der von py verwendeten Django-Konfigurationsdatei an
※shell_Django zu Django, um Plus zu verwenden-INSTALLIERT mit Erweiterungen_Django auf APPS_Erweiterungen müssen angegeben werden
Referenz 1: https://ipython.org/ipython-doc/3/development/kernels.html Referenz 2: http://stackoverflow.com/questions/31088080/django-extensions-shell-plus-kernel-specify-connection-file (Es muss "--connection-file" sein, wie im Kommentar erwähnt) Referenz 3: http://stackoverflow.com/questions/39007571/running-jupyter-with-multiple-python-and-ipython-paths
Ebenfalls, https://github.com/Cadair/jupyter_environment_kernels Es mag einfacher sein, den Kernel zu wechseln, indem ich dies einbeziehe, aber ich habe es nicht getan.
Jetzt können Sie es starten, indem Sie "launch_notebook.sh" ausführen. Es ist jedoch mühsam, es bei jedem Neustart des Servers zu starten. Lassen Sie es also von Supervisord automatisch starten.
sudo vi /etc/supervisor/conf.d/
[program:notebook]
command=/etc/jupyterhub/launch_notebook.sh
directory=/etc/jupyterhub/
autostart=true
autorestart=true
stopgroup=true
startretries=3
exitcodes=0,2
stopsignal=TERM
user=jupyterhub
group=jupyterhub
Lesen Sie die Einstellungsdatei und starten Sie sie.
supervisord reread
supervisord reload
supervisord start notebook
Es wird automatisch gestartet und das Protokoll wird in "/ etc / log / Supervisor / notebook-xxx.log" aufgeführt.
Appendix Ich werde den Inhalt, den ich beim Erstellen der Umgebung erhalten habe, und die Links, auf die ich verwiesen habe, zusammenfassen.
Wenn Sie den 80. Zugriff auf JupyterHub senden, ohne darüber nachzudenken,
2017/02/03 17:20:44 [emerg] 16297#16297: unknown "connection_upgrade" variable
Ich bekomme den Fehler.
Es wurde unter Bezugnahme auf http://mogile.web.fc2.com/nginx/http/websocket.html gelöst, aber es scheint notwendig zu sein, Folgendes in "/ etc / nginx / nginx.conf" zu beschreiben.
http {
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
Wenn Sie mit ELB über https zugreifen, können Sie auf JupyterHub zugreifen. Wenn Sie jedoch den Kernel einrichten, wird im Supervisord der folgende Fehler angezeigt.
[I 2017-02-05 21:43:24.410 JupyterHub log:100] 200 GET /hub/api/authorizations/cookie/jupyter-hub-token-xxx/[secret]([email protected]) 14.89ms
21:44:26.703 - error: [ConfigProxy] Proxy error: Error: socket hang up
at createHangUpError (http.js:1472:15)
at Socket.socketCloseListener (http.js:1522:23)
at Socket.EventEmitter.emit (events.js:95:17)
at TCP.close (net.js:466:12)
Es wird als Cookie bezeichnet, und es scheint, dass es durch Ändern des Einstellungswerts irgendwo behoben werden kann, aber ich konnte das nicht tun und gab auf. Ich werde es eines Tages erneut versuchen.
Dieser Bereich wird an anderer Stelle veröffentlicht, sodass er möglicherweise weggelassen wird. Um jedoch Matplotlib usw. zu verwenden, sind die für die Datenanalyse erforderlichen Bibliotheken im Folgenden enthalten.
sudo apt-get install -y libpng12-dev libjpeg8-dev libfreetype6-dev libxft-dev
pip install numpy pandas matplotlib seaborn scikit-learn
* Sie können es verwenden, indem Sie es in die virtualenv-Umgebung stellen und als Supervisor-Neustart-Notizbuch verwenden.
Recommended Posts