Dos órdenes que suenan igual y hacen cosas distintas. Casi todos los «funcionaba hasta que reiniciamos» son esto.

  • start: ejecútalo ahora. No dice nada de la próxima vez.
  • enable: ejecútalo al arrancar. No lo arranca ahora.
  • enable --now: las dos cosas, que es lo que usted quería decir casi siempre.
systemctl enable --now nginx
systemctl is-enabled nginx
systemctl is-active nginx

Leer el estado

systemctl status php8.3-fpm
  • active (running): como se esperaba.
  • active (exited): se ejecutó y terminó. Correcto para una tarea de una sola vez, incorrecto para un demonio.
  • failed: se paró y no volvió. El motivo está en el diario.
  • activating (auto-restart): está en bucle de caídas. Volver a reiniciarlo no servirá de nada.

Por qué falló

journalctl -u php8.3-fpm --since "1 hour ago" --no-pager | tail -40

reload, no restart

restart tira todas las conexiones en curso. reload relee la configuración y las conserva. Para un servidor web o una base de datos, haga reload salvo que el cambio necesite de verdad un reinicio, y compruebe antes la configuración: nginx -t.

Una unidad propia

# /etc/systemd/system/queue-worker.service
[Unit]
Description=Queue worker
After=network.target mariadb.service

[Service]
User=www-data
ExecStart=/usr/bin/php8.3 /var/www/site/worker.php
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target
systemctl daemon-reload
systemctl enable --now queue-worker
daemon-reload después de editar cualquier archivo de unidad. Sin eso, systemd sigue ejecutando la definición vieja y su cambio parece no haber hecho nada.