Two commands that sound the same and do different things. Almost every "it was working until we rebooted" is this.

  • start - run it now. Says nothing about next time.
  • enable - run it at boot. Does not start it now.
  • enable --now - both, which is what you almost always meant.
systemctl enable --now nginx\nsystemctl is-enabled nginx\nsystemctl is-active nginx

Reading the state

systemctl status php8.3-fpm
  • active (running) - as expected.
  • active (exited) - it ran and finished. Correct for a one-shot, wrong for a daemon.
  • failed - it stopped and did not come back. The reason is in the journal.
  • activating (auto-restart) - it is crash-looping. Restarting it again will not help.

Why it failed

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

reload, not restart

restart drops every connection in progress. reload re-reads the config and keeps them. For a web server or a database, reload unless the change genuinely needs a restart - and check the config first: nginx -t.

A unit of your own

# /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\nsystemctl enable --now queue-worker
daemon-reload after editing any unit file. Without it systemd is still running the old definition and your change appears to have done nothing.