Configura Discourse - Ambiente AWS Linux 2 AMI e Apache2 (httpd)

Ciao a tutti

Ho letto la documentazione e ho esaminato le configurazioni e i consigli pubblicati, tentando di adattarli alla mia situazione specifica.

Per qualcosa che sembra piuttosto semplice, è incredibilmente frustrante che nessuna delle soluzioni proposte abbia funzionato.

Il nostro ambiente:

  • Eseguiamo un’istanza AWS EC2, più precisamente un’immagine AMI AWS Linux 2;
  • Abbiamo Apache2 in esecuzione e configurato;
  • L’istanza fa parte di un gruppo di destinazione AWS a cui fa riferimento il nostro load balancer AWS;
  • Il nostro certificato SSL/TLS è fornito da AWS ed è associato al load balancer;
  • Il nostro provider di dominio è name.com;
  • Parte della nostra configurazione prevede più sottodomini instradati tramite record CNAME, tutti puntanti al load balancer AWS, che a sua volta gestisce il traffico verso l’istanza EC2;
  • Tutto il traffico instradato al load balancer e servito agli utenti web è sicuro;
  • Sul nostro server eseguiamo tre applicazioni Node Express separate;
  • Le porte sono definite in Express come parte della configurazione del server Express; attualmente le porte sono 3000, 4000 e 5000;
  • Il traffico viene instradato da Apache in base al sottodominio all’app web corrispondente, ad esempio:
<VirtualHost *:80>
    ServerName subdomain.domain.io
    ProxyPreserveHost On
    ProxyPass "/" "http://localhost:4000/"
    ProxyPassReverse "/" "http://localhost:4000/"
