Tutoriel : configurer le service apache2

1. Noter la version de l’environnement apache2 sous debian
 
root@debian:/# uname -a
Linux debian 3.16.0-4-amd64 #1 SMP Debian 3.16.36-1+deb8u2 (2016-10-19) x86_64 GNU/Linux

root@debian:/# apache2 -v
Server version: Apache/2.4.10 (Debian)
root@debian:/# php5 -v
PHP 5.6.27-0+deb8u1 (cli) (built: Oct 15 2016 15:53:28)
2. Vérifier la racine du serveur apache2

Vérifier la présence du répertoire racine de apache2 : /var/www/html

3. Réglage des droits d’accès à partir de la racine du serveur apache2

Les droits d’accès devront à terme être configurés pour l’utilisateur et le groupe www-data, mais la création de l’environnement s’effectue :

  • soit en mode privilégié (root)
  • soit en mode utilisateur (username) sous réserve d’y avoir temporairement accordé des droits. C’est notre choix personnel, dans la mesure où celà limite l’exposition au danger de travailler en mode root.

La consultation des répertoires reste toujours possible en mode utilisateur (username).

Les droits seront alloués à www-data à la fin de l’installation.

username@debian:~$ cd /var/www/html
username@debian:/var/www/html$ pwd
/var/www/html
4. Créer un sous-répertoire d’accueil pour le serveur wordpress

Un bref passage en mode root pour créer le répertoire d’accueil /var/www/html/base1 et y accorder des droits temporaires vers l’utilisateur username

root@debian:/var/www/html/base1# cd /var/www/html
root@debian:/var/www/html# mkdir prototype3
root@debian:/var/www/html#chown -R username:username base1

Retour au mode utilisateur quand c’est possible, c’est plus prudent

username@debian:/var/www/html$ ls -lt base1 total 0
5. Créer un répertoire archive

Nous choisissons comme répertoire  /home/username/wordpress-ref-install.

Dans ce répertoire, on conservera les fichiers les plus représentatifs de l’installation, ainsi que les archivages qui auront été faits.

username@debian:~$ cd ~
username@debian:~$ mkdir wordpress-ref-install
6. Télécharger la dernière version française de wordpress.org
username@debian:~$ cd /home/username/wordpress-ref-install
username@debian:~/wordpress-ref-install$ pwd
/home/username/wordpress-ref-install
username@debian:~/wordpress-ref-install$ wget https://fr.wordpress.org/wordpress-4.7-fr_FR.zip
--2016-12-19 18:03:43-- https://fr.wordpress.org/wordpress-4.7-fr_FR.zip
Résolution de fr.wordpress.org (fr.wordpress.org)… 66.155.40.249, 66.155.40.250
Connexion à fr.wordpress.org (fr.wordpress.org)|66.155.40.249|:443… connecté.
requête HTTP transmise, en attente de la réponse… 200 OK
Taille : 9216173 (8,8M) [application/zip]
Sauvegarde en : « wordpress-4.7-fr_FR.zip »

wordpress-4.7-fr_FR.zip 100%[================================================================>] 8,79M 5,39MB/s ds 1,6s 

2016-12-19 18:03:46 (5,39 MB/s) — « wordpress-4.7-fr_FR.zip » sauvegardé [9216173/9216173]

username@debian:~/wordpress-ref-install$ ls -lt
total 9004
-rw-r--r-- 1 username username 9216173 déc. 8 13:00 wordpress-4.7-fr_FR.zip
7. Copier le fichier archive wordpress vers le répertoire d’accueil
username@debian:/var/www/html$ cd /var/www/html/base1
username@debian:/var/www/html/base1$ cp /home/username/wordpress-ref-install/wordpress-4.7-fr_FR.zip .
username@debian:/var/www/html/base1$ ls -lt
total 9004
-rw-r--r-- 1 username username 9216173 déc. 19 18:33 wordpress-4.7-fr_FR.zip

8. Décompresser l’archive  wordpress
username@debian:/var/www/html/base1$ unzip wordpress-4.7-fr_FR.zip
Archive: wordpress-4.7-fr_FR.zip
 creating: wordpress/
 inflating: wordpress/wp-mail.php 
 inflating: wordpress/wp-cron.php 
 inflating: wordpress/wp-trackback.php
