如何在 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
)。
我想在 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
)。