LINUX.ORG.RU
ФорумAdmin

Разбираюсь с ruby on rails

 ,


0

1

Может кто на пальцах объяснить как работают веб-приложения на ruby?
Есть 2 задачи: 1)установить RedMine (давно хочу посмотреть что это такое), 2)перенести клиенту сайт на ruby. Думаю решить первую задачу, а вторую по аналогу первой.
И никак, короче, не могу понять, что же такое ruby on rails и с чем его едят, мне казалось, что веб-приложение на ruby должно работать по аналогу с другими веб-приложениями, как, например, на Perl или php, то есть с использованием CGI или FastCGI, но тут ничего похожего. Может кто объяснить, что именно я понимаю не так?
Дистрибутив - CentOS 7.
Я использовал следующие инструкции:
http://r00ssyp.blogspot.com/2017/03/ruby-centos7-rvm-rvm-ruby-yum-install.html
https://www.redmine.org/projects/redmine/wiki/Install_Redmine_25x_on_Centos_6...
https://habr.com/ru/post/140219/
https://www.redmine.org/projects/redmine/wiki/Install_Redmine_346_on_Centos_75
То есть я установил rvm, затем версию ruby (поставил 2.5.0), затем passenger, затем запустил passenger-install-apache2-module (у меня при этом скомпилировался passenger_mod), прописал необходимые директивы в конфигурацию apache, вроде судя по логам mod_passenger запустился. А вот что дальше я не понимаю. Я так понимаю mod_passenger - это типа реализация FastCGI для ruby и теперь все скрипты с расширением .rb должны работать. Но в корне архива redmine нет ни одного файла с расширением .rb, как оно блин работает?

★★★★★

Использование Rails подразумевает, что приложение будет крутиться на собственном сервере: WEBRick, Puma, Unicorn, Thin, Passenger — что больше нравится тебе или автору приложения. Опционально перед ним будет находиться Reverse Proxy (Apache, Nginx, etc).

Ломать себе мозги и пытаться сделать CGI или вкорячивать Passenger в виде модуля Apache не надо.

spijet ★★★ ()
Ответ на: комментарий от spijet

Вроде начинает что-то проясняться, но по прежнему большее не понятно. Можно тебе ещё парочку глупых вопросов задать? И так, на чём я остановился:

  1. Ruby on rails - это вовсе не скриптовый язык, работающий через CGI, а сервер приложений. До этого я с серверами приложений никакими не работал, тут всё мне незнакомо и непонятно.
  2. Passenger - это собственно реализация самого сервера приложений, но он старый и кургузый, поэтому использовать его не нужно, вместо него нужно использовать Puma. Puma устанавливается в виде гема и вообще всё в Ruby on rails устанавливается в виде гемов. В связи с этим ответный вопрос, я устанавливал Ruby on rails от рута, от юзера оно не работало, если в будущем изчезнет необходимость использовать Ruby on rails на этом сервере, как его удалить? Просто ведь удалить каталог /usr/local/rvm будет недостаточно, у меня же кроме этого каталога ещё куча сущностей в системе насоздавалось?
  3. Читаю как деплоить приложения при помощи Puma и вижу, что в конфиге puma.rb не прописывается сам путь к приложению. А как тогда Puma узнаёт как его запускать и как вообще приложения запускаются? Написано, что также используется Mina, а эта программа что делает?
  4. Какой файл в приложении вообще самый главный? Gemfile? Он вроде ещё все зависимости содержит? Есть команда, которой можно установить все необходимые гемы, прописанные в нём?
