Apache2 als http / https Proxy zu anderen Host
Aus znilwiki
Im Zuge meines Umbau des Servers für das znilwiki habe ich auch meinen Zabbix-Server auf einen anderen Host verlegt.
Dieser hat intern die IP
192.168.200.15
Die Anfragen von außen landen alle auf
http://zabbix.znil.net https://zabbix.znil.net
Auf einem anderen Ubuntu Server - der auch die http://znil.net Webseite mit dem Wiki hostet. Die Anfragen an den Zabbix-Server sollen nun aber "durchgeleitet" werden.
Und das ist eigentlich gar nicht so schwer.
1 Apache Module nachinstallieren / aktiviern
Um den Apache auch als Reverse Proxy nutzen zu können brauch es ein paar Module die erst noch aktiviert werden müssen:
a2enmod rewrite a2enmod proxy_http a2enmod ssl
Im Anschluss ein
service apache2 restart
und es kann losgehen.
2 Subdomain anlegen
Zunächst legt die Subdomain dazu in ISPConfig bzw. direkt als vhost an.
3 .vHost bearbeiten
Dann bearbeitet die .conf
Datei der Webseite, also z.B. die
nano /etc/apache2/sites-enabled/100-zabbix.znil.net.vhost
und löscht den gesamten Inhalt. Ersetzt diesen durch folgenden Inhalt:
<Directory /var/www/zabbix.znil.net> AllowOverride None Require all denied </Directory> <VirtualHost 192.168.200.10:80> ServerName zabbix.znil.net ServerAdmin webmaster@zabbix.znil.net ProxyPass / http://192.168.200.15/ ProxyPassReverse / http://192.168.200.15/ </VirtualHost> <VirtualHost 192.168.200.10:443> ServerName zabbix.znil.net ServerAdmin webmaster@zabbix.znil.net SSLEngine on SSLCertificateFile /var/www/clients/client0/web7/ssl/zabbix.znil.net.crt SSLCertificateKeyFile /var/www/clients/client0/web7/ssl/zabbix.znil.net.key ProxyPass / http://192.168.200.15/ ProxyPassReverse / http://192.168.200.15/ </VirtualHost>
In dem obigen Fall findet die Kommunikation zwischen dem Apache2 Host und dem Weiterleitungsziel unverschlüsselt statt:
Internet -> SSL Verbindung per https:// -> Apache2 Proxy -> Weiterleitung unverschlüsselt per http:// -> Zielserver 192.168.200.15
Soll auch der Datenverkehr zwischen dem Apache2 Proxy und der Zeilseite verschlüsselt ablaufen so muss der 2. teil wie folgt lauten:
<VirtualHost 192.168.200.10:443> ServerName zabbix.znil.net ServerAdmin webmaster@zabbix.znil.net SSLEngine on SSLCertificateFile /var/www/clients/client0/web7/ssl/zabbix.znil.net.crt SSLCertificateKeyFile /var/www/clients/client0/web7/ssl/zabbix.znil.net.key SSLProxyEngine On ProxyPass / https://192.168.200.15/ ProxyPassReverse / https://192.168.200.15/ </VirtualHost>
Statt der IP-Adressen sind übrigends auch FQDN-Namen erlaubt - der Server auf dem der Apache2 Proxy läuft muss den Namen auflösen können!
Falls Ihr nun noch eine Fehlermeldung wie diese bekommt:
Proxy Error
The proxy server could not handle the request GET /web_app. Reason: Error during SSL Handshake with remote server
dann ändert den 2. Teil wie folgt:
<VirtualHost 192.168.200.10:443> ServerName zabbix.znil.net ServerAdmin webmaster@zabbix.znil.net SSLEngine on SSLCertificateFile /var/www/clients/client0/web7/ssl/zabbix.znil.net.crt SSLCertificateKeyFile /var/www/clients/client0/web7/ssl/zabbix.znil.net.key SSLProxyEngine On SSLProxyVerify none SSLProxyCheckPeerCN off SSLProxyCheckPeerName off SSLProxyCheckPeerExpire off ProxyPass / https://192.168.200.15/ ProxyPassReverse / https://192.168.200.15/ </VirtualHost>
Damit schalten wir sämtliche Prüfungen auf Zertifikatsgültigkeiten auf dem internen Weg ab
4 Mattermost
Einstellungen für Mattermost:
# setup the proxy
<Proxy *>
Order allow,deny
Allow from all
</Proxy>
ProxyPreserveHost On
ProxyRequests Off
RewriteEngine On
RewriteCond %{REQUEST_URI} /api/v[0-9]+/(users/)?websocket [NC,OR]
RewriteCond %{HTTP:UPGRADE} ^WebSocket$ [NC,OR]
RewriteCond %{HTTP:CONNECTION} ^Upgrade$ [NC]
RewriteRule .* ws://127.0.0.1:8065%{REQUEST_URI} [P,QSA,L]
# RewriteRule .* wss://127.0.0.1:8065%{REQUEST_URI} [P,QSA,L]
RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} !-f
RewriteRule .* http://127.0.0.1:8065%{REQUEST_URI} [P,QSA,L]
<LocationMatch "^/api/v(?<apiversion>[0-9]+)/(?<apiusers>users/)?websocket">
Require all granted
ProxyPass ws://127.0.0.1:8065/api/v%{env:MATCH_APIVERSION}/%{env:MATCH_APIUSERS}websocket
ProxyPassReverse ws://127.0.0.1:8065/api/v%{env:MATCH_APIVERSION}/%{env:MATCH_APIUSERS}websocket
ProxyPassReverseCookieDomain 127.0.0.1 moin.znil.net
</LocationMatch>
<Location />
Require all granted
ProxyPass http://127.0.0.1:8065/
ProxyPassReverse http://127.0.0.1:8065/
ProxyPassReverseCookieDomain 127.0.0.1 moin.znil.net
</Location>