Sobre o tópico específico de usar exec em php e como ser seguro, a única coisa que você precisa cuidar é escapar dos argumentos.
i.e. não faça isso:
exec('myscript ' . $_POST['arg']);
se não for óbvio - pense no que acontece se $_POST['arg']
contiver ; rm xyz
- ou pior, se você enviar a saída desse comando para a tela e contiver ; more /etc/passwd; more db-config.php
etc.
portanto - escape dos seus argumentos :
$foo = escapeshellarg($whatever);
exec("myscript $foo");
No entanto, se o seu script exigir mais privilégios do que você normalmente permitiria que o seu usuário nginx tivesse - é melhor dar atenção ao conselho que você encontrou que desassocia o usuário que está executando o script bash do usuário nginx.
Semelhante à sua sugestão do daemon do php na questão, o aplicativo php envia uma solicitação para o script bash ser executado, de forma síncrona ou assíncrona, usando um job fila do sistema. A fila de tarefas apenas envia a solicitação ao seu script bash, opcionalmente retornando o resultado. Desta forma, você pode iniciar o script bash "create new user" como um usuário com permissões apropriadas, sem dar ao seu usuário nginx quaisquer privilégios extras e arriscando que essas permissões sejam exploradas em algum outro lugar se o código do seu aplicativo php. Gearman em particular, é muito fácil de configurar.