Search code examples
gunicornsystemdsanicuvloop

How to configure ExecStart for Gunicorn without WSGI?


Systemd and Gunicorn require a wsgi file of some sort as the last arg to ExecStart: http://docs.gunicorn.org/en/latest/deploy.html?highlight=ExecStart#systemd

With Django, this was in the main module as wsgi.py:

ExecStart=/home/admin/django/bin/gunicorn --config /home/admin/src/gunicorn.py --bind unix:/tmp/api.sock myapp.wsgi

But this file obviously doesn't exist when using Sanic and uvloop (I believe the new protocol is called ASGI). I tried substituting it for app.py which unsurprisingly didn't work:

ExecStart=/home/admin/sanic/bin/gunicorn --config /home/admin/src/gunicorn.py --bind unix:/tmp/api.sock myapp.app

How should this parameter be configured when using Sanic?


Solution

  • If you want to start sanic with systemd, why don't you used supervisrod: Supervisord.

    Boot -> Systemd -> supervisord -> gunicorn -> sanic

    [unix_http_server]
    file=/tmp/supervisor.sock                       ; path to your socket file
    
    [supervisord]
    logfile=/var/log/supervisord/supervisord.log    ; supervisord log file
    logfile_maxbytes=50MB                           ; maximum size of logfile before rotation
    logfile_backups=10                              ; number of backed up logfiles
    loglevel=error                                  ; info, debug, warn, trace
    pidfile=/var/run/supervisord.pid                ; pidfile location
    nodaemon=false                                  ; run supervisord as a daemon
    minfds=1024                                     ; number of startup file descriptors
    minprocs=200                                    ; number of process descriptors
    user=root                                       ; default user
    childlogdir=/var/log/supervisord/               ; where child log files will live
    
    [rpcinterface:supervisor]
    supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface
    
    [supervisorctl]
    serverurl=unix:///tmp/supervisor.sock         ; use a unix:// URL  for a unix socket
    
    [program:ctrlapi]
    directory=/home/ubuntu/api
    command=/home/ubuntu/api/venv3/bin/gunicorn api:app --bind 0.0.0.0:8000 --worker-class sanic.worker.GunicornWorker -w 2
    stderr_logfile = log/api_stderr.log
    stdout_logfile = log/api_stdout.log