Astuces pour httpd

man

Je ne peux m'empêcher de vous inciter à lire le man httpd.conf.

On y trouve tout ce qui est écrit ici, et plus encore.

Journaux

Vous pouvez choisir un fichier spécifique où seront enregistrés les logs dans la section de chaque site. Ils sont par défaut enregistrés dans le dossier "/var/www/logs".

log access "nom_du_site.log"

Pour désactiver les logs, écrivez "no log".

Compression gzip

Ajoutez l'instruction "gzip-static" dans la configuration d'un domaine ou dans une section "location". Ainsi, lorsqu'un visiteur demande à afficher un fichier, httpd tentera de lui délivrer un éventuel fichier du même nom avec l'extension ".gz" en plus s'il existe.

Cela peut diminuer drastiquement la bande passante nécessaire, de 2 à 10 fois. Privilégiez de compresser les fichiers texte (html, css, js, svg...).

Pour gzipper un fichier :

$ gzip -vk9 index.html
index.html:                49.5% -- replaced with index.html.gz
1395 bytes in, 733 bytes out

Page d'erreur personnalisée

Vous pouvez préciser avec l'instruction "errdocs" le dossier du chroot dans lequel sont stockées des pages d'erreurs personnalisées.

Il peut s'agit d'une page nommée "err.html" ou bien de pages dont le nom correspond au code d'erreur, par exemple "404.html".

Cela donne :

errdocs "/htdocs/chezmoi.tld/err"

Le dossier /var/www/htdocs/chezmoi.tld/err" contient alors le fichier "err.html" suivant :

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="icon" href="/favicon.png" type="image/png" />
<style type="text/css">body, html {height:100%; margin:0}
#bg {
	position: relative;
	background-position: center;
	background-repeat: no-repeat;
	background-size: cover;
	background-image: url("/img/errimg.jpg");
	height: 100%;
	padding:0;
	margin:0;
}
#content {
	padding:1.5em;
}
</style>
<title>
$RESPONSE_CODE : $HTTP_ERROR
</title>
</head>
<body>
<div id="bg">
	<div id="content">
		<h1>Error page 😖</h1>
		<p>Sorry!</p>
	</div>
</div>
</body>
</html>

Améliorer la disponibilité

Afin d'augmenter le nombre de processus par défaut, et donc pouvoir servir simultanément du contenu à plusieurs clients, augmentez la valeur par défaut qui est de 3 :

prefork 10

Publier en utf-8

Si vous essayez d'afficher un fichier texte brut, il est possible que le navigateur affiche mal les caractères accentués, à moins que vous sélectionniez l'encodage utf-8 dans les paramètres.

Pour éviter aux lecteur d'avoir à chercher ce paramètre, vous pouvez explicitement indiquer que le contenu est diffusé en utf-8 en modifiant le "httpd.conf" dans la section "types". Ça suppose d'échapper le point-virgule, donc autant avoir un exemple pour les fichiers d'extension ".gmi" et ".txt" :

types {
        text/"plain;charset=UTF-8" gmi
        text/"plain;charset=UTF-8" txt
}

Accès restreint par mot de passe

Pour protéger l'accès à un site ou une partie du site par un mot de passe, utilisez la commande "htpasswd" pour créer un fichier d'accès :

# htpasswd /var/www/secret.htpw login

Remplacez login par le nom d'utilisateur que vous souhaiterez utiliser, puis définissez un mot de passe solide. Recommencez à chaque fois que vous voulez ajouter un nouvel utilisateur.

Modifiez les permissions sur ce fichier :

# chown www /var/www/secret.htpw
# chmod 400 /var/www/secret.htpw

Enfin, dans la configuration de httpd, pour protéger l'accès au sous-dossier "/dossier_protege/*" :

location "/dossier_protege/*" {
    authenticate "Acces restreint" with "/secret.htpw"
}

Remarquez que l'emplacement du fichier secret.htpw est relatif au chroot de httpd, on fait comme si "/var/www" était "/".

Pour protéger un site complet, indiquez :

location "/*"

Ou alors, mettez l'instruction "authenticate" au tout début de la configuration sans jamais préciser de "location".

Index des fichiers

Afin de lister automatiquement dans le navigateur les fichiers présents dans un dossier si aucun fichier "index.html" n'est présent, ajoutez dans le fichier "/etc/httpd.conf" :

location "/dossier/*" {
    directory auto index
}

Inclusions de fichiers de configuration

Si vous avez plusieurs sites, ça peut vite être le bazar de tout configurer dans le fichier /etc/httpd.conf. Il vous est possible de découper la configuration dans plusieurs fichiers avec l'instruction include :

include "/etc/httpd/site1.conf"
include "/etc/httpd/site2.conf"

TLS

Pour accélérer les futures négociations TLS si vous servez votre site en https, vous pouvez ajouter un "ticket de session" :

hsts preload
tls {
  certificate "/etc/ssl/chezmoi.tld.crt"
  key "/etc/ssl/private/chezmoi.tld.key"
  ticket lifetime default
}