Voglio installare usando un proxy inverso per Apache

Volevo installare usando il reverse proxy di Apache e ho provato a installare con una porta personalizzata, ma non ha funzionato.
Esiste un modo per farlo?

Verifica del nome di dominio . . .
ATTENZIONE: La porta 443 del computer non sembra essere accessibile utilizzando l'hostname:  
NOME-DOMINIO
ATTENZIONE: Anche la connessione a NOME-DOMINIO (porta 80) fallisce.

Ciò suggerisce che NOME-DOMINIO risolve a un indirizzo IP che non raggiunge questa 
macchina su cui stai installando Discourse.

La prima cosa da fare è verificare che NOME-DOMINIO risolva all'indirizzo IP di questo server.
Di solito lo fai nello stesso luogo in cui hai acquistato il dominio.

Se sei sicuro che l'indirizzo IP risolva correttamente, potrebbe essere un problema del firewall.
Una ricerca sul web per "apri porte IL TUO SERVIZIO CLOUD" potrebbe essere d'aiuto.

Questo strumento è progettato solo per le installazioni più standard. Se non riesci a risolvere
il problema sopra, dovrai modificare manualmente containers/app.yml e poi digitare

FALLITO
--------------------
Pups::ExecError: /usr/local/bin/ruby -e 'if ENV["DISCOURSE_HOSTNAME"] == "discourse.example.com"; puts "Aborting! Domain is not configured!"; exit 1; end' fallito con return #<Process::Status: pid 176 exit 1>
Posizione del fallimento: /pups/lib/pups/exec_command.rb:112:in `spawn'
esecuzione fallita con i parametri "/usr/local/bin/ruby -e 'if ENV[\"DISCOURSE_HOSTNAME\"] == \"discourse.example.com\"; puts \"Aborting! Domain is not configured!\"; exit 1; end'"
de0d133ffdd4c51d9a870d09bd16ce8fcc0680130ced1446f0038b4175a46840
** FALLIMENTO DELL'INIZIALIZZAZIONE ** scorri verso l'alto e cerca i messaggi di errore precedenti, potrebbero essercene più di uno.
./discourse-doctor potrebbe aiutare a diagnosticare il problema.

app.yml

## quali porte TCP/IP dovrebbe esporre questo contenitore?
## Se vuoi che Discourse condivida una porta con un altro server web come Apache o nginx,
## consulta https://meta.discourse.org/t/17247 per i dettagli
expose:
  - "127.0.0.1:8100:80"   # http

params:

Non puoi utilizzare discourse-setup, ma puoi cercare: Come configurare Discourse su un server con siti Apache esistenti

2 Mi Piace

Grazie.
Ho seguito la guida per costruire Discourse.
Tuttavia, il reverse proxy in Apache non funziona correttamente.

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

Errore

 Nessun gestore di protocollo era valido per l'URL /favicon.ico (schema 'ws'). Se stai utilizzando una versione DSO di mod_proxy, assicurati che i moduli secondari del proxy siano inclusi nella configurazione usando LoadModule.

Gentile @Teraterayuki,

Ecco un esempio di configurazione funzionante per i virtual host di Apache2 che agiscono come reverse proxy verso una socket Unix in un 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/

        # Livelli di log disponibili: trace8, ..., trace1, debug, info, notice, warn,
        # error, crit, alert, emerg.
        # È anche possibile configurare il livello di log per moduli specifici, ad esempio:
        #LogLevel info ssl:warn

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

        # Per la maggior parte dei file di configurazione in conf-available/, abilitati o disabilitati a livello globale,
        # è possibile includere una riga valida solo per un particolare virtual host. Ad esempio,
        # la riga seguente abilita la configurazione CGI solo per questo host,
        # dopo che è stata disabilitata 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>

Porta 443

<IfModule mod_ssl.c>
<VirtualHost *:443>
        ServerName mysite.mydomain.com
        ServerAdmin webmaster@localhost
        #SSLProxyEngine on   #abilarla dopo aver configurato Let's Encrypt sul reverse proxy
        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/

        # Livelli di log disponibili: trace8, ..., trace1, debug, info, notice, warn,
        # error, crit, alert, emerg.
        # È anche possibile configurare il livello di log per moduli specifici, ad esempio:
        #LogLevel info ssl:warn

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

        # Per la maggior parte dei file di configurazione in conf-available/, abilitati o disabilitati a livello globale,
        # è possibile includere una riga valida solo per un particolare virtual host. Ad esempio,
        # la riga seguente abilita la configurazione CGI solo per questo host,
        # dopo che è stata disabilitata 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

Si prega di notare che in questa configurazione il proxy utilizza una socket unix e non una web socket (ws)

Si noti inoltre che in questa configurazione non è necessario aggiungere manualmente le informazioni di Let’s Encrypt. Puoi iniziare con questo:

Porta 80 prima di eseguire 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/

        # Livelli di log disponibili: trace8, ..., trace1, debug, info, notice, warn,
        # error, crit, alert, emerg.
        # È anche possibile configurare il livello di log per moduli specifici, ad esempio:
        #LogLevel info ssl:warn

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

        # Per la maggior parte dei file di configurazione in conf-available/, abilitati o disabilitati a livello globale,
        # è possibile includere una riga valida solo per un particolare virtual host. Ad esempio,
        # la riga seguente abilita la configurazione CGI solo per questo host,
        # dopo che è stata disabilitata globalmente con "a2disconf".
        #Include conf-available/serve-cgi-bin.conf
        ModPagespeed Off
     
</VirtualHost>

Porta 443 prima di eseguire Certbot

<IfModule mod_ssl.c>
<VirtualHost *:443>
        ServerName mysite.mydomain.com
        ServerAdmin webmaster@localhost
        #SSLProxyEngine on   #abilarla dopo aver configurato Let's Encrypt sul reverse proxy
        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/

        # Livelli di log disponibili: trace8, ..., trace1, debug, info, notice, warn,
        # error, crit, alert, emerg.
        # È anche possibile configurare il livello di log per moduli specifici, ad esempio:
        #LogLevel info ssl:warn

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

        # Per la maggior parte dei file di configurazione in conf-available/, abilitati o disabilitati a livello globale,
        # è possibile includere una riga valida solo per un particolare virtual host. Ad esempio,
        # la riga seguente abilita la configurazione CGI solo per questo host,
        # dopo che è stata disabilitata globalmente con "a2disconf".
        #Include conf-available/serve-cgi-bin.conf
        ModPagespeed Off

</VirtualHost>
</IfModule>

Quindi, se esegui:

certbot -d mysite.mydomain.com

Il gentile certbot si occuperà di aggiungere automaticamente il codice SSL necessario per te.

Dopo che il nostro amico certbot ha aggiunto il suo codice di configurazione e tutto funziona come previsto, puoi decommentare questa riga:

#SSLProxyEngine on   #abilarla dopo aver configurato Let's Encrypt sul reverse proxy

e riavviare apache2.

Spero che questo ti sia d’aiuto, @Teraterayuki

Stai attento.


Note conclusive:

  1. Si prega di notare che non utilizziamo haproxy nelle nostre configurazioni di reverse proxy Apache2. haproxy aggiunge un livello di complessità non necessario con quasi nessun beneficio tangibile (per noi), quindi eseguiamo Apache2 come reverse proxy “nel modo semplice”. Potrebbe essere diverso per te se desideri utilizzare haproxy, ma onestamente, non utilizziamo haproxy (in diversi setup di reverse proxy Apache2 in produzione) e non abbiamo mai avuto problemi con Apache2 come reverse proxy.
  1. Se non stai utilizzando mod_pagespeed``, commenta quelle righe. Tuttavia, se stai eseguendo mod_pagespeed``, disattiva mod_pagespeed per ogni virtual host quando si effettua il reverse proxy verso Discourse.

Tanti auguri… e speriamo che questo ti sia di qualche piccolo aiuto.

6 Mi Piace

Fatto
Grazie!
Ecco cosa abbiamo effettivamente configurato!

<VirtualHost *:80>
  ServerName NOME-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 Mi Piace

Benvenuto!

Vedi com’è facile?

Configurare Apache2 come proxy inverso per Discourse è un gioco da ragazzi, come dimostri con la tua semplice configurazione della porta 80 senza HTTPS. Ottimo lavoro :slight_smile:

3 Mi Piace

Abbiamo anche accesso al sito con successo tramite HTTPS.
Ho configurato un reverse proxy Apache per reindirizzare a HTTPS.
Tuttavia, le risorse sembrano essere caricate tramite HTTP e non vengono visualizzate correttamente.
Cosa posso fare?

Dovresti pubblicare i tuoi file di configurazione funzionanti per i virtual host, perché nessuno può vederli né aiutarti se non li pubblichi :slight_smile:

A proposito: ho pubblicato file di configurazione virtual host completamente funzionanti e operativi (per la produzione) per la stessa configurazione che stai cercando di implementare. Se li comprendi e li segui, non dovresti avere alcun problema :wink:

Ecco come l’ho configurato.
Sembra che tutti gli URL generati da Discourse siano http.

<VirtualHost *:80>
  ServerName NOME-DOMINIO
  RewriteEngine on
  RewriteCond %{HTTPS} off
  RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
</VirtualHost>
<VirtualHost *:443>
  ServerName NOME-DOMINIO
  SSLEngine On
  SSLProtocol all -SSLv2
  SSLCertificateFile /etc/letsencrypt/live/NOME-DOMINIO/fullchain.pem
  SSLCertificateKeyFile /etc/letsencrypt/live/NOME-DOMINIO/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>

Dovresti impostare DISCOURSE_FORCE_HTTPS su true o configurare tale opzione nelle impostazioni di sistema.

2 Mi Piace

Ciao! Lo script discourse-setup reindirizza qui quando le porte 80/443 sono in uso, ma queste istruzioni non si applicano alle nuove installazioni. Come posso effettuare una nuova installazione utilizzando il mio reverse proxy?

Prova questo:

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

Dovrai comunque modificare a mano il file app.yml dopo, ma almeno riempirà le parti che richiede.

Fammi sapere se ti è d’aiuto, così qualcuno potrà aggiornare di conseguenza la guida.

1 Mi Piace

Ho modificato lo script per utilizzare una variabile per HTTP_PORT e HTTPS_PORT. Tuttavia, non è una soluzione definitiva perché verrà persa. Penso che tu possa procedere e menzionarlo nel post; sarà utile per una prima installazione :slight_smile:

Hai apportato le modifiche all’app.yml? Quando pensi che andranno perse?