Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Serving a request from gunicorn

Trying to setup a server on Rackspace.com.

Have done the following things:

  • Installed Centos 6.3
  • Installed Python 2.7
  • Installed gunicorn using the "Quick Start" on their home page: gunicorn.org/

In the quick start, a "hello world" application seems to be initialized:

Create file "myapp.py":

(tutorial) $ vi myapp.py
(tutorial) $ cat myapp.py

Contents of "myapp.py"

def app(environ, start_response):
   data = "Hello, World!\n"
   start_response("200 OK", [
       ("Content-Type", "text/plain"),
       ("Content-Length", str(len(data)))
   ])
   return iter([data])

Since I know very little about servers, I do not know what to do next. I tried typing the server's IP address into the browser, but that seemed to result in a timeout.

I'm not sure if there is:

  • something else that needs to be installed. Nginx is mentioned under "deploy" on the gunicorn website. Looks like Nginx is a proxy server which is confusing to me because I thought gunicorn was a server. Not sure why I need two servers?
  • something that needs to be configured in gunicorn
  • something that needs to be configured on the server itself
  • something that else entirely that needs to be done in order to actually serve a request

What are the next steps?

Thanks so much!

like image 701
Chris Dutrow Avatar asked Oct 12 '12 12:10

Chris Dutrow


People also ask

How do I run Gunicorn as service?

Running sudo -u www-data curl --unix-socket /run/gunicorn. sock http , our Gunicorn service will be automatically started and you should see some HTML from your server in the terminal. systemd employs cgroups to track the processes of a service, so it doesn't need pid files.

Can Gunicorn be used for production?

Self-hosting Flask application with Gunicorn. Although Flask has a built-in web server, as we all know, it's not suitable for production and needs to be put behind a real web server able to communicate with Flask through a WSGI protocol. A common choice for that is Gunicorn—a Python WSGI HTTP server.

How many requests can Gunicorn handle?

Yes, with 5 worker processes, each with 8 threads, 40 concurrent requests can be served.

What is Gunicorn server?

gunicorn is a server for serving WSGI apps. Mainly, it manages worker processes that actually execute the web application. something that needs to be configured in gunicorn. something that needs to be configured on the server itself. something that else entirely that needs to be done in order to actually serve a request.

How do I tell Gunicorn that a request is secure?

These tell Gunicorn to set wsgi.url_scheme to https, so your application can tell that the request is secure. The dictionary should map upper-case header names to exact string values.

How to specify bind address and number of workers in Gunicorn?

For example, to specify the bind address and number of workers: New in version 19.7. Default: './gunicorn.conf.py' The Gunicorn config file.

Does Gunicorn support I/O bounded applications?

For I/O bounded apps use “pseudo-threads”. Gunicorn is a Python WSGI HTTP Server that usually lives between a reverse proxy (e.g., Nginx) or load balancer (e.g., AWS ELB) and a web application such as Django or Flask. Gunicorn implements a UNIX pre-fork web server.


1 Answers

since gunicorn is a Web server on your case Nginx will act as a back proxy passing the an HTTP request from Nginx to gunicorn.

So, I will put here the steps to take for a simple Nginx and Gunicorn configuration running on the same machine.

  • Starting with nginx configuration

Go to your /etc/nginx/nginx.conf and under the http{} make sure you have: include /etc/nginx/site-enabled/*;

http{
    # other configurations (...)
    include /etc/nginx/sites-enabled/*;
}

now, include a file on /etc/nginx/sites-enabled/mysite.conf where you will proxy your requests to your gunicorn app.

server {
    listen 80 default; # this means nginx will be 
                       # listening requests on port 80 and 
                       # this will be the default nginx server
    server_name localhost;

    # declare proxy params and values to forward to your gunicorn webserver
    proxy_pass_request_headers on;
    proxy_pass_request_body on;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_read_timeout 120s;

    location / {
        # here is where you declare that every request to / 
        # should be proxy to 127.0.0.1:8000 (which is where
        # your gunicorn will be running on)          
        proxy_pass_header Server;
        proxy_set_header Host $http_host;
        proxy_redirect off;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Scheme $scheme;
        proxy_connect_timeout 10;
        proxy_read_timeout 10;

        proxy_pass http://127.0.0.1:8000/; # the actual nginx directive to 
                                           # forward the request
    }
}

Ok, at this point all you have is an Nginx acting as a proxy where all the requests going to 127.0.0.1:80 will be passed to 127.0.0.1:8000.

  • Now is time to configure your Gunicorn webserver:

Usually the way I do I use a configuration file, Gunicorn config file can be an ordinary python file. So now, create a file at any location you like, I will assume this file will be /etc/gunicorn/mysite.py

workers = 3              # number of workers Gunicorn will spawn 

bind = '127.0.0.1:8000'  # this is where you declare on which address your 
                         # gunicorn app is running.
                         # Basically where Nginx will forward the request to

pidfile = '/var/run/gunicorn/mysite.pid' # create a simple pid file for gunicorn. 

user = 'user'          # the user gunicorn will run on

daemon = True          # this is only to tell gunicorn to deamonize the server process

errorlog = '/var/log/gunicorn/error-mysite.log'    # error log

accesslog = '/var/log/gunicorn/access-mysite.log'  # access log

proc_name = 'gunicorn-mysite'            # the gunicorn process name

Ok, all set in configuration. Now all you have to do its to start the servers.

Starting the gunicorn and telling it which app to use and which config file. from the command line and the folder where your myapp.py file is located run:

gunicorn -c /etc/gunicorn/mysite.py mysite:app

Now, only start nginx.

/etc/init.d/nginx start 

or

service nginx start

Hope this helps.

like image 118
andrefsp Avatar answered Sep 21 '22 01:09

andrefsp