User Tools

Site Tools


informatique:logiciels:apache

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
informatique:logiciels:apache [2012/11/03 00:01] – modification externe 127.0.0.1informatique:logiciels:apache [2020/11/02 17:57] (current) pteu
Line 1: Line 1:
-{{tag>informatique logiciel serveur web}} 
  
 ====== Apache ====== ====== Apache ======
  
-[[http://httpd.apache.org/|Apache]] est le plus répandu des serveur web ; c'est un serveur HTTP/HTTPS (avec mod_ssl) auquel on peut ajouter des modules pour étendre ses possibilités.+[[http://httpd.apache.org/|Apache]] est le plus répandu des serveurs web/HTTP dont les fonctionnalités sont extensibles grâce à un système de modules chargés au besoin.
  
-Les fichiers de configuration diffèrent selon la distribution Linux utilisée : sous Redhat le fichier de conf principal est **/etc/httpd/httpd.conf**, qui include le répertoire **/etc/httpd/conf.d/** qui contient les fichiers de configuration des modules. Le **DocumentRoot** par défaut (le répertoire qui contient les pages .html) est **/var/www/html**.+Les fichiers de configuration diffèrent selon la distribution Linux utilisée : sous Redhat-like le fichier de conf principal est **/etc/httpd/httpd.conf**, sous Debian-like il est sous **/etc/apache2/apache2.conf**. Le **DocumentRoot** par défaut (le répertoire qui contient les pages .html) est **/var/www/html**, les logs sont rangés, respectivement, dans **/var/log/httpd/*.log** ou **/var/log/apache2/*.log**.
  
-Les fichiers des logs sont situés dans le répertoire **/var/log/httpd/** : **error.log** qui contient les erreurs et **access.log** qui contient les traces de toutes les connexions des clients.+=====Configuration=====
  
-Pour connaitre les chemins des fichiers de conf sous Debian/Ubunturemplacez "httpd" par "apache" ou "apache2" !+Dans les versions les plus récentes d'Apache, on dépose les configurations de chaque site web dans un fichier dédié, rangé dans le dossier **site-available/** ; lorsqu'on souhaite activer ce site, on créé un lien symbolique de ce dernier dans **site-enabled/**. Ce lien peut être simplement créer via la commande **a2ensite <nom du fichier sans l'extension>**, par exemple ''a2ensite 000-default''
 + 
 +De même pour les modules, avec les dossiers **mods-available/** et **mods-enabled/**, et la commande **a2enmod <nom du module>**, et plus récemment des bouts de conf déposés dans **conf-available/** / **conf-enabled/** avec la commande a2enconf.
  
-=====Configuration===== 
  
 Exemple de directives de configuration commentées : Exemple de directives de configuration commentées :
Line 20: Line 20:
 ====Vérifications==== ====Vérifications====
  
-Il existe 3 syntaxes pour vérifier la configuration d'Apache, avant de redémarrer le service :+Il existe 3 syntaxes pour vérifier la configuration d'Apache :
 <code bash> <code bash>
 httpd -t httpd -t
-# cette commande produit un code de sortie, 0 pour OK et 1 en cas d'erreur+apachectl -t 
 +# cette commande produit un code de sortie, 0 pour OK et 1 en cas d'erreur (retour = "Syntax OK")
  
 # les 2 commandes ci-dessous indique où est l'erreur # les 2 commandes ci-dessous indique où est l'erreur
Line 75: Line 76:
 </code> </code>
  
-Les droits d'accès sont définis principalement par les directives **Allow**, **Deny** et **Order**. Order permet de modifier l'ordre de traitement des 2 directives précédente ; voici la façon dont les vérifications sont traitées (source : [[http://httpd.apache.org/docs/2.2/mod/mod_authz_host.html|doc apache]]) :+<WRAP center round important 60%> 
 +Depuis la version 2.4 d'Apache il est recommandé d'utiliser la directive **Require**, [[http://httpd.apache.org/docs/2.4/howto/access.html#host|les directives allow, deny et order étant désormais obsolètes]]. Des exemples d'utilisation de Require sont listés dans la partie [[informatique:logiciels:apache#serveur_mandataire_mod_proxy|mod_proxy]]. 
 +</WRAP> 
 + 
 +<del>Les droits d'accès sont définis principalement par les directives **Allow**, **Deny** et **Order**.</del> Order permet de modifier l'ordre de traitement des 2 directives précédente ; voici la façon dont les vérifications sont traitées (source : [[http://httpd.apache.org/docs/2.2/mod/mod_authz_host.html|doc apache]]) :
  
 >Ordering is one of: >Ordering is one of:
Line 164: Line 169:
  
  
-===== mod ssl =====+=====Proxy / mod_proxy===== 
 + 
 +Ce module permet d'activer la fonctionnalité de serveur mandataire d'Apache. Il nécessite l'activation d'autres mod pour fonctionner correctement : 
 +  * proxy : fonctionnalités de base du serveur mandataire 
 +  * proxy_http : permet de gérer le protocole HTTP 
 +  * proxy_connect : permet de gérer les connexion SSL chiffrées avec la méthode CONNECT (simple redirection dans ce cas) 
 +  * cache et disk_cache : ajoute la fonctionnalité de cache 
 +  * headers : permet de manipuler les en-têtes 
 + 
 +Activer ceux qu'il faut en fonction des besoins ; dans mon cas : 
 +<code bash> 
 +a2enmod proxy proxy_http proxy_connect headers 
 +</code> 
 + 
 +Exemple de configuration commentée : 
 +<code bash> 
 +# ref : https://httpd.apache.org/docs/2.4/fr/mod/mod_proxy.html 
 +<IfModule mod_proxy.c> 
 + 
 +# active la fonctionnalité de mandataire direct 
 +# ne concerne pas les directives ProxyPass (reverse proxy, voir plus bas) 
 +ProxyRequests On 
 + 
 +<Proxy *> 
 +   AddDefaultCharset off 
 +# on refuse tout par défaut 
 +   Require all denied 
 +# restriction sur un domaine/nom d'hote 
 +# attention cela provoque une double requete DNS + inverse de la part du serveur 
 +#   Require host .rv 
 +# restriction au localhost (127/8, ::1, IP du serveur local) 
 +   Require local 
 +# restriction des IPs clientes au seul LAN 
 +   Require ip 192.168.1 
 +# NB : 
 +# - si des directives doivent être toutes validées (aucune négative et au moins une positive), 
 +#      on encadre par <RequireAll> ... </RequireAll> 
 +# - si au moins l'une doit être positive, on encadre par <RequireAny> 
 +# - si aucune ne doit retourner de résultat positif on utilise <RequireNone> 
 +</Proxy> 
 + 
 +# ajout automatique du suffixe aux noms d'hôte non qualifiés (redirection) 
 +ProxyDomain ".rv" 
 +# connexion sans mandataire 
 +NoProxy     "192.168.1.0/24" ".rv" 
 +# définit le proxy suivant pour toutes (*) les requêtes 
 +#ProxyRemote * http://next-mandataire:8080 
 +# ProxyRemote ftp ftp://proxy-ftp.exemaple.com:8080 
 +# ProxyRemoteMatch est identique à ceci près que le premier paramètre est une regexpr 
 + 
 +# Créer un "alias" vers un site distant (~mirroring) / mandataire inverse (reverse proxy) ou passerelle 
 +# ex : http://mon_proxy/pteu/ -> http://pteu.fr/ 
 +<Location "/pteu/"> 
 +   ProxyPass "http://pteu.fr/" 
 +</Location> 
 +# syntaxe alternative, moins performante si présente en grand nombre : 
 +#ProxyPass "/pteu/" "http://pteu.fr/" 
 + 
 +# Enable/disable the handling of HTTP/1.1 "Via:" headers. 
 +# ("Full" adds the server version; "Block" removes all outgoing Via: headers) 
 +# Set to one of: Off | On | Full | Block 
 +ProxyVia Off 
 + 
 +# définit le nombre max de proxys traversés / pour éviter les boucles infinies 
 +ProxyMaxForwards 5 
 +# timeout réponse d'un site destination; par défaut = Timeout = 60s 
 +#ProxyTimeout 60 
 +# préserve l'entête Host: de la requête cliente 
 +#ProxyPreserveHost Off 
 + 
 +
 +# Filtrages destinations 
 +
 +# bloquer via nom d'hote, de domaine ou tld 
 +# attention les DNS sont résolus au démarrage d'Apache, ce qui le ralentit si en grand nombre 
 +ProxyBlock ".sex" "example.com" 
 +</IfModule> 
 + 
 +<IfModule mod_proxy_connect.c> 
 +# controle utilisation de la methode CONNECT sur certains ports seulement 
 +# défaut : AllowCONNECT 443 563 
 +   AllowCONNECT 21 443 
 +</IfModule> 
 +</code> 
 + 
 +=====HTTPS / mod_ssl=====
  
 Pour activer le **mod SSL** qui permet le chiffrement des données : Pour activer le **mod SSL** qui permet le chiffrement des données :
-  a2enmod ssl+<code bash> 
 +a2enmod ssl 
 +</code> 
 + 
 +=====mod_rewrite===== 
 + 
 +Le **mod_rewrite** permet de manipuler les requêtes entrantes du serveur http. 
 + 
 +Activation du module Apache : 
 +<code bash> 
 +a2enmod rewrite 
 +</code> 
 + 
 +====Syntaxe==== 
 + 
 +source : https://httpd.apache.org/docs/current/fr/mod/mod_rewrite.html#rewriterule 
 + 
 +Exemple de blocage de sites : 
 +<code bash> 
 +<IfModule mod_rewrite.c> 
 +   RewriteCond %{HTTP_HOST} sex.com [NC,OR] 
 +   RewriteCond %{HTTP_HOST} poker.fr [NC,OR] 
 +   RewriteCond %{HTTP_HOST} drugs.com [NC] # pas de OR pour le dernière condition... 
 +   RewriteRule ^(.*)$ - [F,L] 
 +</IfModule> 
 +</code> 
 +On enchaine différentes conditions ''RewriteCond'' (avec le drapeau ''NC'' pour //NoCase//, insensible à la casse) suivis d'un //OU logique// (''OR''), puis on définit la règle ''RewriteRule'' qui contient l'action ''F'' (envoi une erreur **403 : Forbidden** au navigateur) et ''L'' (last) pour arrêter le processus de réécriture. 
 + 
 +Exemple de mise ne place d'une redirection (permanente=301 par défaut) : ajouter ces lignes dans le fichier de configuration du vhost (''/etc/apache2/site-enable/vhost_redir'' dans mon cas) : 
 +<code bash> 
 +<IfModule mod_rewrite.c> 
 +RewriteEngine On 
 +RewriteRule ^(.*)$ http://pteu.fr$1 [R,L] 
 +</IfModule> 
 +</code> 
 + 
 +**Syntaxe** : ''RewriteRule <regex> <url de redirection> [<paramètres>]'' 
 + 
 +dans l'exemple ci-dessus, on redirige tout (''^(.*)$'') vers pteu.fr, avec un code HTTP ''301'' (qui correspond à une redirection permanente). On peut préciser une redirection temporaire (code=302) avec : 
 +<code bash> 
 +[..] 
 +RewriteRule ^(.*)$ http://pteu.fr$1 [R=302,L] 
 +</code> 
 + 
 +====Variables utilisables==== 
 + 
 +https://httpd.apache.org/docs/2.4/mod/mod_rewrite.html#rewritecond
  
  
-==== Générer un certificat ====+=====Générer un certificat=====
  
 Sous Redhat : Sous Redhat :
Line 299: Line 435:
 **NB** : dans tous les fichiers suivant, les commentaires sont précédés d'un dièze (#) **NB** : dans tous les fichiers suivant, les commentaires sont précédés d'un dièze (#)
 **ATTENTION** : il redémarrer les serveurs pour qu'ils prennent en compte la nouvelle configuration (clic droit sur l'icône d'EasyPHP situé dans la barre des taches/Redémarrer) **ATTENTION** : il redémarrer les serveurs pour qu'ils prennent en compte la nouvelle configuration (clic droit sur l'icône d'EasyPHP situé dans la barre des taches/Redémarrer)
 +
 +
 +=====De l'utilisation d'apache2ctl=====
 +
 +Utilisation de l'outil de diagnostique **apache2ctl** (ou **apachectl**, c'est un alias pour la "compatibilité ascendante") :
 +  * ''apache2ctl -V'' : affiche la version et les options de compilation
 +<code bash>
 +apachectl -V
 +Server version: Apache/2.4.29 (Unix)
 +Server built:   Oct 26 2017 16:18:29
 +Server's Module Magic Number: 20120211:68
 +Server loaded:  APR 1.6.2, APR-UTIL 1.6.0
 +Compiled using: APR 1.6.2, APR-UTIL 1.6.0
 +Architecture:   64-bit
 +Server MPM:     worker
 +  threaded:     yes (fixed thread count)
 +    forked:     yes (variable process count)
 +Server compiled with....
 + -D APR_HAS_SENDFILE
 + -D APR_HAS_MMAP
 +[..]
 +</code>
 +  * ''apache2ctl -S'' : permet de lister tous les VirtualHost pris en compte par Apache
 +<code bash>
 +apache2ctl -S
 +VirtualHost configuration:
 +wildcard NameVirtualHosts and _default_ servers:
 +*:80                   is a NameVirtualHost
 +         default server 192.168.1.1 (/etc/apache2/sites-enabled/000-default:1)
 +         port 80 namevhost 192.168.1.1 (/etc/apache2/sites-enabled/000-default:1)
 +Syntax OK
 +</code>
 +  * ''apache2ctl -M'' : lister les modules chargés
  
  
Line 332: Line 501:
 ==== ServerSignature ==== ==== ServerSignature ====
  
-  ServerSignature On | Off | EMail+<code bash> 
 +ServerSignature On | Off | EMail 
 +</code>
  
 Pour afficher la signature d'Apache (paramétrée avec la directive **ServerTokens**)en bas d'une page d'erreur (par exemple), ou juste l'email de l'administrateur. Pour afficher la signature d'Apache (paramétrée avec la directive **ServerTokens**)en bas d'une page d'erreur (par exemple), ou juste l'email de l'administrateur.
 +
 +====ScriptAlias====
 +
 +Aujourd'hui j'ai décidé de déposer une page HTML (valide) dans un de mes répertoires disponibles sous Apache. Surprise elle me génère une vilaine erreur 500 :
 +<code>
 +Internal Server Error
 +
 +The server encountered an internal error or misconfiguration and was unable to complete your request.
 +
 +Please contact the server administrator, webmaster@localhost and inform them of the time the error occurred, and anything you might have done that may have caused the error.
 +
 +More information about this error may be available in the server error log.
 +</code>
 +
 +D'après les logs ça viendrait du fait que Apache veuille exécuter la page, comme s'il s'agissait de CGI !
 +<code>
 +[Mon Jun 24 21:05:03 2013] [error] [client 192.168.1.1] (13)Permission denied: exec of '/var/www/foo/toto.html' failed
 +[Mon Jun 24 21:05:03 2013] [error] [client 192.168.1.1] Premature end of script headers: toto.html
 +</code>
 +
 +Après avoir tourné en rond quelques minutes en regardant si son extension (html) n'était pas préemptée par un module du genre php, le problème était devant le clavier : j'ai vilainement copier/coller le paragraphe des cgi-bin pour déclarer mon nouveau répertoire qui contient mon fichier toto.html :
 +<code bash>
 +ScriptAlias /foo "/var/www/foo/"
 +<Directory "/var/www/foo">
 +   Options FollowSymLinks
 +   AllowOverride All
 +   Order allow,deny
 +   Allow from 192.168.1
 +</Directory>
 +</code>
 +Et oui c'est bien ce fâcheux ''ScriptAlias'' (au lieu de ''Alias'' tout court) qui indique, à tord, à Apache que le dossier contient des exécutables et non des pages html. Solved.
  
  
informatique/logiciels/apache.1351900913.txt.gz · Last modified: 2013/10/14 20:55 (external edit)