Quiero instalar usando un proxy inverso para Apache

Quería instalarlo usando el proxy inverso de Apache e intenté instalarlo con un puerto personalizado, pero no funcionó.
¿Hay alguna manera de hacerlo?

Verificando tu nombre de dominio . . .
ADVERTENCIA: El puerto 443 de la computadora no parece ser accesible usando el nombre de host:  
DOMINIO
ADVERTENCIA: La conexión a DOMINIO (puerto 80) también falla.

Esto sugiere que DOMINIO se resuelve a una dirección IP que no llega a esta
máquina donde estás instalando Discourse.

Lo primero que debes hacer es confirmar que DOMINIO se resuelve a la dirección IP de este servidor.
Por lo general, esto se hace en el mismo lugar donde compraste el dominio.

Si estás seguro de que la dirección IP se resuelve correctamente, podría ser un problema del firewall.
Una búsqueda en la web sobre "abrir puertos TU_SERVICIO_EN_LA_NUBE" podría ayudar.

Esta herramienta está diseñada solo para las instalaciones más estándar. Si no puedes resolver
el problema anterior, necesitarás editar containers/app.yml tú mismo y luego escribir

FALLÓ
--------------------
Pups::ExecError: /usr/local/bin/ruby -e 'if ENV["DISCOURSE_HOSTNAME"] == "discourse.example.com"; puts "Aborting! Domain is not configured!"; exit 1; end' falló con el retorno #<Process::Status: pid 176 exit 1>
Ubicación del fallo: /pups/lib/pups/exec_command.rb:112:in `spawn'
La ejecución falló con los parámetros "/usr/local/bin/ruby -e 'if ENV[\"DISCOURSE_HOSTNAME\"] == \"discourse.example.com\"; puts \"Aborting! Domain is not configured!\"; exit 1; end'"
de0d133ffdd4c51d9a870d09bd16ce8fcc0680130ced1446f0038b4175a46840
** NO SE LOGRÓ EL INICIO ** por favor, desplázate hacia arriba y busca mensajes de error anteriores; puede haber más de uno.
./discourse-doctor puede ayudar a diagnosticar el problema.

app.yml

## ¿Qué puertos TCP/IP debe exponer este contenedor?
## Si deseas que Discourse comparta un puerto con otro servidor web como Apache o nginx,
## consulta https://meta.discourse.org/t/17247 para obtener detalles
expose:
  - "127.0.0.1:8100:80"   # http

params:

No puedes usar discourse-setup, pero puedes buscar: Cómo configurar Discourse en un servidor con sitios Apache existentes

2 Me gusta

Gracias.
Seguí la guía para construir Discourse.
Sin embargo, el proxy inverso en Apache no funciona correctamente.

    ProxyPass /  ws://var/discourse/shared/standalone/nginx.http.sock
    ProxyPassReverse / ws://var/discourse/shared/standalone/nginx.http.sock

Error

 No protocol handler was valid for the URL /favicon.ico (scheme 'ws'). If you are using a DSO version of mod_proxy, make sure the proxy submodules are included in the configuration using LoadModule., 

Estimado @Teraterayuki

Aquí tienes un ejemplo de configuración de hosts virtuales de Apache2 que funcionan como proxy inverso hacia un socket de dominio Unix en un contenedor de Discourse:

Puerto 80

<VirtualHost *:80>
        ServerName mysite.mydomain.com
        ServerAdmin webmaster@localhost
        ProxyPreserveHost On

        #ProxyPass / http://127.0.0.1:8888/
        #ProxyPassReverse / http://127.0.0.1:8888/

        # Niveles de registro disponibles: trace8, ..., trace1, debug, info, notice, warn,
        # error, crit, alert, emerg.
        # También es posible configurar el nivel de registro para módulos específicos, por ejemplo:
        #LogLevel info ssl:warn

        ErrorLog ${APACHE_LOG_DIR}/community_errors.log
        CustomLog ${APACHE_LOG_DIR}/community.log combined

        # Para la mayoría de los archivos de configuración de conf-available/, que están
        # habilitados o deshabilitados a nivel global, es posible incluir una línea
        # solo para un host virtual particular. Por ejemplo, la siguiente línea
        # habilita la configuración de CGI solo para este host,
        # después de haber sido deshabilitada globalmente con "a2disconf".
        #Include conf-available/serve-cgi-bin.conf
        ModPagespeed Off
        RewriteEngine on
        RewriteCond %{SERVER_NAME} =mysite.mydomain.com
        RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>

Puerto 443

<IfModule mod_ssl.c>
<VirtualHost *:443>
        ServerName mysite.mydomain.com
        ServerAdmin webmaster@localhost
        #SSLProxyEngine on   #habilitar esto después de configurar Let's Encrypt en el proxy inverso
        RewriteEngine On
        
        RewriteCond %{HTTP_USER_AGENT}  (Bytespider|Yandex|Wget|seocompany|CCBot|Cincraw) [NC]
        RewriteRule . - [R=403,L]

        ProxyPreserveHost On
        ProxyRequests Off
        RequestHeader set X-Forwarded-Proto expr=%{REQUEST_SCHEME}
        RequestHeader set X-Real-IP expr=%{REMOTE_ADDR}

        #ProxyPass / http://127.0.0.1:8888/
        #ProxyPassReverse / http://127.0.0.1:8888/
        ProxyPass / unix:/var/discourse/shared/socket-only/nginx.http.sock|http://localhost/
        ProxyPassReverse  / unix:/var/discourse/shared/socket-only/nginx.http.sock|http://localhost/

        # Niveles de registro disponibles: trace8, ..., trace1, debug, info, notice, warn,
        # error, crit, alert, emerg.
        # También es posible configurar el nivel de registro para módulos específicos, por ejemplo:
        #LogLevel info ssl:warn

        ErrorLog ${APACHE_LOG_DIR}/community_errors_ssl.log
        #CustomLog ${APACHE_LOG_DIR}/community_ssl.log combined

        # Para la mayoría de los archivos de configuración de conf-available/, que están
        # habilitados o deshabilitados a nivel global, es posible incluir una línea
        # solo para un host virtual particular. Por ejemplo, la siguiente línea
        # habilita la configuración de CGI solo para este host,
        # después de haber sido deshabilitada globalmente con "a2disconf".
        #Include conf-available/serve-cgi-bin.conf
        ModPagespeed Off
        SSLCertificateFile /etc/letsencrypt/live/mysite.mydomain.com/fullchain.pem
        SSLCertificateKeyFile /etc/letsencrypt/live/mysite.mydomain.com/privkey.pem
        Include /etc/letsencrypt/options-ssl-apache.conf
</VirtualHost>
</IfModule>

@Teraterayuki

Ten en cuenta amablemente que en esta configuración el proxy utiliza un socket unix, no un websocket (ws).

También ten en cuenta que en esta configuración no necesitas agregar manualmente la información de Let’s Encrypt. Puedes comenzar con esto:

Puerto 80 antes de ejecutar Certbot

<VirtualHost *:80>
        ServerName mysite.mydomain.com
        ServerAdmin webmaster@localhost
        ProxyPreserveHost On

        #ProxyPass / http://127.0.0.1:8888/
        #ProxyPassReverse / http://127.0.0.1:8888/

        # Niveles de registro disponibles: trace8, ..., trace1, debug, info, notice, warn,
        # error, crit, alert, emerg.
        # También es posible configurar el nivel de registro para módulos específicos, por ejemplo:
        #LogLevel info ssl:warn

        ErrorLog ${APACHE_LOG_DIR}/community_errors.log
        CustomLog ${APACHE_LOG_DIR}/community.log combined

        # Para la mayoría de los archivos de configuración de conf-available/, que están
        # habilitados o deshabilitados a nivel global, es posible incluir una línea
        # solo para un host virtual particular. Por ejemplo, la siguiente línea
        # habilita la configuración de CGI solo para este host,
        # después de haber sido deshabilitada globalmente con "a2disconf".
        #Include conf-available/serve-cgi-bin.conf
        ModPagespeed Off
     
</VirtualHost>

Puerto 443 antes de ejecutar Certbot

<IfModule mod_ssl.c>
<VirtualHost *:443>
        ServerName mysite.mydomain.com
        ServerAdmin webmaster@localhost
        #SSLProxyEngine on   #habilitar esto después de configurar Let's Encrypt en el proxy inverso
        RewriteEngine On


        ProxyPreserveHost On
        ProxyRequests Off
        RequestHeader set X-Forwarded-Proto expr=%{REQUEST_SCHEME}
        RequestHeader set X-Real-IP expr=%{REMOTE_ADDR}

        #ProxyPass / http://127.0.0.1:8888/
        #ProxyPassReverse / http://127.0.0.1:8888/
        ProxyPass / unix:/var/discourse/shared/socket-only/nginx.http.sock|http://localhost/
        ProxyPassReverse  / unix:/var/discourse/shared/socket-only/nginx.http.sock|http://localhost/

        # Niveles de registro disponibles: trace8, ..., trace1, debug, info, notice, warn,
        # error, crit, alert, emerg.
        # También es posible configurar el nivel de registro para módulos específicos, por ejemplo:
        #LogLevel info ssl:warn

        ErrorLog ${APACHE_LOG_DIR}/community_errors_ssl.log
        #CustomLog ${APACHE_LOG_DIR}/community_ssl.log combined

        # Para la mayoría de los archivos de configuración de conf-available/, que están
        # habilitados o deshabilitados a nivel global, es posible incluir una línea
        # solo para un host virtual particular. Por ejemplo, la siguiente línea
        # habilita la configuración de CGI solo para este host,
        # después de haber sido deshabilitada globalmente con "a2disconf".
        #Include conf-available/serve-cgi-bin.conf
        ModPagespeed Off

</VirtualHost>
</IfModule>

Luego, si ejecutas:

certbot -d mysite.mydomain.com

El amigable certbot se encargará de agregar el código SSL necesario por ti.

Después de que nuestro amigo certbot haya agregado su código de configuración y todo funcione como se espera, puedes descomentar esta línea:

#SSLProxyEngine on   #habilitar esto después de configurar Let's Encrypt en el proxy inverso

y reiniciar apache2 nuevamente.

Espero que esto ayude, @Teraterayuki.

Cuídate.


Notas finales:

  1. Ten en cuenta amablemente que no usamos haproxy en nuestras configuraciones de proxy inverso de apache2. haproxy agrega una capa innecesaria de complejidad con casi ningún beneficio tangible (para nosotros), por lo que ejecutamos apache2 como proxy inverso “de la manera fácil”. Tu experiencia puede variar si deseas usar haproxy; pero honestamente, no usamos haproxy (en varias configuraciones de proxy inverso de apache2 en producción) y nunca hemos tenido problemas con apache2 como proxy inverso.
  1. Si no estás usando mod_pagespeed``, comenta esas líneas. Sin embargo, si estás ejecutando mod_pagespeed, desactiva mod_pagespeed``` por host virtual al hacer proxy inverso hacia Discourse.

