Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Django, Virtualenv, nginx + uwsgi import module wsgi error

Im trying to setup my django project on a staging server with nginx, virtualenv, and uwsgi, but I keep getting an import module wsgi error.

If theres a community I can find an answer is here... Thank you all in advance.

This are my configuration files:

uwsgi.py on my django project:

import os
import sys 
import site

site.addsitedir(os.path.join(os.environ['WORKON_HOME'],'project/lib/python2.6/site-packages'))
sys.path.append(os.path.abspath(os.path.dirname(__file__)))
sys.path.append(os.path.join(os.path.realpath(os.path.dirname(__file__)), '../../../'))
sys.path.append(os.path.join(os.path.realpath(os.path.dirname(__file__)), '../../'))

os.environ['DJANGO_SETTINGS_MODULE'] = 'project.configs.staging.settings'

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

Nginx Configuration

# nginx configuration for project.maumercado.com

server {
    server_name project.maumercado.com;
    access_log /home/ubuntu/logs/project/nginx/access.log;
    error_log /home/ubuntu/logs/project/nginx/error.log;

    location / {
            uwsgi_pass unix:/tmp/uwsgi.sock;
            include /etc/nginx/uwsgi_params;
    }

    location /static {
            root /home/ubuntu/django-projects/project/project/media;
    }
    location /media {
            root /home/ubuntu/django-projects/project/project/media;
    }
}

and, my uwsgi.conf

# file: /etc/init/uwsgi.conf 
description "uWSGI starter"

start on (local-filesystems and runlevel [2345])
stop on runlevel [016]

respawn

# home - is the path to our virtualenv directory
# pythonpath - the path to our django application
# module - the wsgi handler python script

exec /home/ubuntu/ve/project/bin/uwsgi \
--uid www-data \
--pythonpath /home/ubuntu/django-projects/project/project/configs/staging/ \
--socket /tmp/uwsgi.sock \
--chmod-socket \
--module wsgi \
--logdate \
--optimize 2 \
--processes 2 \
--master \
--logto /home/ubuntu/logs/project/uwsgi.log

Nginx logs does not state anything besides a 500 in access.log, so heres the uwsgi.log:

Mon Feb  6 13:58:23 2012 - *** Starting uWSGI 1.0.2.1 (32bit) on [Mon Feb  6 13:58:23 2012] ***
Mon Feb  6 13:58:23 2012 - compiled with version: 4.4.5 on 06 February 2012 12:32:36
Mon Feb  6 13:58:23 2012 - current working directory: /
Mon Feb  6 13:58:23 2012 - detected binary path: /home/ubuntu/ve/project/bin/uwsgi
Mon Feb  6 13:58:23 2012 - setuid() to 1000
Mon Feb  6 13:58:23 2012 - your memory page size is 4096 bytes
Mon Feb  6 13:58:23 2012 - chmod() socket to 666 for lazy and brave users
Mon Feb  6 13:58:23 2012 - uwsgi socket 0 bound to UNIX address /tmp/uwsgi.sock fd 3
Mon Feb  6 13:58:23 2012 - Python version: 2.6.6 (r266:84292, Sep 15 2010, 16:02:57)  [GCC 4.4.5]
Mon Feb  6 13:58:23 2012 - Set PythonHome to /home/ubuntu/ve/project
Mon Feb  6 13:58:23 2012 - Python main interpreter initialized at 0x9a9d740
Mon Feb  6 13:58:23 2012 - your server socket listen backlog is limited to 100 connections
Mon Feb  6 13:58:23 2012 - *** Operational MODE: preforking ***
Mon Feb  6 13:58:23 2012 - added /home/ubuntu/django-projects/project/ to pythonpath.
ImportError: No module named wsgi
Mon Feb  6 13:58:23 2012 - unable to load app 0 (mountpoint='') (callable not found or import error)
Mon Feb  6 13:58:23 2012 - *** no app loaded. going in full dynamic mode ***
Mon Feb  6 13:58:23 2012 - *** uWSGI is running in multiple interpreter mode ***
Mon Feb  6 13:58:23 2012 - spawned uWSGI master process (pid: 551)
Mon Feb  6 13:58:23 2012 - spawned uWSGI worker 1 (pid: 588, cores: 1)
Mon Feb  6 13:58:23 2012 - spawned uWSGI worker 2 (pid: 589, cores: 1)

I don't know if the way I set up my project has anything to do with it, but anyways heres the manage file that I use to redirect django utilities:

manage.sh

#!/bin/bash

python ./project/configs/${DEPLOYMENT_TARGET:="common"}/manage.py $*

and just in case this is how I have set up a django project:

project
|-manage.sh -> this fellow is redirected to settings.py (production, common or staging)
|-requirements.txt
|-README
|-dashbard.py
|-project.sqlite
|- project/
    |- apps
        |- accounts
        |-other internal apps
    |- configs 
        |- common -> for local development
            |-settings.py
            |-manage.py
            |-urls
        |-staging
            |-manage.py
            |-settings.py
            |-wsgi.py
            |-logging.conf
        |-production
            |-manage.py
            |-settings.py
            |-wsgi.py
            |-logging.conf
    |-media
    |-templates
like image 632
maumercado Avatar asked Feb 06 '12 16:02

maumercado


2 Answers

I updated wsgi.py to look like this:

import os
import sys
import site

site.addsitedir(os.path.join('/home/ubuntu/ve','project/lib/python2.6/site-packages'))
sys.path.append(os.path.abspath(os.path.dirname(__file__)))
sys.path.append(os.path.join(os.path.realpath(os.path.dirname(__file__)), '../../../'))
sys.path.append(os.path.join(os.path.realpath(os.path.dirname(__file__)), '../../'))

os.environ['DJANGO_SETTINGS_MODULE'] = 'project.configs.staging.settings'

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

My uwsgi.conf file now looks like this:

# file: /etc/init/uwsgi.conf
description "uWSGI starter"

start on (local-filesystems and runlevel [2345])
stop on runlevel [016]

respawn

# home - is the path to our virtualenv directory
# pythonpath - the path to our django application
# module - the wsgi handler python script

exec /home/ubuntu/ve/project/bin/uwsgi \
--uid ubuntu \
--pythonpath /home/ubuntu/django-projects/project/project/configs/staging \
-H /home/ubuntu/ve/project \
--socket /tmp/uwsgi.sock \
--chmod-socket 644 \
--module wsgi \
--logdate \
--optimize 2 \
--processes 2 \
--master \
--logto /home/ubuntu/logs/project/uwsgi.log

And my nginx site-available file looks like this:

# file: /etc/nginx/sites-available/yourdomain.com
# nginx configuration for project.maumercado.com

server {
        listen 80;
        charset utf-8;
        server_name project.maumercado.com;
        access_log /home/ubuntu/logs/project/nginx/access.log;
        error_log /home/ubuntu/logs/project/nginx/error.log;

        location ^~ /cache/ {
                root /home/ubuntu/django-projects/project/project/media;
                expires max;
        }

        location / {
                uwsgi_pass unix:/tmp/uwsgi.sock;
                include /etc/nginx/uwsgi_params;
        }
}

And its working perfect now, I had some problems with the styles because of strange characters being used like ñ in the css files.

Now I would like to know what should I do when I need to run more projects in the same server with uwsgi?

like image 52
maumercado Avatar answered Oct 31 '22 10:10

maumercado


be sure to add the directory containing the wsgi.py file to the pythonpath (you can specify an unlimited series of pythonpath directives)

like image 37
roberto Avatar answered Oct 31 '22 10:10

roberto