Repositories

DotDeb pour PHP7

DotDeb était utile sous Debian Jessie, pour avoir accès à PHP7. PHP7 étant de base dans les repos de Debian Stretch, plus aucun utilité d'utiliser DotDeb. Pour l'instant, donc je laisse tout de même le paragraphe.

wget https://www.dotdeb.org/dotdeb.gpg -O- | apt-key add -
nano /etc/apt/sources.list.d/dotdeb.list

Pour la totalité des packages disponibles chez dotdeb :

deb http://packages.dotdeb.org jessie all
deb-src http://packages.dotdeb.org jessie all

MariaDB officiel pour version 10.2

Via : https://mariadb.com/kb/en/mariadb/installing-mariadb-deb-files/
MariaDB 10.1 est intégré aux repos Debian Stretch par défaut, plus besoin de passer par les repos officielles MariaDB. par contre, si l'on souhaite utiliser la version 10.2 en avance, on peut y revenir :

apt-key adv --recv-keys --keyserver keyserver.ubuntu.com 0xcbcb082a1bb943db
nano /etc/apt/sources.list.d/mariabd.list

Avec l'utilisation du miroir CNRS :

deb [arch=i386,amd64] http://ftp.igh.cnrs.fr/pub/mariadb/repo/10.2/debian stretch main
deb-src http://ftp.igh.cnrs.fr/pub/mariadb/repo/10.2/debian stretch main

On met à jour les sources, et on installe :

apt-get update
apt-get install mariadb-server

mysql_secure_installation fonctionne aussi avec MariaDB.

Installation : Apache

apt-get install apache2

Installation : MariaDB

apt-get install mariadb-client-10.1 mariadb-server-10.1 mariadb-common

Sachant que les aliases suivant marchent encore, mais installent bien MariaDB, pas MySQL :

apt-get install mysql-server mysql-client

On sécurise la base directement :

mysql_secure_installation

Installation : PHP7

Tout plein de packages avec :

apt-get install memcached libapache2-mod-php7.0 php7.0 php7.0-apcu php7.0-bz2 php7.0-cli php7.0-common php7.0-curl php7.0-gd php7.0-geoip php7.0-imagick php7.0-imap php7.0-intl php7.0-json php7.0-mbstring php7.0-mcrypt php7.0-memcached php7.0-mysql php7.0-opcache php7.0-pgsql php7.0-pspell php7.0-readline php7.0-recode php7.0-redis php7.0-snmp php7.0-sqlite3 php7.0-ssh2 php7.0-tidy php7.0-xml php7.0-xmlrpc php7.0-xsl php7.0-zip

Dans le fichier de configuration php.ini qui va bien :

  • expose_php=Off pour masquer la version de PHP dans les headers.

Pour Debian Stretch, on passera par :

Pour Alpine Linux 3.7 (fourni de base avec PHP 7.1 déjà), l'on a aussi le choix pour passer à PHP 7.2 :

Apache : Customisation

On ajoute une ligne au fichier de configuration d'Apache :

nano /etc/apache2/apache2.conf
Include custom.conf

On édite ensuite notre fichier de configuration custom.conf :

nano /etc/apache2/custom.conf
ServerTokens Prod
ServerSignature Off
HostnameLookups Off
TraceEnable Off #Si pas déjà mis en place dans /etc/apache2/conf-enabled/security.conf

Apache : Modules

Lister les modules actifs :

apachectl -M

Activer un module : a2enmod <module>
Désactiver un module : a2dismod <module>

a2enmod cache expires headers rewrite setenvif ssl proxy_fcgi

mod_limitipconn : limiter les connexions avec

On se rend sur http://dominia.org/djao/limitipconn2.html et on télécharge la dernière version :

wget http://dominia.org/djao/limit/mod_limitipconn-0.24.tar.bz2

On installe les prérequis pour la build :

apt-get install build-essential apache2-dev

On extrait le package téléchargé, on se rend dans le bon dossier :

