Обмануть приложение Rails, чтобы думать, что оно в другом порту

StackOverflow https://stackoverflow.com/questions/4590855

Вопрос

У меня есть приложение Rails, которое работает на порту 8080 Что мне нужно обмануть, чтобы думать, что он работает на порту 80.

Я запускаю лак на порту 80 и запросы на пересылку Nginx на порту 8080, но когда пользователь пытается войти в систему с Omniauth, а Defise Gem генерирует URL -адрес для перенаправления обратно на сервер, он думает, что он на порту 8080, который тогда увидит пользователь.

Есть ли способ обмануть приложение Rails для жесткого кода порта как 80 (я думаю, что это плохая практика), или Nginx пересылал запрос, как если бы он работает на порту 80?

Поскольку я не запускаю прокси Nginx в приложение Rails, я не могу придумать способ обмануть порт.

Кто -нибудь сталкивался с этой проблемой раньше, если да, то какая конфигурация необходима для ее исправления?

Заранее спасибо!

РЕДАКТИРОВАТЬ: И Nginx, и Varnish работают на одном и том же сервере.

Это было полезно?

Решение

У меня такая же настройка с лаком на порту 80 и Nginx на порту 8080, а Omniauth (без разработки) делал точно то же самое. Я пытался настройку X-Forwarded-Port и т. д. в лаке и fastcgi_param SERVER_PORT 80; В Nginx, оба без успеха. Другая часть в моей настройке - пассажир (о котором вы не упомянули), но если вы действительно используете пассажир, то вы можете использовать:

passenger_set_cgi_param SERVER_PORT 80; 

(Документы говорят, что вы можете установить это в http блокировать, но это не сработало для меня, и мне пришлось добавить его в server блокировать.)

http://modrails.com/documentation/users%20guide%20nginx.html#passenger_set_cgi_param

Другие советы

Настраивать X-Forwarded-Port в лаке. Видеть этот пример и другие результаты поиска в Google »лак x-forwarded-port".

Вы также должны, конечно, настроить X-Forwarded-For а также X-Forwarded-Proto.


Заголовки X-Forwarded-For, X-Forwarded-Proto, а также X-Forwarded-Port Это способ для HTTP-обратных прокси, таких как Nginx, Squid или Varnish для связи с HTTP-сервером HTTP «Бэк-Энд», ваше приложение Rails, работающее в тонком или единороде, кто на самом деле является пользователем и как пользователь на самом деле подключился.

Например, предположим, что у вас есть Nginx перед вашим применением Rails. Ваше приложение Rails было загружено с тонким и слушает 127.0.0.1:8080, а Nginx слушает 0,0.0.0:80 для HTTP и 0,0.0.0:443 для HTTPS. Nginx настроен на прокси все подключения к приложению Rails. Тогда ваше приложение Rails подумает, что IP -адрес любого пользователя 127.0.0.1, порт 8080, и схема http, даже если фактический пользователь подключен из 1.2.3.4 и запросил страницу через https на порту 443. Анкет Решение состоит в том, чтобы настроить Nginx для установки заголовков:

X-Forwarded-For: 1.2.3.4
X-Forwarded-Scheme: https
X-Forwarded-Port: 443

и приложение Rails должно использовать эти параметры вместо по умолчанию.

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

Вы можете сделать прокси и сервер его как любой порт, который вы хотите.

Может быть, с Apache сверху и пассажиром в одиночестве ...

<VirtualHost *:80>
 ServerName <name>
 DocumentRoot /home/deploy/<name>

 PassengerEnabled off
 ProxyPass / http://127.0.0.1:<port>/
 ProxyPassReverse / http://127.0.0.1:<port>/

</VirtualHost>

В ракушке:

passenger start -e staging -p 3003 -d

Ваша проблема, кажется, вы получаете перенаправления на порт 8080. Лучшее решение - настройка Rails (или Gem Omniauth/Depise) для обработки запросов так, как если бы они были запущены в порту 80 (но я понятия не имею, как или если это возможно).

Как сказал Аблемик; Apache имеет отличный модуль для этого (mod_proxy), с ProxyPassReverse, он переписывает перенаправления обратно в перенаправления порта-80. Более того, с помощью mod_proxy_html он заменит ссылки на порт-8080 на HTML-страницах на ссылки порта-80.

Если вам нужно только переписать перенаправления, вы можете переписать перенаправления в Varnish VCL с чем -то вроде:

sub vcl_fetch {

  ...

  #Rewrite redirect from port 8080 to port 80
  if ( obj.http.Location ~ "^http://[^:]+:8080/.*" ) {
    set obj.http.Location = regsub(obj.http.Location, ""^(http://[^:]+):8080(/.*)","\1\2");
  }
}

(Я думаю, вы должны заменить OBJ Beresp, если вы используете лак> = 2.1)

Если вам придется переписать HTML -страницы, это будет намного сложнее сделать полностью правильно с лаком.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top