如何在 Uberspace 上使用 Ruby CGI 脚本

How to use Ruby CGI scripts on Uberspace

我想在 Uberspace 7 上使用 Ruby CGI 脚本,但是 运行 涉及权限和安全设置的几个问题,尤其是在使用 gem 时。如何使用自定义 gem 安装 CGI 脚本?

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

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

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

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

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

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

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

创建目录
$ mkdir /var/www/virtual/$USER/gem

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

$ 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 脚本中使用 gem,请在需要 gem 之前设置 Gem.paths 变量:

#!/usr/bin/ruby

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

require 'mygem'

(... rest of the script)

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