Ich möchte mit einem Reverse Proxy für Apache installieren

I wanted to install using Apache’s reverse proxy and tried to install with a custom port, but it didn’t work.
Is there any way to do this?

Checking your domain name . . .
WARNING: Port 443 of computer does not appear to be accessible using hostname:  
DOMAIN-NAME
WARNING: Connection to DOMAIN-NAME (port 80) also fails.

This suggests that DOMAIN-NAME resolves to some IP address that does not reach this 
machine where you are installing discourse.

The first thing to do is confirm that DOMAIN-NAME resolves to the IP address of this server.
You usually do this at the same place you purchased the domain.

If you are sure that the IP address resolves correctly, it could be a firewall issue.
A web search for "open ports YOUR CLOUD SERVICE" might help.

This tool is designed only for the most standard installations. If you cannot resolve
the issue above, you will need to edit containers/app.yml yourself and then type

FAILED
--------------------
Pups::ExecError: /usr/local/bin/ruby -e 'if ENV["DISCOURSE_HOSTNAME"] == "discourse.example.com"; puts "Aborting! Domain is not configured!"; exit 1; end' failed with return #<Process::Status: pid 176 exit 1>
Location of failure: /pups/lib/pups/exec_command.rb:112:in `spawn'
exec failed with the params "/usr/local/bin/ruby -e 'if ENV[\"DISCOURSE_HOSTNAME\"] == \"discourse.example.com\"; puts \"Aborting! Domain is not configured!\"; exit 1; end'"
de0d133ffdd4c51d9a870d09bd16ce8fcc0680130ced1446f0038b4175a46840
** FAILED TO BOOTSTRAP ** please scroll up and look for earlier error messages, there may be more than one.
./discourse-doctor may help diagnose the problem.

app.yml

## which TCP/IP ports should this container expose?
## If you want Discourse to share a port with another webserver like Apache or nginx,
## see https://meta.discourse.org/t/17247 for details
expose:
  - "127.0.0.1:8100:80"   # http

params:

You can’t use discourse-setup, but you can search: How to set up Discourse on a server with existing Apache sites

2 „Gefällt mir“

Vielen Dank.
Ich habe die Anleitung befolgt, um Discourse zu erstellen.
Der Reverse-Proxy in Apache funktioniert jedoch nicht ordnungsgemäß.

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

Fehler

Kein Protokoll-Handler war für die URL /favicon.ico gültig (Schema 'ws'). Wenn Sie eine DSO-Version von mod_proxy verwenden, stellen Sie sicher, dass die Proxy-Submodule in der Konfiguration über LoadModule enthalten sind.

Lieber @Teraterayuki,

hier ist eine Beispielkonfiguration für funktionierende Apache2-Virtual-Hosts für einen Reverse-Proxy zu einem Unix-Domain-Socket in einem Discourse-Container:

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

        # Verfügbare Log-Level: trace8, ..., trace1, debug, info, notice, warn,
        # error, crit, alert, emerg.
        # Es ist auch möglich, das Log-Level für bestimmte
        # Module zu konfigurieren, z. B.
        #LogLevel info ssl:warn

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

        # Für die meisten Konfigurationsdateien aus conf-available/, die
        # auf globaler Ebene aktiviert oder deaktiviert werden, ist es möglich,
        # eine Zeile nur für einen bestimmten Virtual-Host einzufügen. Zum Beispiel
        # die folgende Zeile aktiviert die CGI-Konfiguration nur für diesen Host,
        # nachdem sie global mit "a2disconf" deaktiviert wurde.
        #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>

Port 443

<IfModule mod_ssl.c>
<VirtualHost *:443>
        ServerName mysite.mydomain.com
        ServerAdmin webmaster@localhost
        #SSLProxyEngine on   #nach Einrichtung von Let's Encrypt auf dem Reverse-Proxy aktivieren
        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/

        # Verfügbare Log-Level: trace8, ..., trace1, debug, info, notice, warn,
        # error, crit, alert, emerg.
        # Es ist auch möglich, das Log-Level für bestimmte
        # Module zu konfigurieren, z. B.
        #LogLevel info ssl:warn

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

        # Für die meisten Konfigurationsdateien aus conf-available/, die
        # auf globaler Ebene aktiviert oder deaktiviert werden, ist es möglich,
        # eine Zeile nur für einen bestimmten Virtual-Host einzufügen. Zum Beispiel
        # die folgende Zeile aktiviert die CGI-Konfiguration nur für diesen Host,
        # nachdem sie global mit "a2disconf" deaktiviert wurde.
        #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

Bitte beachte, dass bei dieser Konfiguration der Proxy über einen Unix-Socket und nicht über einen WebSocket (ws) läuft.

Beachte auch, dass du bei dieser Konfiguration die Let’s-Encrypt-Informationen nicht manuell hinzufügen musst. Du kannst mit folgendem beginnen:

Port 80 vor der Ausführung von 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/

        # Verfügbare Log-Level: trace8, ..., trace1, debug, info, notice, warn,
        # error, crit, alert, emerg.
        # Es ist auch möglich, das Log-Level für bestimmte
        # Module zu konfigurieren, z. B.
        #LogLevel info ssl:warn

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

        # Für die meisten Konfigurationsdateien aus conf-available/, die
        # auf globaler Ebene aktiviert oder deaktiviert werden, ist es möglich,
        # eine Zeile nur für einen bestimmten Virtual-Host einzufügen. Zum Beispiel
        # die folgende Zeile aktiviert die CGI-Konfiguration nur für diesen Host,
        # nachdem sie global mit "a2disconf" deaktiviert wurde.
        #Include conf-available/serve-cgi-bin.conf
        ModPagespeed Off
     
</VirtualHost>

Port 443 vor der Ausführung von Certbot

<IfModule mod_ssl.c>
<VirtualHost *:443>
        ServerName mysite.mydomain.com
        ServerAdmin webmaster@localhost
        #SSLProxyEngine on   #nach Einrichtung von Let's Encrypt auf dem Reverse-Proxy aktivieren
        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/

        # Verfügbare Log-Level: trace8, ..., trace1, debug, info, notice, warn,
        # error, crit, alert, emerg.
        # Es ist auch möglich, das Log-Level für bestimmte
        # Module zu konfigurieren, z. B.
        #LogLevel info ssl:warn

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

        # Für die meisten Konfigurationsdateien aus conf-available/, die
        # auf globaler Ebene aktiviert oder deaktiviert werden, ist es möglich,
        # eine Zeile nur für einen bestimmten Virtual-Host einzufügen. Zum Beispiel
        # die folgende Zeile aktiviert die CGI-Konfiguration nur für diesen Host,
        # nachdem sie global mit "a2disconf" deaktiviert wurde.
        #Include conf-available/serve-cgi-bin.conf
        ModPagespeed Off

</VirtualHost>
</IfModule>

Wenn du dann folgenden Befehl ausführst:

certbot -d mysite.mydomain.com

wird der freundliche certbot automatisch den erforderlichen SSL-Code für dich hinzufügen.

Nachdem unser Freund certbot seine Konfigurationszeilen hinzugefügt hat und alles wie erwartet funktioniert, kannst du diese Zeile wieder aktivieren:

#SSLProxyEngine on   #nach Einrichtung von Let's Encrypt auf dem Reverse-Proxy aktivieren

und apache2 erneut neu starten.

Ich hoffe, das hilft dir, @Teraterayuki.

Pass gut auf dich auf.


Abschließende Hinweise:

  1. Bitte beachte, dass wir in unseren Apache2-Reverse-Proxy-Konfigurationen kein haproxy verwenden. haproxy fügt eine unnötige Komplexitätsebene hinzu, ohne einen spürbaren Vorteil (für uns) zu bieten. Daher betreiben wir Apache2 als Reverse-Proxy auf „die einfache Art“. Wenn du haproxy verwenden möchtest, mag das für dich anders sein (YMMV); aber ehrlich gesagt verwenden wir haproxy nicht (bei mehreren Apache2-Reverse-Proxy-Setups in Produktion) und hatten noch nie Probleme mit Apache2 als Reverse-Proxy.
  1. Wenn du mod_pagespeed nicht verwendest, kommentiere diese Zeilen aus. Wenn du jedoch mod_pagespeed betreibst, schalte mod_pagespeed pro Virtual-Host aus, wenn du einen Reverse-Proxy zu Discourse einrichtest.

Alles Gute… und ich hoffe, das hilft dir auf irgendeine kleine Weise.

6 „Gefällt mir“

Ich bin fertig
Vielen Dank!
Hier ist, was wir tatsächlich eingerichtet haben!

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

3 „Gefällt mir“

Willkommen!

Sehen Sie, wie einfach das ist?

Apache2 als Reverse-Proxy für Discourse einzurichten ist ein Kinderspiel, wie Sie mit Ihrer einfachen Port-80-Konfiguration ohne HTTPS zeigen. Gut gemacht :slight_smile:

3 „Gefällt mir“

Wir haben den Zugriff auf die Website über HTTPS ebenfalls erfolgreich getestet.
Ich habe zudem einen Reverse-Proxy in Apache eingerichtet, um auf HTTPS umzuleiten.
Allerdings scheinen die Ressourcen weiterhin über HTTP abgerufen zu werden und werden nicht korrekt angezeigt.
Was kann ich tun?

Du solltest deine funktionierenden Konfigurationsdateien für deine virtuellen Hosts posten, da niemand sie sehen oder dir helfen kann, wenn du sie nicht veröffentlichst :slight_smile:

Übrigens: Ich habe voll funktionsfähige, betriebene (Produktions-)Konfigurationsdateien für virtuelle Hosts für dieselbe Konfiguration gepostet, die du versuchst einzurichten. Wenn du sie verstehst und befolgst, solltest du überhaupt keine Probleme haben :wink:

So habe ich es eingerichtet.
Es sieht so aus, als ob alle von Discourse generierten URLs http sind.

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

Du solltest DISCOURSE_FORCE_HTTPS auf true setzen oder diese Einstellung in deinen Systemeinstellungen konfigurieren.

2 „Gefällt mir“

Hallo! Das Skript discourse-setup führt hierher, wenn die Ports 80/443 bereits belegt sind, aber diese Anweisungen gelten nicht für Neuinstallationen. Wie kann ich eine Neuinstallation mit meinem eigenen Reverse-Proxy durchführen?

Versuch folgendes:

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

Danach musst du die app.yml noch manuell bearbeiten, aber zumindest werden die angeforderten Angaben ausgefüllt.

Lass mich bitte wissen, ob es hilft, damit jemand das Howto entsprechend anpassen kann.

1 „Gefällt mir“

Ich habe das Skript so angepasst, dass es eine Variable für HTTP_PORT und HTTPS_PORT verwendet. Allerdings ist das keine saubere Lösung, da die Änderungen verloren gehen. Ich denke, du kannst das ruhig im Beitrag erwähnen – das wird für eine Erstinstallation hilfreich sein :slight_smile:

Du hast die Änderungen in der app.yml vorgenommen? Wann denkst du, dass sie verloren gehen werden?