2015-02-18 4 views
0

Я пытаюсь настроить SSL на Digital Ocean VPS с помощью Nginx. Мой сервер конф это так:SSL на Nginx вызывает цикл перенаправления

upstream unicorn { 


server unix:/home/ubuntu/apps/example/shared/sock/unicorn.example.sock fail_timeout=0; 
} 

server { 
    listen 80; 
    server_name www.example.com example.com; 
    rewrite ^/(.*) https://example.com/$1 permanent; 
} 

server { 
    listen 443; 

    include example_ssl; 

    server_name www.example.com; 
    rewrite ^/(.*) https://example.com/$1 permanent; 
} 

server { 
    listen 443; 
    include example_ssl; 

    server_name example.com; 

    root /home/ubuntu/apps/example/current/public; 

    try_files $uri/index.html $uri @unicorn; 
    location @unicorn { 
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
    proxy_set_header Host $host; 
    proxy_set_header X-Forwarded-Proto $scheme; 
    proxy_redirect off; 
    proxy_pass http://unicorn; 
    } 

    location ~ ^/(assets)/ { 
    gzip_static on; 
    expires max; 
    add_header Cache-Control public; 
    #add_header Last-Modified ""; 
    #add_header ETag ""; 
    } 
    error_page 500 502 503 504 /500.html; 
    client_max_body_size 4G; 
    keepalive_timeout 60; 
} 

Информационный протокол SSL в example_ssl:

ssl on; 

ssl_certificate /etc/nginx/ssl/example.com.crt; 
ssl_certificate_key /etc/nginx/ssl/example.com.key; 

ssl_session_timeout 10m; 

ssl_ciphers "AES256+EECDH:AES256+EDH"; 
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; 
ssl_prefer_server_ciphers on; 
ssl_session_cache shared:SSL:10m; 
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains"; 
add_header X-Frame-Options DENY; 
add_header X-Content-Type-Options nosniff; 

Это вызывает бесконечный цикл перенаправления. Запросы Http перенаправляются на HTTPS, как ожидалось, но все попытки https://example.com перенаправляются обратно в HTTP.

Я не могу понять, почему запросы HTTPS перенаправляются. Я проверил свой SSL-сертификат, перейдя на сайт www.digicert.com, и все вернулось, сказав, что оно было успешно установлено.

Когда я пытаюсь из моего терминала:

openssl s_client -connect example.com:443 

Я получаю следующее сообщение об ошибке:

verify error:num=20:unable to get local issuer certificate 

серт я получил от моего клиента не содержит промежуточные сертификаты, но от того, что я понимаю, это должно по-прежнему работать при попытке доступа к сайту из браузера.

Если я изменю серверный блок, чтобы прослушивать только 80 и не использовать SSL, сайт может загружаться успешно, но мне нужно использовать только SSL.

Кроме того, это приложение Rails с веб-сервером Unicorn. Мой unicorn.log пуст, кроме запуска веб-сервера, поэтому я исправлю, что это совсем не касается моей конфигурации Rails, просто проблема с конфигурацией nginx/ssl cert?

Спасибо!

+1

Похоже, у вас есть два серверных блока, прослушивающих 443, и первый из них переписывает URL-адрес? Удалите первый серверный блок 443. –

ответ

1

Попробуйте это:

upstream unicorn { 
server unix:/home/ubuntu/apps/example/shared/sock/unicorn.example.sock fail_timeout=0; 
} 

server { 
    listen 80; 
    server_name example.com www.example.com; 
    return 301 https://$server_name$request_uri; 
} 

server { 
    listen 443 ssl; 
    include example_ssl; 
    server_name example.com; 

    root /home/ubuntu/apps/example/current/public; 

    try_files $uri/index.html $uri @unicorn; 
    location @unicorn { 
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
    proxy_set_header Host $host; 
    proxy_set_header X-Forwarded-Proto $scheme; 
    proxy_redirect off; 
    proxy_pass http://unicorn; 
    } 

    location ~ ^/(assets)/ { 
    gzip_static on; 
    expires max; 
    add_header Cache-Control public; 
    #add_header Last-Modified ""; 
    #add_header ETag ""; 
    } 
    error_page 500 502 503 504 /500.html; 
    client_max_body_size 4G; 
    keepalive_timeout 60; 
} 

Вам нужно будет удалить "на SSL;" из вашего файла ssl include, то есть для более старых версий nginx. Возможно, вам придется изменить это, если вы используете несколько ssl на одном IP-адресе.

+0

Мне не хватало 'proxy_set_header X-Forwarded-Proto $ scheme;'. Благодаря! –