Le système de gestion des limites a évolué et utiliser /etc/security/limits.conf n’est plus valide sur ubuntu 16 car le système de gestion de service est maintenant basé sur systemd.
Le plus frustrant c’est qu’à première vue rien a changé : dans /etc/init.d/ on retrouve nos scripts de lancement classique mais effectivement on observe un if systemd qui peux mettre la puce à l’oreille. En effet, l’installateur de paquet a fait son travail et a mis en place les fichiers de service compatible avec systemd. Il faut donc aller voir du côté de /etc/systemd/system/multi-user.target.wants pour trouver nos services fpm et nginx.
# ll /etc/systemd/system/multi-user.target.wants total 8 drwxr-xr-x 2 root root 4096 Jan 29 17:27 ./ drwxr-xr-x 13 root root 4096 Jun 13 2017 ../ [...] lrwxrwxrwx 1 root root 33 Jun 15 2016 nginx.service -> /lib/systemd/system/nginx.service lrwxrwxrwx 1 root root 38 Nov 29 2016 php7.0-fpm.service -> /lib/systemd/system/php7.0-fpm.service [...]
Ensuite c’est assez simple, il suffit d’ajouter la limitation de fichiers dans le service nginx ou fpm:
LimitNOFILE=30000
Voici le service complet pour php7.0-fpm:
[Unit] Description=The PHP 7.0 FastCGI Process Manager After=network.target [Service] Type=notify PIDFile=/run/php/php7.0-fpm.pid ExecStartPre=/usr/lib/php/php7.0-fpm-checkconf ExecStart=/usr/sbin/php-fpm7.0 --nodaemonize --fpm-config /etc/php/7.0/fpm/php-fpm.conf ExecReload=/usr/lib/php/php7.0-fpm-checkconf ExecReload=/bin/kill -USR2 $MAINPID LimitNOFILE=30000 [Install] WantedBy=multi-user.target
idem pour la limitation dans une session ssh. Le /etc/security/limits.conf n’a pas d’effet, j’ai donc forcé la limitation en ajoutant directement un ulimit dans le /etc/bash.bashrc :
ulimit -n 30000
Attention ceci s’appliquera à tous les utilisateurs, assurez-vous que c’est acceptable dans votre cas d’utilisation.