uWSGI + nginx for django project, error with strting uwsgi

19,684

Solution 1

unix sockets must obey to file permission schemes. So /var/run must be writable by www-data and nginx must be able to read/write /var/run/uwsgi.sock

If you are not familiar with this kind of things, you should use tcp sockets (choose a port and you are ready)

Solution 2

how set version of python for uwsgi?

Set option plugins in uwsgi settings:

[uwsgi]
...
plugins = python27
...
Share:
19,684
Admin
Author by

Admin

Updated on June 15, 2022

Comments

  • Admin
    Admin almost 2 years

    I try to up webserver for django on nginx+uwsgi, os - debian (3.1.0-1-amd64 x86_64) nginx 1.1.8-1, uwsgi 0.9.8.3-1 configuration:

    <uwsgi>
    <socket>/tmp/uwsgi.sock</socket>
    <process>1</process>
    <master/>
    <enable-threads/>
    <uid>33</uid>
    <gid>33</gid>
    <pidfile>/tmp/uwsgi.pid</pidfile>
    </uwsgi>
    

    in file /etc/uwsgi/apps-enabled/webapp.xml nginx configuration

    location / {
            uwsgi_pass unix:///tmp/uwsgi.sock;
            include uwsgi_params;
            uwsgi_param UWSGI_SCRIPT webapp;
            uwsgi_param UWSGI_CHDIR  /data/web/webapp/webapp;
        }
    

    all projet in /data/web/webapp/webapp/, here setting.py, urls ect. in /data/web/webapp/webapp/webapp.py

    import sys, os
    import django.core.handlers.wsgi
    sys.path.insert(0, '/data/web/webapp/webapp')
    os.environ['DJANGO_SETTINGS_MODULE'] = 'settings'
    application = django.core.handlers.wsgi.WSGIHandler()
    

    uid and gid 33 it is www-data user try run uwsgi as

    root#uwsgi -s /var/run/uwsgi.sock -x /etc/uwsgi/apps-enabled/webapp.xml

    [uWSGI] parsing config file /etc/uwsgi/apps-enabled/webapp.xml
    *** Starting uWSGI 0.9.8.3-debian (64bit) on [Wed Dec 14 21:42:02 2011] ***
    compiled with version: 4.6.1 on 27 July 2011 18:25:51
    writing pidfile to /tmp/uwsgi.pid
    uWSGI running as root, you can use --uid/--gid/--chroot options
    setgid() to 33
    setuid() to 33
    your memory page size is 4096 bytes
    unlink(): Permission denied [socket.c line 38]
    bind(): Address already in use [socket.c line 70]
    

    how permission they want? and what's the problem.. if i run uwsgi as root error is gone, and i see

     *** WARNING: you are running uWSGI as root !!! (use the --uid flag) *** 
    your memory page size is 4096 bytes
    uwsgi socket 0 bound to UNIX address /var/run/uwsgi.sock fd 3
    uwsgi socket 1 bound to UNIX address /tmp/uwsgi.sock fd 4
    your server socket listen backlog is limited to 100 connections
    *** Operational MODE: single process ***
    *** no app loaded. going in full dynamic mode ***
    *** uWSGI is running in multiple interpreter mode ***
    spawned uWSGI master process (pid: 20732)
    spawned uWSGI worker 1 (pid: 20733, cores: 1)
    

    but when i try to access the server, ngix returns 502 error page. And more: permission error in nginx logs:

     2011/12/14 21:57:17 [crit] 20739#0: *1 connect() to unix:///tmp/uwsgi.sock failed (13: Permission denied) while connecting to upstream, client: 10.10.3.111, server: ******, request: "GET /favicon.ico HTTP/1.1", upstream: "uwsgi://unix:///tmp/uwsgi.sock:", host: "****.****.**"
    

    if change owner of /tmp/uwsgi.sock to nginix user in runtime (www-data), he wrote other logs

    [error] 20739#0: *21 upstream prematurely closed connection while reading response header from upstream,
    

    but still error 502 (

    how solving this problem? some one can help me.. really want to use nginx+uwsgi instead of apache. thanks


    however, solution is near :) I use tcp socket now and more, change uwsgi configuration and installed a few more packages. was an important option --autoload. now uwsgi has configuration like this:

    <uwsgi>
    <module>webapp</module>
    <socket>127.0.0.1:5080</socket>
    <pythonpath>/data/web/webapp/webapp</pythonpath>
    <autoload/>
    <daemonize>/var/log/uwsgi_webapp.log</daemonize>
    <processes>1</processes>
    <uid>33</uid>
    <gid>33</gid>
    <enable-threads/>
    <master/>
    <harakiri>120</harakiri>
    <max-requests>5000</max-requests>
    </uwsgi>
    

    remains to solve other problem.. uwsgi use not main system python version >_<

    option "pythonpath" found in plugin python26_plugin.so
    *** Starting uWSGI 0.9.8.3-debian (64bit) on [Thu Dec 15 22:52:23 2011] ***
    compiled with version: 4.6.1 on 27 July 2011 18:25:51
    uWSGI running as root, you can use --uid/--gid/--chroot options
    setgid() to 33
    setuid() to 33
    your memory page size is 4096 bytes
     *** WARNING: you have enabled harakiri without post buffering. Slow upload could be rejected on post-unbuffered webservers *** 
    uwsgi socket 0 bound to TCP address 127.0.0.1:5080 fd 4
    Python version: 2.6.7 (r267:88850, Aug  3 2011, 12:02:14)  [GCC 4.6.1]
    Python main interpreter initialized at 0xc47df0
    threads support enabled
    your server socket listen backlog is limited to 100 connections
    *** Operational MODE: single process ***
    added /data/web/webapp/webapp/ to pythonpath.
    WSGI application 0 (SCRIPT_NAME=) ready on interpreter 0xc47df0 pid: 22983 (default app)
    *** uWSGI is running in multiple interpreter mode ***
    spawned uWSGI master process (pid: 22983)
    spawned uWSGI worker 1 (pid: 22984, cores: 1)
    

    he use python 2.6.7 but main system version is 2.7.2 and all python modules installed for this, so a lot of errors in the log - repeated attempts to import non-existent, one of many typical error:

      File "/usr/lib/python2.6/dist-packages/django/db/__init__.py", line 78, in <module>
        connection = connections[DEFAULT_DB_ALIAS]
      File "/usr/lib/python2.6/dist-packages/django/db/utils.py", line 93, in __getitem__
        backend = load_backend(db['ENGINE'])
      File "/usr/lib/python2.6/dist-packages/django/db/utils.py", line 51, in load_backend
        raise ImproperlyConfigured(error_msg)
    django.core.exceptions.ImproperlyConfigured: 'django_mongodb_engine' isn't an available database backend. 
    Try using django.db.backends.XXX, where XXX is one of:
        'dummy', 'mysql', 'oracle', 'postgresql', 'postgresql_psycopg2', 'sqlite3'
    Error was: No module named django_mongodb_engine.base
    

    so.. how set version of python for uwsgi?