0

安装了扭矩箱服务器 gem。

$torquebox run没关系。程序通过 :80 和 SSL AJP :8009 在 Apache 代理 Torquebox 上运行良好。

这是它击中粉丝的地方:UpStart 的“sudo service torquebox start”表现良好,但有一个例外。浏览器没有错误。只是一张空白的白页。我正在使用 chruby。这是扭矩箱日志:

无法要求文件:torquebox/service_registry: org.jruby.exceptions.RaiseException: (LoadError) 没有要加载的文件 --torquebox/service_registry at org.jruby.RubyKernel.require(org/jruby/RubyKernel.java:1071) [ jruby.jar:] 在 RUBY.require(/home/klyde/.rubies/jruby-1.7.19/lib/ruby/shared/rubygems/core_ext/kernel_require.rb:54) 在 RUBY.(root)(:1)

当然,上面的目录和文件是存在的,如torquebox自己的日志所示。

torquebox run看起来执行得很好,因为 jruby-1.7.19(与 jruby-1.7.19 上的 Torquebox 的 v 3.1.2 运行时相同)、gems 和程序都驻留在我的 Ubuntu 用户“klyde”下。但此命令仅用于开发/测试。当作为服务运行时,Torquebox 使用自己的 bashrc 侧身查看“torquebox”用户。是的,Torquebox 需要自己的用户!因此,在 klyde 和 torquebox 这两个用户下,bashrc 包含相同的内容:

export TORQUEBOX_HOME=/home/klyde/.gem/jruby/1.9.3/gems/torquebox-server-3.1.2-java
export TORQUEBOX_HOME_RAKE_SUPPORT=/home/klyde/.gem/jruby/1.9.3/gems/torquebox-rake-support-3.1.2
export TORQUEBOX_SERVER=/home/klyde/.gem/jruby/1.9.3/gems/torquebox-server-3.1.2-java
export JBOSS_HOME=$TORQUEBOX_SERVER/jboss
export JRUBY_HOME=/home/klyde/.rubies/jruby-1.7.19
export PATH=$JRUBY_HOME/bin:$PATH

export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64
export PATH=$PATH:$JAVA_HOME/bin

我读过 Torquebox 通过它自己的 jruby 运行时版本来预测路径等,而不是 chruby(或 rvm、rbenv)可能做的事情。本着这种精神,我将扭矩箱用户添加到 klyde 组。我已经提高了对我的 klyde .gem 目录中几个文件的权限,提供了一种快速而肮脏的治疗方法。我什至尝试过 chown -R torquebox:torquebox /home/klyde/.rubies。那里没有运气)

问题:我必须重新安装所有东西,包括程序,在扭矩箱用户下,好像这​​样可以工作,无论如何?还是有更优雅(理智)的方法?

4

1 回答 1

0

解决方案:

解决了。我会回答我自己的问题。这是我记得的一堆技巧。

问题的核心似乎是宝石路径的问题。看到这个评论。 和这个。而 Ruby 管理人员通常喜欢将 gem 与 rubies 分开,例如。~/.gem ~/.rubies,当您查看 Torquebox 附带的本机 JRuby 时,您会看到 Torquebox 将 gem 藏在 JRuby 自己的子文件夹中:

/opt/torquebox/torquebox-3.1.2/jruby/lib/ruby/gems/shared/gems/

作为证明,您会看到 Torquebox 二进制下载包含 gem 套件“torquebox-server”。

我使用了 chruby 并运行:

$ jruby -S gem install torquebox-server

和 RVM 一样,它使用“扭矩箱运行”运行良好。但是为了利用类似生产的命令——“sudo service torquebox start”——我发现有必要下载二进制文件并安装在 /opt 下,以便遵循“upstart”的说明。

Warbler 为 JBoss 准备了一个 .war 文件。但是封装了 JBoss 的 Torquebox 提供了自己的代码,旨在取代 .war 的需要。但是,'torquebox run' 或 'sudo service torquebox start' 调用捆绑器。所以如何通过捆绑器放置宝石似乎很重要。将 gem 复制/粘贴到本机 JRuby (/opt/torquebox/torquebox-3.1.2/jruby...) 可能不起作用(正如我发现的那样)。

假设您(明智地)希望在 ~/ 下使用自己的 JRuby,并且在设置环境变量之后(如我所示),那么从终端,您将希望看到如下内容:

