Apache HTTP (Linux): Unterschied zwischen den Versionen
(71 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt) | |||
Zeile 1: | Zeile 1: | ||
== Installation == | == Installation == | ||
<pre> | <pre> | ||
sudo apt-get install apache2 apache2-doc | sudo apt-get -y install apache2 apache2-doc | ||
</pre> | </pre> | ||
Optional Benutzer zur, von Apache genutzten, Gruppe ''www-data'' hinzufügen: | |||
<pre> | |||
sudo usermod -aG www-data <user name> | |||
</pre> | |||
=== Module === | |||
==== PHP ==== | |||
{{note|Bei ''libapache2-mod-php'' auf die richtige Version kontrollieren}} | |||
===== Raspbian Buster 10 ===== | |||
<pre> | |||
sudo apt-get -y install php php-mbstring php-xml libapache2-mod-php php-mysql | |||
</pre> | |||
===== Ubuntu-Server 18.04 ===== | |||
<pre> | |||
sudo apt-get -y install php php-mbstring libapache2-mod-php php7.2 php7.2-mysql | |||
</pre> | |||
===== Ubuntu-Server 16.04 ===== | |||
<pre> | |||
sudo apt-get -y install php php-mbstring libapache2-mod-php7.0 php7.0 php7.0-mysql | |||
</pre> | |||
===== Ubuntu-Server 14.04 ===== | |||
<pre> | <pre> | ||
sudo apt-get install php5 | sudo apt-get -y install php5 libapache2-mod-php5 | ||
</pre> | </pre> | ||
===== Probleme ===== | |||
====== php wird nach Update auf 7.2 nicht ausgeführt ====== | |||
<pre> | <pre> | ||
sudo | sudo a2dismod mpm_event && sudo a2enmod mpm_prefork && sudo a2enmod php7.2 | ||
</pre> | </pre> | ||
Siehe [https://www.techrepublic.com/article/how-to-fix-apache-2-not-executing-php-files/ https://www.techrepublic.com/article/how-to-fix-apache-2-not-executing-php-files/] | |||
==== SSL ==== | |||
<pre> | <pre> | ||
sudo | sudo a2enmod ssl | ||
sudo service apache2 restart | |||
</pre> | </pre> | ||
Zeile 58: | Zeile 95: | ||
SetEnv HTTP_HOME /var/www/phpmyadmin | SetEnv HTTP_HOME /var/www/phpmyadmin | ||
</Directory> | </Directory> | ||
</pre> | |||
bzw. bei Einschränkung auf bestimmte Netzwerke: | |||
<pre> | |||
Alias /phpmyadmin "/var/www/phpmyadmin/" | |||
<Directory "/var/www/phpmyadmin"> | |||
Require ip 10.0.0.0/24 10.3.0.0/24 10.8.5.0/24 | |||
Options +FollowSymLinks | |||
... | |||
</pre> | </pre> | ||
Konfiguration aktivieren: | Konfiguration aktivieren: | ||
<pre style="white-space: pre-wrap; | <pre style="white-space: pre-wrap; | ||
white-space: -moz-pre-wrap; | white-space: -moz-pre-wrap; | ||
white-space: -pre-wrap; | white-space: -pre-wrap; | ||
white-space: -o-pre-wrap; | white-space: -o-pre-wrap; | ||
Zeile 98: | Zeile 146: | ||
ErrorLog ${APACHE_LOG_DIR}/<subdomain>.<domain>-error.log | ErrorLog ${APACHE_LOG_DIR}/<subdomain>.<domain>-error.log | ||
CustomLog ${APACHE_LOG_DIR}/<subdomain>.<domain>-access.log combined | CustomLog ${APACHE_LOG_DIR}/<subdomain>.<domain>-access.log combined | ||
</VirtualHost> | |||
</pre> | |||
==== Weiterleitung an einen anderen Server ==== | |||
Manchmal ist es erforderlich, Http(s)-Anfragen von außen an einen Server, der nur lokal erreichbar ist, weiter zu leiten. | |||
In dem her beschriebenen Beispiel, ist die Webseite <code>test.<domain></code> sowohl lokal, als auch von außen, unter dem selben DNS-Namen erreichbar. | |||
Im folgenden Beispiel habe ich das durch eine Subdomain <code>lokal.<domain></code> gelöst. Der von außen erreichbare Server nimmt dazu die Anfragen für <code>test.<domain></code> entgegen und leitet sie an <code>test.lokal.<domain></code> weiter. | |||
Für das Erstellen einer Subdomain siehe auch [[Bind_Konfiguration_(Linux)#Einrichten_einer_Subdomain|Subdomain in Bind]]. | |||
===== Weiterleitender Server ===== | |||
Der DNS-Name <code>test.<domain></code> muss auf den weiterleitenden Server aufgelöst werden und <code>test.lokal.<domain></code> auf den lokalen Server. In dem folgenden Beispiel ist die weitergeleitete Verbindung zum lokalen Server auch verschlüsselt. | |||
Zuerst müssen die erforderlichen Module aktiviert werden: | |||
<pre> | |||
sudo a2enmod proxy | |||
sudo a2enmod proxy_html | |||
sudo a2enmod proxy_http | |||
</pre> | |||
Danach eine Konfiguration nach folgenden Muster anlegen: | |||
<pre> | |||
<VirtualHost *:443> | |||
ServerName test.<domain> | |||
SSLProxyEngine On | |||
ProxyPass / https://test.local.<domain>/ | |||
ProxyPassReverse / https://test.local.<domain>/ | |||
SSLProxyCheckPeerName off | |||
SSLProxyCheckPeerCN off | |||
SSLEngine on | |||
SSLCertificateFile /etc/ssl/certs/test.crt | |||
SSLCertificateKeyFile /etc/ssl/private/apache.key | |||
</VirtualHost> | |||
</pre> | |||
Da das SSL-Zertifikat am Zielserver eigentlich für <code>test.<domain></code> ausgestellt wurde, muss noch die Validierung des Namen deaktiviert werden. Dazu dienen folgende Zeilen in obigen Beispiel: | |||
<pre> | |||
SSLProxyCheckPeerName off | |||
SSLProxyCheckPeerCN off | |||
</pre> | |||
===== Zielserver ===== | |||
Der Zielserver muss in der <code>.conf</code> den Namen <code>test.lokal.<domain></code> als Aliasnamen angegeben haben. | |||
<pre> | |||
<VirtualHost *:443> | |||
ServerName test.<domain> | |||
ServerAlias test.local.<domain> | |||
... | |||
</VirtualHost> | </VirtualHost> | ||
</pre> | </pre> | ||
Zeile 108: | Zeile 216: | ||
sudo service apache2 reload | sudo service apache2 reload | ||
</pre> | </pre> | ||
=== Weiterleitungen mit htaccess === | |||
==== Links ==== | |||
[https://www.df.eu/blog/301-redirects-weiterleitungen-mit-htaccess/ https://www.df.eu/blog/301-redirects-weiterleitungen-mit-htaccess/] | |||
== Passwortschutz von URLs == | |||
=== Datenbank === | |||
Die Option ''-c'' ist nur erforderlich, falls es die Datenbank noch nicht gibt: | |||
<pre> | |||
sudo htpasswd [-c] /etc/apache2/.htpasswd <name> | |||
</pre> | |||
=== Virtual-Host === | |||
<pre> | |||
<VirtualHost *:80> | |||
... | |||
<Directory "/var/www/html"> | |||
AuthType Basic | |||
AuthName "Restricted Content" | |||
AuthUserFile /etc/apache2/.htpasswd | |||
Require valid-user | |||
</Directory> | |||
... | |||
</VirtualHost> | |||
</pre> | |||
=== Links === | |||
[https://www.digitalocean.com/community/tutorials/how-to-set-up-password-authentication-with-apache-on-ubuntu-14-04 https://www.digitalocean.com/community/tutorials/how-to-set-up-password-authentication-with-apache-on-ubuntu-14-04] | |||
== Binden an ein Netzwerk == | |||
<pre> | |||
<Directory "/var/www/example"> | |||
Require ip 10.0.0.0/24 | |||
Options +FollowSymLinks | |||
... | |||
</Directory> | |||
</pre> | |||
Nicht ''Listen'': | |||
[https://httpd.apache.org/docs/2.4/de/bind.html https://httpd.apache.org/docs/2.4/de/bind.html] | |||
[https://httpd.apache.org/docs/2.4/de/mod/core.html#virtualhost https://httpd.apache.org/docs/2.4/de/mod/core.html#virtualhost] | |||
=== Links === | |||
[https://httpd.apache.org/docs/2.4/mod/mod_authz_host.html https://httpd.apache.org/docs/2.4/mod/mod_authz_host.html] | |||
== HTTP2 einrichten == | |||
=== Installation === | |||
<pre> | |||
sudo apt-get install -y php-fpm | |||
</pre> | |||
=== Konfiguration === | |||
<pre> | |||
sudo a2dismod php7.3 | |||
sudo a2enconf php7.3-fpm | |||
sudo a2enmod proxy_fcgi | |||
sudo a2dismod mpm_prefork | |||
sudo a2enmod mpm_event | |||
sudo a2enmod http2 | |||
</pre> | |||
Um HTTP2 global zu aktivieren, in der Datei | |||
<pre> | |||
sudo vi /etc/apache2/apache2.conf | |||
</pre> | |||
folgende Zeile hinzufügen: | |||
<pre> | |||
# enable http2 | |||
Protocols h2 h2c http/1.1 | |||
</pre> | |||
Dadurch werden die Protokolle in dieser Reihenfolge (HTTP2 over SSL, HTTP2 over TCP und HTTP1) in Abhängigkeit der Browser-Unterstützung verwendet. | |||
Im Anschluss deb Server neustarten: | |||
<pre> | |||
sudo systemctl restart apache2.service | |||
</pre> | |||
=== Testen === | |||
{{note|Hinweis: Von Browsern wird HTTP2 aktuell (Juni 2020) nur über SSL unterstützt}} | |||
==== Browser ==== | |||
Im Chrome-Browser die ''DevTools'' öffnen und unter ''Network'' die Spalte ''Protokoll'' aktivieren => dort sollte dann ''h2'' als Protokoll stehen. | |||
==== Curl ==== | |||
<pre> | |||
curl -v --http2 http://10.0.0.176/phpmyadmin/ | |||
</pre> | |||
=== Links === | |||
[https://www.howtoforge.com/how-to-enable-http-2-in-apache/ https://www.howtoforge.com/how-to-enable-http-2-in-apache/] | |||
[https://httpd.apache.org/docs/2.4/howto/http2.html https://httpd.apache.org/docs/2.4/howto/http2.html] | |||
== Neuinstallieren == | |||
[[Apache HTTP Neuinstallation (Linux)|Apache HTTP Neuinstallation]] | |||
== Server im Problemfall neustarten == | |||
{{note|Noch in Bearbeitung}} | |||
<pre> | |||
sudo vi /usr/local/bin/check_apache.sh | |||
</pre> | |||
<pre> | |||
#!/bin/bash | |||
TEMP_FOLDER=/tmp/.check_apache | |||
FILE=index.html | |||
mkdir $TEMP_FOLDER > /dev/null 2>&1 | |||
cd $TEMP_FOLDER | |||
rm -f $FILE | |||
wget -t 3 -O $FILE https://tutorials.kirner.or.at | |||
if [ ! -s $FILE ] | |||
then | |||
sudo /bin/systemctl reload apache2.service | |||
/usr/bin/mail -s "Apache2 web1 restartet" martin@kirner.or.at <<< 'Apache2 of server "web1" has been restart' | |||
fi | |||
</pre> | |||
<pre> | |||
sudo chmod a+x /usr/local/bin/check_apache.sh | |||
</pre> | |||
== Fehlermeldungen == | |||
=== You don't have permission to access ''<url>'' on this server.=== | |||
Das kann daran liegen, dass sich die Folder-Konfiguration von ''Apache 2.2'' auf ''Apache 2.4'' geändert hat. | |||
Konfiguration in ''Apache 2.2'': | |||
<pre> | |||
<Directory> | |||
... | |||
Order allow,deny | |||
Allow from all | |||
... | |||
</Directory> | |||
</pre> | |||
Konfiguration in ''Apache 2.4'': | |||
<pre> | |||
</Directory> | |||
... | |||
Require all granted | |||
... | |||
</Directory> | |||
</pre> | |||
=== [ssl:warn] [pid 604] AH01906: <fqdn>:443:0 server certificate is a CA certificate (BasicConstraints: CA == TRUE !?) === | |||
[https://sysadmin.compxtreme.ro/how-to-deal-with-rsa-server-certificate-is-a-ca-certificate-basicconstraints-ca-true-problem/ https://sysadmin.compxtreme.ro/how-to-deal-with-rsa-server-certificate-is-a-ca-certificate-basicconstraints-ca-true-problem/] | |||
[https://stackoverflow.com/questions/36138517/apache-warns-that-my-self-signed-certificate-is-a-ca-certificate https://stackoverflow.com/questions/36138517/apache-warns-that-my-self-signed-certificate-is-a-ca-certificate] | |||
=== [so:warn] [pid 11611] AH01574: module dav_module is already loaded, skipping === | |||
Die Konfigurationsdatei | |||
<pre> | |||
sudo vi /etc/apache2/mods-available/dav.load | |||
</pre> | |||
bearbeiten und <code><IfModule !mod_dav.c></code> hinzufügen: | |||
<pre> | |||
<IfModule !mod_dav.c> | |||
LoadModule dav_module /usr/lib/apache2/modules/mod_dav.so | |||
</IfModule> | |||
</pre> | |||
=== The mpm module (prefork.c) is not supported by mod_http2 === | |||
{{note|01.11.2020 - Testweise HTTP2 deaktiviert}} | |||
<pre> | |||
??? | |||
</pre> | |||
=== Leere Antworten bei PHP-Anfragen === | |||
<pre> | |||
sudo vi /etc/apache2/envvars | |||
</pre> | |||
<pre> | |||
export USE_ZEND_ALLOC=0 | |||
</pre> | |||
[https://serverfault.com/questions/66662/apache-gives-empty-reply https://serverfault.com/questions/66662/apache-gives-empty-reply] | |||
[https://www.php.net/manual/de/internals2.memory.management.php https://www.php.net/manual/de/internals2.memory.management.php] | |||
Zurück zu [[Ubuntu]] | Zurück zu [[Ubuntu#A (Server)|Ubuntu]] |
Aktuelle Version vom 16. Juli 2023, 13:29 Uhr
Installation
sudo apt-get -y install apache2 apache2-doc
Optional Benutzer zur, von Apache genutzten, Gruppe www-data hinzufügen:
sudo usermod -aG www-data <user name>
Module
PHP
Bei libapache2-mod-php auf die richtige Version kontrollieren
Raspbian Buster 10
sudo apt-get -y install php php-mbstring php-xml libapache2-mod-php php-mysql
Ubuntu-Server 18.04
sudo apt-get -y install php php-mbstring libapache2-mod-php php7.2 php7.2-mysql
Ubuntu-Server 16.04
sudo apt-get -y install php php-mbstring libapache2-mod-php7.0 php7.0 php7.0-mysql
Ubuntu-Server 14.04
sudo apt-get -y install php5 libapache2-mod-php5
Probleme
php wird nach Update auf 7.2 nicht ausgeführt
sudo a2dismod mpm_event && sudo a2enmod mpm_prefork && sudo a2enmod php7.2
Siehe https://www.techrepublic.com/article/how-to-fix-apache-2-not-executing-php-files/
SSL
sudo a2enmod ssl sudo service apache2 restart
Konfiguration
Um die Warnung bezüglich Domainname zu unterdrücken, in der Datei /etc/apache2/apache2.conf
am Ende folgende Zeile hinzufügen:
ServerName <domain name>
conf-available
Eine *.conf-Datei anlegen:
sudo touch /etc/apache2/conf-available/<conf name>.conf
Beispiel-Datei anhand der Seite phpMyAdmin:
Alias /phpmyadmin "/var/www/phpmyadmin/" <Directory "/var/www/phpmyadmin"> Options +FollowSymLinks AllowOverride All <IfModule mod_dav.c> Dav off </IfModule> SetEnv HOME /var/www/phpmyadmin SetEnv HTTP_HOME /var/www/phpmyadmin </Directory>
bzw. bei Einschränkung auf bestimmte Netzwerke:
Alias /phpmyadmin "/var/www/phpmyadmin/" <Directory "/var/www/phpmyadmin"> Require ip 10.0.0.0/24 10.3.0.0/24 10.8.5.0/24 Options +FollowSymLinks ...
Konfiguration aktivieren:
cd /etc/apache2/conf-available/ sudo a2enconf <conf name>.conf sudo service apache2 reload
sites-available
Port 80 auf Port 443 weiterleiten
<VirtualHost *:80> ServerName <subdomain>.<domain> ServerAlias <subdomain>.<domain> Redirect / https://<subdomain>.<domain> </VirtualHost>
Beispielkonfiguration für eine verschlüsselte Seite
<VirtualHost *:443> ServerName <subdomain>.<domain> SSLEngine on SSLCertificateFile /etc/ssl/certs/<subdomain>-apache.crt SSLCertificateKeyFile /etc/ssl/private/apache.key # Pfad zu den Webinhalten DocumentRoot /var/www/<subdomain> ErrorLog ${APACHE_LOG_DIR}/<subdomain>.<domain>-error.log CustomLog ${APACHE_LOG_DIR}/<subdomain>.<domain>-access.log combined </VirtualHost>
Weiterleitung an einen anderen Server
Manchmal ist es erforderlich, Http(s)-Anfragen von außen an einen Server, der nur lokal erreichbar ist, weiter zu leiten.
In dem her beschriebenen Beispiel, ist die Webseite test.<domain>
sowohl lokal, als auch von außen, unter dem selben DNS-Namen erreichbar.
Im folgenden Beispiel habe ich das durch eine Subdomain lokal.<domain>
gelöst. Der von außen erreichbare Server nimmt dazu die Anfragen für test.<domain>
entgegen und leitet sie an test.lokal.<domain>
weiter.
Für das Erstellen einer Subdomain siehe auch Subdomain in Bind.
Weiterleitender Server
Der DNS-Name test.<domain>
muss auf den weiterleitenden Server aufgelöst werden und test.lokal.<domain>
auf den lokalen Server. In dem folgenden Beispiel ist die weitergeleitete Verbindung zum lokalen Server auch verschlüsselt.
Zuerst müssen die erforderlichen Module aktiviert werden:
sudo a2enmod proxy sudo a2enmod proxy_html sudo a2enmod proxy_http
Danach eine Konfiguration nach folgenden Muster anlegen:
<VirtualHost *:443> ServerName test.<domain> SSLProxyEngine On ProxyPass / https://test.local.<domain>/ ProxyPassReverse / https://test.local.<domain>/ SSLProxyCheckPeerName off SSLProxyCheckPeerCN off SSLEngine on SSLCertificateFile /etc/ssl/certs/test.crt SSLCertificateKeyFile /etc/ssl/private/apache.key </VirtualHost>
Da das SSL-Zertifikat am Zielserver eigentlich für test.<domain>
ausgestellt wurde, muss noch die Validierung des Namen deaktiviert werden. Dazu dienen folgende Zeilen in obigen Beispiel:
SSLProxyCheckPeerName off SSLProxyCheckPeerCN off
Zielserver
Der Zielserver muss in der .conf
den Namen test.lokal.<domain>
als Aliasnamen angegeben haben.
<VirtualHost *:443> ServerName test.<domain> ServerAlias test.local.<domain> ... </VirtualHost>
Konfiguration aktivieren
cd /etc/apache2/sites-available/ sudo a2ensite <conf name>.conf sudo service apache2 reload
Weiterleitungen mit htaccess
Links
https://www.df.eu/blog/301-redirects-weiterleitungen-mit-htaccess/
Passwortschutz von URLs
Datenbank
Die Option -c ist nur erforderlich, falls es die Datenbank noch nicht gibt:
sudo htpasswd [-c] /etc/apache2/.htpasswd <name>
Virtual-Host
<VirtualHost *:80> ... <Directory "/var/www/html"> AuthType Basic AuthName "Restricted Content" AuthUserFile /etc/apache2/.htpasswd Require valid-user </Directory> ... </VirtualHost>
Links
Binden an ein Netzwerk
<Directory "/var/www/example"> Require ip 10.0.0.0/24 Options +FollowSymLinks ... </Directory>
Nicht Listen:
https://httpd.apache.org/docs/2.4/de/bind.html
https://httpd.apache.org/docs/2.4/de/mod/core.html#virtualhost
Links
https://httpd.apache.org/docs/2.4/mod/mod_authz_host.html
HTTP2 einrichten
Installation
sudo apt-get install -y php-fpm
Konfiguration
sudo a2dismod php7.3 sudo a2enconf php7.3-fpm sudo a2enmod proxy_fcgi sudo a2dismod mpm_prefork sudo a2enmod mpm_event sudo a2enmod http2
Um HTTP2 global zu aktivieren, in der Datei
sudo vi /etc/apache2/apache2.conf
folgende Zeile hinzufügen:
# enable http2 Protocols h2 h2c http/1.1
Dadurch werden die Protokolle in dieser Reihenfolge (HTTP2 over SSL, HTTP2 over TCP und HTTP1) in Abhängigkeit der Browser-Unterstützung verwendet.
Im Anschluss deb Server neustarten:
sudo systemctl restart apache2.service
Testen
Hinweis: Von Browsern wird HTTP2 aktuell (Juni 2020) nur über SSL unterstützt
Browser
Im Chrome-Browser die DevTools öffnen und unter Network die Spalte Protokoll aktivieren => dort sollte dann h2 als Protokoll stehen.
Curl
curl -v --http2 http://10.0.0.176/phpmyadmin/
Links
https://www.howtoforge.com/how-to-enable-http-2-in-apache/
https://httpd.apache.org/docs/2.4/howto/http2.html
Neuinstallieren
Server im Problemfall neustarten
Noch in Bearbeitung
sudo vi /usr/local/bin/check_apache.sh
#!/bin/bash TEMP_FOLDER=/tmp/.check_apache FILE=index.html mkdir $TEMP_FOLDER > /dev/null 2>&1 cd $TEMP_FOLDER rm -f $FILE wget -t 3 -O $FILE https://tutorials.kirner.or.at if [ ! -s $FILE ] then sudo /bin/systemctl reload apache2.service /usr/bin/mail -s "Apache2 web1 restartet" martin@kirner.or.at <<< 'Apache2 of server "web1" has been restart' fi
sudo chmod a+x /usr/local/bin/check_apache.sh
Fehlermeldungen
You don't have permission to access <url> on this server.
Das kann daran liegen, dass sich die Folder-Konfiguration von Apache 2.2 auf Apache 2.4 geändert hat.
Konfiguration in Apache 2.2:
<Directory> ... Order allow,deny Allow from all ... </Directory>
Konfiguration in Apache 2.4:
</Directory> ... Require all granted ... </Directory>
[ssl:warn] [pid 604] AH01906: <fqdn>:443:0 server certificate is a CA certificate (BasicConstraints: CA == TRUE !?)
[so:warn] [pid 11611] AH01574: module dav_module is already loaded, skipping
Die Konfigurationsdatei
sudo vi /etc/apache2/mods-available/dav.load
bearbeiten und <IfModule !mod_dav.c>
hinzufügen:
<IfModule !mod_dav.c> LoadModule dav_module /usr/lib/apache2/modules/mod_dav.so </IfModule>
The mpm module (prefork.c) is not supported by mod_http2
01.11.2020 - Testweise HTTP2 deaktiviert
???
Leere Antworten bei PHP-Anfragen
sudo vi /etc/apache2/envvars
export USE_ZEND_ALLOC=0
https://serverfault.com/questions/66662/apache-gives-empty-reply
https://www.php.net/manual/de/internals2.memory.management.php
Zurück zu Ubuntu