2015-10-28 4 views
0

У меня на моем сервере два приложения-рельсы. Каждый из них работает на тонком сервере. Я также использую NGINX. Это мой файл конфигурации NGINX:Несколько приложений Rails через NGINX (обратный прокси)

server{ 

location /blog { 
    proxy_pass http://127.0.0.1:8082; 
    proxy_set_header Host $host; 
    proxy_http_version 1.1; 
    proxy_set_header Upgrade $http_upgrade; 
    proxy_set_header Connection "upgrade"; 

} 
location /website1 { 
    proxy_pass http://127.0.0.1:3000; 
    proxy_set_header Host $host; 
    proxy_http_version 1.1; 
    proxy_set_header Upgrade $http_upgrade; 
    proxy_set_header Connection "upgrade"; 
} 
} 

"http://HOST/blog" => Я получаю 404 ошибку (пустая страница)

"http://[HOST]/website1" => Я получаю ошибку 404 из моего приложения Rails, и на моем журналы приложений я получаю:

INFO -- : Started GET "/website1" 
FATAL -- : ActionController::RoutingError (No route matches [GET] "/website1") 

Что происходит ???

Я попытался установить расположение веб-сайта 1 на странице «/» и в блоге «/ blog». В этом случае сайт1 отлично работает, но я все еще получаю 404 на блоге (пустая страница, а не рельсы одна).

Любая идея? Спасибо, что помогли!

ответ

3

Попробуйте добавить косые черты в прокси-проход. Как:

proxy_pass http://127.0.0.1:8082/; 
proxy_pass http://127.0.0.1:3000/; 

из (Запрос URI передается на сервер следующим образом): http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_pass

Для дальнейшего объяснения, почему вы получаете 404-х, рельсы видят полный путь, когда косая черта исключаются (например, http://HOST/website1 ->/website1 & http://HOST/blog ->/blog). Похоже, что маршрутизация рельсов для обоих приложений не ожидает префикса. Включив конечную косую черту прокси-прокси, ваши URL-адреса получат преобразование таким образом, что http://HOST/website1/ станет корневым путем (/) на стороне рельсов. Вам также может понадобиться proxy_redirect default;, если у вас возникли проблемы с перенаправлением рельсов. См.: http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_redirect

+0

Спасибо! Это работает лучше! Я бы никогда не узнал, что пропала косая черта. Чтобы заставить его работать, я также добавил 'config.action_controller.relative_url_root = '/ blog'' Итак, когда я добрался до http: // HOST/blog, появится моя корневая страница. Однако всякий раз, когда я нажимаю ссылку, префикс игнорируется, он переходит к http: // HOST/posts/1. Есть ли у вас какие-либо идеи? Прошу прощения за такие глупые вопросы, но я ничего не знаю о производственной среде! – Statyx

+0

Если вы установите '' config.action_controller.relative_url_root'', то я думаю, что вам не нужна конечная косая черта. relative_url_root также должен заботиться о генерации URL. –

1

Мне не нравится вставлять несколько конфигураций в один файл, также вам лучше использовать виртуальные хосты. Просто добавьте поддельные домены в ваш файл hosts. Вот как вы о том, что:

http://articles.slicehost.com/2009/4/17/centos-nginx-rails-and-thin

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

Update:

Я пробовал ваш конфиг, и он работает. Единственная часть, которую я изменил, была добавлена ​​/ в конце, как предложил другой ответ. У вас могут быть другие проблемы. Вот почему я указал на сообщение в блоге. Есть проблемы, как вы это делаете, но все будет хорошо, если вы их исправите. Например, вам нужно указать Rails, что вы не работаете в корневом домене, но в/website1 или/blog. Вам также необходимо исправить любые html-ссылки, предполагающие, что пути ресурсов начинаются с корня. Вот почему виртуальные хосты предлагают более чистое решение.

+0

Да, я согласен с вами, но это «просто» лучшая практика? Я просто пытаюсь заставить его работать. Я до сих пор не знаю, в чем проблема. – Statyx

+0

Это просто лучшая практика. Что касается вашей конкретной проблемы, я думаю, что вы неправильно ее настроили. Вот почему я дал вам ссылку. В основном, настройте восходящий поток и установите свой корень. –

+0

Я думаю, вы можете сделать свою работу так, как вы описали. Я предполагаю, что ваш сайт1 работал, потому что вы просто передавали запросы на ваш тонкий сервер, работающий на порту 3000. У вас есть еще один тонкий сервер, работающий на порту 8082? –

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