Ответ 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 (если оно есть, я еще не видел его). Удачи, дайте мне знать, есть ли у кого-либо проблемы или улучшения для этого!