===================================
How to do with Nginx with Gunicorn?
===================================

Green Unicorn (gunicorn) is an HTTP/WSGI server designed to serve fast clients 
or sleepy applications. That is to say; behind a buffering front-end server 
such as nginx or lighttpd.

By default, gunicorn will listen on 127.0.0.1. Navigate to jam App folder, or 
use (ie in scripts, cron job, etc)

.. code-block:: console

  python /usr/bin/gunicorn --chdir /path/to/jam/App wsgi 
    
or from /path/to/jam/App:

.. code-block:: console

  gunicorn wsgi
  [2018-04-13 15:01:44 +0000] [8650] [INFO] Starting gunicorn 19.4.5
  [2018-04-13 15:01:44 +0000] [8650] [INFO] Listening at: http://127.0.0.1:8000 (8650)
  [2018-04-13 15:01:44 +0000] [8650] [INFO] Using worker: sync
  [2018-04-13 15:01:44 +0000] [8654] [INFO] Booting worker with pid: 8654
  .
  .  
  
To start jam.py on all interfaces and port 8081:

.. code-block:: console

  gunicorn -b 0.0.0.0:8081 wsgi
  [2018-04-13 15:03:34 +0000] [8680] [INFO] Starting gunicorn 19.4.5
  [2018-04-13 15:03:34 +0000] [8680] [INFO] Listening at: http://0.0.0.0:8081 (8680)
  [2018-04-13 15:03:34 +0000] [8680] [INFO] Using worker: sync
  [2018-04-13 15:03:34 +0000] [8684] [INFO] Booting worker with pid: 8684
  .
  .
  
Spin up 5 workers if u like with --workers=5

Nginx: 

comment out default location in /etc/nginx/sites-enabled/default (Linux Mint):

.. code-block:: nginx

  	#location / {
  		# First attempt to serve request as file, then
  		# as directory, then fall back to displaying a 404.
  #		try_files $uri $uri/ =404;
  #	}
and add:

.. code-block:: nginx

   # Proxy connections to the application servers
    # app_servers
    location / {
  
        proxy_pass         http://app_servers;
        proxy_redirect     off;
        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_set_header   X-Forwarded-Host $server_name;
  
    }
    
add in /etc/nginx/nginx.conf 127.0.0.1:8081 if this is your Gunicorn server address and port:

.. code-block:: nginx

  # Configuration containing list of application servers
  upstream app_servers {
  server 127.0.0.1:8081;
  }
        
This also enables to have different App servers on different ports

.. code-block:: console
  
  Client Request ----> Nginx (Reverse-Proxy)
                          |
                         /|\                           
                        | | `-> App. Server I.   127.0.0.1:8081
                        |  `--> App. Server II.  127.0.0.1:8082
                         `----> App. Server III. 127.0.0.1:8083
                         
Restart nginx and viola!

Congratulations! We can now test Nginx with Jam.py.

Now, certs:

in /etc/nginx/sites-enabled/jam
we can have something like this to pass everything from http to https to 8001 
port (or any other as per above):

.. code-block:: nginx

  server {
  	listen 80;
  	server_name YOUR_SERVER;
  	
  	access_log off;
  
  	location /static/ {
  		alias /path/to/jam/App/static/;
  	}
  
  	location / {
  		proxy_pass http://127.0.0.1:8001;
  		proxy_set_header X-Forwarded-Host $server_name;
  		proxy_set_header X-Real-IP $remote_addr;
  		add_header P3P 'CP="ALL DSP COR PSAa PSDa OUR NOR ONL UNI COM NAV"';
  	}
  
  	return 301 https://$server_name$request_uri;
  }
  server {
  	listen 443;
  	server_name YOUR_SERVER_FQDN;
  
  	access_log off;
  
  	location /static/ {
  		alias /path/to/jam/App/static/;
  	}
  
  	location = /favicon.ico {
  		alias /path/to/jam/App/favicon.ico;
  	}
  
  
  	ssl on;
  	ssl_certificate /etc/nginx/ssl/YOUR_SERVER.crt;
  	ssl_certificate_key /etc/nginx/ssl/YOUR_SERVER.key;
  	add_header Strict-Transport-Security "max-age=31536000";
  
  	location / {
  		client_max_body_size 10M;
  		proxy_pass http://127.0.0.1:8001;
  		proxy_set_header X-Forwarded-Host $server_name;
  		proxy_set_header X-Real-IP $remote_addr;
  		add_header P3P 'CP="ALL DSP COR PSAa PSDa OUR NOR ONL UNI COM NAV"';
  }

That's it!

Congratulations! We can now test Nginx with Jam.py on https port!

*This was initialy published by Dražen Babić on* https://github.com/jam-py/jam-py/issues/67