Lo mejor para ti… y espero que esto te ayude de alguna manera pequeña.

6 Me gusta

¡Ya terminé!
¡Gracias!
¡Así es como lo configuramos realmente!

<VirtualHost *:80>
  ServerName NOMBRE-DE-DOMINIO
    ProxyPreserveHost on
    RequestHeader set X-Forwarded-Proto expr=%{REQUEST_SCHEME}
    RequestHeader set X-Real-IP expr=%{REMOTE_ADDR}
    ProxyPass / unix:/var/discourse/shared/standalone/nginx.http.sock|http://localhost/
    ProxyPassReverse  / unix:/var/discourse/shared/standalone/nginx.http.sock|http://localhost/
</VirtualHost>

3 Me gusta

¡Bienvenido!

¿Ves lo fácil que es?

Configurar Apache2 como proxy inverso para Discourse es pan comido, como demuestras con tu sencilla configuración del puerto 80 sin HTTPS. Buen trabajo :slight_smile:

3 Me gusta

También accedimos correctamente al sitio mediante HTTPS.
Y he configurado un proxy inverso en Apache para redirigir a HTTPS.
Sin embargo, parece que los recursos se están accediendo mediante HTTP y no se muestran correctamente.
¿Qué puedo hacer?

Deberías publicar tus archivos de configuración funcionales para tus hosts virtuales, porque nadie puede verlos ni ayudarte si no los publicas :slight_smile:

