Nginx i dwie aplikacje

Sytuacja wygląda tak: na serwerze jest zainstalowane rails 2.3.8, mongrel i puszczone jest to przez nginxa (poprzez ssl). Chce uruchomić na tym serwerze drugą aplikacji, tak żeby pierwsza działała jak działa, a druga jak do momentu finalnego sprawdzenia czy działa wszystko ok ma być jak aplikacja dodatkowa a nie główna.

W związku z tym zainstalowalem rvma (wiem, że nie powinno się tak robić, ale nie mogę wyłączyć pierwszej aplikacji na bliżej nieokreślony czas). Druga aplikacja działa na rails 3.0.3 (w tej wersji została napisana, wkrótce mam zamiar zaktualizować ją do 3.0.10 lub nawet do 3.1.0 jak w końcu to wyjdzie). Działa na serwerze thin. I teraz czy wpisuje

rails s

czy this start
aplikacja niby mi się uruchamia na porcie 3000, ale jak próbuje wejść do tej aplikacji po wpisaniu [domena]:3000 to strona się ładuje i ładuje i w końcu się nie załaduje.

Mógłby ktoś pomóc, byłbym bardzo wdzięczny, zresztą jak zawsze jestem wdzięczny za otrzymaną tu pomoc.

Testujesz z zewnątrz i pewnie firewall blokuje ten port. Spróbuj najpierw lokalnie curlem sprawdzić czy działa serwer:

curl http://localhost:3000/

zrobiłem tak:

curl http://0.0.0.0:3000

oraz

curl http://[domena]:3000

i pokazł się błąd bazy danych (to prawidłowo, bo bazy danych jeszcze nie uzupełniłem tabelami), czyli wynika z tego, że inny serwer pomiędzy moim a moim komputerm blokuje port 3000, jak można w nginxie ustawić, żeby port 3000 przekazać na np http(s)://domena.pl/cos
EDYCJA:
Znalazłem coś takiego: http://www.johnyerhot.com/2008/05/27/mongrel-nginx-deploying-to-a-subdirectory/, wkrótce to sprawdze…

Udało mi się już zmienić strukturę bazy danych w tej drugiej aplikacji, po wykonaniu polecenie

rails s

domyślną ścieżką dla grafiki, plików css itd, jest http://domena.pl/
a nie http://domena.pl/test
wszystkie obrazki dostają url http://domena.pl/images/...
a nie http://domena.pl/test/images/...
Mój plik nginxa wygląda mniej więcej tak:

[code]worker_processes 1;

events {
worker_connections 1024;
}

http {
include mime.types;
default_type application/octet-stream;
server_tokens off;
sendfile on;
keepalive_timeout 70;

gzip  on;
gzip_proxied any;
gzip_types text/plain text/css application/x-javascript text/javascript;

client_max_body_size 10m;
client_body_buffer_size 128k;

upstream mongrel{
    server 127.0.0.1:8000;
    server 127.0.0.1:8001;
    server 127.0.0.1:8002;
    }

    server {
        listen   80;
        server_name  domena2.pl;
        rewrite ^/(.*) https://domena.pl/$1 permanent;

    }

    server {
            listen       80;
            server_name  domena.pl;

            rewrite ^/(.*) https://domena.pl/$1 permanent;
    }

# HTTPS server
#
server {
    listen       443;
    server_name  domena.pl;

error_page 403 404 500 502 503 504 /error.html;
location = /error.html {
    root /var/www/apps/spg/public;
}

    ssl                  on;
    ssl_certificate      /...
    ssl_certificate_key  /...

    location /test {
      root       /var/.../test2/public; #nowa aplikacja
      proxy_pass http://localhost:3000;
    }

    root    /var/.../public; #stara aplikacja

    location / {

    proxy_set_header  HTTPS  on;
    proxy_set_header X_FORWARDED_PROTO https;

        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;
        proxy_redirect off;

            if (-f $request_filename) {
                    expires max;
                    break;
            }

            if (!-f $request_filename) {
                    proxy_pass http://mongrel;
                    break;
            }
    }
}

}[/code]
Stara aplikacja chodzi pod Rails2 na mongrelu, więc jest tam mongrel, nowa będzie chodziła na thinie.