$ jruby -S gem env
RubyGems Environment:
- RUBYGEMS VERSION: 2.4.5
- RUBY VERSION: 1.9.3 (2015-01-29 patchlevel 551) [java]
- INSTALLATION DIRECTORY: /home/klyde/.rubies/jruby-1.7.19/lib/ruby/gems/shared
- RUBY EXECUTABLE: /home/klyde/.rubies/jruby-1.7.19/bin/jruby
- EXECUTABLE DIRECTORY: /home/klyde/.rubies/jruby-1.7.19/bin
- SPEC CACHE DIRECTORY: /home/klyde/.gem/specs
- SYSTEM CONFIGURATION DIRECTORY: /home/klyde/.rubies/jruby-1.7.19/etc

- GEM PATHS:
- /home/klyde/.rubies/jruby-1.7.19/lib/ruby/gems/shared

注意 .rubies,而不是 .gem。

如果启用了 RVM 或 rbenv 或 chruby,它将尝试控制 GEM_HOME。这必须被禁用。一个建议,查看 /etc/profile.d/

在任何目录中,GEM_HOME 都应该是空的,或者至少指向 JRuby 子文件夹中的路径。

作为测试:

$ echo $GEM_HOME
(here we can have a blank line)

在 ~/.gemrc

install: --no-ri --no-rdoc
update:  --no-ri --no-rdoc 

gemhome: /home/klyde/.rubies/jruby-1.7.19/lib/ruby/gems/shared
gempath: /home/klyde/.rubies/jruby-1.7.19/lib/ruby/gems/shared

尽管上面的手动编辑会起作用,但多么不文明!)特别是在开发中,使用管理器在每个程序中切换 rubies 很方便。为了两全其美,我将以 chruby 为例。

ruby/jruby 中 gems 的自然目录实际上是在它自己的子文件夹中。这是 GEM_ROOT。并且 GEM_ROOT 保持不变。chruby 会根据它在 GEM_ROOT 中找到的内容更改或人为地创建 GEM_HOME 和 GEM_PATH。然后它继续在 ~/.gem 下归档 gem。观察:

$ echo $GEM_ROOT    
/home/klyde/.rubies/ruby-2.2.2/lib/ruby/gems/2.2.0

$ echo $GEM_HOME
/home/klyde/.gem/ruby/2.2.2

$ echo $GEM_PATH
/home/klyde/.gem/ruby/2.2.2:/home/clyde/.rubies/ruby-2.2.2/lib/ruby/gems/2.2.0

而对于jruby...

$ echo $GEM_ROOT    
/home/klyde/.rubies/jruby-1.7.19/lib/ruby/gems/shared

$ echo $GEM_HOME
/home/klyde/.gem/jruby/1.9.3

$ echo $GEM_PATH
/home/klyde/.gem/jruby/1.9.3:/home/clyde/.rubies/jruby-1.7.19/lib/ruby/gems/shared

要在 chruby 中覆盖它:

/usr/local/share/chruby/chruby.sh

function chruby_use()
{
    ....
    if (( $UID != 0 )); then
        # export GEM_HOME="$HOME/.gem/$RUBY_ENGINE/$RUBY_VERSION"
        # export GEM_PATH="$GEM_HOME${GEM_ROOT:+:$GEM_ROOT}${GEM_PATH:+:$GEM_PATH}"
        # export PATH="$GEM_HOME/bin${GEM_ROOT:+:$GEM_ROOT/bin}:$PATH"

        export GEM_HOME="$GEM_ROOT"
        export GEM_PATH="$GEM_ROOT"
        export PATH=$GEM_HOME/bin:$PATH
        export PATH=$GEM_PATH/bin:$PATH
    fi
}

每个 ruby​​/jruby 都成为自己的 gemset。如果你不反对,这个在 chruby 中的快速编辑将通过 Torquebox 引用 gem 的严格方式来解决你的问题。而且您仍然可以在程序之间照常使用管理器。重新编辑chruby.sh,可以让管理器恢复到默认行为。就这么简单!)

知道了这个涉及 GEM_ROOT 的小技巧,或许可以在 RVM 和 rbenv 中应用相同的补救措施。

  1. 安装 Ruby 和 JRuby:我使用 chruby 或 'ruby-install',并在 ~/. 使用其中一个,rubies/jrubies 进入 ~/.rubies。

  2. 安装 Torquebox 二进制文件:在 Ubuntu 14.04 上,我完全按照 Torquebox 手册 21.1.2 Torquebox 安装。

  3. 环境变量:如果使用上述 GEM_ROOT 技巧,则 RUBY_HOME 和 JRUBY_HOME 可能会被忽略。

