2016-10-05 03:30:41 +02:00
|
|
|
|
---
|
|
|
|
|
categories: web
|
|
|
|
|
title: Howto Apache
|
|
|
|
|
...
|
2016-10-04 10:08:10 +02:00
|
|
|
|
|
2016-10-05 16:59:16 +02:00
|
|
|
|
* Documentation : <https://httpd.apache.org/docs/2.4/>
|
2016-10-11 04:07:21 +02:00
|
|
|
|
* Rôle Ansible : <https://forge.evolix.org/projects/ansible-roles/repository/show/apache>
|
2016-10-04 10:08:10 +02:00
|
|
|
|
|
2018-10-25 22:33:25 +02:00
|
|
|
|
[Apache](https://httpd.apache.org/) est le serveur [HTTP](HowtoHTTP)
|
|
|
|
|
le plus utilisé sur le web depuis 1996.
|
2016-10-05 03:30:41 +02:00
|
|
|
|
|
2016-10-04 10:08:10 +02:00
|
|
|
|
## Installation
|
|
|
|
|
|
2018-10-25 22:33:25 +02:00
|
|
|
|
Nous utilisons la version [Apache-ITK](http://mpm-itk.sesse.net/)
|
|
|
|
|
depuis des années en production sur de nombreux serveurs critiques.
|
|
|
|
|
Apache-ITK permet de préciser pour chaque VirtualHost un utilisateur,
|
|
|
|
|
un groupe et une option *MaxClients* spécifiques, ce qui est utile
|
|
|
|
|
pour la sécurité d'un serveur multi-sites.
|
2016-10-04 10:08:10 +02:00
|
|
|
|
|
|
|
|
|
~~~
|
2017-07-23 00:17:01 +02:00
|
|
|
|
# apt install apache2 libapache2-mpm-itk libapache2-mod-evasive apachetop libwww-perl
|
2016-10-30 18:23:54 +01:00
|
|
|
|
|
|
|
|
|
# apache2ctl -V
|
2017-07-23 00:17:01 +02:00
|
|
|
|
Server version: Apache/2.4.25 (Debian)
|
|
|
|
|
Server built: 2017-07-18T18:37:33
|
|
|
|
|
Server's Module Magic Number: 20120211:68
|
|
|
|
|
Server loaded: APR 1.5.2, APR-UTIL 1.5.4
|
|
|
|
|
Compiled using: APR 1.5.2, APR-UTIL 1.5.4
|
2016-10-30 18:23:54 +01:00
|
|
|
|
Architecture: 64-bit
|
|
|
|
|
Server MPM: prefork
|
|
|
|
|
threaded: no
|
|
|
|
|
forked: yes (variable process count)
|
|
|
|
|
Server compiled with....
|
|
|
|
|
-D APR_HAS_SENDFILE
|
|
|
|
|
-D APR_HAS_MMAP
|
|
|
|
|
-D APR_HAVE_IPV6 (IPv4-mapped addresses enabled)
|
|
|
|
|
-D APR_USE_SYSVSEM_SERIALIZE
|
|
|
|
|
-D APR_USE_PTHREAD_SERIALIZE
|
|
|
|
|
-D SINGLE_LISTEN_UNSERIALIZED_ACCEPT
|
|
|
|
|
-D APR_HAS_OTHER_CHILD
|
|
|
|
|
-D AP_HAVE_RELIABLE_PIPED_LOGS
|
|
|
|
|
-D DYNAMIC_MODULE_LIMIT=256
|
|
|
|
|
-D HTTPD_ROOT="/etc/apache2"
|
|
|
|
|
-D SUEXEC_BIN="/usr/lib/apache2/suexec"
|
|
|
|
|
-D DEFAULT_PIDLOG="/var/run/apache2.pid"
|
|
|
|
|
-D DEFAULT_SCOREBOARD="logs/apache_runtime_status"
|
|
|
|
|
-D DEFAULT_ERRORLOG="logs/error_log"
|
|
|
|
|
-D AP_TYPES_CONFIG_FILE="mime.types"
|
|
|
|
|
-D SERVER_CONFIG_FILE="apache2.conf"
|
2017-11-29 19:39:23 +01:00
|
|
|
|
|
|
|
|
|
# systemctl status apache2
|
|
|
|
|
● apache2.service - The Apache HTTP Server
|
|
|
|
|
Loaded: loaded (/lib/systemd/system/apache2.service; enabled; vendor preset:
|
|
|
|
|
Process: 32127 ExecReload=/usr/sbin/apachectl graceful (code=exited, status=0/
|
|
|
|
|
Process: 1857 ExecStart=/usr/sbin/apachectl start (code=exited, status=0/SUCCE
|
|
|
|
|
Main PID: 2031 (apache2)
|
|
|
|
|
Tasks: 6 (limit: 4915)
|
|
|
|
|
CGroup: /system.slice/apache2.service
|
|
|
|
|
├─ 2031 /usr/sbin/apache2 -k start
|
|
|
|
|
├─32134 /usr/sbin/apache2 -k start
|
|
|
|
|
├─32135 /usr/sbin/apache2 -k start
|
|
|
|
|
├─32136 /usr/sbin/apache2 -k start
|
|
|
|
|
├─32137 /usr/sbin/apache2 -k start
|
|
|
|
|
└─32138 /usr/sbin/apache2 -k start
|
2016-10-04 10:08:10 +02:00
|
|
|
|
~~~
|
|
|
|
|
|
2017-07-23 00:17:01 +02:00
|
|
|
|
> *Note* : Pour Debian 8, il faut installer ainsi :
|
|
|
|
|
>
|
|
|
|
|
> ~~~
|
|
|
|
|
> # apt install apache2-mpm-itk libapache2-mod-evasive apachetop libwww-perl
|
|
|
|
|
> ~~~
|
|
|
|
|
|
|
|
|
|
|
2016-10-04 15:07:06 +02:00
|
|
|
|
## Configuration de base
|
|
|
|
|
|
2016-10-05 00:41:38 +02:00
|
|
|
|
Fichiers de configuration :
|
2016-10-04 15:07:06 +02:00
|
|
|
|
|
2017-07-23 00:17:01 +02:00
|
|
|
|
~~~
|
|
|
|
|
/etc/apache2
|
|
|
|
|
├── apache2.conf
|
2017-10-13 04:43:52 +02:00
|
|
|
|
├── conf-available/
|
2017-07-23 00:17:01 +02:00
|
|
|
|
│ └── X.conf
|
2017-10-13 04:43:52 +02:00
|
|
|
|
├── conf-enabled/
|
2017-07-23 00:17:01 +02:00
|
|
|
|
│ └── X.conf -> ../conf-available/X.conf
|
|
|
|
|
├── envvars
|
|
|
|
|
├── magic
|
2017-10-13 04:43:52 +02:00
|
|
|
|
├── mods-available/
|
2017-07-23 00:17:01 +02:00
|
|
|
|
│ ├── X.load
|
|
|
|
|
│ └── X.conf
|
2017-10-13 04:43:52 +02:00
|
|
|
|
├── mods-enabled/
|
2017-07-23 00:17:01 +02:00
|
|
|
|
│ ├── X.load -> ../mods-available/X.load
|
|
|
|
|
│ └── X.conf -> ../mods-available/X.conf
|
|
|
|
|
├── ports.conf
|
2017-10-13 04:43:52 +02:00
|
|
|
|
├── sites-available/
|
2017-07-23 00:17:01 +02:00
|
|
|
|
│ ├── 000-default.conf
|
|
|
|
|
│ ├── default-ssl.conf
|
|
|
|
|
│ └── X.conf
|
2017-10-13 04:43:52 +02:00
|
|
|
|
└── sites-enabled/
|
2017-07-23 00:17:01 +02:00
|
|
|
|
│ ├── 000-default.conf -> ../sites-available/000-default.conf
|
|
|
|
|
└── X.conf -> ../sites-available/X.conf
|
|
|
|
|
~~~
|
|
|
|
|
|
2018-10-25 22:33:25 +02:00
|
|
|
|
La configuration principale se trouve dans le fichier
|
|
|
|
|
`/etc/apache2/apache2.conf` qui inclut de nombreux fichiers séparés.
|
2017-10-13 05:26:40 +02:00
|
|
|
|
|
2017-07-23 00:17:01 +02:00
|
|
|
|
Nous activons toujours au minimum les modules suivants :
|
2016-10-04 15:07:06 +02:00
|
|
|
|
|
|
|
|
|
~~~
|
|
|
|
|
# a2enmod rewrite expires headers rewrite cgi
|
|
|
|
|
~~~
|
|
|
|
|
|
2018-10-25 22:33:25 +02:00
|
|
|
|
Le fichier `/etc/apache2/conf-available/z-evolinux-defaults.conf`
|
|
|
|
|
contient nos optimisations basiques :
|
2016-10-04 15:07:06 +02:00
|
|
|
|
|
|
|
|
|
~~~{.apache}
|
|
|
|
|
ServerTokens Prod
|
2016-10-05 00:41:38 +02:00
|
|
|
|
Timeout 10
|
2016-10-04 15:07:06 +02:00
|
|
|
|
KeepAliveTimeout 2
|
|
|
|
|
MaxKeepAliveRequests 10
|
2016-12-21 15:58:46 +01:00
|
|
|
|
ServerLimit 250
|
2016-12-12 16:47:56 +01:00
|
|
|
|
#MaxClients 250
|
|
|
|
|
MaxRequestWorkers 250
|
2016-10-05 00:41:38 +02:00
|
|
|
|
StartServers 50
|
|
|
|
|
MinSpareServers 20
|
|
|
|
|
MaxSpareServers 30
|
2016-11-04 01:50:51 +01:00
|
|
|
|
MaxRequestsPerChild 100
|
2016-10-05 03:30:41 +02:00
|
|
|
|
<Directory /home/>
|
|
|
|
|
AllowOverride None
|
|
|
|
|
Require all granted
|
2017-07-23 00:17:01 +02:00
|
|
|
|
# "Require not env XXX" is not supported :(
|
|
|
|
|
Deny from env=GoAway
|
2016-10-05 03:30:41 +02:00
|
|
|
|
</Directory>
|
2016-10-26 17:57:33 +02:00
|
|
|
|
<IfModule mod_ssl.c>
|
|
|
|
|
SSLProtocol all -SSLv2 -SSLv3
|
|
|
|
|
SSLCipherSuite HIGH:MEDIUM:!aNULL:!MD5:!RC4
|
|
|
|
|
</IfModule>
|
2016-10-04 15:07:06 +02:00
|
|
|
|
~~~
|
|
|
|
|
|
2016-10-10 22:39:10 +02:00
|
|
|
|
que l'on active à l'installation via la commande :
|
|
|
|
|
|
2016-10-04 15:07:06 +02:00
|
|
|
|
~~~
|
2016-12-21 15:36:20 +01:00
|
|
|
|
# a2enconf z-evolinux-defaults.conf
|
2016-10-04 15:07:06 +02:00
|
|
|
|
~~~
|
|
|
|
|
|
2018-10-25 22:33:25 +02:00
|
|
|
|
Le fichier `/etc/apache2/ipaddr_whitelist.conf` centralise les
|
|
|
|
|
adresses IP privilégiées, on peut ainsi utiliser `Include
|
|
|
|
|
ipaddr_whitelist.conf` à différents endroits dans la configuration
|
|
|
|
|
d'Apache sans dupliquer ces adresses :
|
2016-10-05 03:30:41 +02:00
|
|
|
|
|
|
|
|
|
~~~{.apache}
|
|
|
|
|
Allow from 192.0.2.42
|
|
|
|
|
~~~
|
|
|
|
|
|
|
|
|
|
Pour la [#gestion-des-droits]() on ajoute dans le fichier `/etc/apache2/envvars` :
|
|
|
|
|
|
|
|
|
|
~~~{.apache}
|
|
|
|
|
umask 007
|
|
|
|
|
~~~
|
|
|
|
|
|
2018-02-28 01:13:11 +01:00
|
|
|
|
### Valider la configuration
|
|
|
|
|
|
2018-10-25 22:33:25 +02:00
|
|
|
|
Avant de redémarrer le serveur, vérifier que vous n'ayez pas introduit
|
|
|
|
|
des erreurs de syntaxes dans la configuration :
|
2018-02-28 01:13:11 +01:00
|
|
|
|
|
|
|
|
|
~~~
|
|
|
|
|
# apache2ctl configtest
|
|
|
|
|
Syntax OK
|
|
|
|
|
~~~
|
|
|
|
|
|
2016-10-05 03:30:41 +02:00
|
|
|
|
## VirtualHost
|
|
|
|
|
|
2018-10-25 22:33:25 +02:00
|
|
|
|
Le terme **VirtualHost** correspond à la séparation de plusieurs
|
|
|
|
|
sites sur un même serveur HTTP. Apache permet d'avoir des VirtualHost
|
|
|
|
|
basés sur des noms de domaine différents (ou des adresses IP
|
|
|
|
|
différentes).
|
2016-10-05 03:30:41 +02:00
|
|
|
|
|
2018-10-25 22:33:25 +02:00
|
|
|
|
Exemple d'un VirtualHost basé sur un nom de domaine via
|
|
|
|
|
`/etc/apache2/sites-available/example.conf` :
|
2016-10-05 03:30:41 +02:00
|
|
|
|
|
|
|
|
|
~~~{.apache}
|
|
|
|
|
<VirtualHost *:80>
|
|
|
|
|
ServerName www.example.com
|
|
|
|
|
ServerAlias example.com
|
|
|
|
|
|
|
|
|
|
DocumentRoot /home/example/www/
|
|
|
|
|
<Directory /home/example/www/>
|
|
|
|
|
Options SymLinksIfOwnerMatch
|
|
|
|
|
AllowOverride AuthConfig Limit FileInfo Indexes
|
|
|
|
|
</Directory>
|
|
|
|
|
|
|
|
|
|
ScriptAlias /cgi-foo /usr/lib/cgi-bin/
|
|
|
|
|
<Directory /usr/lib/cgi-bin/>
|
2019-04-09 15:44:19 +02:00
|
|
|
|
Options +ExecCGI -MultiViews
|
2016-10-05 03:30:41 +02:00
|
|
|
|
AllowOverride None
|
|
|
|
|
|
|
|
|
|
AuthType Basic
|
|
|
|
|
AuthName "Restricted"
|
|
|
|
|
AuthUserFile /home/example/.htpasswd
|
|
|
|
|
require valid-user
|
|
|
|
|
|
|
|
|
|
Deny from all
|
2016-10-10 22:39:10 +02:00
|
|
|
|
Include ipaddr_whitelist.conf
|
2016-10-05 03:30:41 +02:00
|
|
|
|
Allow from 192.0.2.43
|
|
|
|
|
Satisfy any
|
|
|
|
|
</Directory>
|
|
|
|
|
|
|
|
|
|
AssignUserID www-example example
|
|
|
|
|
MaxClientsVHost 150
|
|
|
|
|
|
|
|
|
|
CustomLog /var/log/apache2/access.log vhost_combined
|
|
|
|
|
CustomLog /home/example/log/access.log combined
|
|
|
|
|
ErrorLog /home/example/log/error.log
|
|
|
|
|
|
|
|
|
|
RewriteEngine On
|
|
|
|
|
UseCanonicalName On
|
|
|
|
|
RewriteCond %{HTTP_HOST} !^www.example.com$
|
|
|
|
|
RewriteRule ^/(.*) http://%{SERVER_NAME}/$1 [L,R]
|
|
|
|
|
|
|
|
|
|
</VirtualHost>
|
|
|
|
|
# vim: set filetype=apache expandtab shiftwidth=4 softtabstop=4 tabstop=4 :
|
|
|
|
|
~~~
|
|
|
|
|
|
|
|
|
|
~~~
|
|
|
|
|
# adduser example
|
|
|
|
|
# adduser --ingroup example www-example
|
2016-10-10 22:39:10 +02:00
|
|
|
|
# mkdir /home/example/{www,log,awstats} && chown example: /home/example/{www,log,awstats}
|
2016-10-05 03:30:41 +02:00
|
|
|
|
# a2ensite example
|
|
|
|
|
~~~
|
|
|
|
|
|
2018-10-25 22:33:25 +02:00
|
|
|
|
En cas de gestion de multiples VirtualHost nous utilisons l'interface
|
|
|
|
|
web <https://forge.evolix.org/projects/evoadmin-web>
|
2016-10-10 22:53:32 +02:00
|
|
|
|
|
2016-10-05 03:30:41 +02:00
|
|
|
|
## Gestion des droits
|
|
|
|
|
|
2016-10-10 22:53:32 +02:00
|
|
|
|
### Séparation complète des VirtualHost
|
2016-10-05 03:30:41 +02:00
|
|
|
|
|
2018-10-25 22:33:25 +02:00
|
|
|
|
L'utilisation d'Apache-ITK nous permet d'utiliser des utilisateurs/groupes
|
|
|
|
|
Unix distincts pour chaque VirtualHost. Il est donc impossible
|
|
|
|
|
pour un utilisateur d'accéder en lecture à des fichiers d'un autre
|
|
|
|
|
site, même si un langage dynamique comme PHP est utilisé.
|
|
|
|
|
|
2016-10-05 03:30:41 +02:00
|
|
|
|
|
|
|
|
|
~~~
|
|
|
|
|
# chmod 750 /home/example
|
|
|
|
|
~~~
|
|
|
|
|
|
|
|
|
|
### Restriction en écriture pour Apache
|
|
|
|
|
|
2018-10-25 22:33:25 +02:00
|
|
|
|
Par défaut on souhaite donner uniquement un droit de lecture à
|
|
|
|
|
Apache, sauf sur certains répertoires du type *uploads/*, *cache/*,
|
|
|
|
|
etc. On utilise pour cela un utilisateur distinct pour Apache
|
|
|
|
|
(`www-example`) et la gestion du code via FTP/SSH/SFTP/SCP/RSYNC
|
|
|
|
|
(example), le groupe étant identique. Ainsi on donnera la permission
|
|
|
|
|
**`g+w`** pour les répertoires nécessitant un droit en écriture
|
|
|
|
|
pour Apache. Les fichiers uploadés via Apache auront des permissions
|
|
|
|
|
adéquats (`g+rwX`) pour être lus/modifiés/effacés via
|
|
|
|
|
FTP/SSH/SFTP/SCP/RSYNC (l'opération `chmod` est impossible mais
|
|
|
|
|
n'est pas nécessaire car le umask d'Apache est forcé à 007).
|
|
|
|
|
|
2016-10-05 03:30:41 +02:00
|
|
|
|
|
|
|
|
|
~~~
|
|
|
|
|
# echo "umask 027" >> /etc/profile
|
|
|
|
|
# find /home/example -type f -user www-example -exec chmod 660 {} \;
|
|
|
|
|
# find /home/example -type d -user www-example -exec chmod 770 {} \;
|
|
|
|
|
~~~
|
|
|
|
|
|
2018-10-25 22:33:25 +02:00
|
|
|
|
Attention, il ne faut jamais forcer les droits récursivement sur
|
|
|
|
|
toute l'arborescence. Si la restriction en écriture pour Apache est
|
|
|
|
|
impossible à gérer, on n'utilisera pas d'utilisateur distinct en
|
|
|
|
|
indiquant `AssignUserID example example` ce qui éliminera 100% des
|
|
|
|
|
problèmes de droits (mais pose des problèmes de sécurité).
|
2016-10-05 03:30:41 +02:00
|
|
|
|
|
2016-10-04 15:07:06 +02:00
|
|
|
|
## SSL
|
|
|
|
|
|
2016-12-29 15:26:14 +01:00
|
|
|
|
Apache peut gérer des connexions sécurisées via HTTPS.
|
2016-10-05 03:30:41 +02:00
|
|
|
|
|
|
|
|
|
~~~
|
|
|
|
|
# a2enmod ssl
|
|
|
|
|
~~~
|
|
|
|
|
|
2018-10-25 22:33:25 +02:00
|
|
|
|
Il faut alors générer une clé privée et un certificat auto-signé
|
|
|
|
|
ou délivré par une autorité de certification.
|
2016-10-05 03:30:41 +02:00
|
|
|
|
|
2016-10-27 03:11:14 +02:00
|
|
|
|
Voir [HowtoSSL]()
|
2016-10-05 03:30:41 +02:00
|
|
|
|
|
|
|
|
|
Exemple pour générer un certificat auto-signé :
|
2016-10-05 17:08:16 +02:00
|
|
|
|
|
2016-10-05 03:30:41 +02:00
|
|
|
|
~~~
|
|
|
|
|
# openssl req -newkey rsa:2048 -sha256 -nodes -keyout private.key -out demande.csr
|
|
|
|
|
# openssl x509 -req -days 3650 -sha256 -in demande.csr -signkey private.key -out certificate.crt
|
|
|
|
|
# mv private.key /etc/ssl/private/ && chown root:ssl-cert /etc/ssl/private/private.key && chmod 640 /etc/ssl/private/private.key
|
|
|
|
|
# mv certificate.crt /etc/ssl/certs/ && chown root:root /etc/ssl/certs/certificate.crt && chmod 644 /etc/ssl/certs/certificate.crt
|
|
|
|
|
~~~
|
|
|
|
|
|
|
|
|
|
La configuration d'un VirtualHost pour HTTPS pourra ainsi ressembler à :
|
|
|
|
|
|
|
|
|
|
~~~{.apache}
|
2016-12-20 17:21:01 +01:00
|
|
|
|
<VirtualHost *:80 *:443>
|
2016-10-13 19:18:32 +02:00
|
|
|
|
ServerName secure.example.com
|
|
|
|
|
ServerAlias www.example.com example.com
|
2016-12-20 17:21:01 +01:00
|
|
|
|
|
2016-10-05 03:30:41 +02:00
|
|
|
|
SSLEngine on
|
|
|
|
|
SSLProtocol all -SSLv2 -SSLv3
|
|
|
|
|
SSLCertificateKeyFile /etc/ssl/private/private.key
|
|
|
|
|
SSLCertificateFile /etc/ssl/certs/certificate.crt
|
|
|
|
|
#SSLCertificateChainFile /etc/ssl/certs/certificates_chain.pem
|
2016-12-20 17:21:01 +01:00
|
|
|
|
|
|
|
|
|
RewriteEngine On
|
2018-02-19 16:49:51 +01:00
|
|
|
|
RewriteCond %{HTTPS} !=on [OR]
|
|
|
|
|
RewriteCond %{HTTP_HOST} !^secure.example.com$
|
2016-12-20 17:21:01 +01:00
|
|
|
|
RewriteRule ^/(.*) https://%{SERVER_NAME}/$1 [L,R=permanent]
|
2016-10-05 03:30:41 +02:00
|
|
|
|
</VirtualHost>
|
|
|
|
|
~~~
|
|
|
|
|
|
2018-10-25 22:33:25 +02:00
|
|
|
|
Pour une configuration avancée des paramètres SSL, voir
|
|
|
|
|
[HowtoSSL#configuration-apache]()
|
|
|
|
|
|
|
|
|
|
> *Note* : la syntaxe `<VirtualHost *:80 *:443>` n'est possible
|
|
|
|
|
qu'à partir de Debian 8.
|
2016-10-05 03:30:41 +02:00
|
|
|
|
|
2017-02-07 21:51:55 +01:00
|
|
|
|
|
2016-11-21 15:16:43 +01:00
|
|
|
|
## Logs
|
|
|
|
|
|
|
|
|
|
<https://httpd.apache.org/docs/2.4/fr/logs.html>
|
|
|
|
|
|
2018-10-25 22:33:25 +02:00
|
|
|
|
La directive **CustomLog** permet de définir le journal des accès
|
|
|
|
|
; plusieurs formats existent : combined, common, vhost_combined,
|
|
|
|
|
etc. Cette directive peut être utilisée plusieurs fois, il y aura
|
|
|
|
|
plusieurs fichiers de logs différents.
|
2016-11-21 15:16:43 +01:00
|
|
|
|
|
|
|
|
|
~~~{.apache}
|
|
|
|
|
CustomLog log/global_access.log vhost_combined
|
|
|
|
|
CustomLog log/access.log combined
|
|
|
|
|
~~~
|
|
|
|
|
|
|
|
|
|
Si besoin, on peut ignorer certaines requêtes HTTP ainsi :
|
|
|
|
|
|
|
|
|
|
~~~{.apache}
|
|
|
|
|
SetEnvIf User-Agent "Foo" dontlog
|
|
|
|
|
CustomLog log/access.log combined env=!dontlog
|
|
|
|
|
~~~
|
|
|
|
|
|
|
|
|
|
La directive **ErrorLog** permet de définir le journal d'erreurs Apache.
|
|
|
|
|
|
|
|
|
|
~~~{.apache}
|
|
|
|
|
ErrorLog log/error.log
|
|
|
|
|
~~~
|
|
|
|
|
|
2017-10-09 10:02:29 +02:00
|
|
|
|
### Logué la taille de la requête et le temps d’exécution
|
|
|
|
|
|
2018-10-25 22:33:25 +02:00
|
|
|
|
Si l'on veut loguer, dans un log séparé, la taille de la requête
|
|
|
|
|
et le temps d’exécution par Apache de cette requête, on peut créer
|
|
|
|
|
une configuration apache avec le LogFormat suivant, dans
|
|
|
|
|
*/etc/apache2/conf-available/access-log-time.conf* :
|
2017-10-09 10:02:29 +02:00
|
|
|
|
|
|
|
|
|
~~~
|
|
|
|
|
LogFormat "%h %t \"%r\" %B %D" measure-time
|
|
|
|
|
~~~
|
|
|
|
|
|
|
|
|
|
Et mettre dans le vhost concerné le CustomLog suivant :
|
|
|
|
|
|
|
|
|
|
~~~
|
|
|
|
|
CustomLog /home/example/log/access_log_time.log measure-time
|
|
|
|
|
~~~
|
|
|
|
|
|
2016-10-05 03:30:41 +02:00
|
|
|
|
## Configuration avancée
|
|
|
|
|
|
|
|
|
|
### mod_deflate
|
|
|
|
|
|
2018-10-25 22:33:25 +02:00
|
|
|
|
La compression des fichiers texte/Javascript/CSS/RSS en GZIP se
|
|
|
|
|
fait désormais par défaut car le module **mod_deflate** est activé
|
|
|
|
|
dès l'installation.
|
2016-10-05 03:30:41 +02:00
|
|
|
|
|
2016-10-05 03:57:46 +02:00
|
|
|
|
### mod_proxy_http
|
|
|
|
|
|
2018-10-25 22:33:25 +02:00
|
|
|
|
Le module [proxy](https://httpd.apache.org/docs/2.4/mod/mod_proxy.html)
|
|
|
|
|
permet d'utiliser Apache en tant que proxy, notamment reverse-proxy
|
|
|
|
|
HTTP :
|
2016-10-05 03:57:46 +02:00
|
|
|
|
|
|
|
|
|
~~~
|
|
|
|
|
# a2enmod proxy_http
|
|
|
|
|
~~~
|
|
|
|
|
|
|
|
|
|
Exemple avec un service HTTP local :
|
|
|
|
|
|
|
|
|
|
~~~{.apache}
|
|
|
|
|
ProxyPreserveHost On
|
2017-04-24 15:14:28 +02:00
|
|
|
|
ProxyPass /foo/ http://127.0.0.1:8080/bar
|
|
|
|
|
ProxyPassReverse /foo/ http://127.0.0.1:8080/bar
|
2016-10-28 03:55:34 +02:00
|
|
|
|
<Proxy *>
|
|
|
|
|
Allow from All
|
|
|
|
|
</Proxy>
|
2016-10-05 03:57:46 +02:00
|
|
|
|
~~~
|
|
|
|
|
|
2018-10-25 22:33:25 +02:00
|
|
|
|
Exemple avec un service HTTP distant (pratique pour une migration
|
|
|
|
|
immédiate d'un serveur vers un autre) :
|
2016-10-10 22:39:10 +02:00
|
|
|
|
|
|
|
|
|
~~~{.apache}
|
|
|
|
|
ProxyPreserveHost On
|
|
|
|
|
ProxyPass / http://192.0.2.17/
|
|
|
|
|
ProxyPassReverse / http://192.0.2.17/
|
2016-10-28 03:55:34 +02:00
|
|
|
|
<Proxy *>
|
|
|
|
|
Allow from All
|
|
|
|
|
</Proxy>
|
2016-10-10 22:39:10 +02:00
|
|
|
|
~~~
|
|
|
|
|
|
2019-08-07 23:02:23 +02:00
|
|
|
|
et pour un HTTPS distant, on ajoute `SSLProxyEngine On` :
|
|
|
|
|
|
|
|
|
|
~~~{.apache}
|
|
|
|
|
SSLProxyEngine On
|
|
|
|
|
ProxyPreserveHost On
|
|
|
|
|
ProxyPass / https://192.0.2.17/
|
|
|
|
|
ProxyPassReverse / https://192.0.2.17/
|
|
|
|
|
<Proxy *>
|
|
|
|
|
Allow from All
|
|
|
|
|
</Proxy>
|
|
|
|
|
~~~
|
|
|
|
|
|
|
|
|
|
|
2016-10-05 03:57:46 +02:00
|
|
|
|
### mod_rpaf / mod_remoteip
|
|
|
|
|
|
2018-10-25 22:33:25 +02:00
|
|
|
|
Le module
|
|
|
|
|
[mod_remoteip](https://httpd.apache.org/docs/2.4/mod/mod_remoteip.html)(**mod_rpaf** en Wheezy)
|
|
|
|
|
permet d'utiliser la 1ère adresse IP située
|
|
|
|
|
dans un entête HTTP type *X-Forwarded-For* pour les logs Apache et
|
|
|
|
|
directives **mod_access** (Allow/Deny From).
|
2016-10-05 03:57:46 +02:00
|
|
|
|
|
2018-10-25 22:33:25 +02:00
|
|
|
|
|
|
|
|
|
Voici un exemple d'utilisation en Wheezy pour un reverse-proxy avec
|
|
|
|
|
l'adresse IP 192.0.2.10 :
|
2016-10-05 03:57:46 +02:00
|
|
|
|
|
|
|
|
|
~~~
|
2017-01-14 00:06:38 +01:00
|
|
|
|
# apt install libapache2-mod-rpaf
|
2016-10-05 03:57:46 +02:00
|
|
|
|
# cat /etc/apache2/mods-enabled/rpaf.conf
|
2016-10-10 22:39:10 +02:00
|
|
|
|
<IfModule rpaf_module>
|
2016-10-05 03:57:46 +02:00
|
|
|
|
RPAFenable On
|
|
|
|
|
RPAFsethostname On
|
|
|
|
|
#RPAFheader X-Forwarded-For
|
|
|
|
|
RPAFproxy_ips 127.0.0.1 192.0.2.10
|
|
|
|
|
</IfModule>
|
|
|
|
|
~~~
|
|
|
|
|
|
2016-10-10 22:39:10 +02:00
|
|
|
|
*Note :* bien mettre l'IP du reverse-proxy dans `RPAFproxy_ips`
|
2016-10-05 03:57:46 +02:00
|
|
|
|
|
2018-10-25 22:33:25 +02:00
|
|
|
|
Voici un exemple d'utilisation en Stretch pour un reverse-proxy
|
|
|
|
|
avec le réseau 172.131.0.0/16 :
|
2017-12-19 12:12:30 +01:00
|
|
|
|
|
|
|
|
|
~~~
|
|
|
|
|
# a2enmod remoteip
|
2017-12-19 12:16:05 +01:00
|
|
|
|
# cat /etc/apache2/conf-available/zzz-evolinux-custom.conf
|
2017-12-19 12:12:30 +01:00
|
|
|
|
RemoteIPHeader X-Forwarded-For
|
2017-12-19 16:01:45 +01:00
|
|
|
|
RemoteIPInternalProxy 172.31.0.0/16
|
2017-12-19 12:16:05 +01:00
|
|
|
|
|
2017-12-19 12:12:30 +01:00
|
|
|
|
# systemctl reload apache2
|
|
|
|
|
~~~
|
|
|
|
|
|
2018-10-25 22:33:25 +02:00
|
|
|
|
Attention au niveau des logs cela ne suffit pas. L'astuce est de
|
|
|
|
|
modifier le `LogFormat`, en remplaçant `%h` par `%a`.
|
2017-12-19 12:12:30 +01:00
|
|
|
|
|
|
|
|
|
~~~
|
2018-09-03 18:51:04 +02:00
|
|
|
|
# cat /etc/apache2/conf-available/zzz-evolinux-custom.conf
|
|
|
|
|
|
2017-12-19 12:12:30 +01:00
|
|
|
|
LogFormat "%v:%p %a %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" vhost_combined
|
|
|
|
|
LogFormat "%a %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined
|
|
|
|
|
LogFormat "%a %l %u %t \"%r\" %>s %O" common
|
|
|
|
|
~~~
|
|
|
|
|
|
2016-10-05 03:30:41 +02:00
|
|
|
|
### mod_xsendfile
|
|
|
|
|
|
2018-10-25 22:33:25 +02:00
|
|
|
|
Le module [xsendfile](https://tn123.org/mod_xsendfile/) permet de
|
|
|
|
|
rediriger l'envoi d'un fichier vers Apache via un Header HTTP,
|
|
|
|
|
notamment utilisé pour servir des fichiers via Apache tout en
|
|
|
|
|
permettant de gérer le contrôle d'accès via une application web.
|
2016-10-05 03:30:41 +02:00
|
|
|
|
|
|
|
|
|
~~~
|
2016-10-10 22:39:10 +02:00
|
|
|
|
# apt install libapache2-mod-xsendfile
|
2016-10-05 03:30:41 +02:00
|
|
|
|
~~~
|
|
|
|
|
|
2018-10-25 22:33:25 +02:00
|
|
|
|
Pour autoriser son utilisation via *.htaccess*, on ajoute `Options`
|
|
|
|
|
à `AllowOverride`.
|
2016-10-05 03:30:41 +02:00
|
|
|
|
|
2017-07-23 00:17:01 +02:00
|
|
|
|
### mod_negotiation
|
|
|
|
|
|
2018-10-25 22:33:25 +02:00
|
|
|
|
Le module
|
|
|
|
|
[negotiation](https://httpd.apache.org/docs/2.4/mod/mod_negotiation.html)
|
|
|
|
|
permet de servir des documents en fonction de critère, notamment
|
|
|
|
|
la langue acceptée par le client HTTP.
|
2017-07-23 00:17:01 +02:00
|
|
|
|
|
|
|
|
|
~~~
|
|
|
|
|
# a2enmod negotiation include alias
|
|
|
|
|
~~~
|
|
|
|
|
|
2018-10-25 22:33:25 +02:00
|
|
|
|
Vous pouvez éditer le fichier
|
|
|
|
|
`/etc/apache2/conf-enabled/localized-error-pages.conf` qui permet
|
|
|
|
|
d'afficher des pages d'erreur en différentes langues, et décommenter
|
|
|
|
|
cette partie :
|
2017-07-23 00:17:01 +02:00
|
|
|
|
|
|
|
|
|
Exemple avec un service HTTP local :
|
|
|
|
|
|
|
|
|
|
~~~{.apache}
|
|
|
|
|
<IfModule mod_negotiation.c>
|
|
|
|
|
<IfModule mod_include.c>
|
|
|
|
|
<IfModule mod_alias.c>
|
|
|
|
|
|
|
|
|
|
Alias /error/ "/usr/share/apache2/error/"
|
|
|
|
|
|
|
|
|
|
<Directory "/usr/share/apache2/error">
|
|
|
|
|
Options IncludesNoExec
|
|
|
|
|
AddOutputFilter Includes html
|
|
|
|
|
AddHandler type-map var
|
|
|
|
|
Order allow,deny
|
|
|
|
|
Allow from all
|
|
|
|
|
LanguagePriority en cs de es fr it nl sv pt-br ro
|
|
|
|
|
ForceLanguagePriority Prefer Fallback
|
|
|
|
|
</Directory>
|
|
|
|
|
|
|
|
|
|
ErrorDocument 400 /error/HTTP_BAD_REQUEST.html.var
|
|
|
|
|
ErrorDocument 401 /error/HTTP_UNAUTHORIZED.html.var
|
|
|
|
|
ErrorDocument 403 /error/HTTP_FORBIDDEN.html.var
|
|
|
|
|
ErrorDocument 404 /error/HTTP_NOT_FOUND.html.var
|
|
|
|
|
ErrorDocument 405 /error/HTTP_METHOD_NOT_ALLOWED.html.var
|
|
|
|
|
ErrorDocument 408 /error/HTTP_REQUEST_TIME_OUT.html.var
|
|
|
|
|
ErrorDocument 410 /error/HTTP_GONE.html.var
|
|
|
|
|
ErrorDocument 411 /error/HTTP_LENGTH_REQUIRED.html.var
|
|
|
|
|
ErrorDocument 412 /error/HTTP_PRECONDITION_FAILED.html.var
|
|
|
|
|
ErrorDocument 413 /error/HTTP_REQUEST_ENTITY_TOO_LARGE.html.var
|
|
|
|
|
ErrorDocument 414 /error/HTTP_REQUEST_URI_TOO_LARGE.html.var
|
|
|
|
|
ErrorDocument 415 /error/HTTP_UNSUPPORTED_MEDIA_TYPE.html.var
|
|
|
|
|
ErrorDocument 500 /error/HTTP_INTERNAL_SERVER_ERROR.html.var
|
|
|
|
|
ErrorDocument 501 /error/HTTP_NOT_IMPLEMENTED.html.var
|
|
|
|
|
ErrorDocument 502 /error/HTTP_BAD_GATEWAY.html.var
|
|
|
|
|
ErrorDocument 503 /error/HTTP_SERVICE_UNAVAILABLE.html.var
|
|
|
|
|
ErrorDocument 506 /error/HTTP_VARIANT_ALSO_VARIES.html.var
|
|
|
|
|
</IfModule>
|
|
|
|
|
</IfModule>
|
|
|
|
|
</IfModule>
|
|
|
|
|
~~~
|
|
|
|
|
|
2018-03-15 10:54:31 +01:00
|
|
|
|
### mod_geoip
|
|
|
|
|
|
2018-10-25 22:33:25 +02:00
|
|
|
|
Ce module permet de pouvoir traiter différemment des visiteurs par
|
|
|
|
|
rapport à leur pays d'origine directement depuis la configuration
|
|
|
|
|
d'Apache. Il utilise pour cela la base GeoIP de
|
|
|
|
|
[Maxmind](https://www.maxmind.com).
|
2018-03-15 10:54:31 +01:00
|
|
|
|
|
|
|
|
|
~~~
|
2019-07-15 15:27:55 +02:00
|
|
|
|
# apt install geoip-database-extra libapache2-mod-geoip
|
2018-03-15 10:54:31 +01:00
|
|
|
|
~~~
|
|
|
|
|
|
2018-10-25 22:33:25 +02:00
|
|
|
|
Note: geoip-database-contrib (dans les dépots contrib) va installer
|
|
|
|
|
un cron qui va mettre à jour les fichiers de la base GeoIP. Ces
|
|
|
|
|
fichiers de base se trouvent dans `/usr/share/GeoIP/`
|
2018-03-15 10:54:31 +01:00
|
|
|
|
|
2018-10-25 22:33:25 +02:00
|
|
|
|
Quand on va avoir besoin de GeoIP, il faut penser à l'activer dans
|
|
|
|
|
le(s) fichier(s) de confs
|
2018-03-15 10:54:31 +01:00
|
|
|
|
|
|
|
|
|
~~~
|
2018-05-02 16:52:37 +02:00
|
|
|
|
<IfModule mod_geoip.c>
|
|
|
|
|
GeoIPEnable On
|
|
|
|
|
GeoIPDBFile /usr/share/GeoIP/GeoIP.dat
|
|
|
|
|
</IfModule>
|
2018-03-15 10:54:31 +01:00
|
|
|
|
~~~
|
|
|
|
|
|
2018-10-25 22:33:25 +02:00
|
|
|
|
De là, le pays d'origine du visiteur, ainsi que d'autres informations
|
|
|
|
|
sont placées dans des variables d'environnement utilisables dans
|
|
|
|
|
le VHOST.
|
2018-03-15 10:54:31 +01:00
|
|
|
|
|
2018-10-25 22:33:25 +02:00
|
|
|
|
Exemple : Autoriser que les visiteurs venant de France pour un
|
|
|
|
|
accéder à un dossier précis :
|
2018-03-15 10:55:34 +01:00
|
|
|
|
|
2018-03-15 10:54:31 +01:00
|
|
|
|
~~~
|
2018-05-02 16:52:37 +02:00
|
|
|
|
<Directory /var/www/foo/bar>
|
2018-05-04 15:31:37 +02:00
|
|
|
|
Require expr %{GEOIP_COUNTRY_CODE } == 'FR'
|
2018-05-02 16:52:37 +02:00
|
|
|
|
</Directory>
|
2018-03-15 10:54:31 +01:00
|
|
|
|
~~~
|
|
|
|
|
|
|
|
|
|
Faire une redirection suivant le pays :
|
|
|
|
|
|
|
|
|
|
~~~
|
|
|
|
|
RewriteEngine on
|
|
|
|
|
RewriteCond %{ENV:GEOIP_COUNTRY_CODE} ^FR$
|
|
|
|
|
RewriteRule ^(.*)$ https://www.example.fr$1 [R,L]
|
|
|
|
|
~~~
|
|
|
|
|
|
2018-10-25 22:33:25 +02:00
|
|
|
|
La documentation complète du module est là Pour plus d'info, il y
|
|
|
|
|
a la [documentation complète du
|
|
|
|
|
module](https://dev.maxmind.com/geoip/legacy/mod_geoip2/)
|
2017-07-23 00:17:01 +02:00
|
|
|
|
|
2018-03-29 21:53:44 +02:00
|
|
|
|
### mod_davfs
|
|
|
|
|
|
|
|
|
|
Ce module permet de prendre en charge WebDAV.
|
|
|
|
|
|
|
|
|
|
Pour l'activer :
|
|
|
|
|
|
|
|
|
|
~~~
|
|
|
|
|
# a2enmod davfs
|
|
|
|
|
~~~
|
|
|
|
|
|
2018-10-25 22:33:25 +02:00
|
|
|
|
Ensuite pour activer le module, il suffit de rajouter `Dav On` dans
|
|
|
|
|
le virtualhost voulu.
|
2018-03-29 21:53:44 +02:00
|
|
|
|
|
|
|
|
|
Exemple de vhost :
|
|
|
|
|
|
|
|
|
|
~~~
|
|
|
|
|
<VirtualHost *:443>
|
|
|
|
|
|
|
|
|
|
ServerName dav.example.com
|
|
|
|
|
|
|
|
|
|
DocumentRoot /home/webdav/
|
|
|
|
|
<Directory "/home/webdav/">
|
|
|
|
|
Dav On
|
|
|
|
|
|
|
|
|
|
AuthType Basic
|
|
|
|
|
AuthName DAV
|
|
|
|
|
AuthUserFile "/etc/apache2/webdav.htpasswd"
|
|
|
|
|
Require valid-user
|
|
|
|
|
</Directory>
|
|
|
|
|
|
|
|
|
|
ErrorLog ${APACHE_LOG_DIR}/dav_error.log
|
|
|
|
|
CustomLog ${APACHE_LOG_DIR}/dav_access.log combined
|
|
|
|
|
|
|
|
|
|
SSLEngine on
|
|
|
|
|
SSLCertificateFile /etc/ssl/certs/ssl-cert-snakeoil.pem
|
|
|
|
|
SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key
|
|
|
|
|
</VirtualHost>
|
|
|
|
|
~~~
|
|
|
|
|
|
2016-10-05 03:30:41 +02:00
|
|
|
|
## Authentification HTTP
|
|
|
|
|
|
|
|
|
|
### HTTP Basic Authentication (mod_auth_basic)
|
|
|
|
|
|
2018-10-25 22:33:25 +02:00
|
|
|
|
[Basic](http://httpd.apache.org/docs/2.4/mod/mod_auth_basic.html)
|
|
|
|
|
est la méthode d'authenfication HTTP la plus simple et la plus
|
|
|
|
|
répandue. La configuration se fait via *VirtualHost* ou *.htaccess*
|
|
|
|
|
:
|
2016-10-05 03:30:41 +02:00
|
|
|
|
|
|
|
|
|
~~~{.apache}
|
|
|
|
|
AuthType Basic
|
|
|
|
|
AuthName "Restricted"
|
|
|
|
|
AuthUserFile /foo/.htpasswd
|
|
|
|
|
AuthGroupFile /dev/null
|
|
|
|
|
require valid-user
|
|
|
|
|
~~~
|
|
|
|
|
|
|
|
|
|
La gestion du fichier *.htpasswd* se gère via la commande `htpasswd`.
|
|
|
|
|
|
2018-11-07 23:17:29 +01:00
|
|
|
|
Pour créer l'utilisateur *foo* :
|
2018-01-24 09:48:42 +01:00
|
|
|
|
|
|
|
|
|
~~~{.bash}
|
2018-11-07 23:17:29 +01:00
|
|
|
|
$ htpasswd -c /foo/.htpasswd foo
|
2018-01-24 09:48:42 +01:00
|
|
|
|
New password:
|
|
|
|
|
Re-type new password:
|
2018-11-07 23:17:29 +01:00
|
|
|
|
Adding password for user foo
|
2018-01-24 09:48:42 +01:00
|
|
|
|
~~~
|
|
|
|
|
|
2016-10-05 03:30:41 +02:00
|
|
|
|
### HTTP Digest Authentication (mod_auth_digest)
|
|
|
|
|
|
2018-10-25 22:33:25 +02:00
|
|
|
|
Il est possible d'utiliser la méthode d'authentification Digest
|
|
|
|
|
plutôt que Basic en activant le module :
|
2016-10-05 03:30:41 +02:00
|
|
|
|
|
|
|
|
|
~~~
|
|
|
|
|
# a2enmod auth_digest
|
|
|
|
|
~~~
|
|
|
|
|
|
|
|
|
|
La configuration est quasi-identique au type Basic :
|
|
|
|
|
|
|
|
|
|
~~~{.apache}
|
|
|
|
|
AuthType Digest
|
|
|
|
|
AuthName "Restricted"
|
2016-12-29 15:26:14 +01:00
|
|
|
|
AuthUserFile /foo/.htpasswd
|
2016-10-05 03:30:41 +02:00
|
|
|
|
Require valid-user
|
|
|
|
|
~~~
|
|
|
|
|
|
|
|
|
|
La gestion du fichier *.htpasswd* se gère alors via la commande `htdigest`.
|
|
|
|
|
|
|
|
|
|
### Authentification via LDAP (mod_authnz_ldap)
|
|
|
|
|
|
|
|
|
|
~~~
|
|
|
|
|
# a2enmod authnz_ldap
|
|
|
|
|
~~~~
|
|
|
|
|
|
|
|
|
|
Voici un exemple de configuration :
|
|
|
|
|
|
|
|
|
|
~~~{.apache}
|
|
|
|
|
AuthBasicProvider ldap
|
|
|
|
|
AuthName "Restricted"
|
|
|
|
|
AuthType Basic
|
|
|
|
|
AuthLDAPURL ldaps://ldap.example.com/ou=people,dc=example,dc=com?uid?one?(filter)
|
|
|
|
|
Require valid-user
|
|
|
|
|
~~~
|
|
|
|
|
|
2018-10-25 22:33:25 +02:00
|
|
|
|
Note : pour utiliser *ldaps* avec un certificat non reconnu par le
|
|
|
|
|
système, il faut ajouter la directive suivante dans la configuration
|
|
|
|
|
globale d'Apache `LDAPVerifyServerCert off`.
|
2016-10-05 03:30:41 +02:00
|
|
|
|
|
|
|
|
|
## Rewrite Rules
|
|
|
|
|
|
2017-05-09 21:50:44 +02:00
|
|
|
|
* mod_rewrite : <http://httpd.apache.org/docs/2.4/mod/mod_rewrite.html>
|
|
|
|
|
* drapeaux utilisables : <https://httpd.apache.org/docs/2.4/rewrite/flags.html>
|
2016-10-05 03:57:46 +02:00
|
|
|
|
|
2018-10-25 22:33:25 +02:00
|
|
|
|
Voici quelques motifs classiques de redirection vers un nouveau
|
|
|
|
|
domaine (HTTP 302) … du plus simple au plus compliqué :
|
2016-10-05 03:57:46 +02:00
|
|
|
|
|
2017-03-22 10:58:00 +01:00
|
|
|
|
~~~
|
2018-09-06 19:24:53 +02:00
|
|
|
|
# rediriger la page d'accueil avec un code 301
|
2017-03-22 10:58:00 +01:00
|
|
|
|
RedirectPermanent / http://new.example.com
|
|
|
|
|
|
2018-09-06 19:24:53 +02:00
|
|
|
|
# rediriger n'importe quelle requête en conservant le chemin
|
2017-03-22 10:58:00 +01:00
|
|
|
|
RedirectMatch ^/(.*)$ http://new.example.com/$1
|
|
|
|
|
|
2018-09-06 19:24:53 +02:00
|
|
|
|
# rediriger la page d'accueil vers un autre chemin
|
2017-03-24 11:15:39 +01:00
|
|
|
|
RedirectMatch ^/$ /sub/
|
|
|
|
|
|
2018-09-06 19:24:53 +02:00
|
|
|
|
# rediriger n'importe quelle requête en conservant le chemin avec des exceptions
|
|
|
|
|
RewriteCond %{REMOTE_ADDR} !^192\.0\.2\.129
|
2017-03-22 10:58:00 +01:00
|
|
|
|
RewriteRule ^/(.*) http://new.example.com/$1 [L,R=permanent]
|
|
|
|
|
|
2018-09-06 19:24:53 +02:00
|
|
|
|
# rediriger vers HTTPS sauf pour certaines requetes
|
2017-11-07 18:58:57 +01:00
|
|
|
|
RewriteCond %{REQUEST_URI} !^/.well-known/pki-validation/
|
2017-03-22 10:58:00 +01:00
|
|
|
|
RewriteRule ^/(.*) https://%{SERVER_NAME}/$1 [L,R]
|
2017-05-09 21:50:44 +02:00
|
|
|
|
|
2018-09-06 19:24:53 +02:00
|
|
|
|
# le drapeau NC permet de ne pas tenir compte de la casse
|
2017-05-09 21:50:44 +02:00
|
|
|
|
RewriteRule ^/FoO.tXt /sub/ [L,R,NC]
|
2017-05-22 19:34:52 +02:00
|
|
|
|
|
|
|
|
|
# empêcher des requêtes POST sur une URL particulière
|
|
|
|
|
RewriteCond %{REQUEST_METHOD} POST
|
|
|
|
|
RewriteRule ^/foo.txt [L,F]
|
2017-11-06 20:39:40 +01:00
|
|
|
|
|
2018-09-06 19:24:53 +02:00
|
|
|
|
# rediriger vers HTTPS dans un VirtualHost mixte HTTP/HTTPS
|
2017-11-06 20:39:40 +01:00
|
|
|
|
RewriteCond %{HTTPS} !=on
|
|
|
|
|
RewriteRule ^/(.*) https://%{SERVER_NAME}/$1 [L,R=permanent]
|
2018-09-06 19:24:53 +02:00
|
|
|
|
|
|
|
|
|
# mettre un site en maintenance (code 503) avec des exceptions
|
|
|
|
|
RewriteCond %{REMOTE_ADDR} !^192\.0\.2\.129
|
2018-09-10 22:55:43 +02:00
|
|
|
|
RewriteRule ^.*$ / [R=503,L]
|
|
|
|
|
ErrorDocument 503 "Maintenance temporaire, veuillez patienter. Merci."
|
|
|
|
|
#ErrorDocument 503 http://maintenance.evolix.org/
|
|
|
|
|
#Header Set Cache-Control "no-cache, no-store"
|
|
|
|
|
#Header Set Pragma "no-cache"
|
2019-06-14 11:16:44 +02:00
|
|
|
|
|
|
|
|
|
# Afficher une page de maintenance si elle existe et le contenu du site s'affiche pour ceux ayant l'IP spécifié.
|
|
|
|
|
RewriteCond %{REMOTE_ADDR} !^123\.456\.X\.X
|
|
|
|
|
RewriteCond %{DOCUMENT_ROOT}/maintenance.html -f
|
|
|
|
|
RewriteCond %{SCRIPT_FILENAME} !maintenance.html
|
|
|
|
|
RewriteRule ^.*$ /maintenance.html [R=503,L]
|
|
|
|
|
ErrorDocument 503 /maintenance.html
|
|
|
|
|
Header Set Cache-Control "max-age=0, no-store"
|
2019-07-24 16:39:54 +02:00
|
|
|
|
|
|
|
|
|
# Rediriger sur une page sans ses paramètres et valeurs.
|
|
|
|
|
RewriteCond %{REQUEST_URI} ^/index\.php$
|
|
|
|
|
RewriteCond %{QUERY_STRING} ^parametre=valeur$
|
|
|
|
|
RewriteRule (.*) /page-destination [QSD,R=301,L]
|
2017-03-22 10:58:00 +01:00
|
|
|
|
~~~
|
2016-10-05 03:57:46 +02:00
|
|
|
|
|
2018-10-25 22:33:25 +02:00
|
|
|
|
Pour supprimer un Query String avec une Rewrite Rule :
|
|
|
|
|
<https://www.philipphoffmann.de/blog/2012/08/16/how-to-discard-the-query-string-in-a-rewriterule-apache-mod_rewrite/>
|
2016-10-05 03:57:46 +02:00
|
|
|
|
|
2018-04-30 09:53:00 +02:00
|
|
|
|
### Redirection https
|
|
|
|
|
|
2018-10-25 22:33:25 +02:00
|
|
|
|
Dans le cas où le serveur n'écoute que sur le port 80, derrière un
|
|
|
|
|
proxy qui fait la terminaison SSL mais ne gère pas les redirections
|
|
|
|
|
(exemple Amazon ELB), on peut forcer la redirection directement
|
|
|
|
|
dans Apache en utilisant la valeur de l'en-tête `X-Forwarded-Proto`
|
|
|
|
|
:
|
2018-04-30 09:53:00 +02:00
|
|
|
|
|
|
|
|
|
~~~
|
|
|
|
|
RewriteEngine On
|
|
|
|
|
RewriteCond %{HTTP:X-Forwarded-Proto} =http
|
|
|
|
|
RewriteRule .* https://%{HTTP:Host}%{REQUEST_URI} [L,R=permanent]
|
|
|
|
|
~~~
|
|
|
|
|
|
2018-02-22 10:21:36 +01:00
|
|
|
|
## Conditions
|
|
|
|
|
|
2018-10-25 22:33:25 +02:00
|
|
|
|
À partir de la version Apache 2.4, on peut utiliser des conditions
|
|
|
|
|
pour l'application des directives (l'imbrication de multiples <If>
|
|
|
|
|
n'est disponible que pour les versions >= 2.4.26).
|
2018-02-22 10:21:36 +01:00
|
|
|
|
|
|
|
|
|
~~~{.bash}
|
|
|
|
|
<If "%{HTTP_HOST} == 'test.example.com'">
|
|
|
|
|
SetEnv APP_ENV "test"
|
|
|
|
|
</If>
|
2018-02-22 16:25:14 +01:00
|
|
|
|
<If "%{HTTP_QUERY} =~ /wp-admin*/">
|
|
|
|
|
...
|
|
|
|
|
</If>
|
2018-02-22 10:21:36 +01:00
|
|
|
|
~~~
|
|
|
|
|
|
|
|
|
|
Expressions possibles : [https://httpd.apache.org/docs/2.4/expr.html](https://httpd.apache.org/docs/2.4/expr.html)
|
|
|
|
|
|
2016-10-05 03:30:41 +02:00
|
|
|
|
## Attaques DOS (Denial Of Service) ou XSS
|
|
|
|
|
|
|
|
|
|
### mod_evasive
|
|
|
|
|
|
2018-10-25 22:33:25 +02:00
|
|
|
|
Le module **mod_evasive** permet de limiter certaines attaques DoS
|
|
|
|
|
en limitant l'accès à une ou plusieurs pages par un temps de
|
|
|
|
|
banissement d'une IP source. Par défaut, nous ajustons la configuration
|
|
|
|
|
de façon à ce que si une adresse IP accède plus de 5 fois à la même
|
|
|
|
|
page en 30s, ou à plus de 30 requêtes sur tout le site en 1s, il
|
|
|
|
|
sera banni (erreur HTTP 403) pendant 60s. Une notification sera
|
|
|
|
|
alors envoyée à syslog et par email.
|
2016-10-05 03:30:41 +02:00
|
|
|
|
|
|
|
|
|
~~~{.apache}
|
|
|
|
|
<IfModule mod_evasive20.c>
|
|
|
|
|
DOSHashTableSize 3097
|
|
|
|
|
DOSPageCount 5
|
|
|
|
|
DOSSiteCount 30
|
|
|
|
|
DOSPageInterval 3
|
|
|
|
|
DOSSiteInterval 1
|
|
|
|
|
DOSBlockingPeriod 60
|
|
|
|
|
DOSEmailNotify security@example.com
|
|
|
|
|
</IfModule>
|
|
|
|
|
~~~
|
|
|
|
|
|
2018-10-25 22:33:25 +02:00
|
|
|
|
Attention, pour certains sites avec de nombreuses ressources statiques
|
|
|
|
|
sur le même serveur HTTP, il faut souvent désactiver **mod_evasive**
|
|
|
|
|
pour éviter des faux-positifs et ne l'utiliser qu'en cas d'attaques
|
|
|
|
|
récurrentes.
|
2016-10-05 03:30:41 +02:00
|
|
|
|
|
2018-10-25 22:33:25 +02:00
|
|
|
|
On peut mettre en liste blanche une ip ou une plage d'ip, pour que
|
|
|
|
|
le mod_evasive ignore les requêtes venant de ceux-ci :
|
2017-10-09 10:09:43 +02:00
|
|
|
|
|
|
|
|
|
~~~
|
|
|
|
|
DOSWhitelist 192.168.0.*
|
|
|
|
|
~~~
|
|
|
|
|
|
2018-10-25 22:33:25 +02:00
|
|
|
|
On peut aussi utiliser un wildcard * peut être autorisé sur les 3
|
|
|
|
|
derniers octets, si nécessaire.
|
2017-10-09 10:09:43 +02:00
|
|
|
|
|
2016-10-05 03:30:41 +02:00
|
|
|
|
### Fail2Ban
|
|
|
|
|
|
2018-10-25 22:33:25 +02:00
|
|
|
|
[Fail2Ban](HowtoFail2Ban) est indépendant d'Apache, mais peut être
|
|
|
|
|
utilisé pour de la détection plus précise que *mod_evasive* : il
|
|
|
|
|
va lire en permanence les journaux générés par Apache (ce qui peut
|
|
|
|
|
être coûteux en ressources) et il pourra bannir des adresses IP si
|
|
|
|
|
cela répond à certaines règles comme trop de connexions à une page
|
|
|
|
|
d'authentification par exemple.
|
2016-10-05 03:30:41 +02:00
|
|
|
|
|
2017-07-23 00:17:01 +02:00
|
|
|
|
Voir <https://wiki.evolix.org/HowtoFail2Ban#apache-nginx>
|
2016-10-05 03:30:41 +02:00
|
|
|
|
|
|
|
|
|
### ModSecurity
|
|
|
|
|
|
2018-10-25 22:33:25 +02:00
|
|
|
|
L'utilisation de [ModSecurity](http://www.modsecurity.org) permet
|
2018-11-28 14:50:43 +01:00
|
|
|
|
de bloquer certaines requêtes HTTP (attaques XSS connues, etc.) au
|
|
|
|
|
niveau d'Apache. On l'installe avec le [OWASP ModSecurity Core Rule Set](https://coreruleset.org/) (CRS)
|
|
|
|
|
qui est un ensemble de règles ModSecurity couvrant un large spectre d'attaques possibles.
|
2016-10-05 03:30:41 +02:00
|
|
|
|
|
|
|
|
|
~~~
|
|
|
|
|
# apt install libapache2-mod-security2 modsecurity-crs
|
|
|
|
|
~~~
|
|
|
|
|
|
2018-10-25 22:33:25 +02:00
|
|
|
|
Nous faisons une configuration minimale via
|
|
|
|
|
`/etc/apache2/conf-available/modsecurity.conf` :
|
2016-10-05 03:30:41 +02:00
|
|
|
|
|
|
|
|
|
~~~{.apache}
|
2019-06-06 11:29:14 +02:00
|
|
|
|
<IfModule mod_security2.c>
|
|
|
|
|
|
|
|
|
|
# enable mod_security
|
|
|
|
|
SecRuleEngine On
|
|
|
|
|
# access to request bodies
|
|
|
|
|
SecRequestBodyAccess On
|
|
|
|
|
#SecRequestBodyLimit 134217728
|
|
|
|
|
#SecRequestBodyInMemoryLimit 131072
|
|
|
|
|
# access to response bodies
|
|
|
|
|
SecResponseBodyAccess Off
|
|
|
|
|
#SecResponseBodyLimit 524288
|
|
|
|
|
SecResponseBodyMimeType (null) text/html text/plain text/xml
|
|
|
|
|
#SecServerSignature "Apache/2.2.0 (Fedora)"
|
|
|
|
|
|
|
|
|
|
SecUploadDir /tmp
|
|
|
|
|
SecUploadKeepFiles Off
|
|
|
|
|
|
|
|
|
|
# default action
|
|
|
|
|
SecDefaultAction "log,auditlog,deny,status:406,phase:2"
|
|
|
|
|
|
|
|
|
|
SecAuditEngine Off
|
|
|
|
|
#SecAuditLogRelevantStatus "^[45]"
|
|
|
|
|
# use only one log file
|
|
|
|
|
SecAuditLogType Serial
|
|
|
|
|
# audit log file
|
|
|
|
|
SecAuditLog /var/log/apache2/modsec_audit.log
|
|
|
|
|
# what is logged
|
|
|
|
|
SecAuditLogParts "ABIFHZ"
|
|
|
|
|
|
|
|
|
|
#SecArgumentSeparator "&"
|
|
|
|
|
SecCookieFormat 0
|
|
|
|
|
SecDebugLog /var/log/apache2/modsec_debug.log
|
|
|
|
|
SecDebugLogLevel 0
|
|
|
|
|
|
|
|
|
|
SecDataDir /tmp
|
|
|
|
|
SecTmpDir /tmp
|
|
|
|
|
|
|
|
|
|
#########
|
|
|
|
|
# RULES
|
|
|
|
|
#########
|
|
|
|
|
|
|
|
|
|
# Removed because it does not play well with apache-itk
|
|
|
|
|
# Can be removed when modsecurity 2.9.3 hits debian
|
|
|
|
|
# See https://github.com/SpiderLabs/ModSecurity/issues/712
|
|
|
|
|
SecRuleRemoveById "910000-910999"
|
|
|
|
|
|
2016-10-05 03:30:41 +02:00
|
|
|
|
</IfModule>
|
2019-06-06 11:29:14 +02:00
|
|
|
|
|
2016-10-05 03:30:41 +02:00
|
|
|
|
~~~
|
|
|
|
|
|
2018-11-28 14:50:43 +01:00
|
|
|
|
Nous désactivons le log d'audit par défaut, puisque l’information
|
|
|
|
|
enregistrée dans le log d'erreur Apache est suffisante pour connaître
|
2019-04-16 21:34:48 +02:00
|
|
|
|
la raison d'un bloquage. Par contre, il est utile de le réactiver (avec `SecAuditEngine RelevantOnly`) lorsque
|
2018-11-28 14:50:43 +01:00
|
|
|
|
vous faites un audit des règles applicables a un serveur ou lors de la rédaction
|
|
|
|
|
de nouvelles règles. Dans ce cas, il existe des [outils](https://github.com/Apache-Labor/labor/blob/master/bin/.apache-modsec.alias)
|
2018-10-25 23:47:47 +02:00
|
|
|
|
pour faciliter l’obtention de statistiques du audit log.
|
|
|
|
|
|
2018-10-25 22:33:25 +02:00
|
|
|
|
On peut aussi ajuster certains paramètres de ModSecurity Core Rule
|
2018-11-28 14:50:43 +01:00
|
|
|
|
Set en modifiant le fichier `/etc/modsecurity/crs/crs-setup.conf`.
|
2018-10-25 22:33:25 +02:00
|
|
|
|
C'est notamment ici qu'il faudra ajuster si on utilise d'autres
|
2018-11-28 14:50:43 +01:00
|
|
|
|
méthodes HTTP (comme PATCH, PUT, DELETE...) qui sont bloquées par défaut.
|
2018-02-16 16:04:55 +01:00
|
|
|
|
|
2018-10-25 22:33:25 +02:00
|
|
|
|
On pourra désactiver modsecurity dans des vhosts ou sur des dossiers
|
2018-10-25 23:47:47 +02:00
|
|
|
|
en particulier en jouant avec la directive `SecRuleEngine Off`.
|
|
|
|
|
Ceci peut être utile en cas de problèmes, mais il est toujours mieux
|
|
|
|
|
de faire un léger audit afin d’identifier les règles problématiques
|
2018-11-02 22:35:56 +01:00
|
|
|
|
et les désactiver avec `SecRuleRemoveById XXXX`, comme nous le
|
2018-11-07 17:00:46 +01:00
|
|
|
|
faisont avec les règles 910*.
|
2018-10-25 23:47:47 +02:00
|
|
|
|
|
2018-02-16 16:04:55 +01:00
|
|
|
|
~~~
|
|
|
|
|
<Directory "/home/monsite/www/wp-admin">
|
|
|
|
|
<IfModule security2_module>
|
|
|
|
|
SecRuleEngine Off
|
|
|
|
|
</IfModule>
|
|
|
|
|
</Directory>
|
|
|
|
|
~~~
|
|
|
|
|
|
2018-01-04 09:49:59 +01:00
|
|
|
|
Le Wiki À propos de [ces directives](https://github.com/SpiderLabs/ModSecurity/wiki/Reference-Manual)
|
|
|
|
|
|
2016-10-05 03:30:41 +02:00
|
|
|
|
## Awstats
|
|
|
|
|
|
2018-10-25 22:33:25 +02:00
|
|
|
|
[AWStats](http://www.awstats.org/) est un outil pour générer des
|
|
|
|
|
statistiques en fonction d'un fichier de logs.
|
2016-10-10 22:39:10 +02:00
|
|
|
|
|
2017-07-23 00:17:01 +02:00
|
|
|
|
Voir <https://wiki.evolix.org/HowtoLAMP/AwStats>
|
2016-10-10 22:39:10 +02:00
|
|
|
|
|
2018-10-25 22:33:25 +02:00
|
|
|
|
*Note :* une configuration AWStats peut être forcée au sein d'un
|
|
|
|
|
VirtualHost grâce à la directive `SetEnv AWSTATS_FORCE_CONFIG
|
|
|
|
|
example`
|
2016-10-05 03:30:41 +02:00
|
|
|
|
|
|
|
|
|
## Monitoring
|
|
|
|
|
|
2016-10-05 03:57:46 +02:00
|
|
|
|
### log2mail
|
|
|
|
|
|
2018-10-25 22:33:25 +02:00
|
|
|
|
Pour être alerté en cas de *Segmentation fault*, on ajoute la
|
|
|
|
|
configuration suivante au logiciel
|
|
|
|
|
[log2mail](https://wiki.evolix.org/HowtoLog2mail) :
|
2016-10-05 03:57:46 +02:00
|
|
|
|
|
|
|
|
|
~~~
|
|
|
|
|
file = /var/log/apache2/error.log
|
|
|
|
|
pattern = "Segmentation fault"
|
2017-07-22 12:39:40 +02:00
|
|
|
|
mailto = alert@example.com
|
2016-10-05 03:57:46 +02:00
|
|
|
|
~~~
|
|
|
|
|
|
|
|
|
|
~~~
|
|
|
|
|
# adduser log2mail adm
|
|
|
|
|
# servicectl restart log2mail
|
|
|
|
|
~~~
|
|
|
|
|
|
|
|
|
|
### apachetop
|
|
|
|
|
|
2018-10-25 22:33:25 +02:00
|
|
|
|
L'indispensable **apachetop** permet de surveiller en direct
|
|
|
|
|
l'activité d'Apache via un fichier d'access_log (format *combined*)
|
|
|
|
|
:
|
2016-10-10 22:39:10 +02:00
|
|
|
|
|
2016-12-29 15:26:14 +01:00
|
|
|
|
~~~
|
2016-10-13 18:55:00 +02:00
|
|
|
|
$ apachetop -f access.log -T 3600 -q
|
2016-10-05 03:57:46 +02:00
|
|
|
|
~~~
|
|
|
|
|
|
2018-10-25 22:33:25 +02:00
|
|
|
|
On peut alors visualiser les URLs les plus sollicitées (querystrings
|
|
|
|
|
inclus grâce à l'option *-q*), et switcher à l'aide de la touche
|
|
|
|
|
**d** pour voir les adresses IP source ; à l'aide de la touche
|
|
|
|
|
**n** pour voir la répartition en codes HTTP 2xx/3xx/4xx/5xx.
|
2016-10-13 18:55:00 +02:00
|
|
|
|
|
|
|
|
|
Voici l'ensemble des commandes disponibles :
|
|
|
|
|
|
|
|
|
|
~~~
|
|
|
|
|
d : switch l'affichage entre URLs/IPs source/Referrers
|
|
|
|
|
n : switch l'affichage entre le nombre de requêtes et la répartition en codes HTTP 2xx/3xx/4xx/5xx
|
|
|
|
|
h or ? : afficher l'aide
|
|
|
|
|
p : (un)freeze l'affichage
|
|
|
|
|
q : quitter
|
|
|
|
|
up/down : sélectionner une ligne (affichage d'une '*' sur la ligne)
|
|
|
|
|
right/left : entrer/sortir dans les détails pour la ligne sélectionnées
|
|
|
|
|
|
|
|
|
|
DÉTAILS:
|
|
|
|
|
s: TRI PAR:
|
|
|
|
|
r) requêtes R) reqs/sec b) bytes B) bytes/sec
|
|
|
|
|
2) 2xx 3) 3xx 4) 4xx 5) 5xx
|
|
|
|
|
|
|
|
|
|
t: AFFICHE DANS LE SOUS-MENU:
|
|
|
|
|
u) urls r) referrers h) adresses IP source
|
|
|
|
|
|
|
|
|
|
f: FILTRES:
|
|
|
|
|
a) ajout d'un filtre c) suppression des filtres s) montrer les filtres actifs
|
|
|
|
|
a: AJOUT D'UN FILTRE TYPE REGEX
|
|
|
|
|
u) appliqué à l'URL r) appliqué au Refferer h) appliqué à l'adresse IP source
|
|
|
|
|
~~~
|
|
|
|
|
|
|
|
|
|
|
2016-10-05 03:57:46 +02:00
|
|
|
|
### server-status
|
|
|
|
|
|
2018-10-25 22:33:25 +02:00
|
|
|
|
L'activation du *server-status* est utile pour une observation
|
|
|
|
|
manuelle ou automatique.
|
2016-10-05 03:57:46 +02:00
|
|
|
|
|
2016-10-10 22:39:10 +02:00
|
|
|
|
~~~{.apache}
|
2016-10-05 03:57:46 +02:00
|
|
|
|
<IfModule mod_status.c>
|
|
|
|
|
ExtendedStatus On
|
2016-10-10 22:39:10 +02:00
|
|
|
|
<Location /server-status-XXXX>
|
2016-10-05 03:57:46 +02:00
|
|
|
|
SetHandler server-status
|
|
|
|
|
Deny from all
|
2016-10-10 22:39:10 +02:00
|
|
|
|
Include ipaddr_whitelist.conf
|
2016-10-05 03:57:46 +02:00
|
|
|
|
Allow from 192.0.2.43
|
2016-10-10 22:39:10 +02:00
|
|
|
|
Allow from 127.0.0.1
|
2016-10-05 03:57:46 +02:00
|
|
|
|
</Location>
|
|
|
|
|
</IfModule>
|
|
|
|
|
~~~
|
|
|
|
|
|
|
|
|
|
### Munin
|
|
|
|
|
|
2017-07-22 12:39:40 +02:00
|
|
|
|
Pour activer les plugins Munin pour Apache :
|
2016-10-05 03:57:46 +02:00
|
|
|
|
|
2016-10-05 04:03:24 +02:00
|
|
|
|
~~~
|
2016-10-05 03:57:46 +02:00
|
|
|
|
# cd /etc/munin/plugins
|
|
|
|
|
# ln -s /usr/share/munin/plugins/apache_accesses
|
|
|
|
|
# ln -s /usr/share/munin/plugins/apache_processes
|
|
|
|
|
# ln -s /usr/share/munin/plugins/apache_volume
|
2016-10-05 04:03:24 +02:00
|
|
|
|
~~~
|
2016-10-05 03:57:46 +02:00
|
|
|
|
|
2018-10-25 22:33:25 +02:00
|
|
|
|
Les plugins Apache pour Munin se base *server-status*, on configure
|
|
|
|
|
ainsi via le fichier `/etc/munin/plugin-conf.d/munin-node` :
|
2016-10-10 22:39:10 +02:00
|
|
|
|
|
|
|
|
|
~~~
|
|
|
|
|
[apache_*]
|
|
|
|
|
env.url http://127.0.0.1:%d/server-status-XXXX?auto
|
|
|
|
|
env.port 80
|
|
|
|
|
~~~
|
|
|
|
|
|
|
|
|
|
Pour tester le bon fonctionnement des plugins Apache pour Munin :
|
2016-10-05 03:57:46 +02:00
|
|
|
|
|
2016-10-05 04:03:24 +02:00
|
|
|
|
~~~
|
2016-10-05 03:57:46 +02:00
|
|
|
|
# sudo -u munin munin-run apache_accesses
|
2016-10-05 04:03:24 +02:00
|
|
|
|
~~~
|
2016-10-05 03:57:46 +02:00
|
|
|
|
|
2018-10-25 22:33:25 +02:00
|
|
|
|
Ceci doit vous renvoyer une valeur du type accesses80.value 19372070.
|
|
|
|
|
Si la commande vous renvoie U, vous avez un soucis d'accès à la
|
|
|
|
|
page *server-status*, à vérifier via
|
|
|
|
|
`GET http://127.0.0.1:%d/server-status-XXXX?auto`.
|
2016-10-05 03:57:46 +02:00
|
|
|
|
|
|
|
|
|
## FAQ
|
|
|
|
|
|
2016-10-05 04:03:24 +02:00
|
|
|
|
### Autorisation DirectoryIndex via .htaccess ?
|
|
|
|
|
|
2016-10-05 14:20:23 +02:00
|
|
|
|
Ajouter `Indexes` dans `AllowOverride`.
|
2016-10-05 04:03:24 +02:00
|
|
|
|
|
|
|
|
|
### Autorisation directives mod_expires ou mod_caches via .htaccess ?
|
|
|
|
|
|
2016-10-05 14:20:23 +02:00
|
|
|
|
Ajouter `Indexes` dans `AllowOverride`.
|
2016-10-05 04:03:24 +02:00
|
|
|
|
|
2017-03-14 11:19:34 +01:00
|
|
|
|
### Autorisation de rewrite rules (mod_rewrite) via .htaccess ?
|
|
|
|
|
|
2018-10-25 22:33:25 +02:00
|
|
|
|
Ajouter `FileInfo` dans `AllowOverride` et `+SymLinksIfOwnerMatch`
|
|
|
|
|
ou `+FollowSymLinks` dans `Options`.
|
2017-03-14 11:19:34 +01:00
|
|
|
|
|
2016-10-05 04:03:24 +02:00
|
|
|
|
### Autorisation Options via .htaccess ?
|
|
|
|
|
|
2018-10-25 22:33:25 +02:00
|
|
|
|
Si l'on modifie l'option `php_admin_value memory_limit` : un
|
|
|
|
|
_reload_/_graceful_ suffit pour prendre en compte la modification.
|
2016-10-05 04:03:24 +02:00
|
|
|
|
|
|
|
|
|
Exemple pour le AllowOverride :
|
|
|
|
|
|
|
|
|
|
~~~
|
|
|
|
|
AllowOverride Options=All,MultiViews Indexes AuthConfig Limit FileInfo
|
|
|
|
|
~~~
|
|
|
|
|
|
|
|
|
|
### Authentification LDAP avec serveur LDAP en local
|
|
|
|
|
|
2018-10-25 22:33:25 +02:00
|
|
|
|
Quand on utilise l'authentification LDAP avec un serveur en local,
|
|
|
|
|
il faut démarrer **slapd** avant de démarrer Apache, sinon celui-ci
|
|
|
|
|
se plaint qu'il ne peut pas contacter le serveur LDAP, et bloque
|
|
|
|
|
l'accès aux pages … (erreur 500).
|
2016-10-05 04:03:24 +02:00
|
|
|
|
|
2018-10-25 22:33:25 +02:00
|
|
|
|
Pour cela, dans le script d'init d'apache2 ajouter slapd dans la
|
|
|
|
|
directive `Required-Start:`
|
2016-10-05 04:03:24 +02:00
|
|
|
|
|
|
|
|
|
~~~
|
|
|
|
|
# Required-Start: $local_fs $remote_fs $network $syslog $named slapd
|
|
|
|
|
~~~
|
|
|
|
|
|
|
|
|
|
Supprimer les liens logiques et ré-générer les.
|
|
|
|
|
|
|
|
|
|
~~~
|
|
|
|
|
# insserv -r apache2
|
|
|
|
|
# insserv apache2
|
|
|
|
|
~~~
|
2016-10-20 17:40:08 +02:00
|
|
|
|
|
2016-10-23 17:58:10 +02:00
|
|
|
|
### Page personnalisée lors code erreur HTTP
|
2016-10-20 17:40:08 +02:00
|
|
|
|
|
2018-10-25 22:33:25 +02:00
|
|
|
|
On peut ajouter une configuration générale à tous les vhosts afin
|
|
|
|
|
de faire apparaître le contenu d'une page personnalisée selon le
|
|
|
|
|
code de retour HTTP.
|
2016-10-20 17:40:08 +02:00
|
|
|
|
|
2018-10-25 22:33:25 +02:00
|
|
|
|
Pour cela on ajoute un nouveau fichier de configuration à l'intérieur
|
|
|
|
|
de la racine apache, car cela concernera tout les vhosts.
|
2016-10-20 17:40:08 +02:00
|
|
|
|
|
2016-10-23 17:58:10 +02:00
|
|
|
|
`/etc/apache2/error.conf` :
|
2016-10-20 17:40:08 +02:00
|
|
|
|
|
|
|
|
|
~~~{.apache}
|
|
|
|
|
ErrorDocument XXX /YYYYYY/page.html
|
|
|
|
|
Alias /YYYYYY /var/www/
|
|
|
|
|
<Directory /var/www/>
|
|
|
|
|
Order allow,deny
|
|
|
|
|
Allow from all
|
|
|
|
|
DirectoryIndex page.html
|
|
|
|
|
</Directory>
|
|
|
|
|
~~~
|
2017-01-03 11:20:35 +01:00
|
|
|
|
|
2018-10-25 22:33:25 +02:00
|
|
|
|
*Remplacer XXX par le code erreur HTTP souhaité et YYYYY par le nom
|
|
|
|
|
de Location souhaité (URL) - vu que global à tous les vhosts, prendre
|
|
|
|
|
une chaîne aléatoire.*
|
2016-10-20 17:40:08 +02:00
|
|
|
|
|
2018-10-25 22:33:25 +02:00
|
|
|
|
Ensuite, il suffit simplement d'ajouter le fichier dans la configuration
|
|
|
|
|
générale d'Apache :
|
2016-10-20 17:40:08 +02:00
|
|
|
|
|
2016-10-23 17:58:10 +02:00
|
|
|
|
`/etc/apache2/apache2.conf` :
|
2016-10-20 17:40:08 +02:00
|
|
|
|
|
|
|
|
|
~~~{.apache}
|
|
|
|
|
Include error.conf
|
|
|
|
|
~~~
|
2017-03-28 01:22:48 +02:00
|
|
|
|
|
|
|
|
|
### Site web cassé en https avec un reverse proxy
|
|
|
|
|
|
2018-10-25 22:33:25 +02:00
|
|
|
|
Il est possible que l'application (joomla par exemple) pense qu'elle
|
|
|
|
|
est accédée en HTTP à tort parce qu'en réalité c'est un reverse
|
|
|
|
|
proxy qui fait la terminaison ssl. On peut indiquer dans le vhost
|
2017-03-28 01:22:48 +02:00
|
|
|
|
|
|
|
|
|
~~~{.apache}
|
|
|
|
|
SetEnvIfNoCase X-Forwarded-Proto https HTTPS=on
|
|
|
|
|
~~~
|
|
|
|
|
|
2018-10-25 22:33:25 +02:00
|
|
|
|
Ainsi l'application saura qu'elle est accédée en HTTPS à condition
|
|
|
|
|
que le reverse proxy soit bien configuré et envoie X-Forwarded-Proto.
|
2017-05-20 14:17:44 +02:00
|
|
|
|
|
|
|
|
|
### Interdire en fonction du User-Agent
|
|
|
|
|
|
|
|
|
|
~~~{.apache}
|
|
|
|
|
SetEnvIf User-Agent "^BadBot$" GoAway=1
|
|
|
|
|
SetEnvIf User-Agent "Nutch" GoAway=1
|
|
|
|
|
<Directory />
|
|
|
|
|
Deny from env=GoAway
|
|
|
|
|
</Directory>
|
|
|
|
|
~~~
|
2017-09-12 20:23:39 +02:00
|
|
|
|
|
|
|
|
|
### Site avec accents cassés
|
|
|
|
|
|
2018-10-25 22:33:25 +02:00
|
|
|
|
Si vous avez des vieux fichiers sources (TXT, HTML), il est probable
|
|
|
|
|
qu'ils utilisent l'encodage ISO-8859 au lieu d'Unicode. On peut
|
|
|
|
|
alors forcer la reconnaissance de cet encodage (ajout de charset=
|
|
|
|
|
dans l'entête HTTP Content-Type) via l'option `AddDefaultCharset`
|
|
|
|
|
utilisable globalement, dans un VirtualHost, dans un Directory ou
|
|
|
|
|
même un .htaccess si autorisé :
|
|
|
|
|
|
2017-09-12 20:23:39 +02:00
|
|
|
|
|
|
|
|
|
~~~
|
|
|
|
|
AddDefaultCharset ISO-8859-15
|
|
|
|
|
~~~
|
|
|
|
|
|
2018-10-25 22:33:25 +02:00
|
|
|
|
> *Note* : si vous avez des fichiers PHP en ISO-8859, vous devrez
|
|
|
|
|
> forcer l'option `default_charset` de PHP :
|
|
|
|
|
>
|
2017-09-12 20:23:39 +02:00
|
|
|
|
>
|
|
|
|
|
> ~~~
|
|
|
|
|
> php_value default_charset ISO-8859-15
|
|
|
|
|
> ~~~
|
|
|
|
|
|
2017-11-27 11:11:07 +01:00
|
|
|
|
### php_value error_reporting
|
2017-09-12 20:23:39 +02:00
|
|
|
|
|
2018-10-25 22:33:25 +02:00
|
|
|
|
Pour régler la valeur PHP `error_reporting` par vhost, il ne faut
|
|
|
|
|
pas utiliser les constantes PHP mais le masque binaire.
|
2017-09-12 20:23:39 +02:00
|
|
|
|
|
2018-10-25 22:33:25 +02:00
|
|
|
|
Extrait de <http://php.net/manual/fr/errorfunc.constants.php> : «
|
|
|
|
|
Note: Vous pouvez utiliser ces constantes dans le fichier `php.ini`
|
|
|
|
|
mais pas hors de PHP, comme dans le fichier `httpd.conf`, où vous
|
|
|
|
|
devez utiliser les valeurs des champs de bits. »
|
2017-11-27 11:11:07 +01:00
|
|
|
|
|
|
|
|
|
Exemple :
|
|
|
|
|
|
|
|
|
|
`E_ALL` et `~E_DEPRECATED` et `~E_STRICT`
|
|
|
|
|
→ `php_value error_reporting 22527`
|
|
|
|
|
|
|
|
|
|
Vous pouvez le calculer à la main ou avec un outil comme celui-ci :
|
|
|
|
|
<http://www.bx.com.au/tools/ultimate-php-error-reporting-wizard>
|
2018-01-22 10:44:02 +01:00
|
|
|
|
|
|
|
|
|
### Ne pas logguer le query-string dans le access.log
|
|
|
|
|
|
2018-10-25 22:33:25 +02:00
|
|
|
|
On peut ajouter un nouveau format de log dans `/etc/apache2/apache.conf`
|
|
|
|
|
et l'utiliser après dans les définitions de fichier de logs :
|
2018-09-06 19:08:21 +02:00
|
|
|
|
|
|
|
|
|
~~~
|
2018-01-22 10:44:02 +01:00
|
|
|
|
LogFormat "%h %l %u %t \"%m %U %H\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combinednoqtring
|
2018-09-06 19:08:21 +02:00
|
|
|
|
~~~
|
2018-01-22 10:44:02 +01:00
|
|
|
|
|
2019-07-17 09:43:47 +02:00
|
|
|
|
### Proxy WebSocket socket.io
|
|
|
|
|
|
|
|
|
|
~~~
|
|
|
|
|
# a2enmod proxy_wstunnel
|
|
|
|
|
~~~
|
|
|
|
|
|
|
|
|
|
~~~
|
2019-07-17 09:44:13 +02:00
|
|
|
|
# Socket.io
|
|
|
|
|
RewriteRule /socket.io/websocket/ - [R=200,L]
|
|
|
|
|
ProxyPass /socket.io/socket.io.js http://127.0.0.1:8080/socket.io/socket.io.js
|
|
|
|
|
ProxyPassReverse /socket.io/socket.io.js http://127.0.0.1:8080/socket.io/socket.io.js
|
|
|
|
|
ProxyPass /socket.io/websocket ws://127.0.0.1:8080/socket.io/websocket
|
|
|
|
|
ProxyPassReverse /socket.io/websocket ws://127.0.0.1:8080/socket.io/websocket
|
|
|
|
|
ProxyPass /socket.io/ http://127.0.0.1:8080/socket.io/
|
|
|
|
|
ProxyPassReverse /socket.io/ http://127.0.0.1:8080/socket.io/
|
|
|
|
|
RewriteCond %{REQUEST_URI} ^/socket.io [NC]
|
|
|
|
|
RewriteCond %{QUERY_STRING} transport=websocket [NC]
|
|
|
|
|
RewriteRule /(.*) ws://127.0.0.1:8080/$1 [P,L]
|
|
|
|
|
ProxyPass / http://127.0.0.1:8080/
|
|
|
|
|
ProxyPassReverse / http://127.0.0.1:8080/
|
2019-07-17 09:43:47 +02:00
|
|
|
|
~~~
|