16 марта 2010 г.

Установка Ruby-on-Rails под ISPmanager на FirstVDS (nginx+thin)

Как оказалось, просто включить Ruby-on-Rails в «Возможностях» оказалось недостаточно. Решил сделать всё сам и «с нуля».

Для начала переустановил VDS из VDSmanager'а, выбрав голую FreeBSD.
Затем, подготовив сервер (как описано в статье Установка ISPmanager на чистую FreeBSD), собственно установил ISPmanager. На этапе установки приложений выбрал «Minimal install (web-server only)».

Когда установка завершится, ставим и активируем Nginx через «Возможности».
Затем ставим сами рельсы.
pkg_add -r rubygem-rails

Обновляем список команд:
rehash

Устанавливаем thin:
gem install thin

Устанавливаем mysql:
gem install mysql

Проверяем:
rails -v
ruby -v
thin -v

Настраиваем связку nginx+thin (конфиг подсмотрен здесь). Открываем /usr/local/etc/nginx/nginx.conf и редактируем его следующим образом:
  • 1. В секции http:
    upstream thin {
    server 127.0.0.1:3000;
    server 127.0.0.1:3001;
    server 127.0.0.1:3002;
    server 127.0.0.1:3003;
    }
  • 2. Создаём через ISPmanager сайт (www-домен), заново открываем конфиг nginx
    Редактируем секцию location / нашего сайта:
    location / {
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Real-IP $remote_addr;
    if (-f $request_filename/index.html) {
    rewrite (.*) $1/index.html break;
    }
    if (-f $request_filename.html) {
    rewrite (.*) $1.html break;
    }
    if (!-f $request_filename) {
    proxy_pass http://thin;
    break;
    }

    }

    Ниже ищем перенаправление для статики, зачастую это секция вида
    location ~* ^.+\.(jpg|jpeg|gif|png|svg|js|css|mp3|ogg|mpe?g|avi|zip|gz|bz2?|rar)$ {
    root /home/%username%/data/www/%domain%;
    access_log /home/httpd-logs/%domain%.access.log;
    error_page 404 = @fallback;
    }

    Изменяем её следующим образом:
    location ~* ^.+\.(jpg|jpeg|gif|png|svg|js|css|mp3|ogg|mpe?g|avi|zip|gz|bz2?|rar)$ {
    root /home/%username%/data/www/%domain%/%projectname%/public;
    access_log /home/httpd-logs/%domain%.access.log;
    error_page 404 = @fallback;
    }

    Объясню почему: дело в том, что работа с RoR требует чёткой структуры сайта. Весь публичнодоступный контент должен быть расположен в директории /public, туда мы и направили nginx в поисках статики.

Перезапустите nginx:
/usr/local/etc/rc.d/nginx restart

Создадим наш первый проект на Ruby.
Для этого выберем для него директорию:
cd /home/%username%/data/www/%domain%
где /home/%username%/data/www/%domain% — путь в папку для созданного выше домена, например /home/paveldurov/data/www/vkontakte.ru

Теперь собственно создаём проект:
rails -d mysql %projectname%

Уточню, что если команда rails не работает («not found»), обновите список команд (воспользовавшись rehash) или указывайте полный путь к rails:
/usr/local/bin/rails -d mysql %projectname%

И да, %projectname% выше подразумевает любое название проекта, например — test, а опция -d означает что в качестве БД надо использовать MySQL.

Перейдите в директорию самого проекта (иначе нижеперечисленные команды выполняться не будут):
cd /home/%username%/data/www/%domain%/%projectname%

Запустите thin:
thin start
или просто:
/usr/local/bin/thin start

Чтобы thin работал в фоновом режиме (как т.н. «демон»), используйте опцию -d, например:
thin -d start

Далее, создайте три базы данных.
К примеру, название проекта — testproject, тогда имена БД будут следующими:
  • testproject_test
  • testproject_development
  • testproject_production

Также создайте пользователя MySQL.
Всё это пропишите в файле ./config/database.yml
Затем выполните следующую команду:
rake db:create


Если не создать и не подключить БД, вы будете постоянно сталкиваться с ошибкой
We're sorry, but something went wrong.


Напомню, что вышеперечисленные команды (thin, rake и т.д.) должны выполняться в домашней директории проекта.

Продолжение описания начала работы с ruby (в т.ч. создание первого контроллера) смотрите здесь.

Прочие методы установки Ruby on Rails на FreeBSD и просто интересные статьи:

Комментариев нет: