參考
- https://blog.csdn.net/yilovexing/article/details/82969103
- djanog-2.2
- uwsgi-2.0
1. 首先通過django直接運(yùn)行項(xiàng)目-調(diào)試模式
先在服務(wù)器上放上網(wǎng)站項(xiàng)目代碼,然后python manage.py runserver 0.0.0.0:80,打開瀏覽器看能否訪問。注意開啟防火墻,包括云服務(wù)器防火墻,linux防火墻。
2. 然后通過uwsgi運(yùn)行項(xiàng)目-不走nginx
關(guān)掉上面的manage.py, python下安裝uwsgi,通過uwsgi運(yùn)行項(xiàng)目
檢查項(xiàng)目中wsgi.py是否存在
參考django官方文檔,https://docs.djangoproject.com/en/2.2/howto/deployment/wsgi/uwsgi/ ,
用django start-project 命令創(chuàng)建的項(xiàng)目會(huì)在創(chuàng)建時(shí)自帶 wsgi.py
假設(shè)項(xiàng)目根目錄為/www/myadmin, 創(chuàng)建項(xiàng)目時(shí)在此目錄下執(zhí)行django-admin startproject server .,默認(rèn)會(huì)創(chuàng)建/www/myadmin/server/uwsgi.py。如果不存在則需手動(dòng)創(chuàng)建,方法參考上面的django官方文檔。
在項(xiàng)目文件夾根目錄下新建uwsgi.ini配置文件。
; run: uwsgi --ini uwsgi.ini
; reload: uwsgi --reload uwsgi.pid
; stop: uwsgi --stop uwsgi.pid
[uwsgi]
chdir=/www/your_websit
pidfile = /www/your_website/uwsgi.pid
daemonize = /www/your_website/running.log ;記錄日志的位置
module=server.wsgi:application
master=True
vacuum=True
max-requests=5000
py-autoreload = 1 ;修改py文件后自動(dòng)重啟uwsgi
processes=4 ;根據(jù)實(shí)際cpu數(shù)量酌情配置
disable-logging = true ;正常的request不記錄,只記錄異常
http-socket = :8090 ;網(wǎng)頁(yè)直接訪問,可用于測(cè)試沒有nginx時(shí)是否正常運(yùn)行。
socket = 127.0.0.1:30888 ;和nginx相連時(shí)的配置
- 配置daemonize = *.log,會(huì)使任務(wù)在后臺(tái)運(yùn)行。
- 配置logto = *.log, 會(huì)使任務(wù)在前臺(tái)運(yùn)行。
- 網(wǎng)上說的后臺(tái)運(yùn)行方法
uwsgi -d --ini uwsgi.ini,可能是老版本的,這個(gè)命令在2.2版本會(huì)創(chuàng)建一個(gè)名為--ini的文件作為日志文件,命令后面的uwsgi.ini會(huì)被被忽略。
通過uwsgi啟動(dòng)項(xiàng)目
cd到項(xiàng)目根目錄下,先測(cè)試沒有nginx時(shí)uwsgi是否正常運(yùn)行:
# 激活虛擬環(huán)境
conda activate your_env
# 啟動(dòng)wsgi,該命令相當(dāng)于上面的 python manage.py runserver
uwsgi --ini uwsgi.ini
瀏覽器訪問服務(wù)器8090端口。因?yàn)榕渲梦募性O(shè)置了http-socket=8090,所以此時(shí)應(yīng)該能訪問網(wǎng)站,但是靜態(tài)文件打不開(注意防火墻開放端口)。
錯(cuò)誤排查
如果不能訪問,可查看uwsgi的日志排查錯(cuò)誤,/www/your_website/running.log。
3. 最后通過nginx + wsgi 運(yùn)行項(xiàng)目
安裝nginx
參考 http://www.itdecent.cn/p/8a6d923cda9f
# 添加nginx存儲(chǔ)庫(kù)
sudo yum install epel-release
# 使用yum安裝Nginx
sudo yum install nginx
# 也可以試試這個(gè):http://www.itdecent.cn/p/c22faafc7b8b
yum install nginx --enablerepo=epel
# 設(shè)置nginx開機(jī)自啟動(dòng)
systemctl enable nginx
# 重啟nginx
systemctl restart nginx
配置nginx
ubuntu Nginx 默認(rèn)的配置文件在 /etc/nginx 目錄下,centos 發(fā)行版的配置文件是在 /etc/nginx/nginx.conf
server_name可以區(qū)分從不同hostname網(wǎng)址來(lái)的請(qǐng)求,比如兩個(gè)網(wǎng)址都解析到了該主機(jī),那么設(shè)置server_name可以將其區(qū)分。設(shè)置為
_表示所有如果沒有其他適配的,就到這里。client_max_body_size,前端上傳文件大小限制,nginx默認(rèn)是1m
可以設(shè)置多個(gè)server,實(shí)現(xiàn)一臺(tái)主機(jī)上部署多個(gè)網(wǎng)站。通過listen不同的端口,設(shè)置不同的server_name來(lái)區(qū)別不同的請(qǐng)求。
...
http {
...
server {
listen 80;
client_max_body_size 200m;
server_name _;
...
#配置uwsgi轉(zhuǎn)發(fā),需要和上面uwsgi.ini中的端口對(duì)應(yīng)
location / {
include uwsgi_params;
uwsgi_pass 127.0.0.1:30888;
}
# serve靜態(tài)文件
location /static {
autoindex on;
alias /www/myadmin/static/;
}
...
}
server {
listen 80;
listen 8090;
client_max_body_size 200m;
server_name www.aaa.com www.bbb.com;
...
}
}
重啟nginx使配置生效:
systemctl restart nginx
uwsgi可能也需要重啟:
# 先激活python虛擬環(huán)境,再執(zhí)行下面語(yǔ)句
uwsgi --stop uwsgi.pid
uwsgi --ini uwsgi.ini
#或者使用reload
uwsgi --reload uwsgi.pid
測(cè)試和錯(cuò)誤排查
此時(shí)訪問服務(wù)器的80端口,應(yīng)該能正常訪問網(wǎng)站,包括靜態(tài)資源。
如果不行,可能需要關(guān)閉SELinux。 臨時(shí)關(guān)閉:輸入命令setenforce 0,永久關(guān)閉,vi /etc/selinux/config,將SELINUX=enforcing改為SELINUX=disabled
另外可查看nginx中配置中error_log的位置,檢查nginx的error_log。默認(rèn)路徑為/var/log/nginx/error.log
4. 設(shè)置開機(jī)自啟動(dòng)
創(chuàng)建sh腳本,腳本中激活anaconda,然后啟動(dòng)uwsgi服務(wù)。
# #!/bin/sh
# #this script will run in background
systemctl start nginx
source /root/anaconda3/bin/activate syadmin
uwsgi --ini /www/syadmin/uwsgi.ini
# nohup python /www/your_webst/manage.py start_circle_task >/dev/null 2>&1 &
有了上面的sh腳本后,可以將其加入/etc/rc.d/rc.local中實(shí)現(xiàn)開機(jī)自啟動(dòng)。
也可以用systemctl啟動(dòng)。參考下面的方法(這個(gè)沒有實(shí)踐):
- https://blog.csdn.net/huaishuming/article/details/79794637
- https://blog.csdn.net/sinat_41292836/article/details/103764842
創(chuàng)建systemctl服務(wù),指定Type=forking,systemd認(rèn)為當(dāng)該服務(wù)fork出子進(jìn)程并生成PIDFile,且父進(jìn)程退出后服務(wù)啟動(dòng)成功。同時(shí)指定 PIDFile=FilePath,以便 systemd 能夠跟蹤服務(wù)的主進(jìn)程。