</VirtualHost>
  • Sebbene non particolarmente rilevante, utilizziamo PM2 per gestire le nostre app Express in modo che vengano avviate automaticamente al riavvio del server.

  • Sullo stesso server abbiamo installato Docker;

  • Abbiamo quindi installato Discourse utilizzando una copia di app.yaml (usando come guida Run other websites on the same machine as Discourse - #182 by angus).

Stato attuale:

  • Docker è in esecuzione
  • L’app Discourse (container) è in esecuzione
  • Le app Express sono tutte in esecuzione e vengono instradate correttamente da Apache

Note:

  • Ho provato inizialmente a compilare l’app senza esporre le porte come indicato nella documentazione; quando ciò non ha funzionato, ho esposto la porta 8000 tramite la porta HTTP 80;
  • Nella mia semplice comprensione, Docker è come una casa e i vari container sono le stanze. Docker determina come l’app viene accessibile, ovvero quale stanza accedere. Il mio pensiero nell’esporre la porta 8000 era che avrei potuto fare riferimento alla porta 8000 proprio come faccio con le mie altre app Express, ora che la 8000 era esposta. Ma questo non funziona; di seguito un esempio di ciò che ho provato a fare in Apache:
# FAQ (ROTTE DI DISCOURSE)

<VirtualHost *:80>
    ServerName discourse.domain.io
    ProxyPreserveHost On
    ProxyPass "/" "http://localhost:8000/"
    ProxyPassReverse "/" "http://localhost:8000/"
</VirtualHost>
  • Il test semplice era provare a inserire localhost:8000 nel browser sul server e testare. Il server è un’istanza AWS con Chromium installato. Il fatto che questo non si risolva immediatamente mi dice che c’è un problema e che la mia comprensione manca di qualcosa di fondamentale. Le mie app web vengono eseguite e sono disponibili sulle porte che specifico nella configurazione di Express; la mia aspettativa era che fosse lo stesso per il container Docker.

Note aggiuntive:

  • Mi rendo conto che esiste una soluzione potenziale mettendo NGINX “davanti” ad Apache e Docker per instradare il traffico da discourse.domain.io verso, ad esempio, la porta 8000 sul server locale, ovvero la porta esposta per il container Docker, e instradare tutto il resto del traffico da *.domain.io ad Apache, ad esempio sulla porta 9000, modificando poi la configurazione del VirtualHost per instradare il traffico dalla porta 9000 di conseguenza, ovvero:
# INSTRUAMENTO DELLE APP EXPRESS IN APACHE

<VirtualHost *:9000>
    ServerName other_sub_domains.domain.io
    ProxyPreserveHost On
    ProxyPass "/" "http://localhost:4000/"
    ProxyPassReverse "/" "http://localhost:4000/"
</VirtualHost>
  • Per me questo sembra completamente inutile. Se il dominio discourse.domain.io viene instradato ad Apache e Apache riceve la richiesta e poi prova a instradarla, dovrebbe essere semplice puntarla alla porta esposta del container Docker.
  • Inoltre, se localhost:8000 sul server stesso non si risolve, questa soluzione non funzionerebbe comunque.

Attualmente ottengo un errore 502 in Chrome quando provo a navigare verso il mio container Docker di Discourse. (Vedi screenshot sopra).

Estratto da app.yml

## questo è il template del container Docker Discourse standalone all-in-one
##
## Dopo aver apportato modifiche a questo file, DEVI ricostruire
## /var/discourse/launcher rebuild app
##
## FAI MOLTA ATTENIONE QUANDO MODIFICHI!
## I FILE YAML SONO SUPER SUPER SENSIBILI A ERRORI NELLO SPAZIAMENTO O NELL'ALLINEAMENTO!
## visita http://www.yamllint.com/ per validare questo file quando necessario

templates:
  - "templates/postgres.template.yml"
  - "templates/redis.template.yml"
  - "templates/web.template.yml"
  - "templates/web.ratelimited.template.yml"
  - "templates/web.socketed.template.yml"
## Scommenta queste due righe se desideri aggiungere Lets Encrypt (https)
  #- "templates/web.ssl.template.yml"
  #- "templates/web.letsencrypt.ssl.template.yml"

## quali porte TCP/IP deve esporre questo container?
## Se desideri che Discourse condivida una porta con un altro server web come Apache o nginx,
## vedi https://meta.discourse.org/t/17247 per i dettagli
expose:
  - "8000:80"   # http
  #- "443:443" # https

params:
  db_default_text_search_config: "pg_catalog.english"

  ## Imposta db_shared_buffers al massimo al 25% della memoria totale.
  ## verrà impostato automaticamente da bootstrap in base alla RAM rilevata, oppure puoi sovrascrivere
  #db_shared_buffers: "256MB"

  ## può migliorare le prestazioni di ordinamento, ma aumenta l'utilizzo della memoria per connessione
  #db_work_mem: "40MB"

  ## Quale revisione Git deve utilizzare questo container? (predefinito: tests-passed)
  #version: tests-passed

env:
  LC_ALL: en_US.UTF-8
  LANG: en_US.UTF-8
  LANGUAGE: en_US.UTF-8
  # DISCOURSE_DEFAULT_LOCALE: en

  ## Quante richieste web contemporanee sono supportate? Dipende dalla memoria e dai core CPU.
  ## verrà impostato automaticamente da bootstrap in base alle CPU rilevate, oppure puoi sovrascrivere
  #UNICORN_WORKERS: 3

  ## TODO: Il nome di dominio a cui questa istanza Discourse risponderà
  ## Obbligatorio. Discourse non funzionerà con un semplice numero IP.
  DISCOURSE_HOSTNAME: 'discourse.domain.io'

  ## Scommenta se desideri che il container venga avviato con lo stesso
  ## nome host (opzione -h) specificato sopra (predefinito "$hostname-$config")
  #DOCKER_USE_HOSTNAME: true

  ## TODO: Elenco di email separate da virgola che diventeranno amministratori e sviluppatori
  ## all'iscrizione iniziale, esempio 'user1@example.com,user2@example.com'
  DISCOURSE_DEVELOPER_EMAILS: 'user@domain.io'

  ## TODO: Il server SMTP utilizzato per validare nuovi account e inviare notifiche
  ## INDIRIZZO SMTP, nome utente e password sono obbligatori
  ## ATTENZIONE: il carattere '#' nella password SMTP può causare problemi!
  DISCOURSE_SMTP_ADDRESS: email-smtp.us-east-1.amazonaws.com
  DISCOURSE_SMTP_PORT: 587
  DISCOURSE_SMTP_USER_NAME: ******
  DISCOURSE_SMTP_PASSWORD: ******
  #DISCOURSE_SMTP_ENABLE_START_TLS: true           # (opzionale, predefinito true)
  #DISCOURSE_SMTP_DOMAIN: ******    # (richiesto da alcuni provider)
  #DISCOURSE_NOTIFICATION_EMAIL: ******  # (indirizzo da cui inviare le notifiche)

  ## Se hai aggiunto il template Lets Encrypt, scommenta qui sotto per ottenere un certificato SSL gratuito
  #LETSENCRYPT_ACCOUNT_EMAIL: me@example.com

  ## L'indirizzo CDN http o https per questa istanza Discourse (configurato per il recupero)
  ## vedi https://meta.discourse.org/t/14857 per i dettagli
  #DISCOURSE_CDN_URL: https://discourse-cdn.example.com
  
  ## La chiave IP di geolocalizzazione Maxmind per la ricerca degli indirizzi IP
  ## vedi https://meta.discourse.org/t/-/137387/23 per i dettagli
  #DISCOURSE_MAXMIND_LICENSE_KEY: 1234567890123456

## Il container Docker è senza stato; tutti i dati sono archiviati in /shared
volumes:
  - volume:
      host: /var/discourse/shared/standalone
      guest: /shared
  - volume:
      host: /var/discourse/shared/standalone/log/var-log
      guest: /var/log

## I plugin vanno qui
## vedi https://meta.discourse.org/t/19157 per i dettagli
hooks:
  after_code:
    - exec:
        cd: $home/plugins
        cmd:
          - git clone https://github.com/discourse/docker_manager.git

## Qualsiasi comando personalizzato da eseguire dopo la costruzione
run:
  - exec: echo "Inizio dei comandi personalizzati"
  ## Se desideri impostare l'indirizzo email "Da" per la tua prima registrazione, scommenta e modifica:
  ## Dopo aver ricevuto la prima email di iscrizione, rimetti il commento alla riga. Deve essere eseguito solo una volta.
  #- exec: rails r "SiteSetting.notification_email='info@unconfigured.discourse.org'"
  - exec: echo "Fine dei comandi personalizzati"

Il mio dominio, l’indirizzo email e la configurazione email sono corretti. Come menzionato, non ho bisogno di configurare SSL/TLS.

Richiesta:

  • È la soluzione NGINX l’unico modo per far funzionare questa configurazione e, in tal caso, esiste una spiegazione più chiara riguardo ai passaggi di configurazione? Non sono nella posizione di ricominciare da zero con il server solo per far funzionare Discourse e senza garanzie.
  • In Discourse behind reverse proxy and https - #2 by itsbhanusharma @Dark Matter ha fornito la seguente soluzione per Apache2, ma non credo che questa soluzione sia pensata per un ambiente Node Express e, dato che localhost:8000 non si risolve, non sono sicuro che funzionerebbe:
<VirtualHost *:80>
  ServerAdmin webmaster@localhost
  ServerName  discourse.example.com
  DocumentRoot /website/discourse

  RewriteEngine On
  ProxyPreserveHost On
  ProxyRequests Off
  ProxyPass / unix:/var/discourse/shared/socket-only/nginx.http.sock|http://localhost/
  ProxyPassReverse  / unix:/var/discourse/shared/socket-only/nginx.http.sock|http://localhost/
  ErrorLog /var/log/apache2/discourse.error.log
  LogLevel warn
  CustomLog /var/log/apache2/discourse.access.log combined

  RewriteCond %{SERVER_NAME} =discourse.example.com
  RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>
  • Il problema è nella mia configurazione di Discourse? Il problema è forse l’instradamento di Apache (lo sospetto)? O mi manca qualcosa di più fondamentale?
  • Penso che risolvere questo problema aiuterà molti utenti in futuro.
  • La soluzione ideale sarebbe instradare Discourse direttamente sul server in locale.
  • Poi, instradare tramite URL sarebbe la seconda opzione migliore.

Cordiali saluti,
Matthew Lucas

Questo è troppo complicato per me da capire completamente, quindi considera questo più un’ipotesi selvaggia che una soluzione. Se il problema è che non stai ottenendo qualcosa per connetterti al tuo container Docker in esecuzione tramite localhost, potresti provare a usare l’IP di Docker. Potrebbe anche essere possibile utilizzare il modello di web socket e usare il socket piuttosto che la porta. Alcuni sostengono che questo sia preferibile per una serie di ragioni.

MKJ’s Opinionated Discourse Deployment Configuration potrebbe essere utile da leggere.

@pfaffman@Matthew_Lucas sta già usando il template con socket, però…

Sto sicuramente usando localhost per il mio proxy esterno, e questo dovrebbe funzionare con l’impostazione expose. Non mi aspetterei che debba usare l’IP di docker. E non mi aspetterei che questo fallisca solo con Apache davanti al container docker per quel motivo.

Potresti aver bisogno di configurazione dell’header — vedi Add an offline page to display when Discourse is rebuilding or starting up - #2 by codinghorror

Sto facendo del mio meglio per dimenticare la configurazione di Apache, ma questa sezione della configurazione nginx è qualcosa che penso vorresti capire come replicare con Apache.

    proxy_set_header Host $http_host;
    proxy_http_version 1.1;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto https;
    proxy_set_header X-Real-IP $remote_addr;

In particolare, non credo che funzioni correttamente senza l’header Host.

Dato che non stai usando HTTPS, dovresti essere in grado di usare tcpdump per catturare tracce di pacchetti per vedere esattamente cosa sta andando storto.

Tuttavia, perché mettere Apache lì dentro? È solo un passaggio in più. Se stessi provando qualcosa del genere, imposterei il load balancer Amazon per parlare direttamente alla porta 8000 sull’istanza EC2. Presumo che tu stia terminando HTTPS sull’ELB comunque. Sospetto che il loro load balancer conosca gli header normali da aggiungere senza che tu debba specificarli, ma in caso contrario ovviamente procedi a impostarli. Assicurati solo che la porta sia accessibile tramite il firewall.

Dubito di avere molto altro di valore da contribuire qui, ma spero che qualcosa di questo ti aiuti con la tua configurazione. Buona fortuna.

INSTALLAZIONE DI DOCKER E DISCOURSE SU AWS EC2 LINUX CON UN REVERSE PROXY HTTPD ESISTENTE

Ciao a tutti,

l’ho risolto. Sono tornato alla lavagna e ho ricominciato da capo con un’installazione pulita di Docker e Discourse. Di seguito riporto il mio processo:

Assunzioni

• Hai già un’istanza Linux AWS EC2
• Puoi accedere alla tua istanza EC2 tramite SSH
• Apache 2 è già configurato ed eseguito sul tuo server

ACCEDI ALLA TUA ISTANZA EC2 TRAMITE SSH

  1. Apri CMD / Terminale

  2. Esegui l’accesso SSH all’istanza AWS EC2

Esempio di schermata dopo la connessione all’istanza EC2

ESEGUI AGGIORNAMENTI DI SISTEMA

  1. Esegui gli aggiornamenti di sistema eseguendo il seguente comando nella console / terminale

$ sudo yum update

INSTALLA DOCKER

  1. Cerca il pacchetto Docker di AWS eseguendo il seguente comando nella console / terminale

$ sudo yum search docker

  1. Ottieni le informazioni sulla versione eseguendo il seguente comando nella console / terminale

$ sudo yum info docker

  1. Installa Docker eseguendo il seguente comando nella console / terminale

$ sudo yum install docker

  1. Aggiungi l’utente al gruppo predefinito ec2-user in modo da poter eseguire tutti i comandi Docker senza usare il comando sudo, eseguendo il seguente comando nella console / terminale
$ sudo usermod -a -G docker ec2-user
$ id ec2-user

# Ricarica le assegnazioni di gruppo di un utente Linux a Docker senza disconnettersi

$ newgrp docker
  1. Installa docker-compose eseguendo il seguente comando nella console / terminale
# 1. Ottieni pip3 (pacchetto di installazione di Python)
$ sudo yum install python3-pip
 
# 2. Esegui quindi uno dei seguenti comandi
$ sudo pip3 install docker-compose # con accesso root
 
# OPPURE
 
$ pip3 install --user docker-compose # senza accesso root per motivi di sicurezza

# Verifica i permessi
$ sudo chmod -v +x /usr/local/bin/docker-compose
  1. Abilita il servizio Docker per l’avvio automatico all’accensione eseguendo il seguente comando nella console / terminale

$ sudo systemctl enable docker.service

  1. Avvia il servizio Docker eseguendo il seguente comando nella console / terminale

$ sudo systemctl start docker.service

  1. Verifica che il servizio Docker sia in esecuzione eseguendo il seguente comando nella console / terminale; l’output sarà simile a questo

Comandi Docker di base utili da conoscere:

# Versione di Docker
$ docker version

# Versione di Docker Compose
$ docker-compose version

# Avvia il servizio Docker
$ sudo systemctl start docker.service

# Ferma il servizio Docker
$ sudo systemctl stop docker.service

# Riavvia il servizio Docker
$ sudo systemctl restart docker.service

# Stato del servizio Docker
$ sudo systemctl status docker.service

INSTALLA DISCOURSE

  1. Crea la cartella Discourse

$ sudo mkdir /var/discourse

  1. Clona l’immagine Docker di Discourse nella directory appena creata

$ sudo git clone https://github.com/discourse/discourse_docker.git /var/discourse

  1. Copia il file standalone.yml nella cartella containers

$ cp /var/discourse/samples/standalone.yml /var/discourse/containers/discourse.yml

  1. Modifica il nuovo file discourse.yml come segue (le parti importanti sono le porte esposte per HTTP e i dettagli per l’email SMTP; modifica il file, non copiare e incollare)

Opzioni di modifica:

1. Puoi usare nano e modificare tramite riga di comando / terminale
2. Su AWS, se stai usando MATE con PLUMA, puoi usare PLUMA per modificare il file
3. Puoi usare WINSCP per connetterti via SSH alla macchina e modificare il file tramite l’interfaccia grafica di Windows

## Questo è il template del container Docker Discourse all-in-one, standalone
##
## Dopo aver apportato modifiche a questo file, DEVI ricostruire
## /var/discourse/launcher rebuild app
##
## FAI MOLTA ATTENZIONE DURANTE LA MODIFICA!
## I FILE YAML SONO MOLTO, MOLTO SENSIBILI A ERRORI NELLO SPAZIATURA O NELL'ALLINEAMENTO!
## Visita http://www.yamllint.com/ per convalidare questo file quando necessario

templates:
  - "templates/postgres.template.yml"
  - "templates/redis.template.yml"
  - "templates/web.template.yml"
  ## Rimuovi il commento dalla riga successiva per abilitare l'ascolto IPv6
  #- "templates/web.ipv6.template.yml"
  - "templates/web.ratelimited.template.yml"
  ## Rimuovi il commento da queste due righe se desideri aggiungere Lets Encrypt (https)
  #- "templates/web.ssl.template.yml"
  #- "templates/web.letsencrypt.ssl.template.yml"

## Quali porte TCP/IP dovrebbe esporre questo container?
## Se desideri che Discourse condivida una porta con un altro server web come Apache o nginx,
## vedi https://meta.discourse.org/t/17247 per i dettagli
expose:
  - "8080:80"   # http (eseguito sulla porta locale 8080, porta Docker 80)
  #- "443:443" # https (assicurati che questo sia commentato)

params:
  db_default_text_search_config: "pg_catalog.english"

  ## Imposta db_shared_buffers a un massimo del 25% della memoria totale.
  ## verrà impostato automaticamente da bootstrap in base alla RAM rilevata, oppure puoi sovrascrivere
  #db_shared_buffers: "256MB"

  ## può migliorare le prestazioni di ordinamento, ma aumenta l'uso di memoria per connessione
  #db_work_mem: "40MB"

  ## Quale revisione Git dovrebbe usare questo container? (predefinito: tests-passed)
  #version: tests-passed

env:
  LC_ALL: en_US.UTF-8
  LANG: en_US.UTF-8
  LANGUAGE: en_US.UTF-8
  # DISCOURSE_DEFAULT_LOCALE: en

  ## Quante richieste web concorrenti sono supportate? Dipende dalla memoria e dai core della CPU.
  ## verrà impostato automaticamente da bootstrap in base alle CPU rilevate, oppure puoi sovrascrivere
  #UNICORN_WORKERS: 3

  ## TODO: Il nome di dominio a cui risponderà questa istanza di Discourse
  ## Obbligatorio. Discourse non funzionerà con un indirizzo IP grezzo.
  DISCOURSE_HOSTNAME: 'faq.mobiloan.io'

  ## Rimuovi il commento se vuoi che il container venga avviato con lo stesso
  ## hostname (opzione -h) specificato sopra (predefinito "$hostname-$config")
  #DOCKER_USE_HOSTNAME: true

  ## TODO: Elenco di email separate da virgola che diventeranno amministratori e sviluppatori
  ## durante la registrazione iniziale, esempio 'user1@example.com,user2@example.com'
  DISCOURSE_DEVELOPER_EMAILS: ‘ inserisci qui l'email ’

  ## TODO: Il server di posta SMTP utilizzato per validare nuovi account e inviare notifiche
  ## INDIRIZZO SMTP, nome utente e password sono obbligatori
  ## ATTENZIONE: il carattere '#' nella password SMTP può causare problemi!
  DISCOURSE_SMTP_ADDRESS: INSERISCI SMTP QUI
  DISCOURSE_SMTP_PORT: 587
  DISCOURSE_SMTP_USER_NAME: INSERISCI NOME UTENTE QUI
  DISCOURSE_SMTP_PASSWORD: INSERISCI PASSWORD QUI
  DISCOURSE_SMTP_ENABLE_START_TLS: true           # (opzionale, predefinito true, usiamo Amazon SES)

 

  #DISCOURSE_SMTP_DOMAIN: discourse.example.com    # (richiesto da alcuni provider)
  #DISCOURSE_NOTIFICATION_EMAIL: noreply@discourse.example.com    # (indirizzo da cui inviare le notifiche)

  ## Se hai aggiunto il template Lets Encrypt, rimuovi il commento qui sotto per ottenere un certificato SSL gratuito
  #LETSENCRYPT_ACCOUNT_EMAIL: me@example.com

  ## L'indirizzo CDN http o https per questa istanza di Discourse (configurato per il recupero)
  ## vedi https://meta.discourse.org/t/14857 per i dettagli
  #DISCOURSE_CDN_URL: https://discourse-cdn.example.com
  
  ## La chiave IP di geolocalizzazione Maxmind per la ricerca degli indirizzi IP
  ## vedi https://meta.discourse.org/t/-/137387/23 per i dettagli
  #DISCOURSE_MAXMIND_LICENSE_KEY: 1234567890123456

## Il container Docker è stateless; tutti i dati sono archiviati in /shared
volumes:
  - volume:
      host: /var/discourse/shared/standalone
      guest: /shared
  - volume:
      host: /var/discourse/shared/standalone/log/var-log
      guest: /var/log

## I plugin vanno qui
## vedi https://meta.discourse.org/t/19157 per i dettagli
hooks:
  after_code:
    - exec:
        cd: $home/plugins
        cmd:
          - git clone https://github.com/discourse/docker_manager.git

## Qualsiasi comando personalizzato da eseguire dopo la costruzione
run:
  - exec: echo "Inizio dei comandi personalizzati"
  ## Se desideri impostare l'indirizzo email 'From' per la tua prima registrazione, rimuovi il commento e modifica:
  ## Dopo aver ricevuto la prima email di registrazione, rimetti il commento alla riga. Deve essere eseguito solo una volta.
  #- exec: rails r "SiteSetting.notification_email='info@unconfigured.discourse.org'"
  - exec: echo "Fine dei comandi personalizzati"
  1. Una volta modificato e salvato il file, ricostruisci l’app Discourse eseguendo il seguente comando nel terminale

$ /var/discourse/launcher rebuild discourse

Nota: se il tuo file YAML ha un nome diverso, sostituisci discourse con il nome del tuo file YAML.

Nota che la ricostruzione richiede del tempo.

  1. Una volta ricostruita l’app, questa dovrebbe essere in esecuzione sulla porta 8080. Per verificare, esegui il seguente comando nel terminale

$ sudo lsof -i -P -n | grep LISTEN

Esempio di output delle porte

Noterai che Docker ascolta sulla porta 8080, mentre httpd (Apache) ascolta sulla porta 80.

Per quanto riguarda l’instradamento del traffico, Apache riceverà la richiesta web e, quando appropriato, la instraderà al container Discourse sulla porta 8080.

Per garantire che l’instradamento avvenga, devi configurare l’host virtuale nel file di configurazione di Apache.

CONFIGURAZIONE DELL’HOST VIRTUALE APACHE

  1. Il file di configurazione di Apache si trova in /etc/httpd/conf.d/00-virtualhosts.conf. httpd / apache / apache2 sono diverse versioni di Apache. I tuoi file potrebbero trovarsi in posizioni diverse se non stai usando il servizio httpd, ma la configurazione dell’host virtuale in questo caso sarà la stessa.

Opzioni di modifica:

1. Puoi usare nano e modificare tramite riga di comando / terminale
2. Su AWS, se stai usando MATE con PLUMA, puoi usare PLUMA per modificare il file
3. Puoi usare WINSCP per connetterti via SSH alla macchina e modificare il file tramite l’interfaccia grafica di Windows

Modifica il file /etc/httpd/conf.d/00-virtualhosts.conf aggiungendo quanto segue:

# FAQ (INSTRADAMENTI DISCOURSE)

<VirtualHost *:80>
  	ServerName  sub.domain.com
  	ProxyPreserveHost On
    ProxyPass "/" "http://localhost:8080/"
    ProxyPassReverse "/" "http://localhost:8080/"
</VirtualHost>
  1. Devi creare il record DNS CNAME corrispondente, facendo puntare il sottodominio al tuo server AWS / load balancer.

La nostra configurazione è un po’ complessa, poiché abbiamo un provider di domini che instrada tutto il traffico verso un load balancer AWS.

Il load balancer gestisce il nostro SSL/TLS tramite un certificato fornito da AWS.

Il load balancer instrada anche il traffico all’istanza AWS.

Apache è installato sull’istanza AWS e instrada il traffico verso:

  • Applicazioni Node Express
  • Applicazione Docker / Discourse.

CONCLUSIONE

Questa è solo una soluzione, ma è quella che ha funzionato con la nostra configurazione esistente.

Un grande ringraziamento a:

@Kane York per il suo articolo su Discourse,
@Axel Fernandes per il suo articolo su Medium e le sue note sul download dei file necessari di Discourse e
@Vivek Gite da nixCraft e il suo articolo su cyberciti sull’installazione di Docker su AWS Linux 2.