Как Rails обслуживает статический контент из публики?

Сколько рубинового кода связано с обслуживанием статического контента вне публичного? Проходит ли он через приложение rails? Использует ли она Rack:: Static?

Ответы

Ответ 1

Rails не использует Rack::Static, у него есть своя версия ActionDispatch::Static. Вы должны увидеть его, если вы запустите rake middleware.

Это добавляется к стеку промежуточного программного обеспечения Rails если config.serve_static_assets истинно. Этот параметр по умолчанию соответствует true, но созданный по умолчанию config/environments/production.rb отключается, если отключен.

Идея заключается в том, что во время разработки у вас есть простой единый процесс, который вы можете запустить и проверить, что все работает, и где производительность не является проблемой, но при развертывании в производство вы настраиваете свой веб-сервер (обычно Apache или Nginx) на обслуживать статические файлы, так как он намного лучше, чем Ruby.

Если вы используете Heroku, их последний стек Cedar не использует отдельный веб-сервер для статических файлов, поэтому как часть процесса развертывания они вводят Плагин Rails для обслуживания статических активов. Весь этот плагин установлен serve_static_assets на true.

Ответ 2

Это зависит. Если вы используете что-то вроде phusion пассажира для запуска вашего приложения, его поведение по умолчанию - использовать Apache напрямую и пропускать рельсы для любого статического контента. Если вы используете сервер webrick (rails), он будет использовать намного больше рельсов/кода стойки для выполнения статической службы.

Обратите внимание, что если вы используете apache/nginx с пассажиром: в режиме производства, поскольку по умолчанию предполагается, что apache обслуживает весь статический контент, вам нужно будет запустить rake assets:precompile в приложении до запуска его в apache или статический контент не попадает туда, где нужно, чтобы apache быстро его и в готовой форме.