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, как оно блин работает?

★★★★★

Пассажир

знает где *.rb искать. Весь редмин в папке app, lib, config. Забей.

libert0
()
Ответ на: комментарий от oster2011

ТС

файлы руби ищет. а ты ему про nginx и пуму рассказываешь

libert0
()
Ответ на: комментарий от oster2011

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

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

А ты не пробовал загуглить rails deploy? Вроде 5 звезд, не школьник уже.

anonymous
()

Установка редмина, это великая тайна которая не освещена в интернете/документации?

anonymous
()

Использование 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 ★★★
()

что веб-приложение на ruby должно работать по аналогу с другими веб-приложениями, как, например, на Perl или php,

по-моему, все веб приложения, кроме пыха, работают именно так, как rails

buratino ★★★★★
()
Ответ на: комментарий от 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
()

Дистрибутив - CentOS 7

Извини, не досмотрел. Тогда придется ставить таки rvm или rbenv и возможно попрыгать с бубном. Вот инструкция

anonymous
()
11 апреля 2020 г.
Ответ на: комментарий от 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 ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.