tar xavf mod_limitipconn-0.24.tar.bz2
cd mod_limitipconn-0.24

On édite le Makefile pour changer la ligne APXS=apxs en APXS=apxs2 :

sed -i 's/APXS=apxs/APXS=apxs2/' Makefile

Enfin on compile :

make install

Fichier de chargement du module :

nano /etc/apache2/mods-available/limitipconn.load

On vérifie qu'il contient bien comme première ligne ExtendedStatus On sinon on l'ajoute :

ExtendedStatus On
LoadModule limitipconn_module /usr/lib/apache2/modules/mod_limitipconn.so

Fichier de configuration du module (Doc du module : http://dominia.org/djao/limitipconn2-README) :

nano /etc/apache2/mods-available/limitipconn.conf

Exemple :

<IfModule mod_status.c>
  ExtendedStatus On
  <IfModule mod_limitipconn.c>
            <Location /files>
                MaxConnPerIP 2
            </Location>

            NoIPLimit images/*

            OnlyIPLimit audio/mpeg video

            ErrorDocument 503 "2 files limit, thanks."
    </IfModule>
</IfModule>

et finalement on active le module (dépend du module status, on active aussi donc) :

a2enmod limitipconn status

mod_proxy

mod_proxy : Documentation

mod_pagespeed

mod_pagespeed : Documentation
Installation :

wget https://dl-ssl.google.com/dl/linux/direct/mod-pagespeed-stable_current_amd64.deb
dpkg -i mod-pagespeed-stable_current_amd64.deb
apt-get -f install
service apache2 restart

mod_status

mod_status, pour suivre la charge et les statistiques d'Apache.
Plus d'informations ici sur l'installation et la documentation.

mod_expires

nano /etc/apache2/custom.conf
[...]
<IfModule expires_module>
    ExpiresActive On
    ExpiresByType image/jpg "access plus 1 month"
    ExpiresByType image/jpeg "access plus 1 month"
    ExpiresByType image/gif "access plus 1 month"
    ExpiresByType image/png "access plus 1 month"
    ExpiresByType text/css "access plus 1 month"
    ExpiresByType application/pdf "access plus 1 month"
    ExpiresByType text/x-javascript "access plus 1 month"
    ExpiresByType image/x-icon "access plus 1 month"
    ExpiresDefault "access plus 2 days"
</IfModule>

mod_headers

nano /etc/apache2/custom.conf
[...]
<IfModule headers_module>
    Header always set Content-Security-Policy "default-src https: data: 'unsafe-inline' 'unsafe-eval'"
    Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"
    Header always set Referrer-Policy "unsafe-url"
    Header always set X-Content-Type-Options "nosniff"
    Header always set X-Download-Options noopen; 
    Header always set X-Frame-Options "SAMEORIGIN"
    Header always set X-Permitted-Cross-Domain-Policies none
    Header always set X-Robots-Tag "index,follow,noarchive"
    Header always set X-Xss-Protection "1; mode=block"
    #Ajout cookies en secure
    Header set Set-Cookie HttpOnly;Secure
    #Si on veut supprimer la mention à Apache
    Header unset X-Powered-By
</IfModule>

Apache : mod event MPM et PHP-FPM

On installe les paquets dont on a besoin :

#apache2-mpm-event plus dispo
apt-get install php7.0-fpm

On nettoie Apache de ses modules inutiles :

a2dismod mpm_prefork php7.0

On désinstalle le module PHP :

apt-get purge libapache2-mod-php7.0

On active le mode event :

a2enmod mpm_event

Pour que PHP soit pris en compte, le module Apache proxy_fcgi doit être activé, si pas déjà activé plus haut :

a2enmod proxy_fcgi

On relance Apache :

service apache2 restart

On vérifie que le fichier de configuration PHP-FPM existe bien :

nano /etc/apache2/conf-available/php7.0-fpm.conf
# Redirect to local php-fpm if mod_php is not available
<IfModule !mod_php7.c>
<IfModule proxy_fcgi_module>
    # Enable http authorization headers
    <IfModule setenvif_module>
    SetEnvIfNoCase ^Authorization$ "(.+)" HTTP_AUTHORIZATION=$1
    </IfModule>

    <FilesMatch ".+\.ph(p[3457]?|t|tml)$">
        SetHandler "proxy:unix:/run/php/php7.0-fpm.sock|fcgi://localhost"
    </FilesMatch>
    <FilesMatch ".+\.phps$">
        # Deny access to raw php sources by default
        # To re-enable it's recommended to enable access to the files
        # only in specific virtual host or directory
        Require all denied
    </FilesMatch>
    # Deny access to files without filename (e.g. '.php')
    <FilesMatch "^\.ph(p[3457]?|t|tml|ps)$">
        Require all denied
    </FilesMatch>
</IfModule>
</IfModule>

Si tout ok, on la valide :

a2enconf php7.0-fpm

On relance Apache (encore) :

service apache2 restart

Apache : SSL

Voir : Let's Encrypt & Certbot pour les configurations des vhosts.
Pour la configuration globale, ajouter :

nano /etc/apache2/custom.conf
[...]
    # Mozilla : OCSP Stapling, only in httpd 2.3.3 and later
    SSLUseStapling on
    SSLStaplingResponderTimeout 5
    SSLStaplingReturnResponderErrors off
    SSLStaplingCache shmcb:/var/run/ocsp(128000)

Include ssl.conf dans les vhost demandant SSL :

nano /etc/apache2/ssl.conf
# Adaptation de l'ancienne config auto fournie par Let's Encrypt
SSLEngine on

SSLProtocol             all -SSLv2 -SSLv3
SSLCipherSuite          EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH
SSLHonorCipherOrder     on
SSLCompression          off

SSLProxyEngine On
SSLVerifyClient none

SSLOptions +StrictRequire

#Header edit Set-Cookie (?i)^(.*)(;\s*secure)??((\s*;)?(.*)) "$1; Secure$3$4"
#SSLDHParametersFile "/etc/ssl/private/dhparams.pem"

Et la redirection http vers https dans les vhosts, ici à l'aide du mod rewrite :

RewriteEngine on
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [L,QSA,R=permanent]

Ou bien simplement avec une redirection 301 permanente :

Redirect permanent / https://example.com/

Apache : HTTP2

apt-get install openssl libssl-dev

Pour vérifier la disponibilité, la commande apachectl -v doit renvoyer une version supérieure à 2.4.17.

On va enfin activer http2 sur nos sites, via les VirtualHost :

<VirtualHost *:443>
    Protocols h2 http/1.1
    [...]
</VirtualHost>

On active le mod :

a2enmod http2

Enfin, on relance apache :

service apache2 restart

Et on va tester son site sur https://tools.keycdn.com/http2-test par exemple.

Apache : Custom errors

Dans un fichier de vhost, définir l'autorisation au minimum à AllowOverride FileInfo, ou AllowOverride All pour tout autoriser par les fichiers .htaccess.
On édite ensuite le .htaccess voulu, et on lui ajoute une ligne :

ErrorDocument ErrorCode Action

Par exemple :

ErrorDocument 404 /errors/404.html

Apache : Reverse Proxy simple

A défaut d'utiliser Apache comme reverse proxy, on peut passer par :

On active le mod, et on redémarra Apache :

a2enmod proxy_http
service apache2 restart

On édite le fichier du vhost qui va avoir le rôle de proxy :

nano /etc/apache2/sites-available/proxy
<VirtualHost *:443>
    # Pour relayer du https self-signed
    RequestHeader set X-Forwarded-Proto "https" early
    SSLProxyEngine on
    SSLProxyVerify none
    SSLProxyCheckPeerCN off
    SSLProxyCheckPeerName off
    SSLProxyCheckPeerExpire off

    ProxyPreserveHost On
    ProxyRequests off
    # Exemple pour un serveur Proxmox, sur port 8006
    ProxyPass / https://37.65.17.232:8006/ Keepalive=On
    ProxyPassReverse / https://37.65.17.232:8006/ Keepalive=On

    ServerName my.domain.tld
    [...]
</VirtualHost>

Enfin, on active le site et on relance Apache :

a2ensite proxy
service apache2 reload

Bonus : petit load-balancing

Fichier vhost :

<Proxy balancer://mycluster>
    # Serveur 1
    BalancerMember http://10.0.1.10:8080/

    # Serveur 2
    BalancerMember http://10.0.1.11:8080/
</Proxy>

<VirtualHost *:*>
    # Appel vers le cluster de serveurs créé plus haut
    ProxyPass / balancer://mycluster
</VirtualHost>

Apache : Custom index avec h5ai

Site officiel : https://larsjung.de/h5ai/
On se place dans le dossier racine du vhost voulu :

cd /var/www/my.domain.tld/

On télécharge la dernière version en date :

wget https://release.larsjung.de/h5ai/h5ai-0.29.0.zip

On décompresse le tout :

# installation de zip/unzip au besoin
apt-get install zip unzip
unzip h5ai-0.29.0.zip
# et on supprime l'archive devenue inutile :
rm h5ai-0.29.0.zip

On met en place la possession des fichiers si installé avec un autre utilisateur que celui qui gère Apache :

chown -R www-data:www-data /var/www/my.domain.tld/_h5ai/

On teste dans un navigateur que tout est ok avec l'url my.domain.tld/_h5ai/public/index.php, on change le password par défaut comme indiqué.
Pour définir h5ai comme index par défaut, on ajoute la ligne suivante au fichier /etc/apache2/custom.conf :

DirectoryIndex  index.html  index.php  /_h5ai/public/index.php

Doit écraser l'attribut DirectoryIndex déjà déclaré, soit dans apache2.conf ou bien /etc/apache2/mods-available/dir.conf

Fichiers de configuration

Configuration PHP php.ini :

nano /etc/php/7.0/fpm/php.ini
[...]

PHP-FPM pool config :

nano /etc/php/7.0/fpm/pool.d/www.conf
[...]

MariaDB : Voir : Les options MySQL/MariaDB

nano /etc/mysql/my.cnf
[mysqld]
# Prérequis Nextcloud, si besoin
binlog-format=mixed
[...]
max_allowed_packet = 64M
[...]
table_open_cache = 2000
table_definition_cache =  2000

Fichier custom.conf final pour Apache :

ServerTokens Prod
ServerSignature Off
HostnameLookups Off
TraceEnable Off

ServerName my.domain.tld

<IfModule headers_module>
    Header always set Content-Security-Policy "default-src https: data: 'unsafe-inline' 'unsafe-eval'"
    Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"
    Header always set Referrer-Policy "unsafe-url"
    Header always set X-Content-Type-Options "nosniff"
    Header always set X-Download-Options noopen;
    Header always set X-Frame-Options "SAMEORIGIN"
    Header always set X-Permitted-Cross-Domain-Policies none
    Header always set X-Robots-Tag "index,follow,noarchive"
    Header always set X-Xss-Protection "1; mode=block"
    #Ajout cookies en secure
    Header set Set-Cookie HttpOnly;Secure
    #Si on veut supprimer la mention à Apache
    Header unset X-Powered-By
</IfModule>

# Mozilla : OCSP Stapling, only in httpd 2.3.3 and later
SSLUseStapling on
SSLStaplingResponderTimeout 5
SSLStaplingReturnResponderErrors off
SSLStaplingCache shmcb:/var/run/ocsp(128000)

Connaître le fichier de configuration utilisé par PHP

Avec PHP :

php -i | grep "Loaded Configuration File"

Avec PHP-FPM(7) :

php-fpm(7) -i | grep "Loaded Configuration File"

Documentation supplémentaire

Aller plus loin avec Apache et Nginx

  • system/linux/debian/5-lamp.txt
  • Dernière modification: 2023/08/05 16:22
  • (modification externe)