Come eseguire Discourse come VirtualHost Apache

Sono riuscito a installare Discourse sul mio server, registrarmi come primo utente e pubblicare il mio primo argomento. Quindi, tutto sul lato Discourse sembra funzionare correttamente.

Tuttavia, per installare e far funzionare Discourse, ho dovuto disabilitare il demone Apache httpd. Questo è un grosso problema per me, dato che ho di fatto spento l’intero server web, che include diversi domini e un server di conferenze Jitsi.

La mia installazione di Jitsi viene eseguita come host virtuale separato utilizzando un sottodominio di uno dei siti web che ospito. Poiché Jitsi riesce a condividere la porta 443 con il resto del traffico web, vorrei fare lo stesso con Discourse.

Qualcuno ha un template di definizione di virtualhost che permetta di reindirizzare il traffico a Discourse quando arriva sul sottodominio di Discourse?

Sì, ci sono guide qui su Meta che discutono l’esecuzione di Discourse insieme ad altri siti.

Sono sicuro che se usi la ricerca puoi trovarle.

Essenzialmente risolto, tuttavia la homepage sembra impiegare molto tempo per completare la richiesta, anche dopo che la pagina appare completamente caricata. (Non sono sicuro se questo sia un comportamento normale o meno.)

Discourse
Ho modificato il blocco expose in /var/discourse/containers/app.yml in:

expose:
  - "127.0.0.1:8000:80"   # http
  - "127.0.0.1:8443:443"  # https

Ciò inoltra dal localhost al contenitore Docker. Dopo averlo fatto, è necessario eseguire un rebuild usando ./launcher rebuild app

Apache2 2.4.43 (Ubuntu)
Ho aggiunto un nuovo virtual host per il sottodominio: discourse..com.conf in sites-available, che inoltra il traffico del sottodominio alla porta localhost su cui ascolta l’istanza Docker di Discourse. La definizione del virtual host è riportata di seguito:

<VirtualHost *:80>
    ServerName discourse.<myDomain>.com
    Redirect permanent / https://discourse.<myDomain>.com/
    RewriteEngine On
    RewriteCond %{HTTPS} off
    RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
</VirtualHost>

<VirtualHost *:443>

  ServerName discourse.<myDomain>.com

  SSLProtocol TLSv1 TLSv1.1 TLSv1.2
  SSLEngine on
  SSLProxyEngine on
  SSLCertificateFile /etc/letsencrypt/live/<myDomain>.com/cert.pem
  SSLCertificateKeyFile /etc/letsencrypt/live/<myDomain>.com/privkey.pem
  SSLCACertificateFile /etc/letsencrypt/live/<myDomain>.com/chain.pem
  SSLCipherSuite "EECDH+ECDSA+AESGCM:EECDH+aRSA+AESGCM:EECDH+ECDSA+SHA256:EECDH+aRSA+SHA256:EECDH+ECDSA+SHA384:EECDH+ECDSA+SHA256:EECDH+aRSA+SHA384:EDH+aRSA+AESGCM:EDH+aRSA+SHA256:EDH+aRSA:EECDH:!aNULL:!eNULL:!MEDIUM:!LOW:!3DES:!MD5:!EXP:!PSK:!SRP:!DSS:!RC4:!SEED"
  SSLHonorCipherOrder on
  Header set Strict-Transport-Security "max-age=31536000"

  <Location />
    Order allow,deny
    Allow from all
    Require all granted
  </Location>

  ProxyPreserveHost on
  ProxyRequests Off
  RequestHeader set X-Forwarded-Proto expr=%{REQUEST_SCHEME}
  RequestHeader set X-Real-IP expr=%{REMOTE_ADDR}
  ProxyPass / https://127.0.0.1:8443/
  ProxyPassReverse / https://127.0.0.1:8443/

</VirtualHost>

Dato che non dedico molto tempo alla configurazione di Apache, potrebbero esserci alcune righe non necessarie, oppure righe che potrebbero essere aggiunte o migliorate. Qualsiasi feedback è benvenuto.

