django_uWSGI+nginx环境
1 uWSGI
作用
Django 默认使用的是 Python 自带的 simple HTTPServer 提供web服务的,在安全性和效率上都是不行的,只能用作django开发测试。
WSGI是一个Web服务器(如nginx)与应用服务器(如uWSGI)通信的一种规范(协议),。
uWSGI负责把HTTP协议转化为WSGI协议,可以使python直接使用
安装
[root@webmaster nginx]# pip3 install uwsgi Successfully installed uwsgi-2.0.17.1 [root@webmaster nginx]# uwsgi --version 2.0.17.1
配置
在settings同目录
uwsgi.ini
[uwsgi] # 配置服务器的监听ip和端口 socket = 127.0.0.1:9090 # 配置项目目录(此处设置为项目的根目录) chdir = /data/sqlsite # 配置入口模块 (django的入口函数的模块,即setting同级目录下的wsgi.py) wsgi-file = sqlsite/wsgi.py # 开启master, 将会多开一个管理进程, 管理其他服务进程 master = True # 服务器开启的进程数量 processes = 2 # 以守护进程方式提供服, 输出信息将会打印到log中 daemonize = wsgi.log # 服务器进程开启的线程数量 threads = 2 # 退出的时候清空环境变量 vacuum = true #启动用户,在装uwsgi时已经自动创建 uid = uwsgi # 进程pid pidfile = uwsgi.pid
命令
启动
uwsgi --ini uwsgi.ini
重载
uwsgi --reload uwsgi/uwsgi.pid #django使用自带http服务时,会自动重载配置 #使用uwsgi时,没有运行python进程,由uwsgi托管,需要重载uwsgi才行
实测不行,改为:
[root@webmaster sqlsite]# cat run.sh #!/bin/sh killall -9 uwsgi;sleep 1;uwsgi --ini sqlsite/uwsgi.ini
2 nginx
location /static { alias /data/sqlsite/static; #指定django的静态文件 } location / { include uwsgi_params; uwsgi_pass 127.0.0.1:9090; }
3 admin static文件
这样的情况下,访问admin,会找不到static文件,因为admin的static文件不在static/下面。所以需要把admin的static迁移过来。
在static的配置上增加一个STATIC_ROOT配置,意思是所有static的根目录。这样,static聚合时,系统就会把admin的static文件复制过来。
# Static files (CSS, JavaScript, Images) # https://docs.djangoproject.com/en/2.1/howto/static-files/ STATIC_URL = '/static/' STATIC_ROOT = os.path.join(BASE_DIR, 'static') STATICFILES_DIRS = ( os.path.join(BASE_DIR, 'static'), )
python3 manage.py collectstatic #执行聚合命令后,在static目录下会出现admin目录
4 问题
在venv中运行的django,和在venv中安装的uwsgi,在外面环境下运行uwsgi出现了5000错误,需要在在venv环境