nginx + uwsgi + django 配置经历

Posted on 2016-01-19 17:50  心在北方  阅读(2640)  评论(0编辑  收藏  举报

环境:

centos 7.0 :

[root@judge soft]# cat /etc/redhat-release
CentOS Linux release 7.0.1406 (Core)

[root@judge soft]# uname -r
3.10.0-123.9.3.el7.x86_64

nginx 1.8.0  编译安装

[root@judge ~]# cd /usr/local/nginx/sbin/
[root@judge sbin]# ls
nginx
[root@judge sbin]# ./nginx -v
nginx version: nginx/1.8.0

uwsgi: uwsgi --version  

uwsgi -version 可看到更多的内容

[root@judge soft]# uwsgi --version
2.0.11.2

python 2.7.5

django :

>>> import django
>>> django.__version__
'1.8.2'

原理:  client 发送http请求----经过nginx------uwsgi----django----Nosql mysql 可用两张图来说明

基于软件的发展:

在过去Python的Web服务器的解决方案基本上只有mod_wsgi。其中最流行的(或理解为时尚)的方法是最近Gunicorn

如今nginx和uwsgi结合,在基于 Python的Web应用程序上你能获得在线程(或非线程)之上更好的性能体验。暂且先这么认为吧。

WSGI:

wsgi:web server gateway interface 。It is a specification for web servers and application servers to communicate with web applications (though it can also be used for more than that)   WSGI是一种Web服务器网关接口。它是一个Web服务器(如nginx)与应用服务器(如uWSGI服务器)通信的一种规范。

uWSGI

uWSGI是一个Web服务器,它实现了WSGI协议、uwsgi、http等协议。Nginx中HttpUwsgiModule的作用是与uWSGI服务器进行交换。

要注意 WSGI / uwsgi / uWSGI 这三个概念的区分。

  • WSGI,是一种通信协议。
  • uwsgi同WSGI一样是一种通信协议。
  • 而uWSGI是实现了uwsgi和WSGI两种协议的Web服务器。

uwsgi协议是一个uWSGI服务器自有的协议,它用于定义传输信息的类型(type of information),每一个uwsgi packet前4byte为传输信息类型描述,它与WSGI相比是两样东西。

为什么有了uWSGI为什么还需要nginx?因为nginx具备优秀的静态内容处理能力,然后将动态内容转发给uWSGI服务器,这样可以达到很好的客户端响应。

验证uwsgi

django-admin.py  startproject aaa_pj

cd /opt/aaa_pj/aaa_pj/

vi test.py

#!/usr/bin/env python
#coding:utf-8

def application(env,start_response):
    start_response('200 OK',[('Content-Type','text/html')])
    return "Hello World

uwsgi --http :8001 --wsgi-file /opt/aaa_pj/aaa_pj/test.py       打开浏览器  ip:8001 出现hello world 则说明uwsgi安装没有问题

python /opt/aaa_pj/manage.py runserver 0.0.0.0:82     验证django 

连接django和uwsgi

编写django_wsgi.py文件,将其放在与文件manage.py同一个目录下。

#!/usr/bin/env python
#coding:utf-8

import os
import sys
#将系统的编码设置成UTF8
reload(sys)

sys.setdefaultencoding('utf8')

os.environ.setdefault("DJANGO_SETTINGS_MODULE","aaa_pj.settings")

uwsgi --http :8002 --chdir /opt/aaa_pj/ --module django_wsgi

from django.core.handlers.wsgi import WSGIHandler

application = WSGIHandler()

uwsgi --http :8002 --chdir /opt/aaa_pj/ --module django_wsgi

但是到这样一步,网页始终无法打开, 

 

暂且先不管 

设置uwsgi与Nginx连接

nginx配置:

uWSGI 配置

前面我们是直接使用命令行来启动 uWSGI,在实际部署环境中,我们常用的是配置文件的方式,而非命令行的方式。

我的 Django 程序目录:/opt/aaa_pj/

这里让 Nginx 采用 8088 端口与 uWSGI 通讯,请确保此端口没有被其它程序采用。

uWSGI 支持多种配置文件格式,比如 xml,ini,json 等等都可以。

1. xml 配置

请确定你在上一节中的django_wsgi.py文件已经存在了。新建一个XML文件:aaa_pj.xml,将它放在 /opt/aaa_pj 目录下

<uwsgi>
<socket>127.0.0.1:8088</socket>
<listen>80</listen>
<master>true</master>
<pythonpath>/opt/aaa_pj</pythonpath>
<processes>1</processes>
<logdate>true</logdate>
<daemonize>/var/log/uwsgi.log</daemonize>
<plugins>python</plugins>
</uwsgi>

执行命令:uwsgi -x /opt/aaa_pj/aaa_pj.xml 

or   /usr/local/bin/uwsgi -x /opt/aaa_pj/aaa_pj.xml 

结果报错了:

[root@judge aaa_pj]# uwsgi -x /opt/aaa_pj/aaa_pj.xml
[uWSGI] parsing config file /opt/aaa_pj/aaa_pj.xml
open("./python_plugin.so"): No such file or directory [core/utils.c line 3675]
!!! UNABLE to load uWSGI plugin: ./python_plugin.so: cannot open shared object file: No such file or directory !!!

根据提示 我将xml文件里的 plugin那行删除,结果再执行就没有报错了

[root@judge aaa_pj]# vi aaa_pj.xml
[root@judge aaa_pj]# uwsgi -x /opt/aaa_pj/aaa_pj.xml
[uWSGI] parsing config file /opt/aaa_pj/aaa_pj.xml

此时我重启nginx 又报错了

[root@judge sbin]# ./nginx
nginx: [emerg] unknown log format "/opt/logs/access.log" in /usr/local/nginx/conf/nginx.conf:43

根据提示  不能用=号


server {
listen 80;
server_name localhost;
access_log /opt/logs/access.log;
error_log /opt/logs/error.log;

location / {
uwsgi_pass 127.0.0.1:8088;
include /usr/local/nginx/conf/uwsgi_params;

}
access_log off;
}

再启动nginx就没有报错了。

由于前面的错误,网页没有成功打开。因此还需要仔细找找原因。

 

 

加载指定的xml配置文件。当使用命令行参数时,可以使用简化命令“-x”。当然也可以不简写:

uwsgi --xml /opt/aaa_pj.xml

甚至如果在命令行的最后一个参数以“.xml”结尾,那么就隐含将加载该xml文件作为配置。

uwsgi /opt/aaa_pj.xml

有时候因各种环境问题,-x --xml 命令识别不了,可以使用下面的 ini 配置方式:

2. ini 配置

 

然后执行命令:

[uwsgi]
vhost = false
plugins = python
socket = 127.0.0.1:8088
master = true
enable-threads = true
workers = 1
wsgi-file = /opt/opt_pj/opt_pj/wsgi.py
chdir =/opt/opt_pj/

然后执行命令:

uwsgi --ini /root/nowamagic_venv/nowamagic_pj.ini&

uwsgi 这样就启动起来了。如果无意外的话,就能在网上访问你的 Python 项目了。
 
还有很多问题,需要进一步去检查。今天记录到这。
 

Copyright © 2024 心在北方
Powered by .NET 9.0 on Kubernetes