Outils pour utilisateurs

Outils du site


informatique:linux:apache

Apache

Alias : Répertoire Virtuel

Description

Permet de créer par exemple http://www.monsite.com/doc pointant autre part que le répertoire de base du site

Création du répertoire

Dans l'exemple ci-dessous on pourra en allant sur http://www.monsite.com/doc voir le contenu de /usr/share/doc

Vérifier que le fichier de configuration apache /etc/httpd/conf/httpd.conf contienne la ligne suivante :

  • Include conf.d/*.conf
grep Include /etc/httpd/conf/httpd.conf

Créer par exemple un fichier /etc/httpd/conf.d/doc.conf et insérer les lignes suivantes :

Alias /doc /usr/share/doc
<Directory "/opt/repo">
  Options Indexes FollowSymLinks MultiViews
  Order allow,deny
  Allow from all
  AllowOverride None
</Directory>

Explication :

  • Indexes : Permet de lister le contenu d'un répertoire
  • FollowSymLinks : Permet de suivre les liens symboliques
  • Order allow,deny : Ordre de filtrage, on autorise en priorité puis on refuse.
  • Allow from all : On autorise tout le monde.
  • AllowOverride : Permet de définir un type authetification, ici aucune.

Exemple pour apache sous Windows :

alias /doc "C:\documents"
<Directory "C:\documents">
  Options Indexes MultiViews FollowSymLinks
  AllowOverride AuthConfig
  Order deny,allow
  Allow from all
  Deny from all
</Directory>

Filtrer l'accès au répertoire par IP

Dans l'exemple ci-dessous nous autorisons l'accès http://www.monsite.com/doc uniquement aux adresses locales (127.0.0.0) et au réseau 192.168.20.0 :

Alias /doc "/usr/share/doc/"
<Directory "/usr/share/doc/">
    Options Indexes MultiViews FollowSymLinks
    AllowOverride None
    Order deny,allow
    Deny from all
    Allow from 127.0.0.0/255.0.0.0 ::1/128 192.168.20
</Directory>

Filtrer l'accès au répertoire par mot de passe

Dans l'exemple ci-dessous l'accès à http://www.monsite.com/doc sera restreint par un mot de passe :

Il faut éditer la configuration ainsi :

Alias /doc "/usr/share/doc/"
<Directory "/usr/share/doc/">
    Options Indexes MultiViews FollowSymLinks
    AllowOverride AuthConfig
    Order deny,allow
    Allow from all
    Deny from all
</Directory>

puis créer un fichier /usr/share/doc/.htaccess avec le contenu suivant :

AuthUserFile "/etc/apache2/.htpasswd"
AuthName "Acces /doc Restreint"
AuthType Basic
require valid-user

Pour terminer il faut créer le fichier mot de passe par la commande suivante :

 htpasswd -c /etc/apache2/.htpasswd user

Pour ajouter un autre utilisateur :

htpasswd /etc/apache2/.htpasswd user2

Pour effacer l'utilisateur user2:

htpasswd -D /etc/apache2/.htpasswd user2

VirtualHost : Pour gérer plusieurs sites Web sur un même serveur

Description

Les hébergements virtuels par IP utilisent l'adresse IP de la connexion afin de déterminer quel serveur virtuel doit répondre. Par conséquent, vous devez disposer d'adresses IP différentes pour chaque nom de domaine complet (FQDN) que vous hébergez. Avec un hébergement virtuel par nom, le serveur s'appuit sur les informations transmises par le client dans les en-têtes HTTP de ses requêtes. La technique présentée ici vous permet de disposer de serveurs virtuels différents partagés sur une même adresse IP.

Activer VirtualHost par nom

Pour l'activer, nous allons indiquer que les sites virtuels vont écouter sur n'importe quelle IP sur le port 80.

Nous allons éditer le fichier /etc/httpd/conf/httpd.conf et décommenter ou ajouter la ligne suivante :

NameVirtualHost *:80

Nous allons aussi créer un répertoire dans lequel on déposera un fichiers de configuration par site Web. Ajouter la ligne suivante :

Include vhost/*.conf

Créer le répertoire

mkdir /etc/httpd/vhost

Création d'un VirtualHost par nom

Dans cet exemple nous allons 2 sites :

Nous allons créer les répertoires de nos deux sites :

mkdir /var/www/www.siteweb{1,2}.com

Créer et éditer le fichier /etc/httpd/vhost/www.siteweb1.com.conf et insérer par exemple les lignes suivantes :

<VirtualHost *:80>
      ServerName www.siteweb1.com
      ServerAlias www.monsite1.com *.messites1.com
      ServerAdmin webmaster@localhost
      DocumentRoot /var/www/www.siteweb1.com
      DirectoryIndex index.html index.htm index.php
      <Directory /var/www/www.siteweb1.com>
              Options Indexes FollowSymLinks MultiViews
              AllowOverride None
              Order allow,deny
              allow from all
      </Directory>
</VirtualHost>

Explication :

  • <VirtualHost *:80> : la chaine *:80 doit correspondre exactement à celle saisie pour la directive NameVirtualHost *:80
  • ServerName : Indique le domaine du site principal
  • ServerAlias : Indique les autres domaines qui répondront au requête pour le site www.siteweb1.com.
  • DocumentRoot : Indique le chemin du répertoire de base pour le site

Faire la même chose pour le second site mais remplacer www.siteweb1.com par www.siteweb2.com

Pour terminer redémarrer apache :

/etc/init.d/httpd restart

Tester les VirtualHosts

Pour tester il faut que les enregistements de www.siteweb1.com et www.siteweb2.com soient effectuer sur un serveur DNS. Si ce n'est pas le cas, la configuration peut être testée en éditant préalablement un fichier nommé hosts sur votre poste de travail.

  • Sous Windows éditer : C:\WINDOWS\system32\drivers\etc\hosts
  • Sous Linux/UNIX éditer : /etc/hosts

Ajouter par exemple les lignes suivantes (admettons que l'ip de votre site est 192.168.20.45) :

192.168.20.45	www.siteweb1.com
192.168.20.45	www.siteweb2.com
192.168.20.45	www.montsite1.com
192.168.20.45	www.montsite2.com

Il ne reste plus qu'a créer une page index.html et tester dans votre navigateur.

Rewrite Rules : Règles de reécriture et redirection

Module de apache

Le module mod_rewrite.so doit être chargé au démarrage d'apache et la directive suivante doit être présente pour toute RewriteRules:

RewriteEngine On

Les règles de réécriture utilisent les expressions régulières

Quelques drapeaux (ou flags) utiles

[L]: Celui-ci vous semble familier, comme nous l’avons vu dans notre précédent exemple. Il mérite toutefois une précision. Lorsque le module de réécriture est actif, les règles sont lues séquentiellement et l’URL est comparée ligne à ligne avec le premier argument de celles-ci jusqu’à la dernière. Si une réécriture est effectuée, c’est la forme réécrite qui sera utilisée en entrée pour les règles suivantes. Le flag [L] permet de sortir prématurément de la boucle.

Un autre exemple serait, en début d’une liste de règles : Nous introduisons ici un nouveau concept, à savoir un second argument vide (ou presque, car il consiste en un seul caractère « - » ) . Cette règle particulière implique qu’il n’y a pas de réécriture, l’URL étant passée sans modification aucune. Elle signale au serveur Apache de passer toutes les URL d’images gif ou jpg sans réécriture, ni traitement successif.

[R] [R=code]: Dans ces deux formes une redirection est effectuée. Si l’argument code n’est pas précisé, une redirection 302 (déplacé temporairement) est effectuée. Si vous souhaitez faire savoir au navigateur/robot qu’une page a été remplacée définitivement, utiliser le code 301 comme dans : RewriteRule ^ancien\.html$ http://domaine.tld/nouveau.html [R=301,L] Dans ce cas précis, une réécriture “externe” s’impose (utilisation de http://...) Vous voyez ci-dessus que nous avons combiné deux flags en les séparant par une virgule.

[F]: Forbidden - interdit. Retourne un code 403, par exemple : RewriteRule ^secret.html$ - [F] ( pas de réécriture vu le deuxième argument - )

[NC]: NoCase, ou « insensible à la casse ». La règle suivante : RewriteRule ^script\.php$ programme.php [NC,L] S’appliquera aussi bien à script .php, SCRIPT.PHP ou ScRiPt .PhP

[G]: Gone. Cette page n’existe plus et retourne une entête http 410

[N]: Force l’analyse et l’exécution de toutes les règles en repartant du début de la liste. Ici encore, comme expliqué plus haut ([L]), c’est l’URL modifiée après exécution de la dernière règle qui est utilisée en entrée, et non l’URL originelle. Attention aux boucles infinies !!

[C]: Chain, chaînage avec la ou les règles suivantes jusqu’à la première règle ne se terminant pas par [C] Apache interprète ce flag comme suit : s’il y a réécriture (la règle est vérifiée), la règle suivante est exécutée avec la chaîne réécrite en entrée. Si la règle ne se vérifie pas, toutes les règles qui suivent jusqu’à la première ne comportant pas le flag [C] ne sont pas appliquées.

[QSA]: Query String Append. Rajoute le QUERY_STRING à la fin de l’expression, après la réécriture. A réserver pour la dernière règle de réécriture. Utilisée le plus souvent avec le flag [L], comme dans [QSA,L]

Exemples de config dans apache

Permet d’échapper tout caractère qui suit et lui ôter sa signification particulière, par exemple \. : \

Pour rediriger par exemple http://monsite.com/index.htm vers http://monsite.com/index.html (hors directive <Directory>)

RewriteRule ^/index\.htm$ /index.html [L]

Pour réecrire par exemple http://monsite.com/test/index.htm en http://monsite.com/index.html

<Directory /var/www/test>
      ...
      RewriteEngine On
      RewriteBase /
      RewriteRule ^index\.htm$ index.html [L]
</Directory>

Pour réecrire http://monsite.com/test/uk* et http://monsite.com/test/fr* en http://monsite.com/test/page.htm (* etant toute les pages derrières l'url)

<Directory /var/www/test>
      ...
      RewriteEngine On
      RewriteBase /
      RewriteRule ^(fr)|(uk)(.*)$ /test/page.htm [L]
</Directory>

Pour réecrire par exemple http://nimportequelsite2006.com/ en http://nimportequelsite2007.com/

<Directory /var/www/test>
      ...
      RewriteEngine On
      RewriteBase /
      RewriteCond %{HTTP_HOST} ^(.*)2006(.*)$
      RewriteRule ^(.*)$ http://%12007%2/test/page.htm [R,L]
</Directory>

Admettons la configuration suivante sur le site www.zikossworld.com, on force toutes les urls http://www.zikossworld.com/dokuwiki à être ré-ecrites en https://wiki.zikossworld.com/ :

<Directory /var/www/test>
      RewriteEngine On
      RewriteCond %{SERVER_PORT} !^443$
      RewriteCond %{REQUEST_URI} ^/dokuwiki(.*)
      RewriteRule .* https://wiki.zikossworld.com/%{REQUEST_URI} [QSA,R=301,L]
</Directory>

Si on veux juste sécuriser en HTTPS la partie /admin de son site :

<Directory /var/www/test>
      RewriteEngine On
      RewriteCond %{SERVER_PORT} !^443$
      RewriteCond %{REQUEST_URI} ^/admin(.*)
      RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [QSA,R=301,L]
</Directory>

Proxy

Nous allons configurer ici apache de façon suivante : Lorsque qu'on tape http://monserveur/siteport8083/ que l'on arrive sur http://10.0.0.2:8083. Ceci permet de passer par le port 80 du serveur pour atteindre un site sur le port 8083.

Les modules suivant doivent être chargés :

LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
LoadModule proxy_connect_module modules/mod_proxy_connect.so
LoadModule proxy_ftp_module modules/mod_proxy_ftp.so
LoadModule proxy_http_module modules/mod_proxy_http.so
LoadModule rewrite_module modules/mod_rewrite.so

Modifier la configuration apache ainsi:

# Activer les règles de reécriture
RewriteEngine on
RewriteRule ^/siteport8083(.*) http://10.0.0.2:8083$1 [P,L]

# Alias proxy
ProxyPass /siteport8083 http://10.0.0.2:8083
ProxyPassReverse /siteport8083 http://10.0.0.2:8083

# Activer le proxy
<IfModule mod_proxy.c>
  ProxyRequests On
  ProxyVia On
</IfModule>

Proxy en vue d'une redirection de flux vers un ou plusieurs Tomcat

Pour relayer simplement la requêtes vers un tomcat en http

ProxyPass /test http://10.0.0.2:8383/test
ProxyPassReverse /test http://10.0.0.2:8383/test
# Il est parfois nécessaire d'ajouter la directive ci-dessous s'il y a une gestion de cookies sur le site.
ProxyPassReverseCookieDomain 10.0.0.2:8383 www.site.com

Pour relayer vers plusieurs Tomcat avec équilibrage de charge :

<Proxy balancer://tomcatservers>
  BalancerMember http://10.0.0.2:8383 retry=60
  BalancerMember http://10.0.0.3:8384 retry=60
</Proxy>

<Location /test>
  Allow From All
  ProxyPass balancer://tomcatservers/test stickysession=JSESSIONID nofailover=off
</Location>

SSL

Création du certificat SSL

Se positionner dans le répertoire de configuration apache :

cd /etc/httpd/conf/

Pour générer le certificat voir : Créer un certificat SSL avec OpenSSL

Configuration dans apache

Listen 443
AddType application/x-x509-ca-cert .crt
AddType application/x-pkcs7-crl    .crl

SSLPassPhraseDialog  builtin

SSLSessionCache        "shmcb:/var/log/httpd/ssl_scache(512000)"
SSLSessionCacheTimeout  300

SSLMutex  "file:/var/log/httpd/ssl_mutex"

<VirtualHost *:443>
  DocumentRoot "/ap01/sigfod1/appl/httpd-2.2.6/htdocs"
  ServerName www.example.com:443
  ServerAdmin you@example.com
  ErrorLog "/ap01/sigfod1/appl/httpd-2.2.6/logs/error_log"
  TransferLog "/ap01/sigfod1/appl/httpd-2.2.6/logs/access_log"
  SSLEngine on
  SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL
  SSLCertificateFile "/etc/httpd/conf/server.crt"
  SSLCertificateKeyFile "/etc/httpd/conf/server.key"
  CustomLog "/var/log/httpd/ssl_request_log" \
        "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"
</VirtualHost>

Charset

Pour afficher correctement les accents dans Apache, ajouter les lignes suivantes

Pour l'UTF-8 :

AddDefaultCharset UTF-8
IndexOptions Charset=UTF-8

Pour l'ISO-8859-1

Affichage par défaut 
AddDefaultCharset  ISO-8859-1
IndexOptions Charset=ISO-8859-1

Note :!: : IndexOptions permet d'afficher correctement les accents lorsqu'Apache liste un répertoire.

informatique/linux/apache.txt · Dernière modification: 2018/09/06 19:10 (modification externe)