nginx + jupyter的服務(wù)端部署
我們都知道在本地安裝部署jupyter剩瓶,之后可以執(zhí)行命令
jupyter notebook
可以打開瀏覽器可視化操作編程環(huán)境,那么我們?nèi)绾卧诒镜厝ピL問我們的服務(wù)端呢垄分?下面我先列出一些效果圖來講述我搭建的整個流程宛篇。
下圖是我從登錄jupyter到進入到j(luò)upyter主頁的演示圖
其中說明如下幾點:
- ①是登錄jupyter主頁
https://js.jupyter.com/jupyter
時娃磺,彈出的登錄驗證頁面; - ②是表示該請求是一個https請求叫倍;
- ③是表示jupyter的資源主頁路徑是
jupyter
偷卧; - ④是表示在jupyter的notebook的路徑下的目錄文件列表信息;
那么為了上述列出的這四點是如何實現(xiàn)吆倦?或者說是哪些配置信息決定了上面的顯示呢听诸?
1. notebook的認證
為了實現(xiàn)上面的認證效果,其實就是對服務(wù)器上的jupyter notebook環(huán)境的權(quán)限認證蚕泽。下面介紹一下我們?nèi)绾螌ψ约簡拥膉upyter服務(wù)晌梨,從設(shè)置權(quán)限,到驗證權(quán)限的流程须妻。
- 首先是設(shè)置權(quán)限仔蝌,通過執(zhí)行命令:
jupyter notebook --generate-config
,會創(chuàng)建目錄~/.jupyter
并且該目錄下會有一個配置文件jupyter_notebook_config.py
荒吏,通過設(shè)置如下配置項:
c.NotebookApp.base_url = '/jupyter' # 設(shè)置jupyter的資源主頁路徑敛惊,即[jupyter主頁]圖片中的③
c.NotebookApp.ip = '127.0.0.1' # 設(shè)置了訪問該jupyter應(yīng)用的來源機器只能是本機
c.NotebookApp.open_browser = False # 設(shè)置了關(guān)閉瀏覽器
c.NotebookApp.password = u'sha1:a937e51de9a1:a567707768cd50d0ac1d40a4fb739510ddb3d8cb' # 這就是實現(xiàn)認證的關(guān)鍵所在,即用戶在瀏覽器中輸入一個密碼绰更,如何和服務(wù)器上"正確"的匹配上瞧挤,這個字符串的獲取,需要通過其他命令獲取
c.NotebookApp.port = 8888 # 設(shè)置了jupyter服務(wù)的端口
c.NotebookApp.notebook_dir = u'/data/home/user00/js_python' # 設(shè)置了jupyter的notebook路徑儡湾,即訪問jupyter首頁時特恬,看到的文件列表就是該目錄下的,如果不設(shè)置該項徐钠,那么notebook的目錄就是 `~/.jupyter`
- 我們在1中看到了用戶認證的關(guān)鍵配置項
c.NotebookApp.password
癌刽,那么該值我們?nèi)绾潍@取呢?可以通過進入到ipython
環(huán)境下丹皱,執(zhí)行如下命令獲取妒穴,其中兩次輸入的密碼,就是我們在瀏覽器中需要輸入的密碼摊崭,這樣就能和服務(wù)器上的驗證匹配得上了讼油。
In [1]: from notebook.auth import passwd
In [2]: passwd()
Enter password:
Verify password:
Out[2]: 'sha1:a937e51de9a1:a567707768cd50d0ac1d40a4fb739510ddb3d8cb'
上面我們只是啟動好了jupyter,并且jupyter的服務(wù)只能在本機訪問呢簸,那么我們?nèi)绾卧谶h程進行鏈接該服務(wù)呢矮台?下面我們介紹使用nginx做服務(wù)代理乏屯,到本機的jupyter服務(wù)上去。
2. nginx代理
我們看到上面圖片中的URL請求使用的是https瘦赫,那么我們?nèi)绾蝞ginx做到https請求呢辰晕?另外我們?nèi)绾问潜镜氐逆溄诱埱蟠淼竭h程服務(wù)器上的本機jupyter 8888服務(wù)呢?下面我們將詳細講解确虱。
- 首先是搭建nginx服務(wù)
搭建nginx服務(wù)的時候含友,使用如下命令編譯
>> sudo yum install pcre pcre-devel
>> sudo yum install openssl openssl-devel
>> ./configure --prefix=/data/home/user00/app/nginx-1.6.3 --pid-path=/data/home/user00/app/nginx-1.6.3/nginx.pid --with-http_ssl_module
>> make && make install
- 然后設(shè)置nginx的啟動配置
下圖中的①是用來設(shè)置jupyter的請求是https
請求作用使用的,端口是443校辩,然后還有ssl鑒權(quán)認證窘问,其中文件cert.crt
和cert.key
獲取的方法如下,執(zhí)行如下命令宜咒,然后在本目錄下會生成這兩個文件惠赫,將其拷貝到目錄/data/home/user00/app/nginx-1.6.3/
即可
>> openssl req -x509 -nodes -days 365 -newkey rsa:1024 -keyout cert.key -out cert.crt
# 參數(shù)說明:
# -x509 # 輸出一個x509格式的證書
# -days # x509證書的有效時間
# -newkey rsa:bits # 生成一個bits長度的RSA私鑰文件,用于簽發(fā)
# -keyout # 輸出證書key文件
# -out # 輸出證書私鑰文件
然后啟動nginx的時候故黑,會發(fā)現(xiàn)會報如下錯誤儿咱,表示nginx編譯的時候,沒有加載ssl模塊進去场晶,那么我們就需要編譯一下nginx混埠,將ssl模塊加進去,但是我們不是重新將nginx編譯一遍峰搪。
nginx: [emerg] unknown directive "ssl_certificate" in /data/home/user00/app/nginx-1.6.3/nginx.conf:86
nginx: configuration file /data/home/user00/app/nginx-1.6.3/nginx.conf test failed
具體操作方法如下:
# step 1 解壓nginx包到一個新的目錄
# step 2 然后重新編譯岔冀,但是呢,我們這次只添加我們需要的模塊概耻,例如上面的ssl使套,
# 但是需要保證prefix和pid-path與本機之前編譯的nginx這些設(shè)置保持一致;
# 注意鞠柄,這里只執(zhí)行 make 不要執(zhí)行 make install
./configure --prefix=/data/home/user00/app/nginx-1.6.3 --pid-path=/data/home/user00/app/nginx-1.6.3/nginx.pid --with-http_ssl_module
make
# step 3 在該路徑下會有文件 objs/nginx 侦高,將其拷貝到系統(tǒng)的nginx目錄,例如本文中的例子厌杜,在拷貝之前最好備份一下舊的nginx
cp objs/nginx /data/home/user00/app/nginx-1.6.3/sbin/nginx
# step 4 重啟nginx服務(wù)即可
3. 問題處理
下面是問題匯總奉呛,在搭建的過程中遇到的問題,進行了匯總夯尽。
問題1:
2018/02/02 01:38:41 [error] 16673#0: *7 connect() failed (111: Connection refused) while connecting to upstream, client: 10.32.203.42, server: js.jupyter.com, request: "GET / HTTP/1.1", upstream: "http://127.0.0.1:8888/", host: "js.jupyter.com"
解答 :
查看后臺的8888服務(wù)是否有拉起瞧壮,發(fā)現(xiàn)服務(wù)沒有起來,通過重新拉起即可解決匙握。
問題2:
2018/02/02 01:21:58 [error] 11207#0: *46 open() "/data/home/user00/app/nginx-1.6.3/html/jupyter" failed (2: No such file or directory), client: 10.32.203.42, server: localhost, request: "GET /jupyter HTTP/1.1", host: "js.jupyter.com"
解答:
這里代理轉(zhuǎn)到j(luò)upyter8888服務(wù)出現(xiàn)了問題咆槽,才會出現(xiàn)去請求 .../html/jupyter
目錄資源的問題,需要檢查配置中關(guān)于代理的設(shè)置是否正確
下面是關(guān)于使用過程中遇到的問題的匯總圈纺。
問題1:
解決:
由于在
from sklearn import linear_model
加載時秦忿,出現(xiàn) scipy
包沒有安裝的情況麦射;等安裝了之后,再次執(zhí)行上面步驟出現(xiàn)的上面錯誤灯谣,需要重新啟動 jupyter服務(wù)即可解決