I’ve been doing a lot more Rails dev recently, and as I wrote about previously, I’ve really been enjoying using puma-dev to do that. I just wanted to add a couple of things to that initial post that may not be initially apparent.
Getting puma to stay idle longer
Out the box, puma-dev will spin down an app after 15 minutes of inactivity. This was a bit short for my tastes so I went asking around for how to extend this. Turns out you can run a simple command …
puma-dev -install -timeout 180m
On OSX this actually updates the plist file that launches puma-dev directly. which brings me to the next point …
Restarting puma-dev manually
On OSX. The puma-dev plist file used by launchd to run puma-dev on startup, seems to be located at /Users/<your username>/Library/LaunchAgents/io.puma.dev.plist
The reason why this is important is that in the puma-dev readme, it says to restart puma-dev by running.
pkill -USR1 puma-dev
However. Lets say, you’ve misconfigured your plist file (like I managed to do), launchd will keep trying to run puma-dev and failing all the while spitting out an error that looks like this in your puma log files every ten seconds
Error listening: accept tcp 0.0.0.0:0: accept: invalid argument
The dead giveaway is entries like this in your system log files located at /private/var/log/system.log
io.puma.dev[1616]): Service exited with abnormal code: 1
Service only ran for 0 seconds. Pushing respawn out by 10 seconds
To stop this just run this command
launchctl unload /Users/<your username>/Library/LaunchAgents/io.puma.dev.plist
This will let you fix up your plist file. Then you can restart it with this command
launchctl load /Users/<your username>/Library/LaunchAgents/io.puma.dev.plist
You can also use this as a way of starting and restarting puma-dev.
Running on a different port
If you have Apache running on port 80 and don’t pass in the right command when installing then puma-dev will fail to launch, and keep failing as described above.
This means you have to run `puma-dev install` with the http-port flag, for example
puma-dev -install -http-port 81
I like this, not for the reason you’d think, but because it allows me access my apps on https://<appname>.dev, while still accessing my php apps with apache on port 80!
Something to note though is that you have to run this command everytime you run `puma-dev install`, or else it will overwrite your settings in your plist file and cause you hours of grief as you try to figure out how you broke all the things amidsts rending of hair and gnashing of teeth
To illustrate … say you have your port set to 81 and you run the command we discussed first
puma-dev -install -timeout 180m
This will reset your port to 80 quietly, and puma-dev will start failing as I described previously. so to avoid that you want to run
puma-dev -install -timeout 180m -http-port 81
instead.
This behavior is subtle enough to cause problems for someone who may have installed puma-dev a while ago and forgotten where everything is and how it all works, so I filed a bug report about it.
Hope this helps someone avoid a stressful afternoon or two!