Ciao @Nap,

Bene sapere che hai risolto il tuo problema.

Sto eseguendo Discourse su diversi server con Apache2 come reverse proxy front-end che si connette a una socket Unix; la configurazione funziona perfettamente (come sappiamo tutti, è leggermente più lenta di nginx, che uso anche su alcuni server, ma funziona bene).

Fondamentalmente, configuro il virtual host in questo modo:

Configurazione della porta 80

<VirtualHost *:80>
    ServerAdmin webmaster@localhost
    ServerName  discourse.mygreatwebsite.com
    DocumentRoot /website/discourse  # spesso non necessario

    RewriteEngine On
    ProxyPreserveHost On
    ProxyRequests Off
    ErrorLog /var/log/apache2/discourse.error.log
    LogLevel warn
    CustomLog /var/log/apache2/discourse.access.log combined

    RewriteCond %{SERVER_NAME} =discourse.mygreatwebsite.com
    RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>

Configurazione della porta 443:

<VirtualHost *:443>
  ServerAdmin webmaster@localhost
  ServerName  discourse.mygreatwebsite.com
  DocumentRoot /website/nginx  # nella maggior parte dei casi non necessario in questa configurazione
  
  SSLProxyEngine on
  RewriteEngine On
  ProxyPreserveHost On
  ProxyRequests Off
  RequestHeader set X-Forwarded-Proto expr=%{REQUEST_SCHEME}
  RequestHeader set X-Real-IP expr=%{REMOTE_ADDR}
  
  ProxyPass / unix:/var/discourse/shared/socket-only/discourse.http.sock|http://my.ip.address.here/
  ProxyPassReverse  / unix:/var/discourse/shared/socket-only/discourse.http.sock|http://my.ip.address.here/
  ErrorLog /var/log/apache2/discourse-ssl.error.log
  LogLevel warn
  CustomLog /var/log/apache2/discourse-ssl.access.log combined

  Include /etc/letsencrypt/options-ssl-apache.conf
  SSLCertificateFile /etc/letsencrypt/live/discourse.com/fullchain.pem
  SSLCertificateKeyFile /etc/letsencrypt/live/discourse.com/privkey.pem
</VirtualHost>

Note:

  1. Normalmente, lascio che letsecrypt certbot si occupi di tutto il lavoro relativo alla configurazione di tutti i certificati SSL, reindirizzamenti, ecc.

  2. Utilizziamo l’indirizzo IP a cui è associato apache2 nei file di configurazione di apache2.

  3. Configuriamo sempre questa esposizione tramite socket Unix nel contenitore Discourse e non esponiamo alcuna porta TCP/IP del contenitore in questa configurazione.

Ciao e spero che questo aggiunga qualche valore, anche se in ritardo.

Due rapide aggiunte:

  1. Se desideri utilizzare un socket Unix invece di un proxy diretto, puoi farlo (dopo aver abilitato web.socketed.template.yml nel tuo app.yml) nel seguente modo:
  ProxyPreserveHost On
  ProxyRequests Off
  RequestHeader set X-Forwarded-Proto https
  RequestHeader set X-Real-IP expr=%{REMOTE_ADDR}
  <Location />
    ProxyPass unix:/var/discourse/shared/standalone/nginx.http.sock|http://localhost/
    ProxyPassReverse unix:/var/discourse/shared/standalone/nginx.http.sock|http://localhost/
  </Location>

Tieni presente che probabilmente dovrai gestire SELinux se provi a far leggere ad Apache da /var/discourse in questo modo. Un comando come semanage fcontext -a -t httpd_sys_rw_content_t /var/discourse/shared/standalone/nginx.http.sock, seguito da restorecon /var/discourse/shared/standalone/nginx.http.sock, dovrebbe risolvere il problema.

  1. Apache include il piuttosto fantastico mod_md, che può ottenere automaticamente i certificati Let’s Encrypt per te. Lo consiglio vivamente.