Apache

De Wiki de Jordan LE NUFF
Sauter à la navigation Sauter à la recherche
Ligne 54 : Ligne 54 :
 
=== Log par proxy ===
 
=== Log par proxy ===
 
Pour logger les adresses IP distantes, qui passent par un proxy donc, il faut ajouter la directive suivante dans le fichier <code>/local/www/current/conf/httpd.conf</code> dans la section <code>log_config_module</code> :
 
Pour logger les adresses IP distantes, qui passent par un proxy donc, il faut ajouter la directive suivante dans le fichier <code>/local/www/current/conf/httpd.conf</code> dans la section <code>log_config_module</code> :
<syntaxhighlight lang="apache" highlight="5">
+
<syntaxhighlight lang="apache" highlight="6-8">
 
<IfModule log_config_module>
 
<IfModule log_config_module>
 
...
 
...
 
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
 
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
 
LogFormat "%h %l %u %t \"%r\" %>s %b" common
 
LogFormat "%h %l %u %t \"%r\" %>s %b" common
LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" proxy
+
 
 +
<IfModule proxy_module>
 +
LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" proxy
 +
</IfModule>
  
 
<IfModule logio_module>
 
<IfModule logio_module>

Version du 10 janvier 2020 à 16:13

Présentation

Cette page a pour objet de lister les gestes techniques liées au serveur web Apache.

Plus d'informations sur le site de l'éditeur :

Administration simple

Localisation de la commande Apache

Pour identifier où est localisée la commande httpd, lancer la commande suivante :

find /local/www -name httpd

Exemple de retour :

/local/www/2.4.12/bin/httpd

Pour ajouter la commande dans le PATH afin de ne pas à avoir la chercher à chaque fois, créer un fichier /etc/profile/httpd.sh et y ajouter le contenu suivant :

PATH=$PATH:/local/www/2.4.12/bin

Enregistrer le fichier. Le sourcer pour une prise en compte immédiate avec la commande :

. /etc/profile/httpd.sh

Le binaire httpd est désormais dans le PATH. Pour le vérifier, taper :

which httpd

Exemple de retour :

/local/www/2.4.12/bin/httpd

Gestion du processus Apache

Démarrer Apache :

httpd -k start

Arrêter Apache subitement :

httpd -k stop

Arrêter Apache proprement :

httpd -k graceful-stop

Redémarrer Apache subitment :

httpd -k restart

Redémarrer Apache proprement :

httpd -k graceful

Afficher les vhosts configurés et la configuration en cours :

httpd -S

Afficher les modules chargés :

httpd -M

Vérifier la syntax du/des fichier(s) de configuration :

httpd -t

Gestion des logs

Log par proxy

Pour logger les adresses IP distantes, qui passent par un proxy donc, il faut ajouter la directive suivante dans le fichier /local/www/current/conf/httpd.conf dans la section log_config_module :

<IfModule log_config_module>
...
	LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
	LogFormat "%h %l %u %t \"%r\" %>s %b" common

	<IfModule proxy_module>
		LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" proxy
	</IfModule>

	<IfModule logio_module>
		# You need to enable mod_logio.c to use %I and %O
		LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio
	</IfModule>
...
</IfModule>

Cette ligne permet de déclarer un format de log spécifique, nommé proxy. La variable %{X-Forwarded-For}i représente l'adresse IP distante qui a envoyé la requête au proxy.

Une fois ce format déclaré, il faut l'appliquer aux requêtes "proxyfiées". Pour ce faire, dans la section VirtualHost correspond à l'application à logger, il faut ajouter/modifier les lignes suivantes :

<VirtualHost *:80>
...
	SetEnvIf X-Forwarded-For "^.*\..*\..*\..*" forwarded	
	CustomLog "|/usr/sbin/rotatelogs -n 5 /data/logs/${url_app}/${url_app}_http_access.log 10M" proxy env=forwarded
	CustomLog "|/usr/sbin/rotatelogs -n 5 /data/logs/${url_app}/${url_app}_http_access.log 10M" combined env=!forwarded
	ErrorLog "|/usr/sbin/rotatelogs -n 5 /data/logs/${url_app}/${url_app}_http_error.log 10M"
...
</VirtualHost>

La directive SetEnvIf permet de définir une variable forwarded uniquement si un en-tête X-Forwarded-For est déclaré dans la requête et qu'il respecte l'expression régulière ^.*\..*\..*\..*. Plus d'informations sur la documentation officielle d'Apache sur la directive SetEnvIf.

La partie proxy env=forwarded indique d'utiliser le format de log proxy dans le cas ou la variable forwarded existe.

La partie combined env=!forwarded indique d'utiliser le format de log combined dans le cas ou la variable forwarded n'existe pas.

