1. 程式人生 > >Django2.1+nginx+uwsgi+VPS上線專案筆記(超詳細)

Django2.1+nginx+uwsgi+VPS上線專案筆記(超詳細)

這篇部落格記錄了我把django上線伺服器的過程,期間碰到了很多坑,所以想把經歷分享一下,如果有人遇到了和我一樣的問題,希望能對你有幫助。本文可能會有講的不到位或者我理解錯誤的地方,歡迎大家更正

需要的準備:配置好python環境的雲主機(ESC、VPS)一臺,django專案一個,python-pip能夠正常使用

1、開始

先用ssh連線上雲伺服器,我用的是Vultr的VPS,價格非常實惠,網路穩定,推薦一下,還沒有云伺服器想建個人網站的朋友們可以通過https://www.vultr.com/?ref=7568198 註冊哦!

註冊完賬號後,點這裡部屬新的伺服器 在這裡插入圖片描述

選配置,我建議使用洛杉磯節點,相對還是比較穩定的。 在這裡插入圖片描述

我這裡因為習慣選的烏班圖16.4系統,大家也可以用centos等 在這裡插入圖片描述 我選的3.5刀一個月的套餐,2.5的套餐沒有ipv4地址,所以還是選的3.5的在這裡插入圖片描述 在這裡插入圖片描述 完成後,點右下角的deploy now就行了,它這個是按小時收費的。充值可以用支付寶微信。

2、配置專案

註冊完成後通過ssh連線雲伺服器~ 在這裡插入圖片描述

登陸上來以後 先把該裝的東西安裝一下。git、python虛擬環境、你的專案要用的包。

然後git 把專案從github上clone到本地,沒有設定過github的ssh的朋友要先設定一下哦,先cd到你要clone的目錄 再用git clone就可以了

比如我這裡是

git clone [email protected]
:YuanfangLiao/DjBlog.git

然後專案就克隆到本地了 在這裡插入圖片描述

cd到專案目錄下,修改settings.py設定

# debug模式調整成false
DEBUG = False
# 修改一下允許的埠號
ALLOWED_HOSTS = ['127.0.0.1','你的公網ip或者域名', ]
# 靜態檔案目錄
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
# 檔案上傳路徑
MEDIA_ROOT = os.path.join(BASE_DIR, 'static/upload')

把debug改成flase以後,別忘了要在urls裡面設定一下靜態資源的url,不然會導致後續靜態資源載入不出來的問題

# 增加以下一行,以識別靜態資源
url(r'^static/(?P<path>.*)$', static.serve,{'document_root': settings.STATIC_ROOT}, name='static')

3、配置uwsgi

首先弄清下面幾個概念:

WSGI:全稱是Web Server Gateway Interface,WSGI不是伺服器,python模組,框架,API或者任何軟體,只是一種規範,描述web server如何與web application通訊的規範。server和application的規範在PEP 3333中有具體描述。要實現WSGI協議,必須同時實現web server和web application,當前執行在WSGI協議之上的web框架有Bottle, Flask, Django。

uwsgi:與WSGI一樣是一種通訊協議,是uWSGI伺服器的獨佔協議,用於定義傳輸資訊的型別(type of information),每一個uwsgi packet前4byte為傳輸資訊型別的描述,與WSGI協議是兩種東西,據說該協議是fcgi協議的10倍快。

uWSGI:是一個web伺服器,實現了WSGI協議、uwsgi協議、http協議等。

所以理論上,不用nginx直接用uwsgi也是可以的,但是nginx對靜態資源的處理更到位,所以我們還是用nginx+uwsgi比較好。

nginx+uwsgi的流程大概是這樣的: 在這裡插入圖片描述

收到request以後,nginx伺服器先去處理請求,如果是請求的靜態資源,nginx會直接找到相應的靜態資源並返回,所以效率是非常高的。如果是請求的動態資源,nginx會通過反向代理,找到內部網路上的伺服器,在這裡就是我們要用的uwsgi,當然阿帕奇也是可以的。

