jdv12
jdv12

Reputation: 171

ssl with django gunicorn and nginx

I am currently working on deploying my project over https however I am running into some issues. I have it working with http but when I try to incorporate the ssl it breaks. I think I am misconfiguring the gunicorn upstream client in my nginx block but I am uncertain. Could the issue be in the unix binding in my gunicorn service file? I am very new to gunicorn so I'm a little lost.

Here is my configuration below.

Gunicorn:

[Unit]
Description=gunicorn daemon
After=network.target

[Service]
Environment=PYTHONHASHSEED=random
User=USER
Group=www-data
WorkingDirectory=/path/to/project
ExecStart=/path/to/project/project_env/bin/gunicorn --workers 3 --bind unix:/path/to/project/project.sock project.wsgi:application

[Install]
WantedBy=multi-user.target

Nginx (working-http):

server {
    listen 80 default_server;
    listen [::]:80 default_server;
    server_name server_domain;

    location = /favicon.ico { access_log off; log_not_found off; }

    location /static/ {
        root /path/to/project;

    }

    location / {
        include proxy_params;
        proxy_pass http://unix:/path/to/project/project.sock;
    }

}

Nginx (https):

upstream server_prod {
  server unix:/path/to/project/project.sock fail_timeout=0;
}

server {
        listen 80 default_server;
        listen [::]:80 default_server;
        server_name server_domain;

}

server {
    server_name server_domain;

    listen 443; 

    ssl on;
    ssl_certificate /etc/ssl/server_domain.crt; 
    ssl_certificate_key /etc/ssl/server_domain.key; 

    location /static/ {
    root /path/to/project;

    }

    location / {
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto https; 
        proxy_set_header Host $http_host;
        proxy_redirect off;

        if (!-f $request_filename) {
            proxy_pass http://server_prod;
            break;
        }
    }
}

Upvotes: 2

Views: 5321

Answers (1)

Pablo M
Pablo M

Reputation: 241

Your gunicorn systemd unit file seems OK. Your nginx is generally OK too. You have posted too little info to get an appropriate diagnostic. I'm guessing you are missing passing the X-Forwarded-Proto header to gunicorn, but it could be something else. Here's an nginx configuration file that works for me:

upstream gunicorn{
    # 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).

    # for UNIX domain socket setups:

    server unix:/path/to/project/project.sock fail_timeout=0;

    # for TCP setups, point these to your backend servers
    # server 127.0.0.1:9000 fail_timeout=0;
}
server {
    listen 80;
    listen 443 ssl http2;
    server_name server_domain;
    ssl_certificate /etc/ssl/server_domain.crt; 
    ssl_certificate_key /etc/ssl/server_domain.key; 



    # path for static files
    root /path/to/collectstatic/dir;

    location / {
      # checks for static file, if not found proxy to app
      try_files $uri @proxy_to_app;
    }

    location @proxy_to_app {
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

        # When Nginx is handling SSL it is helpful to pass the protocol information
        # to Gunicorn. Many web frameworks use this information to generate URLs.
        # Without this information, the application may mistakenly generate http
        # URLs in https responses, leading to mixed content warnings or broken
        # applications. In this case, configure Nginx to pass an appropriate header:
        proxy_set_header X-Forwarded-Proto $scheme;

        # 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;


        # Try to serve static files from nginx, no point in making an
        # *application* server like Unicorn/Rainbows! serve static files.
        proxy_pass http://gunicorn;
    }


}

Upvotes: 2

Related Questions