Rotation des logs

Il est possible d'intégrer une rotation des logs directement dans la configuration Apache.

Pour ce faire, il faut avant tout localiser la commande rotatelogs sur le serveur dans le dossier des binaires d'Apache avec la commande suivante :

find /local/www/current -name rotatelogs

Exemple de retour :

/local/www/current/bin/rotatelogs

Une fois la commande localisée, adapter la déclaration des fichiers de logs dans la configuration Apache.

Exemple de configuration de rotation de logs :

<VirtualHost *:80>
	ServerName pprd-appli.mydomain.com
	DocumentRoot "/data/www/PREPROD/appli/"
	ErrorLog "|/local/www/current/bin/rotatelogs -l -f -n 15 /data/logs/${app_name}/${url_app}_http_error.log 10M"
	CustomLog "|/local/www/current/bin/rotatelogs -l -f -n 15 /data/logs/${app_name}/${url_app}_http_access.log 10M" combined
	LogLevel debug
	<Directory "/data/www/PREPROD/appli/">
		DirectoryIndex index.php
		Options FollowSymLinks
		AllowOverride All
		Require all granted
	</Directory>
</VirtualHost>

Les logs sont paramétrés pour ne tourner que sur 15 fichiers d'une taille maximale de 10M.

Plus d'informations sur la documentation officielle d'Apache : https://httpd.apache.org/docs/2.4/fr/programs/rotatelogs.html.

Configuration modèle

Voici un modèle de configuration Apache s'appuyant sur des variables de configuration (grâce à Define et UnDefine) dont il est possible de s'inspirer pour chaque nouveau vhost :

Define app_name appli.mydomain.com
# Appli de développement
<VirtualHost *:80>
	Define url_app dev-${app_name}
	ServerName ${url_app}
	DocumentRoot "/data/www/DEV/appli/public"
	ErrorLog "|/usr/sbin/rotatelogs -n 5 /data/logs/${url_app}_http_error.log 10M"
	CustomLog "|/usr/sbin/rotatelogs -n 5 /data/logs/${url_app}_http_access.log 10M" combined
	LogLevel debug
	
	php_flag log_errors on
	php_flag display_errors off
	# 32767 for E_ALL, 8 for E_NOTICE, 2 for E_WARNING, 1 for E_ERROR
	# More information on https://www.php.net/manual/fr/errorfunc.constants.php
	php_value error_reporting "8"
	php_value error_log /data/logs/${url_app}_php_error.log

	<Directory "/data/www/DEV/appli/public">
		DirectoryIndex index.html index.php
		Options FollowSymLinks
		AllowOverride All
		Require all granted
	</Directory>
	UnDefine url_app
</VirtualHost>

# Appli d'intégration
<VirtualHost *:80>
	Define url_app int-${app_name}
	ServerName ${url_app}
	DocumentRoot "/data/www/INT/appli/public"
	ErrorLog "|/usr/sbin/rotatelogs -n 5 /data/logs/${url_app}_http_error.log 10M"
	CustomLog "|/usr/sbin/rotatelogs -n 5 /data/logs/${url_app}_http_access.log 10M" combined
	LogLevel debug	
	
	php_flag log_errors on
	php_flag display_errors off
	# 32767 for E_ALL, 8 for E_NOTICE, 2 for E_WARNING, 1 for E_ERROR
	# More information on https://www.php.net/manual/fr/errorfunc.constants.php
	php_value error_reporting "8"
	php_value error_log /data/logs/${url_app}_php_error.log
	
	<Directory "/data/www/INT/appli/public">
		DirectoryIndex index.html index.php
		Options FollowSymLinks
		AllowOverride All
		Require all granted
	</Directory>
	UnDefine url_app
</VirtualHost>

# Appli de recette
<VirtualHost *:80>
	Define url_app rec-${app_name}
	ServerName ${url_app}
	DocumentRoot "/data/www/REC/appli/public"
	ErrorLog "|/usr/sbin/rotatelogs -n 5 /data/logs/${url_app}_http_error.log 10M"
	CustomLog "|/usr/sbin/rotatelogs -n 5 /data/logs/${url_app}_http_access.log 10M" combined
	LogLevel debug	
	
	php_flag log_errors on
	php_flag display_errors off
	# 32767 for E_ALL, 8 for E_NOTICE, 2 for E_WARNING, 1 for E_ERROR
	# More information on https://www.php.net/manual/fr/errorfunc.constants.php
	php_value error_reporting "8"
	php_value error_log /data/logs/${url_app}_php_error.log
	
	<Directory "/data/www/REC/appli/public">
		DirectoryIndex index.html index.php
		Options FollowSymLinks
		AllowOverride All
		Require all granted
	</Directory>
	UnDefine url_app
