django gunicorn sock file not created by wsgi

33,149

Solution 1

I had to change the permissions of my sock folder:

sudo chown ben:www-data /home/ben/myproject/

Another thing is that I have changed the sock location after reading in many post that it's not a good pratice to keep the sock file in the django project. My new location is:

/home/ben/run/

Don't forget to change permissions:

sudo chown ben:www-data /home/ben/run/

To be sure that gunicorn is refreshed, run these commands:

pkill gunicorn
sudo systemctl daemon-reload
sudo systemctl start gunicorn

That will kill the gunicorn processes and start new ones.

You can run this command to make the process start at server boot:

sudo systemctl enable gunicorn

All works well now.

Solution 2

While the accepted answer works, there is one (imo major) issue with it, which is that the gunicorn web server is (probably) running as root, which is not recommended. The reason you end up needing to chown the socket is because it is owned by root:root, because that is the user/group your init job assumes by default. There are multiple ways to get your job to assume another role. As of this time (with gunicorn 19.9.0), in my opinion, the simplest solution to this is to use the --user and --group flags provided as part of the gunicorn command. This means your server can start with the user/group you specify. In your case:

exec gunicorn --user ben --group www-data --bind unix:/home/ben/myproject/myproject.sock -m 007 wsgi

will start gunicorn under ben:www-data user and create a socket owned by ben:www-data with the permissions 770, or read/write/execute privilege for the user ben and group www-data on the socket, which is exactly what you ned in this case.

Share:
33,149
Ben
Author by

Ben

I'm a game developer (Unity, BennuGD, Div Game Studio) I'm a professional web developer (Angular) I'm a professional mobile app developer (Xamarin Forms)

Updated on July 05, 2022

Comments

  • Ben
    Ben almost 2 years

    I have a basic django rest application in my digital ocean server (Ubuntu 16.04) with a local virtual environment. The basic wsgi.py is:

    import os
    
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "workout_rest.settings")
    
    # This application object is used by any WSGI server configured to use this
    # file. This includes Django's development server, if the WSGI_APPLICATION
    # setting points here.
    from django.core.wsgi import get_wsgi_application
    application = get_wsgi_application()
    
    # Apply WSGI middleware here.
    # from helloworld.wsgi import HelloWorldApplication
    # application = HelloWorldApplication(application)
    

    I have followed step by step this tutorial: https://www.digitalocean.com/community/tutorials/how-to-set-up-django-with-postgres-nginx-and-gunicorn-on-ubuntu-16-04

    When I test Gunicorn's ability to serve the project with this command: gunicorn --bind 0.0.0.0:8000 myproject.wsgi:application All works well.

    So I've tried to setup Gunicorn to use systemd service file. My /etc/systemd/system/gunicorn.service file is:

    [Unit]
    Description=gunicorn daemon
    After=network.target
    
    [Service]
    User=ben
    Group=www-data
    WorkingDirectory=/home/ben/myproject
    ExecStart=/home/ben/myproject/myprojectenv/bin/gunicorn --workers 3 --bind unix:/home/ben/myproject/myproject.sock myproject.wsgi:application
    
    [Install]
    WantedBy=multi-user.target
    

    My Nginx configuration is:

    server {
        listen 8000;
        server_name server_domain_or_IP;
    
        location = /favicon.ico { access_log off; log_not_found off; }
        location /static/ {
            root /home/ben/myproject;
        }
    
        location / {
            include proxy_params;
            proxy_pass http://unix:/home/ben/myproject/myproject.sock;
        }
    }
    

    I've changed listen port from 80 to 8000 because 80 give me a err_connection_refused error. After starting the server with this command:

    sudo systemctl restart nginx
    

    When I try to run my website, I get an 502 Bad Gateway error. I've tried these commands (found on the tutorial comments):

    sudo systemctl daemon-reload
    sudo systemctl start gunicorn
    sudo systemctl enable gunicorn
    sudo systemctl restart nginx
    

    but nothing changes. When I take a look at the Nginix logs with this command:

    sudo tail -f /var/log/nginx/error.log
    

    I can read that sock file doesn't exists:

    2016/10/07 09:00:18 [crit] 24974#24974: *1 connect() to unix:/home/ben/myproject/myproject.sock failed (2: No such file or directory) while connecting to upstream, client: 86.197.20.27, server: 139.59.150.116, request: "GET / HTTP/1.1", upstream: "http://unix:/home/ben/myproject/myproject.sock:/", host: "server_ip_adress:8000"
    

    Why this sock file isn't created? How can I configure django/gunicorn to create this file? I have added gunicorn in my INSTALLED_APP in my Django project but it doesn't change anything.

    EDIT:

    When I test the nginx config file with nginx -t I get an error: open() "/run/nginx.pid" failed (13: Permission denied). But if I run the command with sudo: sudo nginx -t, the test is successful. Does that mean that I have to allow 'ben' user to run Ngnix?

    About gunicorn logfile, I cannot find a way to read them. Where are they stored?

    When I check whether gunicorn is running by using ps aux | grep gunicorn:

    ben      26543  0.0  0.2  14512  1016 pts/0    S+   14:52   0:00 grep --color=auto gunicorn
    

    Here is hat happens when you run the systemctl enable and start commands for gunicorn:

    sudo systemctl enable gunicorn
    Synchronizing state of gunicorn.service with SysV init with /lib/systemd/systemd-sysv-install...
    Executing /lib/systemd/systemd-sysv-install enable gunicorn
    
    sudo systemctl start gunicorn
    I get no output with this command
    
    sudo systemctl is-active gunicorn
    active
    
    sudo systemctl status gunicorn
    ● gunicorn.service - gunicorn daemon
       Loaded: loaded (/etc/systemd/system/gunicorn.service; enabled; vendor preset: enabled)
       Active: active (exited) since Thu 2016-10-06 15:40:29 UTC; 23h ago
    
    Oct 06 15:40:29 DevUsine systemd[1]: Started gunicorn.service.
    Oct 06 18:52:56 DevUsine systemd[1]: Started gunicorn.service.
    Oct 06 20:55:05 DevUsine systemd[1]: Started gunicorn daemon.
    Oct 06 20:55:17 DevUsine systemd[1]: Started gunicorn daemon.
    Oct 06 21:07:36 DevUsine systemd[1]: Started gunicorn daemon.
    Oct 06 21:16:42 DevUsine systemd[1]: Started gunicorn daemon.
    Oct 06 21:21:38 DevUsine systemd[1]: Started gunicorn daemon.
    Oct 06 21:25:28 DevUsine systemd[1]: Started gunicorn daemon.
    Oct 07 08:58:43 DevUsine systemd[1]: Started gunicorn daemon.
    Oct 07 15:01:22 DevUsine systemd[1]: Started gunicorn daemon.