/etc/profile.d/torquebox.sh :

export TORQUEBOX_HOME=/opt/torquebox/current
export JBOSS_HOME=$TORQUEBOX_HOME/jboss
export JRUBY_HOME=/home/klyde/jruby-1.7.19
PATH=$JBOSS_HOME/bin:$JRUBY_HOME/bin:$PATH

我还编辑了... /etc/profile

export TORQUEBOX_HOME=/opt/torquebox/current
export JBOSS_HOME=$TORQUEBOX_HOME/jboss
export JRUBY_HOME=/home/klyde/jruby-1.7.19

PATH=$JBOSS_HOME/bin:$JRUBY_HOME/bin:$PATH
export RUBY_HOME=/home/klyde/ruby-2.2.2

export PATH=$RUBY_HOME/bin:$PATH
export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64
export PATH=$PATH:$JAVA_HOME/bin
  1. 符号链接或移动torquebox.conf的副本:

    /opt/torquebox/torquebox-3.1.2/share/init/torquebox.conf

    进入:

    /etc/init/torquebox.conf

然后编辑一行。JBoss 需要一条通向其开启按钮的清晰路径,standalone.sh:

/opt/torquebox/current/jboss/bin/standalone.sh >> /var/log/torquebox/torquebox.log 2>&1
  1. 使用 rake upstart、Torquebox manual 18.4 Server control 启用“sudo service torquebox start”。

  2. 如果使用 nokogiri:

我用 1.6.1 替换了 nokogiri 1.6.6.2。对于许多人来说,这种改变是必要的。谷歌它以获取更多信息。这在 gem 列表中显示为 1.6.1-java,在我的 Gemfile 中(gem 'nokogiri', '1.6.1-java')。您可能必须清除(删除)Gemfile.lock 的内容,以及直接编辑它 - nokogiri (1.6.1-java)。'$jruby -S bundle' 在直接编辑后不会覆盖 Gemfile.lock,'bundle install or update' 也一样:

$jruby -S gem install nokogiri 1.6.1

这个网站通常是在 SSL 下。为了那些好奇的人,对我来说,我是否应该忘记,这是我的 Apache 代理 Torquebox 的样子:

/etc/apache2/sites-available/example.conf :

<VirtualHost example.com:80>
    ServerAdmin webmaster@localhost
    ServerName example.com
    Redirect / https://example.com
</VirtualHost>

/etc/apache2/sites-available/example-ssl.conf :

<IfModule mod_ssl.c>
    <VirtualHost _default_:443>

        SSLEngine on
        SSLCertificateFile   /etc/apache2/ssl/certs/16746xxxxxbbac.crt
        SSLCertificateChainFile /etc/apache2/ssl/certs/sf_bundle-g2-g1.crt
        SSLCertificateKeyFile /etc/apache2/ssl/private/ks.key

        ServerAdmin webmaster@localhost
        ServerName example.com
        ServerAlias example.com
        DocumentRoot /home/klyde/ror/exampleprog/public

        ProxyRequests Off
        ProxyPreserveHost On
        ProxyPassReverseCookiePath / /
        ProxyPass /errors/ !
        ProxyPass / ajp://localhost:8009/
        ProxyPassReverse / ajp://localhost:8009/

        <Proxy *>
            AddDefaultCharset off
            Require all granted
            Order allow,deny
            Allow from all
        </Proxy>

        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined

        BrowserMatch ".*MSIE.*" nokeepalive ssl-unclean-shutdown downgrade-1.0 force-response-1.0
        SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL

    </VirtualHost>
</IfModule>

/opt/torquebox/torquebox-3.1.2/jboss/standalone/configuration

<subsystem xmlns='urn:jboss:domain:web:1.4' default-virtual-server='default-host' native='false'>
    <connector name='http' protocol='HTTP/1.1' scheme='http' socket-binding='http'/>
    <connector name="ajp" protocol="AJP/1.3" scheme="http" socket-binding='ajp' />
    <virtual-server name='default-host'>
        <alias name='localhost'/>
        <alias name='example.com'/>
    </virtual-server>
</subsystem>

必要时修复权限。以用户 'torquebox' 的身份运行可能会克服一些最先遇到的问题。

于 2015-07-13T11:44:23.700 回答