原帖地址:https://zhuanlan.zhihu.com/p/27690113
伴隨著人工智慧和深度學習的火熱發展,Python也成為了一門非常熱門的語言。我們可以看到熱門的深度學習架構都提供Python的介面,有些甚至只有Python的介面,這一定程度上推動了Python的普及。當然,在我們完成模型的訓練之後,我們總是要搭建一個示範的平台,要麼開放給使用者使用,要麼是內部進行測試。
雖然說Python是著名的膠水語言,可以和很多語言和架構進行互操作,但是要是能直接使用Python編寫的架構進行伺服器的部署的話,則可以簡化程式的編寫過程。Python下最著名的網站架構就是Django了,因此今天就介紹下新版本Django的部署方法,主要以Windows和Linux為例。那為何要寫這篇呢。因為Django這幾年也變化了很多,然而網上有很多陳舊的部署教程,會對我們的部署過程進行幹擾,所以我覺得有這個必要好給你們傳授下一些部署的經驗。當然,部署前請用python manage.py runserver檢查一下伺服器是否正常工作。
我們先看看Windows下怎麼進行Django的部署,我藉助的是Azure中的Django模板中所使用wfastcgi庫以及微軟自己的伺服器平台IIS。過程如下:
安裝IIS,請務必勾選伺服器技術中的CGI。
安裝wfastcgi
pip install wfastcgi
執行指令,獲得FastCGI的Handler參數。
wfastcgi-enable
會獲得一串類似c:\anaconda2\python.exe|c:\anaconda2\lib\site-packages\wfastcgi.pyc的字串,其實就是python的路徑和handler的路徑用|進行串連而成的字串,記錄下來,後面會用到。
在網站根目錄下建立一個web.config,填入以下內容
<configuration> <system.webServer> <handlers> <add name="Python FastCGI" path="*" verb="*" modules="FastCgiModule" scriptProcessor="C:\Python36\python.exe|C:\Python36\Lib\site-packages\wfastcgi.py" resourceType="Unspecified" requireAccess="Script" /> </handlers> </system.webServer> <appSettings> <!-- Required settings --> <add key="WSGI_HANDLER" value="django.core.wsgi.get_wsgi_application()" /> <add key="PYTHONPATH" value="C:\MyApp" /> <!-- Optional settings --> <add key="WSGI_LOG" value="C:\Logs\my_app.log" /> <add key="WSGI_RESTART_FILE_REGEX" value=".*((\.py)|(\.config))$" /> <add key="APPINSIGHTS_INSTRUMENTATIONKEY" value="__instrumentation_key__" /> <add key="DJANGO_SETTINGS_MODULE" value="my_app.settings" /> <add key="WSGI_PTVSD_SECRET" value="__secret_code__" /> <add key="WSGI_PTVSD_ADDRESS" value="ipaddress:port" /> </appSettings></configuration>
上面一段是範例的web.config檔案,摘自wfastcgi的官方介紹頁面,我們需要做一些更改,首先scriptProcessor改為上面我們記錄的那段字串,然後是一些必要的參數,像PYTHONPATH改為網站的根目錄的路徑,最後就是一些可選的參數,像WSGI_LOG是log檔案的路徑,還有DJANGO_SETTINGS_MODULE需要改為自己項目的名稱,像APPINSIGHTS_INSTRUMENTATIONKEY,WSGI_PTVSD_SECRET,WSGI_PTVSD_ADDRESS這些都是Azure上的參數,我們可以將其刪除。
在IIS建立一個網站,指向網站的根目錄,注意連接埠不要重複。
開啟瀏覽器進行訪問,不出意外已經就OK了。 如果還是有問題,一般是許可權問題,檢查下Anaconda的目錄對於IIS_IUSRS是否有可讀、可執行、列出目錄許可權。
上面的部署過程在IIS 6及以上都測試通過了,基本沒啥大問題。而且通過上面設定的WSGI_RESTART_FILE_REGEX參數,可以實現自動重啟,簡直不要太爽。
之後是在Linux下的部署,我原本想著會比Windows簡單的多,但是自從體驗過了DigitalOcean的一鍵部署的鏡像後,我感覺我還是too simple了。提醒大家千萬別用DO中Ubuntu16.04的Django的一鍵鏡像,不知道為什麼突然就掛了,而且一上來還不能用網域名稱訪問。Ubuntu14.04的Django的一鍵鏡像還行,就是Django版本太老了,一升級又掛了。所以我還是從頭開始吧,這次主要是使用nginx和uwsgi來進行部署的,過程如下:
遵照nginx官方教程進行nginx的安裝,一般是下載認證,並添加到本機,重新整理庫安裝軟體的緩衝,再進行安裝這樣一個流程。此處以Ubuntu/Debian為例,在bash中敲入:
wget http://nginx.org/keys/nginx_signing.keysudo apt-key add nginx_signing.key
再修改/etc/apt/sources.list,添加以下兩行
deb http://nginx.org/packages/system/ codename nginxdeb-src http://nginx.org/packages/system/ codename nginx
system按情況替換為debian或ubuntu,codename可通過lsb_release -a獲得,然後繼續執行
apt-get updateapt-get install nginx
確保Python及pip已經安裝,可以通過以下指令安裝。
apt-get install python-dev python-pip
安裝uwsgi
pip install uwsgi
像上面一樣,在根目錄下面建立一個設定檔uwsgi.ini,填入以下內容。
[uwsgi]socket = 127.0.0.1:8001chdir = /path/to/your/project/wsgi-file = project_name/wsgi.pymaster = trueprocesses = 1vacuum = trueoptimize = 2stats = 127.0.0.1:9191daemonize = /var/log/uwsgi/myapp.log
chdir修改為項目的根目錄,project_name修改為自己的項目名稱,daemonize則是記錄檔的路徑,socket的連接埠可以靈活進行調整。
執行命令將uwsgi伺服器跑起來
uwsgi uwsgi.ini
按照nginx的教程,我們修改nginx的設定檔,新版本的路徑一般在/etc/nginx/conf.d/default.conf。
upstream django { server 127.0.0.1:8001;}server { listen 80; server_name myapp.example.com; root /var/www/myapp/html; location / { index index.html; } location /static/ { alias /var/django/projects/myapp/static/; } location /main { include uwsgi_params; uwsgi_pass django; uwsgi_param Host $host; uwsgi_param X-Real-IP $remote_addr; uwsgi_param X-Forwarded-For $proxy_add_x_forwarded_for; uwsgi_param X-Forwarded-Proto $http_x_forwarded_proto; }}
請保證上遊django路由的連接埠與之前socket設定的一致,static目錄和其他配置等可以靈活進行調整。 如果你現在直接跑的話,可以發現網站可以正常跑,但是靜態檔案卻是有問題的。這還是許可權問題,因為nginx預設不是用root使用者跑的,他沒有訪問靜態目錄的許可權。這有兩種解決方案,一個是給nginx使用者靜態目錄的存取權限,還有一種就是讓nginx以root使用者來跑。以第二種為例,那就是將/etc/nginx/nginx.conf中的user nginx修改為 user root,再用service nginx restart重啟服務即可。 如果對項目做了更改,他並不會自動生效,需要先將之前的uwsgi進程kill掉,再次運行步驟5即可。
以上,就是文章的全部內容啦,如果感覺還意猶未盡的話,可以給我的Github 首頁 加個follow之類的(滑稽),以後說不定還會再分享一些相關的經驗。