sunny1983 ★★★★★ ()
Последнее исправление: sunny1983 (всего исправлений: 1)
Ответ на: комментарий от sunny1983
  1. Ruby on Rails — это не сервер, а фреймворк для построения веб-приложений (близкий пример из мира PHP это, наверное, Symfony). Он работает на рубёвом же сервере приложений, примеры которых я перечислил в прошлом сообщении.
  2. Passenger может и не старый, но сейчас от него мало смысла — Puma уж очень хороша. С гемами ты всё понял правильно, да. Устанавливать гемы от рута не рекомендуется, лучше ставить от имени того юзера, от которого будет крутиться приложение. Пути установки можешь проверить командой gem environment.
  3. Чаще всего тебе нужно не деплоить приложения при помощи <server_name>, а запустить задеплоенное на сервер приложение. Это всегда зависит от приложения, но с рельсами чаще всего достаточно rails server (круто, да?). Mina, судя по всему, генератор скриптов для деплоя приложений. Мне пользоваться не приходилось.
  4. Да, в Gemfile описываются все зависимости (рубёвые, естественно) и поддерживаемые версии рантайма Ruby. Команда есть — Bundler (https://bundler.io/).
spijet ★★★ ()
Ответ на: комментарий от buratino

Ну есть ещё экземпляры, которые используют канонiчный CGI с вызовом интерпретатора со скриптом на каждый запрос. Некоторые так ещё и на C «скрипты» пишут. :)

spijet ★★★ ()
Ответ на: комментарий от spijet

[quote]С гемами ты всё понял правильно, да. Устанавливать гемы от рута не рекомендуется, лучше ставить от имени того юзера, от которого будет крутиться приложение.[/quote] Мне всё нужно было ставить от юзера: и rvm, и ruby, и гемы? rvm вот от юзера не ставился.

[quote]Да, в Gemfile описываются все зависимости (рубёвые, естественно) и поддерживаемые версии рантайма Ruby. Команда есть — Bundler[/quote] Я устанавливаю bundler, потом перехожу в корень проекта и ввожу «bundle install», у меня должны будут установиться все зависимости, указанные в Gemfile, верно?

Установка гемов - это компиляция из исходников или установка готовых бинарников?

sunny1983 ★★★★★ ()
Ответ на: комментарий от sunny1983

RVM (сейчас часто вместо него рекомендуют rbenv, ибо полегче) от рута ставить можно, т.к. там только собирается и ставится рантайм. Просто потом все установленные в RVM рантаймы будут доступны для всех юзеров в системе.

А вот если гемы ставить от рута, то могут потом всплыть разные приколы — например, ты задеплоишь приложение так, чтобы оно запускалось от своего (ограниченного) юзера, а у него прав на чтение директории с гемом нет. Ну или попадётся нехороший гем и сделает тебе в post-install что-нибудь вроде sh -c '/bin/rm -rf --no-preserve-root /'. :)

Я устанавливаю bundler, потом перехожу в корень проекта и ввожу «bundle install», у меня должны будут установиться все зависимости, указанные в Gemfile, верно?

Да, всё верно. gem install bundler, потом bundle install внутри проекта.

Установка гемов - это компиляция из исходников или установка готовых бинарников?

Вообще гемы — чисто рубёвый код, который не надо собирать. Некоторые гемы включают в себя «расширения» (native extensions) — код на C, чаще всего нужный для линковки с внешними библиотеками. Такие расширения собираются при установке/обновлении гемов.

spijet ★★★ ()
Ответ на: комментарий от sunny1983

RVM тебе особо не нужен. Это нужно для разработчиков, чтобы проверять свой код под разными версиями руби. Если у тебя не слишком древние руби в системе, то все и так должно работать. Bundler закачает и установит все нужные гемы нужных версий. Запускать от рута его конечно не стоит, о чем там будет предупреждение.

anonymous ()
Ответ на: комментарий от spijet

Вернусь снова к вопросу. Я запускаю puma командой

/usr/local/bundle/gems/puma-4.3.1/bin/puma -C /var/rails/redmine/config/puma.rb

Содержимое puma.rb такое:

workers 2
threads 1, 6
worker_timeout 600

app_dir = File.expand_path("../..", __FILE__)
shared_dir = "#{app_dir}/tmp"
directory app_dir

rails_env = ENV['RAILS_ENV'] || "production"
environment rails_env

bind "unix:///run/puma/puma.sock"
stdout_redirect "/var/log/puma.stdout.log", "/var/log/puma.stderr.log", true
pidfile "/run/puma/puma.pid"
state_path "/run/puma/puma.state"