....
 inflating: wordpress/wp-includes/css/admin-bar-rtl.css 
 inflating: wordpress/wp-includes/class-wp-query.php 
username@debian:/var/www/html/base1$ ls -lt
total 9008
-rw-r--r-- 1 username username 9216173 déc. 19 18:33 wordpress-4.7-fr_FR.zip
drwxr-xr-x 5 username username 4096 déc. 8 12:00 wordpress
username@debian:/var/www/html/base1$ ls -lt wordpress
total 192
-rw-r--r-- 1 username username 9106 déc. 8 12:00 readme.html
-rw-r--r-- 1 username username 3581 déc. 8 12:00 wp-config-sample.php
drwxr-xr-x 5 username username 4096 déc. 8 12:00 wp-content
drwxr-xr-x 9 username username 4096 déc. 8 12:00 wp-admin
drwxr-xr-x 18 username username 12288 déc. 8 12:00 wp-includes
-rw-r--r-- 1 username username 16250 nov. 29 05:39 wp-settings.php
-rw-r--r-- 1 username username 2422 nov. 21 02:46 wp-links-opml.php
-rw-r--r-- 1 username username 33939 nov. 21 02:46 wp-login.php
-rw-r--r-- 1 username username 7841 nov. 21 02:46 wp-mail.php
-rw-r--r-- 1 username username 3301 oct. 25 03:15 wp-load.php
-rw-r--r-- 1 username username 29896 oct. 19 04:47 wp-signup.php
-rw-r--r-- 1 username username 4513 oct. 14 19:39 wp-trackback.php
-rw-r--r-- 1 username username 5447 sept. 27 21:36 wp-activate.php
-rw-r--r-- 1 username username 3065 août 31 16:31 xmlrpc.php
-rw-r--r-- 1 username username 1627 août 29 12:00 wp-comments-post.php
-rw-r--r-- 1 username username 19935 mars 5 2016 license.txt
-rw-r--r-- 1 username username 364 déc. 19 2015 wp-blog-header.php
-rw-r--r-- 1 username username 3286 mai 24 2015 wp-cron.php
-rw-r--r-- 1 username username 418 sept. 25 2013 index.php
username@debian:/var/www/html/base1$
9. Replacer le système de fichiers wordpress sur le  répertoire d’accueil
username@debian:/var/www/html/base1$ cp -R wordpress/* .
username@debian:/var/www/html/base1$ ls -lt
total 9200
drwxr-xr-x 18 username username 12288 déc. 19 18:35 wp-includes
-rw-r--r-- 1 username username 2422 déc. 19 18:35 wp-links-opml.php
-rw-r--r-- 1 username username 3301 déc. 19 18:35 wp-load.php
-rw-r--r-- 1 username username 33939 déc. 19 18:35 wp-login.php
-rw-r--r-- 1 username username 7841 déc. 19 18:35 wp-mail.php
-rw-r--r-- 1 username username 16250 déc. 19 18:35 wp-settings.php
-rw-r--r-- 1 username username 29896 déc. 19 18:35 wp-signup.php
-rw-r--r-- 1 username username 4513 déc. 19 18:35 wp-trackback.php
-rw-r--r-- 1 username username 3065 déc. 19 18:35 xmlrpc.php
drwxr-xr-x 5 username username 4096 déc. 19 18:35 wp-content
-rw-r--r-- 1 username username 3286 déc. 19 18:35 wp-cron.php
-rw-r--r-- 1 username username 364 déc. 19 18:35 wp-blog-header.php
-rw-r--r-- 1 username username 1627 déc. 19 18:35 wp-comments-post.php
-rw-r--r-- 1 username username 3581 déc. 19 18:35 wp-config-sample.php
drwxr-xr-x 9 username username 4096 déc. 19 18:35 wp-admin
-rw-r--r-- 1 username username 418 déc. 19 18:35 index.php
-rw-r--r-- 1 username username 19935 déc. 19 18:35 license.txt
-rw-r--r-- 1 username username 9106 déc. 19 18:35 readme.html
-rw-r--r-- 1 username username 5447 déc. 19 18:35 wp-activate.php
-rw-r--r-- 1 username username 9216173 déc. 19 18:33 wordpress-4.7-fr_FR.zip
drwxr-xr-x 5 username username 4096 déc. 8 12:00 wordpress
10. Supprimer les fichiers temporaires du répertoire d’accueil

Le répertoire relais et le fichier archive au niveau du répertoire d’accueil ne sont plus utiles.

username@debian:/var/www/html/base1$ rm -R wordpress
username@debian:/var/www/html/base1$ rm -R wordpress-4.7-fr_FR.zip
11. Configurer les modules du service apache2

Il s’agit ici de vérifier la liste des modules apache2.

Dans le répertoire d’accueil /etc/apache2/mods-enabled, on doit trouver les modules suivants : alias, php5, rewrite, ssl.

Si besoin activer (en mode root) les modules présents depuis /etc/apache2/mods-available avec la commande a2enmod en mode root.

username@debian:/var/www/html/base1$ ls  /etc/apache2/mods-enabled
alias.conf authz_host.load cgi.load filter.load negotiation.load socache_shmcb.load
alias.load authz_user.load deflate.conf mime.conf php5.conf ssl.conf
auth_basic.load autoindex.conf deflate.load mime.load php5.load ssl.load
authn_core.load autoindex.load dir.conf mpm_prefork.conf rewrite.load status.conf
authn_file.load cgid.conf dir.load mpm_prefork.load setenvif.conf status.load
12. Configurer l’aiguillage des requêtes par le serveur apache2

Notre nom de domaine sur le web est philsite91.ddns.net. Pour plus de détails, on pourra se reporter au guide.

A partir du moment où une requête url arrive sur ma machine serveur, ce sont les fichiers présents au niveau du répertoire  /etc/apache2/sites-enabled qui se chargent d’aiguiller la requête vers un répertoire du système de fichiers local, en se basant sur le nom de domaine et ses suffixes éventuels.

On configurera le répertoire /etc/apache2/sites-enabled pour que des réquêtes utilisant le nom philsite91.ddns.net/base1 puissent être aiguillées vers le répertoire local /var/www/html/base1.

Deux fichiers sont mis en oeuvre, et utilisent le mode VirtualHost
-> 000-default.conf intercepte les requêtes http (port 80)
-> default-ssl.conf intercepte les requêtes https (port 443).

username@debian:/var/www/html/base1$ ls -lt /etc/apache2/sites-enabled
total 44
-rwxr-xr-x 1 root root 4864 déc. 10 16:54 000-default.conf
-rwxr-xr-x 1 root root 14959 déc. 10 12:01 default-ssl.conf.bak

Les directives ServerName et DocumentRoot procèdent à l’aiguillage

On accordera l’autorisation de réécrire les url (mode rewrite) pour le répertoire cible : AllowOverride All

On commence par ajouter une entête au fichier 000-default.conf

<VirtualHost *:80>
 ServerAdmin webmaster@localhost
 ServerName nom-de-domaine/base1
 DocumentRoot /var/www/html/base1
 <Directory /var/www/html>
 Options Indexes FollowSymLinks MultiViews
 AllowOverride All
 Order allow,deny
 allow from all
 </Directory>
 <Directory /var/www/html/base1>
 Options Indexes FollowSymLinks MultiViews
 AllowOverride All
 Order allow,deny
 allow from all
 </Directory>
 <Directory /var/www/html/autres-répertoires>
 Options Indexes FollowSymLinks MultiViews
 AllowOverride None
 Order allow,deny
 deny from all
 </Directory>
</VirtualHost>

Et on complète par l’entête au fichier default-ssl.conf.

On note qu’il est besoin de disposer d’un certificat serveur, ce qui fait l’objet d’un futur guide. Cela permettra de enseigner les trois lignes de déclaration suivantes :

  • chemin d’accès au certificat
  • chemin d’accès à la clé privée
  • chemin d’accès à la chaîne de certificats.
  <VirtualHost _default_:443>
 ServerAdmin webmaster@localhost
 ServerName nom-de-domaine/base1
 DocumentRoot /var/www/html/base1
 <Directory /var/www/html>
 Options Indexes FollowSymLinks MultiViews
 AllowOverride All
 Order allow,deny
 allow from all
 </Directory>
 <Directory /var/www/html/autres-répertoires>
 Options Indexes FollowSymLinks MultiViews
 AllowOverride None
 Order allow,deny
 deny from all
 </Directory>


 # Available loglevels: trace8, ..., trace1, debug, info, notice, warn,
 # error, crit, alert, emerg.
 # It is also possible to configure the loglevel for particular
 # modules, e.g.
 #LogLevel info ssl:warn

 ErrorLog ${APACHE_LOG_DIR}/error.log
 CustomLog ${APACHE_LOG_DIR}/access.log combined

 # For most configuration files from conf-available/, which are
 # enabled or disabled at a global level, it is possible to
 # include a line for only one particular virtual host. For example the
 # following line enables the CGI configuration for this host only
 # after it has been globally disabled with "a2disconf".
 #Include conf-available/serve-cgi-bin.conf

 # SSL Engine Switch:
 # Enable/Disable SSL for this virtual host.
 SSLEngine on

 # A self-signed (snakeoil) certificate can be created by installing
 # the ssl-cert package. See
 # /usr/share/doc/apache2/README.Debian.gz for more info.
 # If both key and certificate are stored in the same file, only the
 # SSLCertificateFile directive is needed.
 SSLCertificateFile /etc/letsencrypt/live/nom-de-domaine/cert.pem
 SSLCertificateKeyFile /etc/letsencrypt/live/nom-de-domaine/privkey.pem

 # Server Certificate Chain:
 # Point SSLCertificateChainFile at a file containing the
 # concatenation of PEM encoded CA certificates which form the
 # certificate chain for the server certificate. Alternatively
 # the referenced file can be the same as SSLCertificateFile
 # when the CA certificates are directly appended to the server
 # certificate for convinience.
 SSLCertificateChainFile /etc/letsencrypt/live/nom-de-domaine/chain.pem

 # Certificate Authority (CA):
 # Set the CA certificate verification path where to find CA
 # certificates for client authentication or alternatively one
 # huge file containing all of them (file must be PEM encoded)
 # Note: Inside SSLCACertificatePath you need hash symlinks
 # to point to the certificate files. Use the provided
 # Makefile to update the hash symlinks after changes.
 #SSLCACertificatePath /etc/ssl/certs/
 #SSLCACertificateFile /etc/apache2/ssl.crt/ca-bundle.crt

 # Certificate Revocation Lists (CRL):
 # Set the CA revocation path where to find CA CRLs for client
 # authentication or alternatively one huge file containing all
 # of them (file must be PEM encoded)
 # Note: Inside SSLCARevocationPath you need hash symlinks
 # to point to the certificate files. Use the provided
 # Makefile to update the hash symlinks after changes.
 #SSLCARevocationPath /etc/apache2/ssl.crl/
 #SSLCARevocationFile /etc/apache2/ssl.crl/ca-bundle.crl

 # Client Authentication (Type):
 # Client certificate verification type and depth. Types are
 # none, optional, require and optional_no_ca. Depth is a
 # number which specifies how deeply to verify the certificate
 # issuer chain before deciding the certificate is not valid.
 #SSLVerifyClient require
 #SSLVerifyDepth 10

 # SSL Engine Options:
 # Set various options for the SSL engine.
 # o FakeBasicAuth:
 # Translate the client X.509 into a Basic Authorisation. This means that
 # the standard Auth/DBMAuth methods can be used for access control. The
 # user name is the `one line' version of the client's X.509 certificate.
 # Note that no password is obtained from the user. Every entry in the user
 # file needs this password: `xxj31ZMTZzkVA'.
 # o ExportCertData:
 # This exports two additional environment variables: SSL_CLIENT_CERT and
 # SSL_SERVER_CERT. These contain the PEM-encoded certificates of the
 # server (always existing) and the client (only existing when client
 # authentication is used). This can be used to import the certificates
 # into CGI scripts.
 # o StdEnvVars:
 # This exports the standard SSL/TLS related `SSL_*' environment variables.
 # Per default this exportation is switched off for performance reasons,
 # because the extraction step is an expensive operation and is usually
 # useless for serving static content. So one usually enables the
 # exportation for CGI and SSI requests only.
 # o OptRenegotiate:
 # This enables optimized SSL connection renegotiation handling when SSL
 # directives are used in per-directory context.
 #SSLOptions +FakeBasicAuth +ExportCertData +StrictRequire
 <FilesMatch "\.(cgi|shtml|phtml|php)$">
 SSLOptions +StdEnvVars
 </FilesMatch>
 <Directory /usr/lib/cgi-bin>
 SSLOptions +StdEnvVars
 </Directory>

 # SSL Protocol Adjustments:
 # The safe and default but still SSL/TLS standard compliant shutdown
 # approach is that mod_ssl sends the close notify alert but doesn't wait for
 # the close notify alert from client. When you need a different shutdown
 # approach you can use one of the following variables:
 # o ssl-unclean-shutdown:
 # This forces an unclean shutdown when the connection is closed, i.e. no
 # SSL close notify alert is send or allowed to received. This violates
 # the SSL/TLS standard but is needed for some brain-dead browsers. Use
 # this when you receive I/O errors because of the standard approach where
 # mod_ssl sends the close notify alert.
 # o ssl-accurate-shutdown:
 # This forces an accurate shutdown when the connection is closed, i.e. a
 # SSL close notify alert is send and mod_ssl waits for the close notify
 # alert of the client. This is 100% SSL/TLS standard compliant, but in
 # practice often causes hanging connections with brain-dead browsers. Use
 # this only for browsers where you know that their SSL implementation
 # works correctly.
 # Notice: Most problems of broken clients are also related to the HTTP
 # keep-alive facility, so you usually additionally want to disable
 # keep-alive for those clients, too. Use variable "nokeepalive" for this.
 # Similarly, one has to force some clients to use HTTP/1.0 to workaround
 # their broken HTTP/1.1 implementation. Use variables "downgrade-1.0" and
 # "force-response-1.0" for this.
 BrowserMatch "MSIE [2-6]" \
 nokeepalive ssl-unclean-shutdown \
 downgrade-1.0 force-response-1.0
 # MSIE 7 and newer should be able to use keepalive
 BrowserMatch "MSIE [17-9]" ssl-unclean-shutdown

 </VirtualHost>
13. Réception des requêtes au niveau du répertoire d’accueil

Au niveau du fichier /etc/apache2/apache2.conf, on déclare la mise en œuvre d’un mécanisme de réception des requêtes au niveau du fichier .htaccess. Il s’agit de vérifier que l’option est activée :

# AccessFileName: The name of the file to look for in each directory
# for additional configuration directives. See also the AllowOverride
# directive.
#
AccessFileName .htaccess

Ensuite, le modèle proposé pour le contenu du fichier .htaccess est issu de wordpress :

username@debian:/var/www/html/base1# cat .htaccess
# BEGIN rlrssslReallySimpleSSL rsssl_version[2.4.1]
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTPS} !=on [NC]
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
</IfModule>
# END rlrssslReallySimpleSSL

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

# END WordPress

Le fichier .htaccess dispose ainsi des directives pour

  • Forcer l’accès au site en mode https
  • Réécrire les requêtes vers un fichier ou un sous-répertoire inconnu pour qu’elles pointent vers la page d’accueil.
14. Configurer la taille maximum des fichiers chargeables sur le site  (mode root)

La taille maximum autorisée pour les chargements est configurable dans /etc/php5/apache2 avec php.ini (taille des uploads).

;;;;;;;;;;;;;;;;
; File Uploads ;
;;;;;;;;;;;;;;;;

; Whether to allow HTTP file uploads.
; http://php.net/file-uploads
file_uploads = On

; Temporary directory for HTTP uploaded files (will use system default if not
; specified).
; http://php.net/upload-tmp-dir
;upload_tmp_dir =

; Maximum allowed size for uploaded files.
; http://php.net/upload-max-filesize
upload_max_filesize = 64M

; Maximum number of files that can be uploaded via a single request
max_file_uploads = 20
15. Configurer les droits de propriété et d’accès aux fichiers (mode root)
root@debian:/var/www/html# cd /var/www/html
root@debian:/var/www/html# chown -R www-data:www-data *
root@debian:/var/www/html# find /var/www/html -type d -exec chmod 755 {} +
root@debian:/var/www/html# find /var/www/html -type f -exec chmod 644 {} +
15. Redémarrer le serveur apache (mode root)
root@debian:/var/www/html/base1# service apache2 restart
root@debian:/var/www/html/base1#