Por cierto: Publicé archivos de configuración de hosts virtuales totalmente funcionales y operativos (producción) para la misma configuración que estás intentando implementar. Si los entiendes y los sigues, no deberías tener ningún problema :wink:

Así es como lo configuré.
Parece que todas las URLs generadas por Discourse son http.

<VirtualHost *:80>
  ServerName DOMAIN-NAME
  RewriteEngine on
  RewriteCond %{HTTPS} off
  RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
</VirtualHost>
<VirtualHost *:443>
  ServerName DOMAIN-NAME
  SSLEngine On
  SSLProtocol all -SSLv2
  SSLCertificateFile /etc/letsencrypt/live/DOMAIN-NAME/fullchain.pem
  SSLCertificateKeyFile /etc/letsencrypt/live/DOMAIN-NAME/privkey.pem
  ProxyPreserveHost on
  RequestHeader set X-Forwarded-Proto expr=%{REQUEST_SCHEME}
  RequestHeader set X-Real-IP expr=%{REMOTE_ADDR}
  ProxyPass / unix:/var/discourse/shared/standalone/nginx.http.sock|http://localhost/
  ProxyPassReverse  / unix:/var/discourse/shared/standalone/nginx.http.sock|http://localhost/
</VirtualHost>

Deberías definir DISCOURSE_FORCE_HTTPS como verdadero o configurar esa opción en tu configuración del sistema.

2 Me gusta

¡Hola! El script discourse-setup redirige aquí cuando los puertos 80/443 están en uso, pero estas instrucciones no se aplican a las instalaciones nuevas. ¿Cómo puedo realizar una instalación nueva usando mi propio proxy inverso?

Prueba esto:

./discourse-setup  --skip-connection-test --skip-rebuild

Aún tendrás que editar el archivo app.yml manualmente después, pero al menos rellenará la información que solicita.

Y avísame si te ayuda para que alguien pueda editar esa guía en consecuencia.

1 me gusta

He modificado el script para usar una variable para HTTP_PORT y HTTPS_PORT. Sin embargo, no es una solución limpia porque se perderá. Creo que puedes proceder a mencionarlo en la publicación; será útil para una instalación inicial :slight_smile:

¿Hiciste los cambios en el app.yml? ¿Cuándo crees que se perderán?