首页 > 解决方案 > 如何在 Uberspace 上使用 Ruby CGI 脚本

问题描述

我想在 Uberspace 7 上使用 Ruby CGI 脚本,但在权限和安全设置方面遇到了一些问题,尤其是在使用 gems 时。如何使用自定义 gem 安装 CGI 脚本?

标签: rubyrubygemscgiuberspace

解决方案


首先,请注意 Uberspace 7 在 SELinux 上运行。这意味着 CGI 脚本文件~/html/不仅必须是可执行的,而且还需要正确的 SELinux 上下文。在这种情况下,类型必须是httpd_sys_content_t

您可以使用以下命令查看 SELinux 上下文ls -lZ

$ ls -Z file1
-rw-rw-r--  user1 group1 unconfined_u:object_r:user_home_t:s0 file1

如果某些文件的上下文错误,可以使用restorecon命令恢复上下文,例如restorecon -R ~/html/.

Ruby gems 的用户安装目录是~/.gem/. 在 Uberspace 上,gem install默认安装到该目录:

$ cat /etc/gemrc
gem: --no-document --user-install

由于 apache 进程无法访问主目录,因此无法从 CGI 脚本执行安装在那里的 gem。/var/www/virtual/$USER/gem您可以改为安装 gems ,创建目录

$ mkdir /var/www/virtual/$USER/gem

您不能直接使用--install-dir参数,gem install因为这与上面提到的默认参数冲突:

$ gem install mygem --install-dir /var/www/virtual/$USER/gem
ERROR:  Use --install-dir or --user-install but not both

相反,~/.gemrc使用以下内容创建以覆盖默认参数(替换<USERNAME>为您的实际用户名):

gem: --install-dir /var/www/virtual/<USERNAME>/gem

现在 gems 的安装应该可以工作了:

$ gem install mygem

要在 CGI 脚本中使用 gems,请Gem.paths在需要 gems 之前设置变量:

#!/usr/bin/ruby

Gem.paths = { 'GEM_PATH' => '/var/www/virtual/<USERNAME>/gem' }

require 'mygem'

(... rest of the script)

这是必需的,因为我们无法修改GEM_PATHapache 进程的环境变量(即 set )。


推荐阅读