2013-05-15 2 views
1

У меня есть старое приложение rails 2.3, которое я сейчас перехожу в nginx + Passenger (из Apache + Passenger). Nginx настроен для SSL и, кажется, работает правильно, за исключением того, что я получаю застревание в 302-цикле перенаправления из моего приложения Rails.Слишком много переадресаций: пассажир + nginx SSLRequirement

Приложение rails считает, что запросы не являются ssl (request.ssl? Должно оцениваться как false). В production.log каждая запись в журнале показывает запрос как http. Если я отключу плагин SSLRequirement, тогда цикл перенаправления исчезнет. Тем не менее, я хотел бы убедиться, что мое приложение rails обнаруживает запрос https, чтобы он мог правильно настроить протокол при создании абсолютных URL-адресов.

Единственная причина, по которой я упоминаю предыдущую настройку Apache + Passenger, заключается в том, что плагин SSLRequirement функционировал должным образом в этой конфигурации.

Nginx конфигурации для моего виртуального хоста выглядит следующим образом:

server { 
    listen  443 ssl; 
    server_name new.example.com; 
    root /home/user/railsapps/example-setup/public; 
    passenger_enabled on; 
    ssl_certificate /etc/nginx/ssl/2013/example.com.chained.crt; 
    ssl_certificate_key /etc/nginx/ssl/2013/example.key; 
    ssl_protocols  SSLv3 TLSv1 TLSv1.1 TLSv1.2; 
    ssl_ciphers   HIGH:!aNULL:!MD5; 
} 
+0

Это не связано на ваш вопрос, но вы, похоже, не устанавливаете ни один из стандартных заголовков прокси-серверов, например «proxy_set_header X-Real-IP $ remote_addr; proxy_set_header X-Forwarded-For $ proxy_add_x_forwarded_for; proxy_set_header Host $ http_host;" Невозможность их установки может вызвать «захватывающее» поведение. – Danack

ответ

0

Ответ был найден здесь:

Error 310. Too many redirects with nginx + rails 3

я просто необходимо изменить конфигурации на следующее:

server { 
    listen 443; 
    ssl on; 
    server_name new.usfamilytree.com; 
    root /home/admin/railsapps/example-setup/public; 
    passenger_enabled on; 
    ssl_certificate /etc/nginx/ssl/2013/example.com.chained.crt; 
    ssl_certificate_key /etc/nginx/ssl/2013/example.key; 
    ssl_protocols  SSLv3 TLSv1 TLSv1.1 TLSv1.2; 
    ssl_ciphers   HIGH:!aNULL:!MD5; 
} 

Я удалил SSL прочь слушать линии и добавил " ssl on; " линия.

3

Как вы догадались, ваше приложение Rails не знает, что запрос выполняется через HTTPS. По to this page вам необходимо установить:

proxy_set_header X-Forwarded-Proto $scheme; 

Чтобы получить Nginx пройти схему до Rails

Однако они устанавливают его в блоке месте и вы, кажется, не один.

+0

Вот что мне нужно, чтобы заставить его работать с единорогом, так как в этом случае nginx действует как прокси. Я думаю, что это отличается от пассажира. – Pierre

0

@ Ответ Danak не будет работать, потому что пассажир не работает как прокси-сервер - он работает как модуль для nginx. Вместо этого вы можете подделать любой заголовок http с passenger_set_cgi_param.

passenger_set_cgi_param HTTP_X_FORWARDED_PROTO $scheme; 

Я не знаю, если сейчас X-Forwarded-Прото является стандартом для рельсов, но он автоматически работал с request.ssl? для меня на рельсах 4.

Docs here.

+2

Начиная с Passenger 5.0.1 'пассажир_set_cgi_param' [больше не доступен] (https://blog.phusion.nl/2015/03/04/phusion-passenger-5-0-1-released/) и заменен на' passenger_set_header'. – jwadsack

Смежные вопросы