最后更新于 .

之前的文章已经提到了 django+fastcgi的运行并不如意(web.py+spawn-fcgi却正常很多……),所以特意抽时间研究了一下uwsgi,试了一下,运行的很好,也很快,哈哈。 所以笔者的所有之前用apache+django搭建的项目(如fuload等)都已经替换成了nginx+django+uwsgi。 一.安装uwsgi

  1. http://projects.unbit.it/uwsgi/wiki/WikiStart#Getit 下载最新版本的uwsg。
  2. 解压后,如果没有安装libxml2,又不想安装的话,那么编辑文件 buildconf/default.ini, 把
    xml_implementation = libxml2
    
    改成
    xml_implementation = false
    
  3. 执行编译
    python uwsgiconfig.py --build
    
  4. 执行安装
    python setup.py install
    

这样,uwsgi就安装上了~ 二.nginx配置 配置要比fastcgi还简单一些:

location / { 
    include uwsgi_params;
    uwsgi_pass 127.0.0.1:9090;
}

三.django配置 在mysite的统计目录(即setting.py的上级目录),创建文件uws_app.py:

import sys 
import os

sys.path.append(os.path.abspath(os.path.dirname(__file__)))
os.environ['DJANGO_SETTINGS_MODULE'] = 'mysite.settings'

import django.core.handlers.wsgi

application = django.core.handlers.wsgi.WSGIHandler()

启动uwsgi:

uwsgi -s :9090 -w uws_app -p10 -d uws.error &

其实也可以不用写uws_app.py这个文件,直接启动uwsgi:

uwsgi --module='django.core.handlers.wsgi:WSGIHandler()' --env DJANGO_SETTINGS_MODULE=mysite.settings -s :9090 -p 10 -d uws.log --touch-reload=uws.tc &

四.web.py配置 创建文件 index.py :

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

import web 

urls = ("/.*", "hello")

class hello:
    def GET(self):
        return 'Hello, world!'

app = web.application(urls, globals())
application = app.wsgifunc()

启动uwsgi:

uwsgi -s :9091 -w index -p 2 -d uws.error &

OK,到此为止就整个配置完啦,简单吧! 使用了uwsgi之后的fuload运行也非常稳定:

1


最后是uwsgi的一些文档,大家可以看一下. uwsgi 启动参数: http://projects.unbit.it/uwsgi/wiki/Doc uwsgi 配合django,web.py,flask等: http://projects.unbit.it/uwsgi/wiki/Example

Pingbacks

  1. Flask+uWSGI+Nginx部署过程 | 朱剑的财富博客 on #

    [...] http://www.vimer.cn/2011/07/linux%E4%B8%8Bnginxpythonuwsgi%E9%83%A8%E7%BD%B2%E6%80%BB%E7%BB%93django... [...]

Pingbacks已打开。

Trackbacks

引用地址

