Django+Uwsgi+Nginx部署
Posted cs_1993
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django+Uwsgi+Nginx部署相关的知识,希望对你有一定的参考价值。
一 uwsgi介绍
uWSGI是一个Web服务器,它实现了WSGI协议,uwsgi, http等协议。 nginx中HttpUwsgiMoule的作用是与uWSGI服务器进行交换
1 WSGI是一种Web服务器网关接口。它是一个Web服务器(如nginx,uWSGI等服务器)与web应用(如用Flask框架写的程序)通信的一种规范。
2 uwsgi是一种线路协议而不是通信协议,在此常用于在uWSGI服务器与其他网络服务器的数据通信。
3 而uWSGI是实现了uwsgi和WSGI两种协议的Web服务器。
3 uwsgi协议是一个uWSGI服务器自有的协议,它用于定义传输信息的类型(type of information),每一个uwsgi packet前4byte为传输信息类型描述,它与WSGI相比是两样东西。
uWSGI的主要特点如下:
超快的性能
低内存占用(实测为apache2的mod_wsgi的一半左右)
多app管理(终于不用冥思苦想下个app用哪个端口比较好了)
详尽的日志功能(可以用来分析app性能和瓶颈)
高度可定制(内存大小限制,服务一定次数后重启等)
二 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
基本测试
Create a file called 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 --http :8000 --wsgi-file test.py
用uwsgi 启动django
uwsgi --http :8000 --module [项目名称.wsgi]
实例:uwsgi --http 0.0.0.0:8080 --chdir /project/CNBlog/ --module cnblog.wsgi
可以把参数写到配置文件里
[uwsgi] socket = 172.16.123.203:9000 # nginx链接的ip和端口 #http = 172.16.123.203:9000 # 访问HTTP协议监听IP和端口 # Django-related settings # the django project directory (full path) chdir = /project/SchoolInfomationSystem # 项目根目录 # Django‘s wsgi file module = SchoolInfomationSystem.wsgi # django项目下的wsgi文件 # process-related settings client_max_body_size 75M # master master = true # maximum number of worker processes processes = 4 # 开启4个进程(按需更改) threads = 2 # 每个进程开启2个线程 max-requests = 6000 #daemonize = /var/log/uwsgi.log # 后台启动,并把日志记录到指定文件 # ... with appropriate permissions - may be needed chmod-socket = 664 # clear environment on exit vacuum = true
示例中用的是ini配置文件,如需使用xml配置,请另行百度xml配置文件。更多的参数使用也可以自行百度添加上去
当ini配置文件写好后执行
uwsgi --ini /project/crazye-uwsgi.ini #--ini 表示使用ini配置文件,xml文件就用--xm
常用选项:
http : 协议类型和端口号
processes : 开启的进程数量
workers : 开启的进程数量,等同于processes(官网的说法是spawn the specified number ofworkers / processes)
chdir : 指定运行目录(chdir to specified directory before apps loading)
wsgi-file : 载入wsgi-file(load .wsgi file)
stats : 在指定的地址上,开启状态服务(enable the stats server on the specified address)
threads : 运行线程。由于GIL的存在,我觉得这个真心没啥用。(run each worker in prethreaded mode with the specified number of threads)
master : 允许主进程存在(enable master process)
daemonize : 使进程在后台运行,并将日志打到指定的日志文件或者udp服务器(daemonize uWSGI)。实际上最常用的,还是把运行记录输出到一个本地文件上。
pidfile : 指定pid文件的位置,记录主进程的pid号。
vacuum : 当服务器退出的时候自动清理环境,删除unix socket文件和pid文件(try to remove all of the generated file/sockets)
三 Nginx的安装和配置
安装 nginx yum install -y nginx
再接下来要做的就是修改nginx.conf配置文件。打开/etc/nginx/nginx.conf文件,添加如下内容。
server { listen 8099; server_name 127.0.0.1 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 uwsgi_params; uwsgi_pass 127.0.0.1:8000; uwsgi_read_timeout 2; } location /static { expires 30d; autoindex on; add_header Cache-Control private; alias /home/fnngj/pydj/myweb/static/; } }
配置二
# the upstream component nginx needs to connect to upstream django { # server unix:///path/to/your/mysite/mysite.sock; # for a file socket server 127.0.0.1:8001; # for a web port socket (we‘ll use this first) } # configuration of the server server { # the port your site will be served on listen 8000; # the domain name it will serve for server_name .example.com; # substitute your machine‘s IP address or FQDN charset utf-8; # max upload size client_max_body_size 75M; # adjust to taste # Django media location /media { alias /path/to/your/mysite/media; # your Django project‘s media files - amend as required } location /static { alias /path/to/your/mysite/static; # your Django project‘s static files - amend as required } # Finally, send all non-media requests to the Django server. location / { uwsgi_pass django; include /path/to/your/mysite/uwsgi_params; # the uwsgi_params file you installed } }
listen 指定的是nginx代理uwsgi对外的端口号。
server_name 网上大多资料都是设置的一个网址(例,www.example.com),我这里如果设置成网址无法访问,所以,指定的到了本机默认ip。
在进行配置的时候,我有个问题一直想不通。nginx到底是如何uwsgi产生关联。现在看来大概最主要的就是这两行配置。
include uwsgi_params;
uwsgi_pass 127.0.0.1:8000; 注意要和wsgi监听的ip和端口一致
include 必须指定为uwsgi_params;而uwsgi_pass指的本机IP的端口与myweb_uwsgi.ini配置文件中的必须一直。
以上是关于Django+Uwsgi+Nginx部署的主要内容,如果未能解决你的问题,请参考以下文章
debian完整部署 Nginx + uWSGI + Django
Django + Uwsgi + Nginx 实现生产环境部署
centos7下部署Django(nginx+uWSGI+Python3+Django)