Quero instalar usando um proxy reverso para Apache

Eu queria instalar usando o proxy reverso do Apache e tentei instalar com uma porta personalizada, mas não funcionou.
Existe alguma maneira de fazer isso?

Verificando seu nome de domínio . . .
AVISO: A porta 443 do computador não parece estar acessível usando o nome de host:  
NOME-DO-DOMÍNIO
AVISO: A conexão com NOME-DO-DOMÍNIO (porta 80) também falha.

Isso sugere que NOME-DO-DOMÍNIO resolve para algum endereço IP que não alcança esta 
máquina onde você está instalando o Discourse.

A primeira coisa a fazer é confirmar que NOME-DO-DOMÍNIO resolve para o endereço IP deste servidor.
Geralmente, você faz isso no mesmo local onde comprou o domínio.

Se você tem certeza de que o endereço IP resolve corretamente, pode ser um problema de firewall.
Uma pesquisa na web por "abrir portas SEU SERVIÇO DE NUVEM" pode ajudar.

Esta ferramenta foi projetada apenas para as instalações mais padrão. Se você não conseguir resolver
o problema acima, precisará editar containers/app.yml manualmente e depois digitar

FALHA
--------------------
Pups::ExecError: /usr/local/bin/ruby -e 'if ENV["DISCOURSE_HOSTNAME"] == "discourse.example.com"; puts "Abortando! Domínio não está configurado!"; exit 1; end' falhou com o retorno #<Process::Status: pid 176 exit 1>
Local da falha: /pups/lib/pups/exec_command.rb:112:in `spawn'
exec falhou com os parâmetros "/usr/local/bin/ruby -e 'if ENV[\"DISCOURSE_HOSTNAME\"] == \"discourse.example.com\"; puts \"Abortando! Domínio não está configurado!\"; exit 1; end'"
de0d133ffdd4c51d9a870d09bd16ce8fcc0680130ced1446f0038b4175a46840
** FALHA NO BOOTSTRAP ** por favor, role para cima e procure mensagens de erro anteriores, pode haver mais de uma.
./discourse-doctor pode ajudar a diagnosticar o problema.

app.yml

## quais portas TCP/IP este container deve expor?
## Se você quiser que o Discourse compartilhe uma porta com outro servidor web como Apache ou nginx,
## consulte https://meta.discourse.org/t/17247 para detalhes
expose:
  - "127.0.0.1:8100:80"   # http

params:

Você não pode usar discourse-setup, mas pode pesquisar: Como configurar o Discourse em um servidor com sites Apache existentes

Obrigado.
Segui o guia para construir o Discourse.
No entanto, o proxy reverso no Apache não está funcionando corretamente.

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

Erro

Nenhum manipulador de protocolo era válido para a URL /favicon.ico (esquema 'ws'). Se você estiver usando uma versão DSO do mod_proxy, certifique-se de que os submódulos de proxy estejam incluídos na configuração usando LoadModule.

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.

Concluído
Obrigado!
Aqui está o que realmente configuramos!

<VirtualHost *:80>
  ServerName DOMAIN-NAME
    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>

Bem-vindo!

Viu como é fácil?

Configurar o Apache2 como um proxy reverso para o Discourse é muito simples, como você demonstrou com sua configuração simples da porta 80 sem HTTPS. Bom trabalho :slight_smile:

Também acessamos o site com sucesso via https.
E configurei um proxy reverso no Apache para redirecionar para https.
No entanto, os recursos parecem estar sendo acessados via http e não estão sendo exibidos corretamente.
O que posso fazer?

Você deve postar seus arquivos de configuração funcionais para seus hosts virtuais, pois ninguém consegue vê-los nem ajudá-lo se você não os postar :slight_smile:

A propósito: publiquei arquivos de configuração de host virtual totalmente funcionais e operacionais (em produção) para a mesma configuração que você está tentando implementar. Se você entender e segui-los, não terá nenhum problema :wink:

É assim que configurei.
Parece que todas as URLs geradas pelo Discourse são 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>

Você deve definir DISCOURSE_FORCE_HTTPS como true ou ajustar essa configuração nas suas configurações do sistema.

Olá! O script discourse-setup leva a esta página quando as portas 80/443 já estão em uso, mas estas instruções não se aplicam a instalações novas. Como posso fazer uma instalação nova usando meu próprio proxy reverso?

Tente o seguinte:

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

Você ainda precisará editar o app.yml manualmente depois disso, mas isso pelo menos preencherá as informações que o script solicitar.

E me avise se isso ajudar, para que alguém possa atualizar o tutorial de acordo.

Eu modifiquei o script para usar uma variável para HTTP_PORT e HTTPS_PORT. No entanto, não é uma solução limpa porque ela será perdida. Acho que você pode seguir em frente e mencionar isso no post, será útil para uma instalação inicial :slight_smile:

Você fez as alterações no app.yml? Quando você acha que elas serão perdidas?