Estou executando um aplicativo php em um servidor Apache. No aplicativo php, preciso executar um script Ruby na linha de comando. Verifiquei que executar o script diretamente de um terminal como user
funciona corretamente. O ambiente Ruby local user
é configurado definindo uma variável de caminho e fonte /home/user/.rvm/scripts/rvm
que permite ao script carregar os requisitos com require
instruções.
Agora, através do aplicativo php, o script falha nessas instruções require e presumo que isso ocorre porque não há configuração de ambiente Ruby para o www-data
usuário. Eu nunca usei Ruby antes e não tenho certeza de qual seria a maneira correta de configurar esse ambiente
Responder1
Eu fui capaz de descobrir isso. Postei a resposta à minha pergunta no SO. Espero que ajude!
https://stackoverflow.com/a/40224414/1672458
Eu fui capaz de descobrir isso. Primeiro euRVM instaladocomo uma instalação multiusuário para garantir que a
www-data
conta possa acessá-la.$ curl -sSL https://get.rvm.io | sudo bash -s stable
Instale a versão Ruby desejada, no meu caso 2.3.1, e defina rvm para usá-la:
$ rvm install 2.3.1 $ rvm use 2.3.1
Execute
gem
para instalar todas as gemas necessárias. Como o rvm é uma instalação multiusuário, essas joias são armazenadas no sistema e não no seu usuário específico.$ gem install packagename
Não sei se isso é necessário, mas fecharia a sessão SSH e a reabriria. rvm mexe com variáveis de ambiente, então é melhor prevenir do que remediar.
Execute
env
para imprimir todas as variáveis de ambiente.printenv
também funciona seenv
não funcionar por algum motivo. Você obterá uma grande lista de tudo definido, você só precisa dos relacionados ao Ruby.Não copie/cole esses valores, eles são exemplos que retirei do meu sistema. O seu será diferente!PATH=/usr/local/rvm/gems/ruby-2.3.1/bin:/usr/local/rvm/gems/ruby-2.3.1@global/bin:/usr/local/rvm/rubies/ruby-2.3.1/bin:/usr/local/rvm/bin:/home/steven/bin:/home/steven/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin rvm_bin_path=/usr/local/rvm/bin GEM_HOME=/usr/local/rvm/gems/ruby-2.3.1 IRBRC=/usr/local/rvm/rubies/ruby-2.3.1/.irbrc MY_RUBY_HOME=/usr/local/rvm/rubies/ruby-2.3.1 rvm_path=/usr/local/rvm rvm_prefix=/usr/local rvm_ruby_string=ruby-2.3.1 GEM_PATH=/usr/local/rvm/gems/ruby-2.3.1:/usr/local/rvm/gems/ruby-2.3.1@global RUBY_VERSION=ruby-2.3.1
Agora precisamos que o PHP reconheça essas variáveis. Você precisará encontrar o arquivo correto em seu sistema, o que pode ser complicado. Não tenho como saber qual é o correto, usei tentativa e erro.
O arquivo no meu sistema é
/etc/php/5.6/fpm/pool.d/www.conf
. Adicionar todosdas variáveis de ambiente que você inseriu anteriormente neste arquivo com o formato abaixo. Observe que vocêPATH
também precisa estar aqui!env[rvm_path] = /usr/local/rvm env[rvm_prefix] = /usr/local
Agora reinicie
php-fpm
. O nome do seu serviço pode ser diferente do meu; Estou usando a versão 5.6 de ondrej/php.Ubuntu 15.04 e mais recente (systemd):
$ sudo systemctl restart php5.6-fpm
Ubuntu 14.10 e mais recente:
$ sudo service php5.6-fpm restart
Finalmente, no próprio script, você precisará
cd
acessar o diretório a partir do qual está executando obundle
comando. Meu pequeno roteiro é este:cd /opt/slate /usr/bin/git reset --hard /usr/bin/git pull bundle exec middleman build --clean cp -R /opt/slate/build/* /var/www/docs
Funciona para mim!