Pojawił się jeszcze jeden problem związany z tym, że jak chce wejść na jakąś podstronę w tej drugiej aplikacji to pojawia się Error 500, to zapewne jest wina złego przekierowania w nginx.

Z wszelką pomocą byłbym bardzo wdzięczny.

W konfiguracji środowiska ustaw odpowiednie config.action_controller.asset_host, wtedy zasoby będą się ładować z odpowiedniego URL-a.

Znalazłem takie rozwiązanie http://groups.google.com/group/thin-ruby/browse_thread/thread/ac4c84052f72e513?pli=1, jak sprawdze czy działa to dam znać

EDYCJA
W końcu znalazłem rozwiązanie, ale masakra z tym jest, trzeba aż w trzech miejscach ustawić, żeby uruchomić aplikację w podkatalogu.

  1. konfiguracja nginxa podobna do tej z zacytowanej strony
  2. config.action_controller.asset_host = “http://domena.pl/test2
  3. w trakcie uruchomienia thina trzeba wykorzystać opcję --prefix /test2

To tak dla potomnych, narazie wygląda, że działa.

Opisany przezemnie sposób działał w środowisku produkcyjny, teraz chciałem uruchomić stronę w trybie produkcyjnym, wykonałem następujące ustawienia:

config Railsów

config.action_controller.asset_host = "http://domena.pl/beta"

Nginx

[code]upstream thin {
server 127.0.0.1:5000;
server 127.0.0.1:5001;
server 127.0.0.1:5002;
}

location /beta/ {
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;
proxy_redirect off;
proxy_pass http://thin;
}[/code]
konfiguracja thina

[code]—
chdir: /var/…/test
environment: production
address: 0.0.0.0
port: 5000
servers: 3
prefix: /beta
timeout: 30
log: log/thin.log
pid: tmp/pids/thin.pid
max_conns: 1024
max_persistent_conns: 512
require: []

wait: 30
servers: 3
daemonize: true[/code]
logi thina

[code]Started GET “/beta/images/flags/pl-PL.png?1314387375” for xxx.xxx.xxx.xxx at 2011-09-22 20:17:56 +0200

ActionController::RoutingError (No route matches “/images/flags/pl-PL.png”):[/code]
Strony (i podstrony) ładują się, jednak pliki zewnetrzne (grafika, css, js) już nie.

config.action_controller.asset_host ustawiasz tylko jeżeli masz assets na innym serwerze, np na jakimś CDN. zakomentuj tą linijkę i sprawdź czy zadziała.

Sprawdziłem i jeśli nie ustawię config.action_controller.asset_host to obrazki szukane są w aplikacji uruchomionej pod adresem domena.pl a nie domena.pl/beta. Kurcze w środowisku developerskim to działa a w produkcji już nie.

w logach nginxa mam coś takiego:

2011/09/22 20:53:35 [error] 39799#0: *8 kevent() reported about an closed connection (61: Connection refused) while reading response header from upstream, client: xxx.xxx.xxx, server: domena.pl, request: "GET /beta/ HTTP/1.1", upstream: "http://127.0.0.1:5000/beta/", host: "domena.pl"

Podsumowując skoro strona główna i podstrony są ładowane bez problemu a jest jedynie problem z assetami, to chyba trzeba coś w railsach ustawić, ale co to nie wiem.

https://github.com/rails/rails/pull/2977 jest już w 3.1.1.rc1

ok dzięki za info, ale tą aplikację muszę szybko uruchomić a aktualizacja railsów może, chciaż nie musi, że niektóre rzeczy przestaną działać.

Sprawdziłem teraz przez curla czy mogę pobrać stronę z serwera (sprawdziłem na serwerze) i mam taki rezultat:

[code]Starting server on 0.0.0.0:5000 …
Starting server on 0.0.0.0:5001 …
Starting server on 0.0.0.0:5002 …

curl http://0.0.0.0:5000

couldn’t connect to host[/code]
Potem zrobiłem

# curl http://0.0.0.0:5001

I teraz wyskakuje błąd:

Not Found: /

A strona się ładuje tylko bez obrazków.