Среда развертывания Rails в Windows

Есть ли какой-либо хороший способ развертывания приложения Ruby on Rails, построенного на Ruby 1.9.3 и Rails 3.2.6 с Apache на компьютере под управлением Windows? Я потратил часы на то, чтобы очистить форумы, но все сообщения кажутся слишком старыми, чтобы работать с новейшими версиями Ruby и Rails. Mongrel больше не разрабатывается и постоянно приводит к сбою Rails, тонкость имеет лишь рудиментарную поддержку Windows, и на моем компьютере задержка запуска Ruby "необычно" завершается, Passenger - только Linux... Я немного потерян на данный момент.

Есть ли стабильное, хорошо документированное решение для обслуживания приложений Rails, построенных на новейших фреймворках с Apache в Windows?

UPDATE

Наконец я закончил разработку своего собственного решения. Ознакомьтесь с нижеприведенным руководством для краткого руководства по развертыванию Rails в Windows.

Ответ 1

ОБНОВЛЕНИЕ: Я только что вернулся в компанию, где я развернулся с этим процессом. После того, как 11 месяцев остались без изменений во время использования продукта, среда приложения и сервера все еще функционирует безупречно:)

Хорошо, похоже, я наконец понял это. Обратите внимание, что я развертываю небольшой пул пользователей в интрасети компании, поэтому мое решение может не работать для всех. Я использую отличный Bitnami RubyStack, который содержит интегрированную установку Apache/Rails/MySQL. Оттуда я сделал следующее (работал для Rails 3.2.6 и Ruby 1.9.3):

  • Завершите работу всех серверов Apache и Rails (WEBrick/Thin/Mongrel/Unicorn). Выйдите из своего сайта, если у вас есть какие-либо версии разработки. Очистите кеш браузера.

  • Если вы еще этого не сделали, перенесите свою базу данных в рабочий режим. Из командной строки RubyStack, cd в каталог приложения, запустите bundle exec rake db:migrate db:schema:load RAILS_ENV="production". ПРЕДУПРЕЖДЕНИЕ: db: schema: load удалит все данные в вашей производственной базе данных.

  • Предварительно скопируйте свои активы: bundle exec rake assets:precompile. Обратите внимание, что это может занять очень много времени в зависимости от ваших активов.

  • В вашем httpd.conf (для меня это C:\RubyStack-3.2.5-0\apache2\conf\httpd.conf)

    Убедитесь, что необходимые модули не закомментированы:

    LoadModule expires_module modules/mod_expires.so
    LoadModule headers_module modules/mod_headers.so
    LoadModule proxy_module modules/mod_proxy.so
    LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
    LoadModule proxy_http_module modules/mod_proxy_http.so
    LoadModule rewrite_module modules/mod_rewrite.so
    

    Затем вставьте следующий код в файл: app_name - имя папки вашего приложения Rails и *:82 - любой номер порта, который прослушивает Apache (обозначается командой Listen <port_number>:

    <VirtualHost *:82>
    
      # Your server web or IP address goes here.
      # You can leave at localhost if deploying to
      # company intranet or some such thing.
      ServerName localhost
    
      # Customize the next two lines with your app public directory
      DocumentRoot "C:/RubyStack-3.2.5-0/projects/app_name/public"
      <Directory "C:/RubyStack-3.2.5-0/projects/app_name/public">
        Allow from all
        Options -MultiViews
      </Directory>
    
      RewriteEngine On
    
      # Redirect all non-static requests to Rails server,
      # but serve static assets via Apache
      RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} !-f
      RewriteRule ^/(.*)$ balancer://app_balancers%{REQUEST_URI} [P,QSA,L]
    
      # Serves dynamic rails assets from multiple servers
      # to improve performance. A Rails server such as
      # thin or WEBrick must be running on at least one of
      # these ports in order for Apache to serve your site
      <Proxy balancer://app_balancers>
        BalancerMember http://localhost:3001/
        BalancerMember http://localhost:3002/
      </Proxy>
    
      # Support for far-futures expires header
      <LocationMatch "^/assets/.*$">
        Header unset ETag
        FileETag None
        # RFC says only cache for 1 year
        ExpiresActive On
        ExpiresDefault "access plus 1 year"
      </LocationMatch>
    </VirtualHost>
    
  • Создайте один командный файл Windows (*.bat) для каждого из серверов Rails, которые будут использоваться вашим приложением. Обязательно запускайте их в режиме производства на портах вашего балансира. Например, для вашего первого сервера:

    @echo off
    cd D:\your_app_folder
    rails s -e production -p 3001
    
  • ПРИМЕЧАНИЕ. Следующие несколько шагов необходимы, потому что Rails-серверы должны запускаться как службы или они будут закрыты, если на сервер не войдет пользователь. Это также позволяет автоматически перезапускать при сбое. Однако Windows не может запускать пакетные файлы в качестве сервисов, поэтому мы должны преобразовать их в Windows EXE. Но стандартные Windows EXE не могут использоваться как службы, потому что они не отвечают на методы OnStart и OnStop. Итак, чтобы, наконец, заставить наши серверы работать как службы Windows, мы должны использовать Non-Sucking Service Manager в качестве интерфейса для наших Windows EXE.

  • Загрузите конвертер BAT в EXE (просто Google для одного) и сделайте EXE из своих пакетных файлов. Убедитесь, что у вашего конвертера есть возможность скрыть окна команд при его запуске (этот параметр обычно называется "Видимость" или что-то в этом роде.)

  • Загрузите Диспетчер сервисов без сопровождения (nssm.exe). Поместите его где-то постоянным и добавьте эту папку в свой путь.

  • Запустите командную строку. Тип nssm install <servicename>, где <servicename> - это то, что вы хотите, чтобы ваш сервис вызывался. Вам будет предложено ввести путь к приложению, которое вы хотите запустить как услугу; выберите Windows EXE, созданные на шаге 7, затем нажмите "Установить", оставив опции командной строки пустым.

  • Повторите шаги 6-8 для всех портов вашего балансира, создав другую службу для каждого сервера Rails.

  • Запустите все службы, которые вы только что создали (меню "Пуск" → "Администрирование" → "Службы" ). Сервисы должны запускаться немедленно, но вы должны дать серверам Rails не менее 30 секунд для инициализации.

  • Запустите Apache. Если он не запускается, проверьте, включены ли все необходимые модули (перечисленные в первой части шага 4).

  • Перейдите к localhost:82, заменив номер вашего порта на 82, если вы его настроили. Вы должны видеть, что ваш сайт выглядит точно так же, как и при разработке.

Пожалуйста, дайте мне знать, если это слишком долго, чтобы соответствовать StackOverflow. Я только что потратил немало времени на борьбу с этой проблемой и подумал, что настало время написать последнее руководство по развертыванию Rails в Windows (если оно есть, я еще не видел его). Удачи, дайте мне знать, есть ли у кого-либо проблемы или улучшения для этого!