Quero instalar usando um proxy reverso para Apache

Caro @Teraterayuki

Aqui está um exemplo de conjunto de hosts virtuais Apache2 funcionais para um proxy reverso a um socket Unix em um container Discourse:

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

        # Níveis de log disponíveis: trace8, ..., trace1, debug, info, notice, warn,
        # error, crit, alert, emerg.
        # Também é possível configurar o nível de log para módulos específicos, por exemplo:
        #LogLevel info ssl:warn

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

        # Para a maioria dos arquivos de configuração de conf-available/, que são
        # habilitados ou desabilitados em nível global, é possível
        # incluir uma linha apenas para um host virtual específico. Por exemplo, a
        # seguinte linha habilita a configuração CGI apenas para este host,
        # após ter sido desabilitada globalmente com "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>

Porta 443

<IfModule mod_ssl.c>
<VirtualHost *:443>
        ServerName mysite.mydomain.com
        ServerAdmin webmaster@localhost
        #SSLProxyEngine on   #habilite isso após configurar o Let's Encrypt no proxy reverso
        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/

        # Níveis de log disponíveis: trace8, ..., trace1, debug, info, notice, warn,
        # error, crit, alert, emerg.
        # Também é possível configurar o nível de log para módulos específicos, por exemplo:
        #LogLevel info ssl:warn

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

        # Para a maioria dos arquivos de configuração de conf-available/, que são
        # habilitados ou desabilitados em nível global, é possível
        # incluir uma linha apenas para um host virtual específico. Por exemplo, a
        # seguinte linha habilita a configuração CGI apenas para este host,
        # após ter sido desabilitada globalmente com "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

Note gentilmente que nesta configuração o proxy usa um socket unix, não um socket web (ws)

Note também que nesta configuração você não precisa adicionar manualmente as informações do Let’s Encrypt. Você pode começar com isto:

Porta 80 Antes de Executar o 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/

        # Níveis de log disponíveis: trace8, ..., trace1, debug, info, notice, warn,
        # error, crit, alert, emerg.
        # Também é possível configurar o nível de log para módulos específicos, por exemplo:
        #LogLevel info ssl:warn

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

        # Para a maioria dos arquivos de configuração de conf-available/, que são
        # habilitados ou desabilitados em nível global, é possível
        # incluir uma linha apenas para um host virtual específico. Por exemplo, a
        # seguinte linha habilita a configuração CGI apenas para este host,
        # após ter sido desabilitada globalmente com "a2disconf".
        #Include conf-available/serve-cgi-bin.conf
        ModPagespeed Off
     
</VirtualHost>

Porta 443 Antes de Executar o Certbot

<IfModule mod_ssl.c>
<VirtualHost *:443>
        ServerName mysite.mydomain.com
        ServerAdmin webmaster@localhost
        #SSLProxyEngine on   #habilite isso após configurar o Let's Encrypt no proxy reverso
        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/

        # Níveis de log disponíveis: trace8, ..., trace1, debug, info, notice, warn,
        # error, crit, alert, emerg.
        # Também é possível configurar o nível de log para módulos específicos, por exemplo:
        #LogLevel info ssl:warn

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

        # Para a maioria dos arquivos de configuração de conf-available/, que são
        # habilitados ou desabilitados em nível global, é possível
        # incluir uma linha apenas para um host virtual específico. Por exemplo, a
        # seguinte linha habilita a configuração CGI apenas para este host,
        # após ter sido desabilitada globalmente com "a2disconf".
        #Include conf-available/serve-cgi-bin.conf
        ModPagespeed Off

</VirtualHost>
</IfModule>

Em seguida, se você executar:

certbot -d mysite.mydomain.com

O amigável certbot cuidará de adicionar o código SSL necessário para você.

Depois que nosso amigo certbot adicionar seu código de configuração e tudo estiver funcionando conforme o esperado, você pode descomentar esta linha:

#SSLProxyEngine on   #habilite isso após configurar o Let's Encrypt no proxy reverso

e reiniciar o apache2 novamente.

Espero que isso ajude @Teraterayuki

Cuide-se.


Notas Finais:

  1. Note gentilmente que não usamos haproxy em nossas configurações de proxy reverso apache2. O haproxy adiciona uma camada desnecessária de complexidade com quase nenhum benefício tangível (para nós), então executamos o apache2 como proxy reverso “da maneira fácil”. YMMV se você quiser usar haproxy; mas, honestamente, não usamos haproxy (em várias configurações de proxy reverso apache2 em produção) e nunca tivemos problemas com o apache2 como proxy reverso.
  1. Se você não estiver usando mod_pagespeed, comente essas linhas. No entanto, se você estiver executando mod_pagespeed, desabilite o mod_pagespeed por host virtual ao fazer proxy reverso para o Discourse.

Tudo de bom… e espero que isso ajude você de alguma pequena maneira.