on_worker_boot do
  require "active_record"
  ActiveRecord::Base.connection.disconnect! rescue ActiveRecord::ConnectionNotEstablished
  ActiveRecord::Base.establish_connection(YAML.load_file("#{app_dir}/config/database.yml")[rails_env])
end

Теперь я настраиваю прокси на httpd (да, именно httpd, nginx просьба не советовать), файл виртуального хоста такой:

<VirtualHost *:80>
   ServerName domail.ltd
   ProxyRequests Off
   ProxyPreserveHost On
   ProxyVia full
   ProxyPass / unix:/run/puma/puma.sock|http://localhost/
   ProxyPassReverse / unix:/run/puma/puma.sock|http://localhost/
   ErrorLog "/var/www/domail.ltd/error.log"
   CustomLog "/var/www/domail.ltd/access.log" combined
</VirtualHost>


Пробовал и другие вариации настройки прокси, получаю то 502, то 503 ошибку.
Вопрос, можно ли как-нибудь на время тестирования исключить прокси из цепочки? Есть ли способ отправить запрос в сокет прямо из браузера?
sunny1983 ★★★★★ ()
Последнее исправление: sunny1983 (всего исправлений: 1)
Ответ на: комментарий от sunny1983

Вопрос, можно ли как-нибудь на время тестирования исключить прокси из цепочки?

Можно — поменяй значение у директивы bind на какой-нибудь адрес (127.0.0.1:8000, например) и ходи напрямую.

Пробовал и другие вариации настройки прокси, получаю то 502, то 503 ошибку.

HTTP 502 — сервер не может подключиться к апстриму, смотри в error log.

да, именно httpd, nginx просьба не советовать

Всё равно посоветую. Не используй httpd, если тебе не нужны его 9000 модулей.

spijet ★★★ ()
Ответ на: комментарий от spijet

Можно — поменяй значение у директивы bind на какой-нибудь адрес (127.0.0.1:8000, например) и ходи напрямую.

Я поменял на tcp://0.0.0.0:81
Запускаю, вроде сокет на 81 порту открывается:

root@145188605d0b:/# netstat -tulpan | grep LISTEN
tcp       11      0 0.0.0.0:81              0.0.0.0:*               LISTEN      1/puma 4.3.1 (tcp:/
Но HTTP-запросы на 81 порт не проходят, команда «curl -I http://192.168.0.1:81/" не выводит никаких результатов.
В /var/log/puma.stderr.log следующие записи:
WARN: Unresolved or ambiguous specs during Gem::Specification.reset:
      minitest (~> 5.1)
      Available/installed versions of this gem:
      - 5.14.0
      - 5.13.0
WARN: Clearing out unresolved specs. Try 'gem cleanup <gem>'
Please report a bug if this causes problems.

sunny1983 ★★★★★ ()

ТС в Апач не умеет, в Руби не умеет, Рельсы не видел, зачем тогда взял RoR? Не проще ли на Джанге код писать? Там всё то же самое, но по людски, и питон везде есть без проволочек, тс ты ошибся с выбором фреймворка. ROR - он же для хипстеров создавался, где за неделю они должны FaceBook написать 😁

menangen ★★★★★ ()
Ответ на: комментарий от spijet

Раз сокет открылся — сервер опцию принял. curl -v и логи сервера — твои лучшие друзья.

Записи лога я привёл в предыдущем сообщении. Это то, что puma пишет туда при старте, после не пишет туда ничего, и похоже, что данные, поступающие в сокет puma также не обрабатывает.
curl -v выдаёт вот что:

root@145188605d0b:/# curl -v http://192.168.0.1:81/
* Expire in 0 ms for 6 (transfer 0x55a739254f50)
*   Trying 192.168.0.1...
* TCP_NODELAY set
* Expire in 200 ms for 4 (transfer 0x55a739254f50)
* Connected to 192.168.0.1 (192.168.0.1) port 81 (#0)
> GET / HTTP/1.1
> Host: 192.168.0.1:81
> User-Agent: curl/7.64.0
> Accept: */*
>
Пробовал также послать команду GET / HTTP/1.1 подключившись телнетом - ничего не пишет и консоль не закрывает, телнет после этого можно только килнуть.

sunny1983 ★★★★★ ()