2013-08-20 14 views
6

Sto sviluppando un'applicazione (RoR + Heroku) che consente agli utenti di creare i propri siti Web utilizzando il mio sottodominio (pagename.myapp.com) o utilizzando il proprio dominio (pagename.com). Un punto importante di questo è che questa opzione è la chiave della mia attività: i sottodomini sono i piani gratuiti ei domini personalizzati sono quelli a pagamento. Quindi ho una tabella in cui memorizzo i domini personalizzati di ciascun utente e controllo se questa pagina è attiva (esiste e ha pagato la quota).domini personalizzati per l'app web multi-tenant

Per questo ho bisogno di dare agli utenti la possibilità di indirizzare il loro dominio ai miei server. Tutti sappiamo che Heroku non consiglia l'uso di DNS A-Records.

Inoltre vorrei astrarre il più possibile questa funzionalità per poter passare la mia infrastruttura (da Heroku ad AWS) in futuro senza dover chiedere a tutti i miei utenti di cambiare la loro zona DNS. Tenendo conto di ciò, penso che l'opzione migliore sarebbe eseguire qualcosa come un proxy EC2 (usando l'IP Elastico AWS) che mi dà la proprietà di questo IP. Questo proxy penso che dovrebbe reindirizzare a proxy.myapp.com e risolverei la richiesta a livello di app.

Non ho trovato informazioni chiare a riguardo, non sono sicuro se questa ipotesi sia la soluzione migliore e come configurare il proxy (quale tipo di proxy utilizzare? Nginx forse?).

Detto questo, vorrei chiedere raccomandazioni/migliori pratiche per risolvere questa caratteristica "comune".

Grazie

risposta

3

Cosa si vogliono fare è abbastanza semplice da implementare. Le tue ipotesi sono corrette sulla configurazione del proxy. Nginx o haproxy funzioneranno entrambi alla grande per questo (personalmente utilizzerei haproxy). Qui ci sono alcuni dei trucchi che si andrà in contro però:

  1. Modifica l'intestazione host a un server proxy può causare l'applicazione web end per generare link errati. È possibile utilizzare i percorsi relativi per risolvere questo problema, ma richiede che gli sviluppatori di applicazioni web per essere consapevoli dell'ambiente che sono in esecuzione in.

    1. utente si collega al www.example.com (proxy server)
    2. server proxy si connette a www.realdomain.com (web app)
    3. l'app Web ha un collegamento per un carrello. www.realdomain.com/shoppingcart
    4. finali utente clicca sul link, ma il collegamento è www.realdomain.com/shoppingcart~~V~~singular~~3rd anziché www.example.com/shoppingcart
  2. Il costo della recitazione ospitante come server proxy. Questo può fuoriuscire senza controllo molto rapidamente. Ad esempio, vuoi ridondanza, se sì, come pensi di implementarlo? Avete in programma di avere la terminazione SSL? Se è così, dovrai aumentare il conteggio della CPU per far fronte al carico aggiuntivo. Vuoi avere una connessione sicura con heroku dal tuo proxy? Se lo fai, dovrai aumentare anche il conteggio della CPU. Potrebbe essere necessario aggiungere anche ram aggiuntive a seconda del numero di connessioni simultanee.

  3. Heroku cambia anche i bilanciatori di carico regolarmente. Questo è importante perché il tuo servizio proxy dovrà ricaricare la configurazione/aggiornare gli indirizzi IP delle istanze di heroku ogni 60 secondi. Nella mia esperienza possono cambiare una o due volte al giorno, ma la voce DNS che usano ha un TTL di 60 secondi. Ciò significa che dovresti assicurarti di essere in grado di aggiornare la tua configurazione fino a ogni 60 secondi.

La mia azienda ha fatto qualcosa di molto simile a questo per quasi un anno. Usiamo haproxy e semplicemente lo ricarichiamo regolarmente. Non abbiamo mai avuto un'interruzione o un'interruzione per i nostri utenti finali. Nginx è anche un ottimo prodotto. Ha incorporato il caching DNS, quindi se segui questa strada dovrai assicurarti di configurarlo correttamente in modo che la cache TTL del DNS sia di 60 secondi.

0

Molti dei vostri clienti desiderano utilizzare l'app nel proprio dominio? Per esempio. esempio.com piuttosto che theapp.example.cpm? In caso contrario, consiglierei di averli CNAME su proxy.myapp.com quali CNAME su myapp.herokuapp.com. Quindi, è possibile aggiornare proxy.myapp.com senza l'interruzione del cliente.

Se hai bisogno dell'apice o del supporto di un record, dovresti impostare Nginx come proxy inverso per la tua app di Heroku. Tenere presente che se è necessario il supporto HTTPS per i domini client, sarà necessario eseguire una sorta di gestione dei certificati sul proprio proxy.

+0

In heroku, i CNAME non funzionano. Basano il loro routing fuori dagli host virtuali. Ti permettono di usare il tuo nome DNS, ma questo è ciò che l'OP sta chiedendo. Per poter utilizzare il proprio nome DNS, fanno pagare extra. – dtorgo

Problemi correlati