Есть ещё одни вариант — использовать облачные сервисы, который сам умеет хранить, "нарезать" и раздавать картинки.
Я пользовался cloudinary.com, но у меня были небольшие нагрузки. Так что я не могу сказать на сколько эффективно он будет справляться. Если не будет устраивать cloudinary, то, думаю, что найдутся и другие аналоги.
Использовать puma не обязательно. Но можно если хочется.
Если хотите на сервере держать несколько ресурсов, то достаточно настроить рельсовые сервера на разные порты или unix-сокеты.
А в настройках nginx нужно будет прописать несколько секция server. В каждой секции будет свой server_name (доменное имя ресурса) и каждая секция будет проксировать (через секцию proxy_pass) запросы на свой рельсовый сервер (порт или unix-сокет). И нужно не забыть настроить для каждой секции директиву root так что бы она смотрела на public директорию нужного ресурса.