评论

  1. django部署遇到的问题,help

    django部署遇到的问题,help on #

    Page not found (404)
    Request Method: GET
    Request URL: http://127.0.0.1/admin/blog/blogpost/

    Using the URLconf defined in myapp.urls, Django tried these URL patterns, in this order:

    1. ^admin/ ^$ [name='index']
    2. ^admin/ ^logout/$ [name='logout']
    3. ^admin/ ^password_change/$ [name='password_change']
    4. ^admin/ ^password_change/done/$ [name='password_change_done']
    5. ^admin/ ^jsi18n/$ [name='jsi18n']
    6. ^admin/ ^r/(?P\d+)/(?P.+)/$
    7. ^admin/ ^(?P\w+)/$ [name='app_list']

    The current URL, admin/blog/blogpost/, didn't match any of these.

    You're seeing this error because you have DEBUG = True in your Django settings file. Change that to False, and Django will display a standard 404 page.

    Reply

    1. Dante

      Dante on #

      正则写的有问题吧。。

      Reply

  2. 包子

    包子 on #

    你好,我按照你的安装步骤,都没有出现什么问题,也在把/etc/nginx/sites-available/default进行了你上面的配置,但是我更改了root地址。
    问题就是现在我打开127.0.0.1却是502错误,因为先前安装了spawn-fcgi,但是我后来删除了,难道是因为没有删除干净的缘故或者其他
    = =!希望帮忙解决下,搜了2个多小时,没有解决

    Reply

  3. 包子

    包子 on #

    找到原因了,是配置出来问题

    location / {
    include uwsgi_params;
    uwsgi_pass 127.0.0.1:9090;
    }

    貌似加上uwsgi_pass 127.0.0.1:9090;就会出现502,难道是因为我的uwsgi没有安装成功?还是说其他的原因?

    Reply

    1. Dante

      Dante on #

      uwsgi 有启动吗?
      netstat -lpnt
      可以看到监听端口里面有没有9090

      Reply

      1. 包子

        包子 on #

        确实配置有问题

        uWSGI Error

        Python application not found

        出现这类问题的时候,是不是需要配置uwsgi,我按照你的安装方式却在/etc里面找不到uwsgi的配置。不知道问题出在哪儿,我用的是ubuntu11,是不是跟发行版本也有关系?

        Reply

        1. Dante

          Dante on #

          应该是uwsgi需要的app对象不存在。

          Reply

  4. SErHo

    SErHo on #

    请问,为什么使用数据库后,就会出现uwsgi application not found,而其他情况下不会,我使用的是 webpy 0.36,uwsgi 0.9.8.6。

    Reply

    1. Dante

      Dante on #

      这个确认有关系么。。。是不是看一下uwsgi进程启动了没有。。

      Reply

  5. ara

    ara on #

    按您文章进行了配置,出现错误,请教问题原因
    nginx.conf 配置:
    server { # python/uwsgi
    listen 80;
    root /home/chenkai/webpytest;
    error_log /home/chenkai/webpytest/nginx.log;
    location / {
    include uwsgi_params;
    uwsgi_pass 127.0.0.1:9090;
    index index.html index.htm;
    }
    }
    index.py内容:
    import web
    urls=('/(.*)','hello')
    class hello:
    def GET(self):
    return 'Hello,world!'
    app=web.application(urls,globals())
    application=app.wsgifunc()

    用uwsgi -s 127.0.0.1:9090 -w index -d uws.error启动

    出现错误uws.error:
    *** Starting uWSGI 1.0-dev (32bit) on [Mon Oct 24 17:13:38 2011] ***
    compiled with version: 4.6.1 on 24 October 2011 16:31:58
    current working directory: /home/chenkai/webpytest
    detected binary path: /usr/local/bin/uwsgi
    *** WARNING: you are running uWSGI without its master process manager ***
    your memory page size is 4096 bytes
    uwsgi socket 0 bound to TCP address 127.0.0.1:9090 fd 4
    Python version: 2.7.2+ (default, Oct 4 2011, 20:29:37) [GCC 4.6.1]
    Python main interpreter initialized at 0x91c9b78
    your server socket listen backlog is limited to 100 connections
    *** Operational MODE: single process ***
    WSGI application 0 (mountpoint='') ready on interpreter 0x91c9b78 pid: 3717 (default app)
    *** uWSGI is running in multiple interpreter mode ***
    spawned uWSGI worker 1 (and the only) (pid: 3717, cores: 1)
    Traceback (most recent call last):
    File "/usr/local/lib/python2.7/dist-packages/web.py-0.36-py2.7.egg/web/application.py", line 237, in process
    return self.handle()
    File "/usr/local/lib/python2.7/dist-packages/web.py-0.36-py2.7.egg/web/application.py", line 228, in handle
    return self._delegate(fn, self.fvars, args)
    File "/usr/local/lib/python2.7/dist-packages/web.py-0.36-py2.7.egg/web/application.py", line 409, in _delegate
    return handle_class(cls)
    File "/usr/local/lib/python2.7/dist-packages/web.py-0.36-py2.7.egg/web/application.py", line 385, in handle_class
    return tocall(*args)
    TypeError: GET() takes exactly 1 argument (2 given)

    [pid: 3717|app: 0|req: 1/1] 60.55.159.142 () {40 vars in 638 bytes} [Mon Oct 24 17:13:46 2011] GET / => generated 30432 bytes in 81 msecs (HTTP/1.1 500) 1 headers in 63 bytes (2 switches on core 0)

    Reply

    1. Dante

      Dante on #

      web.py 我只是试了一下,现在基本不用这个框架了

      看报错是GET函数的参数不对。

      Reply

      1. ara

        ara on #

        晕倒了,居然要这样才可以
        def GET(self,name):
        基本上网上的例子都是没有name的,非常感谢

        最后请教一下现在您在用哪个python的框架?哪个python框架适合新手入门?谢谢

        Reply

        1. Dante

          Dante on #

          我用两个框架
          django --适合中型项目
          bottle -- 适合小型项目和大型项目

          Reply

  6. shandy

    shandy on #

    django和uwsgi及nginx,是每个都要单独启动?

    Reply

    1. Dante

      Dante on #

      uwsgi和nginx都需要单独启动。。。

      Reply

      1. shandy_li

        shandy_li on #

        django是靠uwsgi来启动还是要单独启动?

        Reply

  7. fjctlzy

    fjctlzy on #

    你知道如果后端uwsgi抛出exception的时候前端nginx会显示502,我如果想限制uwsgi具体的报错信息怎么办(方便调试)

    Reply

    1. Dante

      Dante on #

      没明白,你是说不要显示nginx默认的错误页面还是要显示?

      Reply

  8. 陈仁义

    陈仁义 on #

    想请教一下,照着web.py的配置,创建了上面列出的index.py文件,访问后提示“Internal Server Error”,有什么修正的建议吗?

    Reply

    1. Dante

      Dante on #

      打开debug模式,看一下报错信息

      Reply

发表评论