What is gunicorn.sock?

I am new to Michal Karzinsky's django shooting tutorial. I am using Django 1.7.4 on Ubuntu 14 and my setup for shooting script is as follows

#!/bin/bash NAME="mytestapp" # Name of the application DJANGODIR=/var/www/testapp/src # Django project directory SOCKFILE=/var/www/testapp/run/gunicorn.sock # we will communicte using this unix socket USER=ubuntu # the user to run as GROUP=ubuntu # the group to run as NUM_WORKERS=3 # how many worker processes should Gunicorn spawn DJANGO_SETTINGS_MODULE=testapp.settings # which settings file should Django use DJANGO_WSGI_MODULE=testapp.wsgi # WSGI module name echo "Starting $NAME as `whoami`" # Activate the virtual environment cd $DJANGODIR export DJANGO_SETTINGS_MODULE=$DJANGO_SETTINGS_MODULE export PYTHONPATH=$DJANGODIR:$PYTHONPATH # Create the run directory if it doesn't exist RUNDIR=$(dirname $SOCKFILE) test -d $RUNDIR || mkdir -p $RUNDIR # Start your Django Unicorn # Programs meant to be run under supervisor should not daemonize themselves (do not use --daemon) exec gunicorn ${DJANGO_WSGI_MODULE}:application \ --name $NAME \ --workers $NUM_WORKERS \ --user=$USER --group=$GROUP \ --bind=0.0.0.0:8000 \ --log-level=debug \ --log-file=- 

When I change the binding setting to unix: $ SOCKFILE, my script is still working, but I cannot connect to my browser. In this question, I read that it is not wise to deploy 0.0.0.0:8000 on a production server.

I am a little versed in unix sockets, but I don’t know how I can use the unix socket file to serve my site. I tried to edit the socket file as root, but the OS does not allow me to open it.

How to configure a socket file so that I can serve my pages?

PS: Here is my nginx configuration file

 upstream hello_app_server { # fail_timeout=0 means we always retry an upstream even if it failed # to return a good HTTP response (in case the Unicorn master nukes a # single worker for timing out). server 127.0.0.1:8000 fail_timeout=0; } server { listen 80; server_name test.com; client_max_body_size 4G; access_log /var/www/testapp/src/logs/nginx-access.log; error_log /var/www/testapp/src/logs/nginx-error.log; location /static/ { alias /var/www/testapp/src/static/static_dirs/; } location /media/ { alias /var/www/testapp/src/static/media/; } location / { # an HTTP header important enough to have its own Wikipedia entry: # http://en.wikipedia.org/wiki/X-Forwarded-For proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # enable this if and only if you use HTTPS, this helps Rack # set the proper protocol for doing redirects: # proxy_set_header X-Forwarded-Proto https; # pass the Host: header from the client right along so redirects # can be set properly within the Rack application proxy_set_header Host $http_host; # we don't want nginx trying to do something clever with # redirects, we set the Host: header above already. proxy_redirect off; # set "proxy_buffering off" *only* for Rainbows! when doing # Comet/long-poll stuff. It also safe to set if you're # using only serving fast clients with Unicorn + nginx. # Otherwise you _want_ nginx to buffer responses to slow # clients, really. # proxy_buffering off; # Try to serve static files from nginx, no point in making an # *application* server like Unicorn/Rainbows! serve static files. if (!-f $request_filename) { proxy_pass http://hello_app_server; break; } } # Error pages error_page 500 502 503 504 /500.html; location = /500.html { root /var/www/testapp/src/static/; } } 
+8
unix django nginx sockets gunicorn
source share
2 answers

You have to use a reverse proxy like nginx to sit in front of the canary, and this is what actually serves your site. They exchange data through a socket.

The gunicorn files have a sample nginx configuration that does just that, although it is obvious that you must make the sockfile match what you put in your gun configuration.

+3
source share

Sockets are a much more efficient and effective alternative to network ports if you work locally on a server. However, if your nginx server and your django application are on different servers, you will need to open certain ip connections.

For your example, if you want to use sockets, you just need to specify the address of the upstream server in the socket file. Change nginx configuration as

 upstream hello_app_server { # fail_timeout=0 means we always retry an upstream even if it failed # to return a good HTTP response (in case the Unicorn master nukes a # single worker for timing out). server unix:/var/www/testapp/run/gunicorn.sock fail_timeout=0; } server { . . . # Rest of your file... 
+2
source share

All Articles