Archive for the ‘ Sysadmin ’ Category

Nginx, VirtualHosts SSL & IPv6

Serveur HTTP haute performance et reverse proxy multi-usage, Nginx a été écrit par Igor Sysoev pour les besoins de rambler.ru. Après s’être essayé au développement de modules Apache (voir la section russe de son site), le gars Igor a sorti cet OVNI, redoutable dans la mise à disposition de fichiers statiques, entre autres (le module de streaming déchire pas mal également).

Il faut savoir qu’un Kazakh émigré à Moscou, quand il n’a plus de vodka et qu’il a sucé tous les rinces doigts, il passe à l’antigel. Pas la collection 2012 de chez Lise Charmel hein, mais bien le dégivrant utilisé sur l’aéroport de la capitale russe. Cela se ressent  de temps à autre sur la documentation du projet. Ou alors peut-être devrais-je arrêter le Picon…

Pas mal cet ensemble en tulle multibrins non ?

La majorité des visiteurs masculins étant partis mater des photos de nénettes en deux pièces, continuons avec les assidus et ceux qui sont déjà revenus, apprenant que “tulle” était masculin.  Quoi qu’il en soit, je me suis emmêlé les pinceaux dans les directives pour disposer d’un daemon fonctionnel, servant des name-based virtualhosts, SSL ou non, IPv6 ou non. J’ai fini par repartir à zéro, après m’être tapé des message d’erreurs comme:

nginx: [emerg] bind() to [::]:80 failed (98: Address already in use)
nginx: [emerg] bind() to [::]:443 failed (98: Address already in use)

ou encore

nginx: [emerg] duplicate listen options for [::]:80 in ...
nginx: [emerg] duplicate listen options for [::]:443 in  ...

Une précision tout de même: je pars du principe que l’OS sous-jacent est un GNU/Linux, que le kernel a été paramétré afin que les sockets AF_INET6 écoutent en v4 et V6 (voir section 3.7 du RFC3493). Grossièrement un coup de sysctl pour mettre net.ipv6.bindv6only à 0 (man 7 ipv6).

On a tous notre petit bloc server qui s’occupe de tout ce qui n’est pas prévu par les virtualhosts. Et bien il suffit de se servir des paramètres ipv6only et default_server de la directive listen comme suit:

server {
    listen 80 default_server;
    listen [::]:80 ipv6only=on default_server;
    server_name blah.domain.tld;
  ...
}

Nginx écoute maintenant sur le port 80, en IPv4 et en IPv6. La même chose pour le SSL:

server {
    listen 443 ssl default_server;
    listen [::]:443 ipv6only=on ssl default_server;
    server_name blah.domain.tld;
  ...
}

Et ça roule pour le port 443. Il n’est absolument pas obligatoire de disposer de deux blocs distincts, le tout pouvant parfaitement être regroupé:

server {
    listen 80 default_server;
    listen 443 ssl default_server;
    listen [::]:80 default_server;
    listen [::]:443 ipv6only=on ssl default_server;
    server_name blah.domain.tld;
  ...
}

Les name-based virtualhosts seront plus simplement configurés, sans fioritures:

server {
    listen 80;
    listen [::]:80;
    server_name vh1.domain.tld;
  ...
}
server {
    listen 443 ssl;
    listen [::]:443 ssl;
    server_name vh1.domain.tld;
  ...
}

ou en un seul bloc:

server {
    listen 80;
    listen 443 ssl;
    listen [::]:80;
    listen [::]:443 ssl;
    server_name vh2.domain.tld;
  ...
}

Les virtualhosts ci-dessus sont donc accessibles en IPv6 et v4, sur les ports 80 et 443, SSL activé sur ce dernier.

RTFM !

Au final, rien d’impressionnant: une fois la documentation des paramètres ipv6only et default_server potassée, ça va mieux. Au final, elle est plutôt bien foutue cette doc !

Maudit Picon.