====== Apache ======
Cette page est juste un mémo
Docs => http://devdocs.io/apache_http_server/
===== Commandes utiles =====
Tester les configs avant de faire un reload ou un restart
apache2ctl -t
reloader, restarter etc..
service apache2 restart
/etc/init.d/apache2 restart
apache2ctl restart
Afficher les modules chargés
apache2ctl -t -D DUMP_MODULES
ou
apache2ctl -M
D'autre commande
apache2ctl -h
Afficher le status
apache2ctl status
Encore plus détaillé
apache2ctl fullstatus
===== Configuration de base =====
La doc => http://httpd.apache.org/docs/2.2/fr/
Le minimum pour un accès avec un nom de domaine
# Apache doit écouter sur le port 80
Listen 80
# Toutes les adresses IP doivent répondre aux requêtes sur les
# serveurs virtuels
NameVirtualHost *:80
DocumentRoot /www/example.com
ServerName www.example1.com
# Autres directives ici
DocumentRoot /www/example.org
ServerName www.example2.org
# Autres directives ici
Les directives
AllowOverride None
Options Indexes FollowSymLinks
Les options
* AllowOverride None / All : permet la prise en compte des fichiers .htaccess (plus d'options dans la doc http://httpd.apache.org/docs/2.2/fr/mod/core.html#allowoverride )
* Options : par défaut All (toutes les options sauf MultiViews). Plus d'options dans la doc http://httpd.apache.org/docs/2.2/fr/mod/core.html#options)
* None : Désactive toutes les fonctions
* ExecCGI : Exécution de scripts CGI permise
* FollowSymLinks : Permet au serveur de suivre les liens symboliques
* Indexes : Affiche la liste des fichiers contenu dans le répertoire si aucun fichier index.html/php n'est présent
* MultiViews : Permet au serveur d'exécuter un fichier qui ressemblerait au fichier demandé si il n'existe pas. ex: un appel à /fichier exécutera /fichier.php si /fichier n'existe pas mais que /fichier.php existe
Accès par mot de passe
#accès au fichier de mot de passe généré par la commande htpasswd
AuthUserFile .htpasswd
AuthGroupFile /dev/null
AuthName "Ce message s'affichera dans la boite de dialogue demandant l'identification"
AuthType Basic
require valid-user
===== Installation de Apache2-mpm-worker =====
http://www.skyminds.net/serveur-dedie-installation-dapache-php-mysql-et-webmin/
Voici les paquets standards à installer
ii apache2 2.2.16-6+squeeze4 Apache HTTP Server metapackage
ii apache2-mpm-worker 2.2.16-6+squeeze4 Apache HTTP Server - high speed threaded model
ii apache2-utils 2.2.16-6+squeeze4 utility programs for webservers
ii apache2.2-bin 2.2.16-6+squeeze4 Apache HTTP Server common binary files
ii apache2.2-common 2.2.16-6+squeeze4 Apache HTTP Server common files
ii mysql-client-5.1 5.1.49-3 MySQL database client binaries
ii mysql-common 5.1.49-3 MySQL database common files, e.g. /etc/mysql/my.cnf
ii mysql-server 5.1.49-3 MySQL database server (metapackage depending on the latest version)
ii mysql-server-5.1 5.1.49-3 MySQL database server binaries and system database setup
ii mysql-server-core-5.1 5.1.49-3 MySQL database server binaries
ii php5 5.3.3-7+squeeze3 server-side, HTML-embedded scripting language (metapackage)
ii php5-cgi 5.3.3-7+squeeze3 server-side, HTML-embedded scripting language (CGI binary)
ii php5-cli 5.3.3-7+squeeze3 command-line interpreter for the php5 scripting language
ii php5-common 5.3.3-7+squeeze3 Common files for packages built from the php5 source
ii php5-curl 5.3.3-7+squeeze3 CURL module for php5
ii php5-gd 5.3.3-7+squeeze3 GD module for php5
ii php5-mcrypt 5.3.3-7+squeeze3 MCrypt module for php5
ii php5-mysql 5.3.3-7+squeeze3 MySQL module for php5
ii php5-suhosin 0.9.32.1-1 advanced protection module for php5
ii postfix 2.7.1-1+squeeze1 High-performance mail transport agent
Pour que php5 marche avec la version worker, il est indispensable d'installer le paquet
libapache2-mod-fcgid
Il faut ajouter les lignes suivantes dans le fichier **/etc/apache2/httpd.conf**
# pour faire marcher php5 avec apache2-mpm-worker
AddHandler fcgid-script .php
FCGIWrapper /usr/lib/cgi-bin/php5 .php
Options ExecCGI
il faut aussi activer les modes suivant :
a2enmod cache
a2enmod fcgid
a2enmod headers
a2enmod rewrite
Très important aussi, pour le php5, il faut configurer le fichier /etc/php5/cgi/php.ini mais il ne faut surtout pas négliger /etc/apache2/mods-available/fcgid.conf
Toutes les options ici http://httpd.apache.org/mod_fcgid/mod/mod_fcgid.html#fcgidmaxrequestlen
===== Problème =====
Problème rencontré et solution.
apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1 for ServerName
Il suffit de modifier le fichier /etc/hosts et de rajouter un localhost.localdomain avant le localhost
Avant
127.0.0.1 localhost swp.localhost rdlaptop.rdomain
Après
127.0.0.1 localhost.localdomain localhost swp.localhost rdlaptop.rdomain
Votre fichier peut aussi ressembler à ca
127.0.0.1 localhost.localdomain localhost
77.77.77.77 p2pfr
Remplacez par ca
127.0.0.1 localhost.localdomain localhost
77.77.77.77 p2pfr.localdomain p2pfr
Surtout ne faite pas l'erreur de mettre
127.0.0.1 localhost.localdomain localhost
77.77.77.77 p2pfr.com p2pfr
Sinon apache ne prendra pas en compte la config de votre site avec comme nom de domaine p2pfr.com, il passera directement par la config **default**
===== Log d'apache =====
Tous les logs d'apache se trouvent dans **/var/log/apache2**.
Dans mon cas, j'ai décidé de créer un répertoire par site web afin d'y stocker les logs **access.log** et **error.log**. Et c'est dans ce cas précis qu'il faut faire attention à **logrotate** !!
En effet, la config de logrotate pour apache est la suivante :
/var/log/apache2/*.log {
weekly
missingok
rotate 52
compress
delaycompress
notifempty
create 640 root adm
sharedscripts
postrotate
/etc/init.d/apache2 reload > /dev/null
endscript
}
Logrotate ne gère donc que le répertoire **/var/log/apache2** mais pas ces sous répertoire !\\
Modifiez alors ce fichier en ajoutant le répertoire de destination **/var/log/apache2/*/*.log**.
/var/log/apache2/*.log /var/log/apache2/*/*.log {
weekly
missingok
rotate 52
compress
delaycompress
notifempty
create 640 root adm
sharedscripts
postrotate
/etc/init.d/apache2 reload > /dev/null
endscript
}
Si vous avez des sous-sous répertoire, ajoutez **/var/log/apache2/*/*/*.log** etc...
Pour ceux qui utilise **awstats** ou tout autre script qui doit lire les fichiers de log, pensez à modifier la ligne
create 640 root adm
par
create 644 root adm
==== internal dummy connection ====
--- source: https://blog.nicolargo.com/2011/03/supprimer-les-logs-apache-internal-dummy-connection.html
Si vous avez plein de log apache avec des lignes **internal dummy connection**, créez un fichier de conf avec
# Filters
SetEnvIf Remote_Addr "127\.0\.0\.1" local
SetEnvIf Remote_Addr "\:\:1" local
Ensuite, on doit activer ce filtre le fichier de définition de votre site (sous le répertoire /etc/apache2/site-enabled). Il faut modifier la ligne suivante:
CustomLog /var/log/apache2/www-access.log combined env=!local
Un restart d'apache pour appliquer
===== Lorsque Apache est installé dans un NAT à travers d'un reverse proxy =====
J'ai constaté que lorsque apache est installé dans un LAN et que les connexions HTTP passent par un reverse proxy (ici pound) la variable PHP **$_SERVER[REMOTE_ADDR]** renvoie l'adresse ip du serveur proxy.
La 1ère solution aurait été de recoder le code de vos script php en remplacant **$_SERVER[REMOTE-ADDR]** par **$_SERVER[X_FORWARDED_FOR]** mais ce n'est pas pratique et pas très recommandable.
Il existe donc un module apache nommé **rpaf** ( voir http://stderr.net/apache/rpaf/ ) dispo dans les dépots debian.
Installé le via la commande
aptitude install libapache2-mod-rpaf
Ajoutez un petit de code dans votre config apache **/etc/apache2/httpd.conf**
RPAFenable On
RPAFsethostname On
RPAFproxy_ips 127.0.0.1, xx.xx.xx.xx
Remplacez les xx.xx.xx.xx par l'ip public de votre serveur proxy.
Activez le module et rechargez apache
a2enmod rpaf
service apache2 reload
et voila ;)
===== PHP =====
Les log de php sont par défaut un truc de ouf... Si vous regardé les log error.log d'apache vous trouverez des milliers de ligne de **mod_fcgid: stderr: PHP Notice:** et il convient de modifier php.ini pour éviter toutes ses lignes qui ne servent à rien et qui remplit/fait ramer votre serveur pour rien.
/etc/php5/cgi/php.ini\\
Remplacez ca
error_reporting = E_ALL & ~E_DEPRECATED
par ca
error_reporting = E_ALL & ~E_DEPRECATED & ~E_NOTICE
Ensuite on recharge apache2
service apache2 reload
Quelques préconisations de configuration et sécurité => http://wiki.goldzoneweb.info/configuration_securisation_et_optimisations_de_php
===== ALERT - script tried to increase memory_limit =====
Quand on a Wordpress d'installé, on peut remarqué dans le syslog de nombreuses lignes d'alerte de suhosin
suhosin[20206]: ALERT - script tried to increase memory_limit to 268435456 bytes which is above the allowed value (attacker '82.xxx.xxx.xxx', file '/var/www/xxxxx', line 12)
On édite le fichier de config php qui ici tourne comme un cgi **/etc/php5/cgi/php.ini** on cherche la variable **memory_limit** et on la fixe à 256M
; Maximum amount of memory a script may consume (128MB)
; http://php.net/memory-limit
memory_limit = 256M
===== Les mods d'apache =====
==== expires ====
doc : http://httpd.apache.org/docs/current/fr/mod/mod_expires.html
Il est important de mettre en cache certains fichiers qui ne bougent jamais comme les images, scripts js et fichiers css. Le cache en question est situé côté client et économisera de la bande passante sur le serveur.
ExpiresActive On
ExpiresByType image/gif "access plus 30 days"
ExpiresByType image/jpg "access plus 30 days"
ExpiresByType image/jpeg "access plus 30 days"
ExpiresByType image/png "access plus 30 days"
ExpiresByType image/x-icon "access plus 30 days"
ExpiresByType text/css "access plus 1 days"
ExpiresByType application/x-javascript "access plus 3 days"
===== mod_fcgid: read data timeout in 40 seconds =====
Si vous voyez ça dans vos log, il vous faut rajouter ça dans **/etc/apache2/mods-available/fcgid.conf**
IPCCommTimeout 240
===== Tester les performances =====
Avec **httperf** voir très bon tuto => http://www.synbioz.com/blog/benchmark_avec_httperf
Un outils intégré avec apache, **ab** pour apache benchmark
Pour tester une url avec 2000 requêtes dont 10 en simultanées
ab -c 10 -n 2000 'https://mon_serveur/url_a_bourriner'
Pour envoyer en POST, créer un fichier **post.txt** avec les paramètres urlencodé
email=toto%40toto.fr&variable=1
Utilisez la commande suivante
ab -p post.txt -T 'application/x-www-form-urlencoded' -c 10 -n 2000 'https://mon_server/api/test'
===== Sécurité =====
Pour cacher la version de apache et autre
vi /etc/apache2/conf.d/security
ServerTokens Prod
ServerSignature Off
TraceEnable Off
Pour cacher la version de php, modifiez php.ini et configurer la variable suivante
expose_php = Off
===== apache2-mpm-itk =====
Après quelques années d'expériences avec apache2, nous avons abandonné la version worker au profit de la version prefork. Aujourd'hui nous passons de prefork à itk.
La migration se fait sans douleurs avec un
apt-get install apache2-mpm-itk
Ceci remplace apache2-mpm-prefork et toute la config reste compatible sans problème.
Le mpm itk permet de choisir un uid:gid différent pour chaque virtual-host et ce sans avoir recours aux cgi ou aux modules suexec ou suphp, ce qui est extrêmement pratique dans le cadre d’un hébergement mutualisé ainsi que dans certains cas pratiques.
Coté sécurité, le mpm itk permet d’isoler la configuration de chaque vhost directement dans son fichier de configuration.
Il n'y a plus qu'a créer un utilisateur et de rajouter ces lignes dans vos config
AssignUserId username groupname
Plus d'info :
* http://bibabox.fr/apache2-mpm-itk-utiliser-un-utiliser-un-utilisateur-different-pour-chaque-vhost/
* http://www.it-connect.fr/serveur-web-mutualise-55-des-pistes-de-securisation/
===== En cas de piratage =====
Restaurer une sauvegarde et comparer les répertoires avec **diff**
diff -qr repOK repHACKED
Recopier que les fichiers qui ont changé avec **rsync**
rsync -avP repOK repHACKED
Refaite un diff pour des nouveaux fichiers ne serait pas resté tout seul
Comparer les logs
===== Debian 10 Apache 2.4 php7.3 =====
Sur la dernière debian, apache est par défaut apache mpm event.
Plus question ici d'installer le module apache php. Pour activer php, suivez les commandes
apt install php7.3-fpm
a2enmod proxy_fcgi
a2enconf php7.3-fpm
systemctl restart apache
le module itk n'est plus nécessaire, maintenant on peut gérer les users directement dans la config des pools php
=> doc: https://villalard.net/utiliser-apache-avec-php-fpm
# cd /etc/php/7.3/fpm/pool.d
# ls
www.conf
cp www.conf dev.conf
vi dev.conf
On modifie au minimum
; Start a new pool named 'www'.
; the variable $pool can be used in any directive and will be replaced by the
; pool name ('www' here)
[dev]
; Unix user/group of processes
; Note: The user is mandatory. If the group is not set, the default user's group
; will be used.
user = edmc
group = edmc
; The address on which to accept FastCGI requests.
; Valid syntaxes are:
; 'ip.add.re.ss:port' - to listen on a TCP socket to a specific IPv4 address on
; a specific port;
; '[ip:6:addr:ess]:port' - to listen on a TCP socket to a specific IPv6 address on
; a specific port;
; 'port' - to listen on a TCP socket to all addresses
; (IPv6 and IPv4-mapped) on a specific port;
; '/path/to/unix/socket' - to listen on a unix socket.
; Note: This value is mandatory.
listen = /run/php/dev.sock
ensuite on adapte notre config apache
SetHandler "proxy:unix:/run/php/dev.sock|fcgi://localhost/"
on restart php et apache
systemctl restart php7.3-fpm.service apache2.service
et voila :)
===== htcacheclean =====
Activez les modules
a2enmod mod_cache mod_cache_disk
Dans la config du site, pour un cache de 60 secondes
#LogLevel debug
CacheRoot /var/cache/apache2/mod_cache_disk
CacheDefaultExpire 60
CacheMinExpire 60
CacheMaxExpire 60
CacheEnable disk /
#CacheDetailHeader On
CacheHeader On
CacheIgnoreCacheControl On
CacheIgnoreNoLastMod On
CacheStoreNoStore On
CacheStoreExpired On
#CacheIgnoreHeaders None
#CacheDisable "/index.php"
#UnsetEnv no-cache
Voir les fichiers en cache
htcacheclean -A -p/var/cache/apache2/mod_cache_disk
Si vous avez configuré un autre répertoire que celui par défaut, la purge ne se fera pas, mettez un cron
0 */2 * * * /usr/bin/htcacheclean -n -t -p/home/user/apache2_mod_cache_disk -l100M
Cette exemple purge toutes les 2 heures en vérifiant que la taille globale ne dépasse pas 100Mo, ''-t'' supprimer les répertoires vide (important car il peut vite y'en avoir un paquet), ''-n'' met une priorité basse au processus afin de ne pas bloquer le serveur.