基于uWSGI和nginx部署Django
原理
Web Client <===> Web Server(nginx) <===> The tcp <===> uWSGI <===> Django
也就是说我们通常这么做:将nginx作为服务器最前端,它接收WEB 即客户端的所有请求,统一管理请求。nginx把所有静态请求自己来处理 (这是NGINX的强项)。然后,NGINX将所有非静态请求通过uwsgi传递给Django,由Django来进行处理 ,从而完成一次WEB请求
安装uwsgi
pip install
# Or 安装最新版
$pip install https://projects.unbit.it/downloads/uwsgi-lts.tar.gz
安装之后简单的测试:创建一个test.py文件:
# 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服务器:
uwsgi --http :8000 --wsgi-file test.py
启动django项目
uwsgi --http :8000 --chdir /usr/projects/WillingDo/ -w WillingDo.wsgi
WillingDo.wsgi
指项目下的wsgi.py文件,django创建项目时会自己生成
uwsgi一些常用选项
uwsgi --chdir=/path/to/your/project \
--module=mysite.wsgi:application \
--env DJANGO_SETTINGS_MODULE=mysite.settings \
--master --pidfile=/tmp/project-master.pid \
--socket=127.0.0.1:49152 \ # can also be a file
--processes=5 \ # number of worker processes
--uid=1000 --gid=2000 \ # if root, uwsgi can drop privileges
--harakiri=20 \ # respawn processes taking more than 20 seconds
--max-requests=5000 \ # respawn processes after serving 5000 requests
--vacuum \ # clear environment on exit
--home=/path/to/virtual/env \ # optional path to a virtualenv
--daemonize=/var/log/uwsgi/yourproject.log # background the process
安装nginx
sudo apt-get install nginx
增加些关于nginx的配置
将uwsgi_params
文件拷贝到项目文件夹下。uwsgi_params
文件在/etc/nginx/目录下,也可以从这个页面下载
在项目文件夹下创建nginx的配置文件mysite_nginx.conf
upstream django{
server 127.0.0.1:8001;
}//
server {
listen 8000;//外界访问端口
server_name 116.196.87.3;//主机ip,有域名可以填域名
charset UTF-8;
access_log /var/log/nginx/myweb_access.log;
error_log /var/log/nginx/myweb_error.log;
client_max_body_size 75M;
location / {
include /usr/projects/WillingDo/uwsgi_params;
uwsgi_pass django;//照应第一行的 django 指的本机IP端口,与myweb_uwsgi.ini中的端口要一致
uwsgi_read_timeout 2;
}
location /static {
expires 30d;
autoindex on;
add_header Cache-Control private;
alias /usr/projects/WillingDo/static/;
}
}
之前一直没搞懂这些配置是干嘛的,后面好几个blog的都试了遍,终于成功,发现
include /usr/projects/WillingDo/uwsgi_params;
uwsgi_pass django;//照应第一行的 django 指的本机IP端口,与myweb_uwsgi.ini中的端口要一致
主要这两行,把nginx与uwsgi关联了起来;保存重启nginx
service nginx restart
用.ini文件配置uwsgi
每次都运行上面命令拉起Django应用实在麻烦,使用.ini文件能简化工作,方法如下:
在应用目录下创建文件mysite_uwsgi.ini
,填入并修改下面内容:
[uwsgi]
# Django-related settings
socket = :8001 //对应nginx的配置文件
# the base directory (full path)
chdir = /usr/projects/WillingDo
# Django s wsgi file
# 对于mysite_uwsgi.ini文件来说,与它的平级的有一个myweb目录,这个目录下有一个wsgi.py文件。
module = WillingDo.wsgi
# process-related settings
# master
master = true
# maximum number of worker processes
processes = 4
# ... with appropriate permissions - may be needed
# chmod-socket = 664
# clear environment on exit
vacuum = true
# 这个配置,其实就相当于在上一小节中通过wsgi命令,后面跟一堆参数的方式,给文件化了。
切换到项目目录下,读取mysite_uwsgi.ini文件启动项目
uwsgi --ini mysite_uwsgi.ini
访问http://外网ip:你设置的端口应该能行了,如下是我测试的
感谢几个大佬 ,参考
通过Nginx部署Django(基于ubuntu)