Both sides previous revisionPrevious revisionNext revision | Previous revision |
informatique:logiciels:apache [2014/03/01 10:44] – [mod ssl] pteu | informatique:logiciels:apache [2020/11/02 17:57] (current) – pteu |
---|
{{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/Ubuntu, remplacez "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 : |
</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: |
| |
| |
===== 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 : |
</code> | </code> |
| |
=====Réécriture===== | =====mod_rewrite===== |
| |
Le **mod_rewrite** permet de manipuler les requêtes entrantes. | Le **mod_rewrite** permet de manipuler les requêtes entrantes du serveur http. |
| |
Activation du module apache : | Activation du module Apache : |
<code bash> | <code bash> |
a2enmod rewrite | a2enmod rewrite |
</code> | </code> |
| |
Mise ne place d'une redirection temporaire : ajouter ces lignes dans le fichier de configuration du vhost (''/etc/apache2/site-enable/vhost_redir'' dans mon cas) : | ====Syntaxe==== |
| |
| source : https://httpd.apache.org/docs/current/fr/mod/mod_rewrite.html#rewriterule |
| |
| Exemple de blocage de sites : |
<code bash> | <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 | RewriteEngine On |
RewriteRule ^(.*)$ http://pteu.fr$1 [R=301,L] | RewriteRule ^(.*)$ http://pteu.fr$1 [R,L] |
| </IfModule> |
</code> | </code> |
| |
**Syntaxe** : ''RewriteRule <regex> <url de redirection> [<paramètres>]'' | **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 temporaire). ''L'' indique que c'est la dernière règle à parcourir. | 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 : |
**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 |
| |
| |
====ScriptAlias==== | ====ScriptAlias==== |
| |
Aujourd'hui j'ai décider de déposer une page HTML (valide) dans un de mes répertoire disponible sous Apache. Surprise elle me génère une vilaine erreur 500 : | 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> | <code> |
Internal Server Error | Internal Server Error |
</code> | </code> |
| |
Après avoir tourner 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 : | 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> | <code bash> |
ScriptAlias /foo "/var/www/foo/" | ScriptAlias /foo "/var/www/foo/" |
</code> | </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. | 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. |
| |
| |
===== Liens ===== | ===== Liens ===== |
| |
* [[http://www.karlesnine.com/spip.php?article147|Régénérer un certificat]] | * [[http://www.karlesnine.com/spip.php?article147|Régénérer un certificat]] |
* [[http://www.debianadmin.com/install-and-configure-apache2-with-php5-and-ssl-support-in-debian-etch.html|le même sur Debian admin]] | * [[http://www.debianadmin.com/install-and-configure-apache2-with-php5-and-ssl-support-in-debian-etch.html|le même sur Debian admin]] |