Настройка SSL в nginx

  • Опубликовано:
Создание ключей и сертификатов описывать не буду, процедура стандартная, везде описана и у меня получилась с первого раза. Однако Nginx (за которым работает Gunicorn) долго не хотел заводиться, поэтому приведу здесь базовую конфигурацию.

server {
    listen 80;
    server_name www.domain.com;
    rewrite ^ http://domain.com$request_uri? permanent;
}

server {
    listen 80;
    server_name domain.com;
    root /home/django/project;
    
    location / {
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header Host $http_host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Scheme $scheme;
        proxy_pass http://127.0.0.1:8006/;
    }
    
    error_page 500 502 503 504 /media/50x.html;
}

server {
    listen 443;
    ssl on;
    ssl_certificate /etc/ssl/certs/project.crt;
    ssl_certificate_key /etc/ssl/private/project.key;
    keepalive_timeout 70;
    
    server_name domaiin.com www.domain.com;
    root /home/django/project;

    # без этого 301 переадресация не работала
    if ($http_host != "domain.com") {
        rewrite ^ $scheme://domain.com$request_uri permanent;
    }
    
    location / {
        proxy_pass http://127.0.0.1:8006;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Ssl on;
    }
}
Обращаем внимание на переадресацию сервера с www, который надо направить на нужный протокол. Такой rewrite не будет работать:
server {
    listen 443;
    server_name www.domain.com;
    rewrite ^ http://domain.com$request_uri? permanent;
}
Помогла конструкция:
if ($http_host != "domain.com") {
        rewrite ^ $scheme://domain.com$request_uri permanent;
    }
Либо $scheme заменить на https.