Este relatório de bug parece confirmar sua suspeita inicial:
This is the wrong answer to the question "how do I set ulimits for a daemon process?" /etc/security/limits.d is only processed by pam_limits, which has no reason to be in the path for service startup.
No reinício manual, por outro lado, o nginx está herdando os limites do seu shell.
A solução alternativa: basta chamar ulimit no nitscript do nginx. Você não pode usar ulimit -n
como usuário regular, mas o script de inicialização deve ter privilégios suficientes ao ser executado na inicialização.