1.說明
關于在Linux上使用uwsgi部署Django的項目的過程并不難,主要是配置文件的寫法,尤其是nginx的配置文件,本文在Ubuntu20.04上通過uwsgi和nginx部署Django項目
2.安裝環(huán)境
安裝環(huán)境主要有Nginx、Python、MySQL、Redis,可以根據你的實際情況進行安裝
2.1 安裝nginx
大多數(shù)發(fā)行版Linux都支持通過包管理器直接安裝nginx,如果不支持,那你就只能去網上找一下通過編譯源碼的方式安裝nginx了。我這里是在Ubuntu20.04安裝,可以直接通過apt命令安裝nginx
sudo apt update
sudo apt install nginx
安裝完之后,它會自動運行nginx,訪問一下本機的IP(http://localhost
也行),如果看到Welcome to nginx!
的頁面提示,說明安裝成功了
2.2 安裝python
由于我使用Ubuntu20.04已經自帶Python3.8,所以我這里就直接使用Python3.8了,如果你需要其他版本,可以參考一下之前的文章
【Linux】Linux系統(tǒng)安裝Python3和pip3
我這里只需要再安裝一個pip
sudo apt install python3-pip
之后自己安裝一下項目需要用到的庫就好,至少把Django項目能用runserser跑起來
2.3 安裝mysql
安裝MySQL可以參考
【mysql】Ubuntu18安裝MySQL、忘記root密碼
如果安裝通過pip安裝mysqlclient報錯,可以基本上因為少了某些依賴
sudo apt install build-essential
sudo apt install pkg-config
sudo apt install libmysqlclient-dev
sudo apt install default-libmysqlclient-dev
2.4 安裝redis
如果你的項目需要安裝Redis,可以參考
【redis】redis簡介、安裝、連接指定庫
3.收集靜態(tài)文件
打開Django配置文件(一般是settings.py
),把DEBUG
改為False
,然后用STATIC_ROOT
寫上收集靜態(tài)文件存放的路徑,可以使用絕對路徑放到任意有權限的位置,但它會覆蓋已有文件,所以建議該路徑與STATICFILES_DIRS
不同,我這里是/home/pan/productions/static
DEBUG = False
STATICFILES_DIRS = [
os.path.join(BASE_DIR, "static"),
]
STATIC_ROOT = '/home/pan/productions/static'
修改好配置文件之后,就可以通過collectstatic
收集靜態(tài)文件了,這個操作就是把Django項目中用到的靜態(tài)文件復制一份到指定文件夾,目的是為了方便nginx代理
python3 manage.py collectstatic
如果沒有報錯的話,打開STATIC_ROOT
路徑應該可以看到已經收集好的靜態(tài)文件了
4.使用uwsgi啟動
4.1 安裝uwsgi
首先需要安裝uwsgi,使用pip安裝就行
sudo pip install uwsgi
安裝好之后在終端執(zhí)行一下uwsgi
如果有輸出那就可以了
4.2 uwsgi配置文件
新建一個ini文件,比如說uwsgi.ini
,下面是我的uwsgi.ini
配置文件的寫法,把該文件放在manage.py
所在目錄就行
[uwsgi]
# 啟動項目的IP端口,可以使用IP端口也可以使用本地文件
socket = 127.0.0.1:8000
# socket = /path/to/your/mysite/mysite.sock
# 項目目錄(一般是manage.py所在目錄)
chdir = /home/pan/productions/baiduwp_python/baiduwp_python
# 指定項目里的wsgi.py,絕對路徑和相對路徑都行
wsgi-file = baiduwp_python/wsgi.py
# 進程數(shù)
processes = 1
# 線程數(shù)
threads = 2
# 主程序
master = True
# 存放pid文件路徑
pidfile = uwsgi.pid
# 存放日志文件路徑
daemonize = uwsgi.log
# 緩存大小,如果提示緩存不夠就需要改大一點
buffer-size=4095
# 虛擬環(huán)境路徑(如果使用Python虛擬環(huán)境的話)
# virtualenv=/root/.virtualenvs/django_env
# 靜態(tài)文件的路徑,我們已經讓nginx處理,所以注釋掉
# static-map = /static=/home/pan/productions/static
關于日志格式
uwsgi有默認的日志格式,[pid: %(pid)|app: -|req: -/-] %(addr) (%(user)) {%(vars) vars in %(pktsize) bytes} [%(ctime)] %(method) %(uri) => generated %(rsize) bytes in %(msecs) msecs (%(proto) %(status)) %(headers) headers in %(hsize) bytes (%(switches) switches on core %(core))
如果你想要修改uwsgi的日志格式可以參考官網鏈接:https://uwsgi-docs.readthedocs.io/en/latest/LogFormat.html
比如說我這里需要修改一下日志時間的格式,它默認是ctime
,用英文縮寫表示的格式(例如“25/Sep/2023:17:12:21 +0800”),這里使用ftime
啟用自定義格式(例如“2023-09-25 17:14:36”)
[uwsgi]
socket = 127.0.0.1:8000
...
log-format-strftime = true
log-date = %%Y-%%m-%%d %%H:%%M:%%S
log-format = [pid: %(pid)|app: -|req: -/-] %(addr) (%(user)) {%(vars) vars in %(pktsize) bytes} [%(ftime)] %(method) %(uri) => generated %(rsize) bytes in %(msecs) msecs (%(proto) %(status)) %(headers) headers in %(hsize) bytes (%(switches) switches on core %(core))
還要注意,你需要看一下Django項目的wsgi.py
讀取的配置文件對不對,因為這個文件是Django自動生成的,如果你項目結構改變過,需要手動更新一下
4.3 啟動uwsgi
uwsgi的基本命令,在終端執(zhí)行
uwsgi --ini uwsgi.ini # 啟動uwsgi
uwsgi --stop uwsgi.pid # 關閉uwsgi
uwsgi --reload uwsgi.pid # 重啟uwsgi
其中uwsgi.ini
是使用uwsgi的啟動文件,按照上面的案例寫就行,啟動之后會生成uwsgi.pid
文件保存對應的ID,關閉uwsgi的時候需要指定該文件
5.使用nginx代理
上面是通過uwsgi以socket的方式啟動Django項目,這種協(xié)議瀏覽器是不能直接訪問的,所以需要借助nginx把請求轉發(fā)給Django
我們要修改nginx的配置文件,如果你希望監(jiān)聽80端口,你可以直接修改nginx的默認配置文件,一般是/etc/nginx/sites-enabled/default
,不過為了方便管理,我這里還是在/etc/nginx/conf.d
新建一個配置文件吧,一個項目一個配置文件比較方便后期管理
sudo vim /etc/nginx/conf.d/django_8000.conf
配置內容如下
# 這種寫法比較方便配合負載均衡
upstream backend {
# 這里的IP端口即Django項目的IP端口
server 127.0.0.1:8000;
# 如果uwsgi使用的本地文件,此處寫法參考
# server unix:/path/to/your/mysite/mysite.sock;
}
server {
# nginx監(jiān)聽端口,即在瀏覽器訪問時的端口,我這里是監(jiān)聽8080端口
listen 8080;
autoindex on;
location /static {
alias /home/pan/productions/static;
}
location / {
include uwsgi_params;
uwsgi_pass backend;
}
}
保存好nginx配置文件之后,需要重新加載一下nginx配置
sudo nginx -t
sudo nginx -s reload
現(xiàn)在打開瀏覽器訪問http://localhost:8080
應該是可以正常訪問了文章來源:http://www.zghlxwxcb.cn/news/detail-522040.html
一般來說,如果是Django項目與nginx處于同一臺服務器,sock文件的方式會比IP端口更高效一點,但是使用sock文件的時候注意一下是否有讀寫權限文章來源地址http://www.zghlxwxcb.cn/news/detail-522040.html
到了這里,關于【Django】在Linux上部署Django(nginx+uwsgi)的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!