首頁 > 軟體

一文教會你用nginx+uwsgi部署自己的django專案

2022-08-21 14:00:15

第一步:換源

輸入命令換掉Ubuntu的下載源

sudo nano /etc/apt/sources.list

將以下全部替換掉原檔案,我這裡用的是阿里的源,你也可以換其他的。

deb http://mirrors.aliyun.com/ubuntu/ bionic main restricted
deb http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted
deb http://mirrors.aliyun.com/ubuntu/ bionic universe
deb http://mirrors.aliyun.com/ubuntu/ bionic-updates universe
deb http://mirrors.aliyun.com/ubuntu/ bionic multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-updates multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted
deb http://mirrors.aliyun.com/ubuntu/ bionic-security universe
deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu bionic stable
分別輸入以下命令,更新源
sudo apt update
sudo apt upgrade

第二步:安裝相關包

1.安裝python3

# 安裝python3
sudo apt install python3
# 檢視python安裝路徑:
which python
# 檢視python版本:建議使用3.6之後的版本,因為其他的筆者沒試過,筆者用的是3.6.9版本
python

2.安裝openssh-server和net-tools

# 安裝 openssh-server
sudo apt install openssh-server
#開啟:
sudo service ssh start
 
# 安裝net-tools  
sudo apt install net-tools
# 檢視虛擬機器器ip:
ifconfig

如下圖所示,就是我們的虛擬機器器IP

 安裝django的執行環境

#安裝django執行環境:
sudo apt install virtualenv
# 建立環境
virtualenv --python=/usr/bin/python3 myblog
# 進入環境:
cd myblog
# 啟用環境:
source bin/activate

安裝django:pip3 install Django

建立專案:django-admin.py startproject blog

啟用並且建立好專案之後就基本和下圖所示差不多了

# 進入到blog中安裝 uwsgi:
pip3 install uwsgi

第三步:寫入測試檔案並測試執行

1.寫入測試檔案

安裝好之後我們再寫一個測試檔案,用來測試我們專案的執行方式,實際專案也是一樣的。這裡我用的是nano編輯寫入方式,你也可以使用vim,方式不限,能建立寫入即可寫入命令為:

sudo nano test.py

需要寫入的檔案內容為:

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

2.測試執行

測試命令為:uwsgi --http :8000 --wsgi-file test.py

回車之後,我們在瀏覽器輸入ip加port埠號,我的是192.168.217.133:8000。在瀏覽器開啟發現報了以下錯誤。

 對於這個錯誤,我們只需要開啟專案檔案的settings.py檔案,在ALLOWED_HOSTS裡面新增自己虛擬機器器的地址,就ok了,然後我們再測試執行,發現正常,網頁輸出hello world。這裡說明uwsgi能夠正常執行測試檔案。

但是我們並不是為了執行test.py檔案,我們是為了執行自己的django專案,這裡我們需要對上一個命令進行修改,改為:uwsgi --http :8000 --module blog.wsgi

第四步:引入nginx

1、安裝啟動nginx

為了避免在輸入ip時,不輸入埠號也能正常使用,我們引入輕量級的nginx,這裡我們用命令列安裝並且啟動nginx

安裝:sudo apt install nginx

啟動:sudo service nginx start

2、寫入conf組態檔

輸入命令:sudo nano /etc/nginx/sites-available/blog_nginx.conf

新建一個conf檔案,並且寫入以下內容,將裡面涉及路徑的地方全部改為你自己專案的路徑:

upstream django {
    # server unix:///home/python/myblog/blog/blog.sock; # 這裡的路徑改為你自己專案路徑
    server 127.0.0.1:8001; # for a web port socket (we'll use this first)
}
server {
    listen      8000;
    server_name 192.168.217.133; # 將這裡的ip地址改為你自己的虛擬機器器或者伺服器地址
    charset     utf-8;
    client_max_body_size 75M;   # adjust to taste
    location /media  {
        alias /home/python/myblog/blog/media;  # your Django project's media files - amend as required
    }
    location /static {
        alias /home/python/myblog/blog/static; # your Django project's static files - amend as required
    }
    location / {
        uwsgi_pass  django;
        include     /home/python/myblog/blog/uwsgi_params; # the uwsgi_params file you installed
    }
}

