I have my proof-of-concept working for the web infrastructure - no need for a Unicorn/Puma-like app, no need for monit, no need to daemonize - just systemd to manage N Racket processes, and nginx in front to reverse proxy to the Racket workers.
[Unit]
Description=Racket hello world %i
[Service]
WorkingDirectory=/home/deploy/appname/current/
ExecStart=/usr/local/bin/racket /home/deploy/appname/current/hello.rkt %i
Restart=always
[Install]
WantedBy=multi-user.target
Enable 2 workers: sudo systemctl enable hello@{1..2}
Start them: sudo systemctl start hello\@{1..2}
Check status: sudo systemctl status hello\@{1..2}
They auto start at boot time, and they auto restart if killed or they crash.
I hacked up a quick test using a command line argument to specify the port and log file (I know there are more elegant solutions, but I was in a hurry to verify it). It's possible that using a single log file for all the workers will "just work", but I wasn't sure, so I use one log file per process for now. I suppose there are pros/cons to each approach.
(module+ main
(define instance-id (string->number (vector-ref (current-command-line-arguments) 0)))
(define port (+ 8000 instance-id))
(serve/servlet
dispatcher
#:log-file (format "hello~a.log" instance-id)
#:stateless? #t
#:port port