要用uwsgi,首先下載它。

下載uwsgi,如果是python3就用相應的pip3

pip install uwsgi

測試一下uwsgi

隨便找個目錄,新建一個檔案 test.py

def application(env, start_response):
    start_response('200 OK', [('Content-Type','text/html')])
    return [b"Hello World"]

網上很多教程最後的return裡面沒有加b,實際上這樣會導致HelloWorld打印不出來,應該返回byte格式的才對

然後用uwsgi測試一下

uwsgi --http :8001 --wsgi-file test.py

用瀏覽器訪問一下 ip:8001 如果出現hello world就是成功啦!

然後我們試一下用uwsgi跑我們的專案 先cd到專案目錄下

我們需要這兩個配置檔案,沒有的話先新建一下

在這裡插入圖片描述

uwsgi.ini

[uwsgi]
# nginx要繫結的埠號這裡先註釋掉
# socket = 127.0.0.1:8010
# 直接做伺服器的話的埠號
http=0.0.0.0:8010
# 專案目錄,千萬別弄錯了
chdir=/root/my_project/DjangoBlog/DjBlog
# 專案的wsgi.py檔案,路徑別弄錯了
wsgi-file=DjBlog/wsgi.py

# 底下是縣城的配置,基本先不用改
processes=4
threads=2
enable-threads=True
master=True
pidfile=uwsgi.pid
daemonize=uwsgi.log

uwsgi_params

uwsgi_param QUERY_STRING        $query_string;
uwsgi_param REQUEST_METHOD      $request_method;
uwsgi_param CONTENT_TYPE        $content_type;
uwsgi_param CONTENT_LENGTH      $content_length;

uwsgi_param REQUEST_URI     $request_uri;
uwsgi_param PATH_INFO       $document_uri;
uwsgi_param DOCUMENT_ROOT       $document_root;
uwsgi_param SERVER_PROTOCOL     $server_protocol;
uwsgi_param UWSGI_SCHEME        $scheme;

uwsgi_param REMOTE_ADDR     $remote_addr;
uwsgi_param REMOTE_PORT     $remote_port;
uwsgi_param SERVER_PORT     $server_port;
uwsgi_param SERVER_NAME     $server_name;

uwsgi_params這個檔案一個字都不能錯哦,直接複製就行了,不然一會nginx會報錯的。

到這裡理論上已經能用uwsgi 跑我們的專案了 跑一下試試

uwsgi --ini uwsgi.ini

好了直接瀏覽器訪問IP:8010

在這裡插入圖片描述

能跑了,uwsgi配置完畢。

4、配置nginx

先下載nginx

sudo apt-get install nginx

裝完後直接輸入埠號 在這裡插入圖片描述 看到這個介面就ok了

先關了nginx

nginx -s stop

要配置nginx啦!

配置檔案在,新版的都在這裡了,nginx.conf是以前的了,直接找這個檔案就可以

/etc/nginx/sites-enabled/default

開啟它 我的是配置成這樣的,路徑別弄錯了

upstream django {
        server 127.0.0.1:8010; #web的socket埠
    }

server {
        listen 80 default_server;
        listen [::]:80 default_server;
        index index.html index.htm index.nginx-debian.html;

        server_name _;

        location / {
                root /root/my_project/DjangoBlog/DjBlog; #專案目錄
                uwsgi_pass django;
                include /root/my_project/DjangoBlog/DjBlog/uwsgi_params; #uwsgi_params檔案的地址
 				 }
  		}	

配置完成後,儲存! 激動人心的時刻來了

先別激動 重啟一下伺服器

reboot

重新連上後,先cd到專案目錄

uwsgi --ini uwsgi.ini
#重啟一下nginx
nginx -s stop
nginx

直接輸入ip或者域名