新版本Django在Windows和Linux下的部署__Linux

來源:互聯網
上載者:User

原帖地址: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之類的(滑稽),以後說不定還會再分享一些相關的經驗。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.