Cómo ejecutar Discourse como un VirtualHost de Apache

He podido instalar Discourse con éxito en mi servidor, registrarme como el primer usuario y publicar mi primer tema. Así que todo en el lado de Discourse parece estar funcionando.

Sin embargo, para instalar y ejecutar Discourse, tuve que desactivar mi daemon Apache httpd. Esto es un problema importante para mí, ya que básicamente he apagado todo mi servidor web, que incluye varios dominios y un servidor de conferencias Jitsi.

Mi instalación de Jitsi se ejecuta como un host virtual separado usando un subdominio de uno de los sitios web que estoy alojando. Dado que Jitsi puede compartir el puerto 443 con el resto del tráfico web, me gustaría hacer lo mismo con Discourse.

¿Alguien tiene una definición de host virtual de plantilla que permita redirigir el tráfico a Discourse cuando llegue a través del subdominio de Discourse?

2 Me gusta

Sí, hay guías aquí en Meta que discuten cómo ejecutar Discourse junto con otros sitios.

Estoy seguro de que si usas la búsqueda, puedes encontrarlas.

2 Me gusta

Básicamente resuelto, sin embargo, la página de inicio parece tardar mucho en finalizar la solicitud, incluso después de que la página parezca haberse cargado completamente. (No estoy seguro de si este es un comportamiento normal o no.)

Discourse
Modifiqué el bloque expose en /var/discourse/containers/app.yml para que quedara así:

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

Esto redirige desde localhost al contenedor de Docker. Después de hacer esto, es necesario realizar una reconstrucción usando ./launcher rebuild app

Apache2 2.4.43 (Ubuntu)
Añadí un nuevo host virtual para el subdominio: discourse..com.conf en sites-available, el cual redirige el tráfico del subdominio al puerto de localhost en el que escucha la instancia de Discourse en Docker. La definición del host virtual es la siguiente:

<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>

Dado que no dedico mucho tiempo a configurar Apache, puede haber algunas líneas innecesarias, o líneas que podrían añadirse o mejorarse. Cualquier comentario será bienvenido.

1 me gusta

Hola @Nap,

Es bueno saber que resolviste tu problema.

Estoy ejecutando Discourse en varios servidores con Apache2 como proxy inverso frontal hacia un socket Unix y la configuración funciona perfectamente (como todos sabemos, es un poco más lento que nginx, que también ejecuto en algunos servidores, pero funciona bien).

Básicamente, configuro el virtual host de la siguiente manera:

Configuración del puerto 80

<VirtualHost *:80>
    ServerAdmin webmaster@localhost
    ServerName  discourse.mygreatwebsite.com
    DocumentRoot /website/discourse  # a menudo no es necesario

    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>

Configuración del puerto 443:

<VirtualHost *:443>
  ServerAdmin webmaster@localhost
  ServerName  discourse.mygreatwebsite.com
  DocumentRoot /website/nginx  # generalmente no es necesario en esta configuración
  
  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>

Notas:

  1. Normalmente, dejo que letsecrypt certbot haga todo el trabajo relacionado con la configuración de todos los certificados SSL y redirecciones, etc.

  2. Usamos la dirección IP a la que está vinculado apache2 en los archivos de configuración de apache2.

  3. Siempre configuramos esto (exponemos) con sockets Unix en el contenedor de Discourse y no exponemos ningún puerto TCP/IP del contenedor en esta configuración.

Saludos y espero que esto añada algo de valor, aunque sea tarde en el juego.

5 Me gusta

Dos adiciones rápidas:

  1. Si deseas usar un socket Unix en lugar de un proxy directo, puedes hacerlo (después de habilitar web.socketed.template.yml en tu app.yml) de la siguiente manera:
  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>

Ten en cuenta que probablemente necesites gestionar SELinux si intentas que Apache lea desde /var/discourse de esa manera. Algo como semanage fcontext -a -t httpd_sys_rw_content_t /var/discourse/shared/standalone/nginx.http.sock seguido de restorecon /var/discourse/shared/standalone/nginx.http.sock debería funcionar para ello.

  1. Apache cuenta con el bastante increíble mod_md, que puede obtener tus certificados de LetsEncrypt de forma automática. Lo recomiendo encarecidamente.
2 Me gusta

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.