参考
- https://blog.csdn.net/yilovexing/article/details/82969103
- djanog-2.2
- uwsgi-2.0
1. 首先通过django直接运行项目-调试模式
先在服务器上放上网站项目代码,然后python manage.py runserver 0.0.0.0:80
,打开浏览器看能否访问。注意开启防火墙,包括云服务器防火墙,linux防火墙。
2. 然后通过uwsgi运行项目-不走nginx
关掉上面的manage.py, python下安装uwsgi,通过uwsgi运行项目
检查项目中wsgi.py是否存在
参考django官方文档,https://docs.djangoproject.com/en/2.2/howto/deployment/wsgi/uwsgi/ ,
用django start-project 命令创建的项目会在创建时自带 wsgi.py
假设项目根目录为/www/myadmin, 创建项目时在此目录下执行django-admin startproject server .
,默认会创建/www/myadmin/server/uwsgi.py
。如果不存在则需手动创建,方法参考上面的django官方文档。
在项目文件夹根目录下新建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文件后自动重启uwsgi
processes=4 ;根据实际cpu数量酌情配置
disable-logging = true ;正常的request不记录,只记录异常
http-socket = :8090 ;网页直接访问,可用于测试没有nginx时是否正常运行。
socket = 127.0.0.1:30888 ;和nginx相连时的配置
- 配置daemonize = *.log,会使任务在后台运行。
- 配置logto = *.log, 会使任务在前台运行。
- 网上说的后台运行方法
uwsgi -d --ini uwsgi.ini
,可能是老版本的,这个命令在2.2版本会创建一个名为--ini
的文件作为日志文件,命令后面的uwsgi.ini会被被忽略。
通过uwsgi启动项目
cd到项目根目录下,先测试没有nginx时uwsgi是否正常运行:
# 激活虚拟环境
conda activate your_env
# 启动wsgi,该命令相当于上面的 python manage.py runserver
uwsgi --ini uwsgi.ini
浏览器访问服务器8090端口。因为配置文件中设置了http-socket=8090,所以此时应该能访问网站,但是静态文件打不开(注意防火墙开放端口)。
错误排查
如果不能访问,可查看uwsgi的日志排查错误,/www/your_website/running.log
。
3. 最后通过nginx + wsgi 运行项目
安装nginx
参考 https://www.jianshu.com/p/8a6d923cda9f
# 添加nginx存储库
sudo yum install epel-release
# 使用yum安装Nginx
sudo yum install nginx
# 也可以试试这个:https://www.jianshu.com/p/c22faafc7b8b
yum install nginx --enablerepo=epel
# 设置nginx开机自启动
systemctl enable nginx
# 重启nginx
systemctl restart nginx
配置nginx
ubuntu Nginx 默认的配置文件在 /etc/nginx
目录下,centos 发行版的配置文件是在 /etc/nginx/nginx.conf
server_name可以区分从不同hostname网址来的请求,比如两个网址都解析到了该主机,那么设置server_name可以将其区分。设置为
_
表示所有如果没有其他适配的,就到这里。client_max_body_size,前端上传文件大小限制,nginx默认是1m
可以设置多个server,实现一台主机上部署多个网站。通过listen不同的端口,设置不同的server_name来区别不同的请求。
...
http {
...
server {
listen 80;
client_max_body_size 200m;
server_name _;
...
#配置uwsgi转发,需要和上面uwsgi.ini中的端口对应
location / {
include uwsgi_params;
uwsgi_pass 127.0.0.1:30888;
}
# serve静态文件
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虚拟环境,再执行下面语句
uwsgi --stop uwsgi.pid
uwsgi --ini uwsgi.ini
#或者使用reload
uwsgi --reload uwsgi.pid
测试和错误排查
此时访问服务器的80端口,应该能正常访问网站,包括静态资源。
如果不行,可能需要关闭SELinux。 临时关闭:输入命令setenforce 0
,永久关闭,vi /etc/selinux/config,将SELINUX=enforcing
改为SELINUX=disabled
另外可查看nginx中配置中error_log的位置,检查nginx的error_log。默认路径为/var/log/nginx/error.log
4. 设置开机自启动
创建sh脚本,脚本中激活anaconda,然后启动uwsgi服务。
# #!/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中实现开机自启动。
也可以用systemctl启动。参考下面的方法(这个没有实践):
- https://blog.csdn.net/huaishuming/article/details/79794637
- https://blog.csdn.net/sinat_41292836/article/details/103764842
创建systemctl服务,指定Type=forking,systemd认为当该服务fork出子进程并生成PIDFile,且父进程退出后服务启动成功。同时指定 PIDFile=FilePath,以便 systemd 能够跟踪服务的主进程。