一、uwsgi介绍
uWSGI是一个Web服务器,它实现了WSGI协议、uwsgi、http等协议。Nginx中HttpUwsgiModule的作用是与uWSGI服务器进行交换。
1、 WSGI / uwsgi / uWSGI
WSGI是一种Web服务器网关接口。它是一个Web服务器(如nginx,uWSGI等服务器)与web应用(如用Flask框架写的程序)通信的一种规范。
uwsgi是一种线路协议而不是通信协议,在此常用于在uWSGI服务器与其他网络服务器的数据通信。
而uWSGI是实现了uwsgi和WSGI两种协议的Web服务器。
uwsgi协议是一个uWSGI服务器自有的协议,它用于定义传输信息的类型(type of information),每一个uwsgi packet前4byte为传输信息类型描述,它与WSGI相比是两样东西。
2、uWSGI主要特点
超快的性能
低内存占用(实测为apache2的mod_wsgi的一半左右)
多app管理
详尽的日志功能(可以用来分析app性能和瓶颈)
高度可定制(内存大小限制,服务一定次数后重启等)
3、安装 uWSGI
# Install the latest stable release:
pip install uwsgi
# ... or if you want to install the latest LTS (long term support) release,
pip install https://projects.unbit.it/downloads/uwsgi-lts.tar.gz
备注:后期只需要增加配置, 告诉uWSGI-server的框架入口函数在哪,就能让django和uWSGI服务器对接上
4、测试
# script-name:test.py
def application(env, start_response):
start_response('200 OK', [('Content-Type','text/html')])
return [b"Hello World"] # python3
#return ["Hello World"] # python2
运行
$ uwsgi --http :8000 --wsgi-file test.py #开启服务器上8000端口,运行此项目
5、用uwsgi 启动django
$ uwsgi --http :8000 --module mysite.wsgi
在django项目的setting.py文件的同级目录下,增加一个配置文件 uwsgi.ini (只要名字以 .ini 结尾即可)
$ cat uwsgi.ini
[uwsgi]
# 配置服务器的监听ip和端口,让uWSGI作为nginx的支持服务器的话,设置socke就行;如果要让uWSGI作为单独的web-server,用http
# http = 127.0.0.1:8000
socket = 127.0.0.1:8000
# 配置项目目录(此处设置为项目的根目录)
chdir = /home/wwwroot/python/my_pro
# 配置入口模块(django的入口函数的模块,即setting同级目录下的wsgi.py)
wsgi-file = my_pro/wsgi.py
# 开启master, 将会多开一个管理进程, 管理其他服务进程
master = True
# 服务器开启的进程数量
processes = 2
# 以守护进程方式提供服, 输出信息将会打印到log中
daemonize = wsgi.log
# 服务器进程开启的线程数量
threads = 4
# 退出的时候清空环境变量
vacuum = true
# 进程pid
pidfile = uwsgi.pid
chmod-socket = 664
# 配uWSGI搜索静态文件目录(及django项目下我们存放static文件的目录,用uWSGI作为单独服务器时才需要设置,此时我们是用nginx处理静态文件)
# check-static = /home/wwwroot/python/ttsx
启动
$ /usr/local/bin/uwsgi uwsgi.ini [--ini]
二、配置nginx
修改nginx扩展配置文件
$ cat /usr/local/nginx/conf/conf.d/my_pro.conf
upstream django {
server 127.0.0.1:8000;
}
server {
listen 80;
server_name _ ; #这个指代本机
index index.htm index.html;
root /home/wwwroot/python/my_pro ;
error_page 404 /404.html;
error_page 500 502 503 504 /50x.html;
location / {
#持久化连接相关配置
#proxy_connect_timeout 30s;
#proxy_read_timeout 86400s;
#proxy_send_timeout 30s;
#proxy_http_version 1.1;
#proxy_set_header Upgrade $http_upgrade;
#proxy_set_header Connection "upgrade";
add_header X-Cache $upstream_cache_status;
expires 12h;
include uwsgi_params; # 设置将所有请求转发给uwsgi服务器处理
uwsgi_pass django; # 指定uwsgi服务器url
}
location /static {
alias /home/wwwroot/python/my_pro/static/; # 设置将/static的静态请求交给nginx,并指定静态文件的目录
}
location ~ .*\.(html|htm|png|gif|jpeg|jpg|bmp|js|css)?${
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_pass http://127.0.0.1:8000;
#缓存相关配置
#proxy_cache cache_one;
#proxy_cache_key $host$request_uri$is_args$args;
#proxy_cache_valid 200 304 301 302 1h;
expires 24h;
}
}
nginx安装详见:https://blog.csdn.net/m0_37886429/article/details/68941918
三、打包静态文件
以上,nginx+uWSGI+django已经可以正常运行了,但是登陆django的admin后台管理界面,网页的静态文件无法找到。
那是因为我们在前面设置nginx的静态文件目录时,static目录下一般只是我们项目应用开发中自己的静态文件,但是django后台admin用到的静态文件并不在这,所以找不到。所以我们需要把所有的静态文件打包放在一个目录下。
1、在setting.py文件下增加一行配置,指定所有静态文件的根目录
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
2、执行django管理器命令,会自动将我们项目所有的静态文件放到上面设置的静态文件根目录下
$ python manage.py collectstatic