Quiero instalar usando un proxy inverso para Apache

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