python3 + Django + uwsgi + nginx 配置部署筆記

本文環境

操做系統: Ubuntu 16.04.3
Python版本: 3.5.2
Django版本: 2.0.4
nginx版本: 1.10.3html

本文平臺爲騰訊雲1核1G系統
個人項目文件名爲: dgutpsy

安裝pip3(python3 的pip)

sudo apt-get install python3-pip

2018-04-10-20-07-25.png

安裝成功後運行 pip3將會出現

2018-04-10-20-09-19.png

安裝uwsgi

pip install uwsgi

2018-04-10-20-17-19.png

測試uwsgi運行狀態

新建文件test.py
def application(env, start_response):
    start_response('200 OK', [('Content-Type','text/html')])
    return [b"Hello World"]
有些教程說是 return "hello world"
可是這樣其實會出現訪問空白的狀況, 個人是Python3的環境,須要對hello world進行編碼.
而若是你是Python2的環境,你應該寫 return "hello world"

使用uwsgi運行該文件

uwsgi --http :8000 --wsgi-file test.py
此語句的意思是, 使用uwsgi運行test.py文件, 採用http模式, 端口8000

2018-04-10-20-44-49.png

訪問頁面

好啦,能夠看到親切的hello world 就說明uwsgi運行成功了

2018-04-10-20-39-21.png

TIPS: 若是你訪問不了,請先檢查騰訊雲安全組端口是否開放8000端口

安裝Django

pip3 install Django
如在python3裏面import django沒有報錯則安裝成功.

2018-04-10-20-55-49.png

上傳項目代碼

如今咱們開始上傳項目代碼

2018-04-10-20-42-25.png

使用MobaXterm的sftp工具拖進來,[笑着哭]不要問我爲何不用ftp,這個方便.

確認代碼運行正常

切進項目目錄,運行
python3 manage.py runserver 0.0.0.0:8000

2018-04-10-20-59-03.png

訪問頁面

2018-04-10-21-01-32.png

不太對?這是由於設置了ALLOWED_HOSTS的緣由
咱們在setting.py裏設置一下
ALLOWED_HOSTS = ['*']

再次訪問頁面

2018-04-10-21-05-34.png

OK!

uswgi運行項目

uwsgi --http :8000 --chdir /home/ubuntu/dgutpsy  --wsgi dgutpsy.wsgi
這個語句的意思與上類似,只不過是多了一個工做路徑和wsgi文件
2018-04-10-21-05-34.png
開什麼玩笑? 你以爲沒變化?

至此

咱們能夠暫定如下內容
  1. 項目沒問題.
  2. 項目配置沒問題
  3. uwsgi沒問題
  4. 對項目的支持環境沒問題

接下來, 咱們開始配置nginx

安裝nginx

sudo apt-get install nginx

測試nginx運行狀態

2018-04-10-21-18-53.png

nginx 安裝成功

修改nginx配置

文件路徑 "/etc/nginx/sites-enabled/default"

別再費力找nginx.conf啦,新版本已經沒有這個文件的.python

個人
upstream django {
        server 127.0.0.1:8001; #web的socket端口
    }
server {
    listen 80 default_server;
    listen [::]:80 default_server;
 
    index index.html index.htm index.nginx-debian.html;

    server_name _;

    location / {
        root /home/ubuntu/dgutpsy; #項目目錄
        uwsgi_pass django;
        include /home/ubuntu/dgutpsy/uwsgi_params; #uwsgi_params文件的地址
    }
}

完整的uwsgi_params文件內容應該是nginx

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  REQUEST_SCHEME     $scheme;
uwsgi_param  HTTPS              $https if_not_empty;

uwsgi_param  REMOTE_ADDR        $remote_addr;
uwsgi_param  REMOTE_PORT        $remote_port;
uwsgi_param  SERVER_PORT        $server_port;
uwsgi_param  SERVER_NAME        $server_name;
沒有這個文件,或者這個文件寫錯是會報錯的哦.

訪問測試502

2018-04-10-21-37-49.png

這是由於咱們的socket通訊還沒開始呢!

nginx 與 uwsgi通訊

先使用hello world測試
uwsgi --socket :8001 --wsgi-file test.py

訪問測試頁面

圖片描述


至此: nginx 與 uwsgi通訊成功!web

TIPS: 這裏你是沒法經過在瀏覽器裏面訪問8001端口來判斷是否啓動的,由於它是socket協議

讓uwsgi後臺運行

這樣雖然看似能夠, 可是當你關閉ssh時,又會出現502了!

這是由於當你關閉這個ssh進程時,uwsgi進程也被終止了.
並且,每次啓動都要輸一串好長的命令,好不麻煩!shell

這個時候,咱們須要用到一個東西, 那就是ini配置文件啓動.
其中daemonize = /home/ubuntu/dgutpsy/test.log的意思就是後臺運行並規定日誌輸出目錄。django

新建test.ini

[uwsgi]
socket = 127.0.0.1:8001
wsgi-file = /home/ubuntu/dgutpsy/test.py
daemonize = /home/ubuntu/dgutpsy/test.log
uwsgi --ini test.ini

niginx與Django項目通訊

新建dgutpsy.ini

[uwsgi]
socket = 127.0.0.1:8001
chdir           = /home/ubuntu/dgutpsy
module          = dgutpsy.wsgi
master          = true
processes       = 1 

threads = 2 
max-requests = 6000

daemonize = /home/ubuntu/dgutpsy/run.log

而後運行ubuntu

uwsgi --ini dgutpsy.ini

域名映射

添加域名>解析consult.psyannabel.cn瀏覽器

訪問頁面

後記:

Q&A:
Q: 能用manage.py運行的,爲何要用uwsgi?安全

A: 單進程的manage.py, 能和web服務器uwsgi比ma

Q: 能用uwsgi的,爲何還要用nginx?服務器

A: uwsgi雖然是web服務器, 可是它在處理靜態文件時, 並無nginx來得優秀.

Q: 大體流程?

A: nginx運行web處理http請求, nginx使用socket與uwsgi通訊,將動態部分轉讓交給uwsgi處理

Q: 爲啥個人test.py運行不了?

A: 若是端口開放沒有問題,那麼請檢查Python版本對應的return
相關文章
相關標籤/搜索