asdfでインストールしたRubyをapache2からCGIで使う

/usr/local/bin/ruby のパスにasdfでインストールしたrubyを使う方法。
いまどきなのにRoR(Ruby on Rails)じゃないの?
はい。CGIで使う方法を書きます。
(理由はうちのレンタルサーバーで使える選択肢だから・・・)

Apacheのインストール~CGI利用準備

sudo apt -y apache2

セキュリティ的な変更
HTTPのヘッダに情報を出力するかどうかの設定。(外部に公開しないなら設定不要)

sudo vi /etc/apache2/conf-enabled/security.conf

# 以下編集内容 ----------------------------------------------------
# ServerTokens の設定を変更 (Full以外を選択)
ServerTokens Prod

# エラーページのフッタの抑制 (OnならOffへ変更)
ServerSignature Off

※ちなみに「vi」は、テキストエディタで、最低限の使い方としては「Ins」キーで挿入モードへ変更
その状態から「Esc」後に「:wq」で保存+終了。

ディレクトリ名だけでアクセスできるように変更

sudo vi /etc/apache2/mods-enabled/dir.conf

# index.htmlを自動的に検知させる設定
DirectoryIndex index.html

CGIを有効化

sudo a2enmod cgi

sudo systemctl restart apache2

ユーザディレクトリをホームディレクトリにする

sudo a2enmod userdir

sudo systemctl restart apache2

mkdir ~/public_html

ユーザディレクトリ(/cgi-bin以下)でCGIを利用

mkdir ~/public_html/cgi-bin

sudo vi /etc/apache2/conf-enabled/cgi-enabled.conf

# 以下編集内容 ----------------------------------------------------
<Directory "/home/*/public_html/cgi-bin">
    Options +ExecCGI
    AddHandler cgi-script .cgi .rb
</Directory>
# 以上編集内容 ----------------------------------------------------

sudo systemctl restart apache2

以上で「~/public_html/index.html」にhtmlファイルを配置すると「http://localhost/~<ユーザ名>/」へアクセスすることでユーザ毎のディレクトリでファイルアクセスが可能になります。

asdfでインストールしたRubyのパスを通す

asdfでrubyのインストールはこちらを参照してください。

インストールしたディレクトリ(バージョン)を確認

ls ~/.asdf/installs/ruby

# 結果例
2.5.9/ 3.0.3/ 3.1.1/

「/usr/local/bin/ruby」で起動するようにシンボリックリンクを作成する

sudo ln -s ~/.asdf/installs/ruby/2.5.9/bin/ruby /usr/local/bin/

以上で「~/public_html/cgi-bin/」以下に配置したcgiやrbファイルを読み出せるようになります。

ファイルのアクセス権の変更

cgiやrbファイルをCGIとして実行するにはファイルのアクセス権を変更する必要があります。

chmod 705 <CGIとして動かすファイル>

ちなみにパスを通していない場合やアクセス権を変更していないと以下のようなInternal Server Errorが出ます。
以下のエラーが出る場合は、上記の設定を見直してください。

Internal Server Error

The server encountered an internal error or misconfiguration and was unable to complete your request.

Please contact the server administrator at webmaster@localhost to inform them of the time this error occurred, and the actions you performed just before this error.

More information about this error may be available in the server error log.