</VirtualHost>

# Appli de préproduction
<VirtualHost *:80>
	Define url_app pprd-${app_name}
	ServerName ${url_app}
	DocumentRoot "/data/www/PREPROD/current/public"
	ErrorLog "|/usr/sbin/rotatelogs -n 5 /data/logs/${url_app}_http_error.log 10M"
	CustomLog "|/usr/sbin/rotatelogs -n 5 /data/logs/${url_app}_http_access.log 10M" combined
	LogLevel debug	
	
	php_flag log_errors on
	php_flag display_errors off
	# 32767 for E_ALL, 8 for E_NOTICE, 2 for E_WARNING, 1 for E_ERROR
	# More information on https://www.php.net/manual/fr/errorfunc.constants.php
	php_value error_reporting "8"
	php_value error_log /data/logs/${url_app}_php_error.log
	
	<Directory "/data/www/PREPROD/current/public">
		DirectoryIndex index.html index.php
		Options FollowSymLinks
		AllowOverride All
		Require all granted
	</Directory>
	UnDefine url_app
</VirtualHost>
UnDefine app_name

Autoriser plusieurs dossiers

Dans le cas où il n'est pas envisageable de modifier la configuration Apache à chaque création d'un nouveau dossier, il est possible de donner accès à des dossiers correspondant à une expression régulière (voir la documentation à propos de la directive Directory). Voici un exemple :

# Appli de recette
<VirtualHost *:80>
	ServerAdmin mymail@mydomain.com
	DocumentRoot "/data/www/REC"
	ServerName rec-appli.mydomain.com
	RewriteEngine On
	ErrorLog "|/usr/sbin/rotatelogs -n 5 /data/logs/rec-appli.mydomain.com_http_error.log 10M"
	CustomLog "|/usr/sbin/rotatelogs -n 5 /data/logs/rec-appli.mydomain.com_http_access.log 10M" combined
	php_flag log_errors on
	php_flag display_errors off
	# 32767 for E_ALL, 8 for E_NOTICE, 2 for E_WARNING, 1 for E_ERROR
	# More information on https://www.php.net/manual/fr/errorfunc.constants.php
	php_value error_reporting "8"
	php_value error_log /data/logs/rec-appli.mydomain.com_php_error.log
	LogLevel debug
	
	<Directory ~ "/data/www/REC/appli.*">
		Options FollowSymLinks
		AllowOverride All
		Order allow,deny
		Allow from All
	</Directory>
</VirtualHost>

Dans cet exemple, seuls les dossiers commençant par /data/www/REC/appli seront publiés.

Erreurs connues

Forbidden You don't have permission to access

Derrière l'erreur "Forbidden You don't have permission to access [...]" peuvent se cacher de nombreuses causes.

Vérifier les droits

Il faut vérifier que l'utilisateur du processus Apache possède bien les droits d'accès au dossier/fichier concerné par l'erreur. Il faut également vérifier que l'existence dudit fichier/dossier.

Cohérence du contrôle d'accès

Avec Apache 2.2, la gestion du contrôle d'accès se faisait avec les directives Order Allow, Deny.

Avec Apache 2.4, bien que les directives Order Allow, Deny soient encore supportées, la gestion du contrôle d'accès se fait désormais avec la directive Require.

En 2.4, si, dans la configuration d'un vhost, il est utilisé une gestion d'accès différente de celle utilisé dans la configuration principale d'Apache, l'erreur Forbidden You don't have permission to access apparaîtra.

Il faut donc vérifier que la gestion d'accès utilisée est la même pour la configuration principale d'Apache et de ses vhosts.

AH00037: Symbolic link not allowed or link target not accessible

Vérifier les droits

Il faut vérifier que l'utilisateur du processus Apache possède bien les droits d'accès au lien concerné par l'erreur. Il faut également vérifier que l'existence dudit lien.

Combinaison de sections

Sur Apache 2.4, les sections sont combinées selon un ordre bien défini.

Plus particulièrement, "Les sections situées à l'intérieur de sections <VirtualHost> sont appliquées après les sections correspondantes situées en dehors de la définition de l'hôte virtuel, ce qui permet à l'hôte virtuel de prévaloir sur la configuration du serveur principal."

De ce fait, l'erreur "AH00037: Symbolic link not allowed or link target not accessible" peut être due à directive Options None définie dans la configuration principale d'Apache. Pour corriger cette situation, aller dans le fichier /local/www/<version>/conf/httpd.conf et remplacer la section :

<Directory />
	AllowOverride None
	Require all denied
	Options None
</Directory>

par :

<Directory />
	AllowOverride None
	Require all denied
</Directory>

Relancer Apache pour prise en compte des modifications :

httpd -k graceful