建立好檔案之後,我們需要對該檔案建立一個軟連結,需要輸入以下命令:

sudo ln -s /etc/nginx/sites-available/blog_nginx.conf /etc/nginx/sites-enabled

完成之後我們可以通過ll /etc/nginx/sites-enabled/這個命令來檢視一下,是否設定正確,參考下圖

3、建立uwsgi_params檔案和靜態資料夾設定

1)、uwsgi_params

這裡我們需要建立一個uwsgi_params檔案,建立命令為:sudo nano uwsgi_params

並且將下面內容一字不差的寫入到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  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;

檔案儲存之後重啟一下nginx即可

2)、建立靜態資料夾

開啟django專案的settings.py檔案,新增靜態檔案的路徑,如下圖: 

然後儲存退出並複製對映靜態檔案,命令為:python manage.py collectstatic

建立media資料夾:mkdir  media

最後輸入命令檢視靜態資料夾是否設定正確:

第五步:建立uwsgi和nginx的管道通訊

在uwsgi 中將http通訊改為socket通訊,修改命令為:uwsgi --socket :8001 --wsgi-file test.py

此時進入阻塞,在瀏覽器中輸入IP地址:192.168.217.133:8000,發現可以開啟,顯示hello world成功。說明uesgi和nginx通訊正常

進入nginx組態檔中:sudo nano /etc/nginx/sites-available/blog_nginx.conf

將檔案中下面兩行中的第二行註釋掉,開啟第一行,但是路徑一定要正確,改使用管道通訊

    server unix:///home/python/myblog/blog.sock; # for a file socket

    # server 127.0.0.1:8001; # for a web port socket (we'll use this first)

儲存退出,重啟nginx:sudo service nginx restart

將uwsgi引數套節字改為blog.sock

uwsgi --socket blog.sock --wsgi-file test.py

回到瀏覽器輸入:192.168.217.133:8000得到502:如圖

 我們檢視一下錯誤紀錄檔,發現是因為許可權問題,解決辦法,在命令列後面加入--chmod=666

uwsgi --socket blog.sock --wsgi-file test.py --chmod=666

執行之後發現沒有問題,並且正常顯示Hello World介面。

現在我們執行django專案,命令為:uwsgi --socket blog.sock --module blog.wsgi --chmod=666

重新整理192.168.217.133:8000得到django的基礎頁面。

目前可以說明nginx和uwsgi管道通訊正常。

第六步:將專案改為後臺執行

建立一個uwsgi的組態檔:sudo nano blog_uwsgi.ini

寫入一下內容,將其中的路徑改為自己的專案路徑

# mysite_uwsgi.ini file
[uwsgi]
# Django-related settings
# the base directory (full path)
chdir = /home/python/myblog/blog
# Django's wsgi file
module = blog.wsgi
# the virtualenv (full path)
home = /home/python/myblog
# process-related settings
# master
master = true
# maximum number of worker processes
processes = 10
# the socket (use the full path to be safe
socket = /home/python/myblog/blog/mysite.sock
# ... with appropriate permissions - may be needed
chmod-socket = 664
# clear environment on exit
vacuum = true
# daemonize uwsgi and write messages into given log
daemonize = /home/python/myblog/blog/uwsgi.log

儲存退出並且啟動組態檔,命令為:uwsgi --ini blog_uwsgi.ini

我們可以檢視一下後臺程序,是否正常啟動,輸入:ps aux

最後回到nginx組態檔中,將監聽埠改為80,重啟nginx即可。在瀏覽器中輸192.168.217.133得到django頁面結果,表示專案執行正常。

總結

到此這篇關於用nginx+uwsgi部署自己的django專案的文章就介紹到這了,更多相關nginx+uwsgi部署django專案內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com