Ruby on Rails – jedna aplikacja z wieloma domenami (Dreamhost + Passenger)
Jakiś czas temu sporo namęczyłem się z odpaleniem jednej aplikacji RoR tak by działała na wielu domenach równocześnie (i dla każdej z nich troszkę inaczej się zachowywała. Całość to sieć sklepów internetowych sprzedających różne systemy antywirusowe z jedną bazą danych i jednym panelem administracyjnym).
Niestety nie posiadam własnej maszyny a tylko współdzielony hosting na DreamHost.com więc uciec się musiałem do kilku prostych sztuczek. Po pierwsze uruchomić mod_rails na każdej subdomenie, po drugie utworzyć symlinki z katalogów subdomen na katalog z aplikacją. Wystarczyło na katalog “public” – jednak nie wiem czy to najlepszy pomysł gdyż podczas prób mod_rails kilka razy się wywalił… jeśli ktoś wymyśli lepszy pomysł to bardzo proszę o maila :) – może było by zsymlinkować cały katalog z aplikacją?.
Wykrywanie domeny przez którą klient łączy się ze sklepem również do trudnych nie należało, w app/application.rb mam funkcję która inicjalizuje zmienną @strona (którą później używam do wczytania odpowiedniej konfiguracji)
@strona = Site.find_by_host(request.host)
- Site – moja tabela w bazie danych gdzie trzymane są ustawienia dla różnych domen
- find_by_host – szukanie po odpowiedniej kolumnie gdzie są zapisane domeny
- request.host – zmienna w której zapisany jest host przez który się łączymy ze stroną
Dość dobry sposób, może tak zostać. Też tak robię. Swego czasu kilka aplikacji tego typu napisałem w PHP.
Drugim, trochę szybszym jednak trochę mniej dynamicznym rozwiązaniem jest utworzenie pliku konfiguracyjnym w którym przechowujemy ID jako integer – strony i po prostu robić zapytania w stylu:
Site.find_by_site_id( config[:site_id] )
Jest wiele tego typu możliwości, moje jest lekko bardziej wydajne, jednak to twoje wydaje się bardziej wygodne.
Pozdrawiam,
Mateusz (name specjalnie inny dlatego, że chcę sobie wypozycjonować stronę.;))
Miło że ktoś tu zajrzał :),
sprawę “wywaleń się aplikacji” namierzyłem – była to kwestia logów. Wiele aplikacji próbowało równocześnie pisać do tego samego pliku log/proguction.log . (to moje podejście nie jest niestety najlepsze.. wymaga co najmniej zmienienia poziomu logowania – jednak na razie działa :) ).
Ciekawy pomysł na rozwiązanie tego problemu można znaleźć na: http://railscasts.com/episodes/94-activeresource-basics .