It's super effective

多分技術関連をメインに発信します

CGI on Ubuntu Server

経緯

さくらのVPSをお借りしたので、せっかくだからUbuntuServerをぶち込んでCGIを動かそうと思ったら滅茶苦茶苦労した。   VPSを借りた(サーバ未インストール)という状態を前提にお話しを進めようと思います。

やりたいこと

持って来たCGIスクリプトをサーバに突っ込んで動かす

用意するもの

  • 自分のPC(win10)
  • さくらのVPS

手順

ステップ1:OSのインストールとユーザ作成

折角サーバを借りてもOSを突っ込まなければ意味がありません。というわけでOSを突っ込みましょう。経緯でもふれたとおり、Ubuntuを突っ込むことにしました。しばらくするとインストールが完了するので端末を起動。とりあえずユーザだけ作成。 rootユーザでログインして、以下のコマンドを叩くことで新たなユーザを作成します。

sudo adduser serverUser

これでserverUserという名前のユーザがサーバに作成されました。 これでユーザの作成完了!以降はこのユーザを使って色々やります。

ステップ2:SSH接続の準備

今回はRLoginを使ってリモートデスクトップSSH接続(ローカルのPCからCUIで遠くのコンピュータをいじくりまわすヤツ)することにしました。一旦サーバから離れて、RLoginをインストールしましょう。指示に合わせてカチカチするだけだったので割愛。気が向いたら手順乗せるかも。

ステップ3:RLoginを使おう!

とりあえず起動します。RLoginのサーバ情報に借りたサーバの情報を追加。その際こんな感じの画面が出てくるはずです。 f:id:tabun-are:20220321173238p:plain ホスト名に使っているサーバのIPアドレスを、ユーザ名に自分でサーバに作ったユーザの名前を、パスフレーズにそれのパスワードをそれぞれ入力して完了。他はそのままで大丈夫です。 f:id:tabun-are:20220321224339p:plain

うまくつながるとこうなります。以降、自分のPCからサーバを弄ることができるようになりました。わざわざブラウザ開いてマイページに行って端末開いて・・・なんて面倒とはおさらば!

ステップ4:Apacheを突っ込む

サーバ側の作業です。コマンドで一発。

sudo apt-get install apache2

ステップ5:Apacheを設定する

引き続きサーバ側の作業になります。一番めんどくせぇ部分です。気合入れていきましょう。

ubuntu16.04のApache2設定/cgi設定 - Qiita を参考に設定を弄り、公開ディレクトリを変更します。まずは/etc/apache2/sites-availableに移動して、vimなりnanoなりEmacsなりでhoge.confを開き(無ければ新規作成してくれる)、以下を入力し保存。

ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"
AddHandler cgi-script .cgi .py

<Directory "/var/www/cgi-bin">  
        AllowOverride None
        Require all granted
        Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
        Order allow,deny
        Allow from all
</Directory>

次に、デフォルトの設定を無効化してこの設定を有効化する。

sudo a2dissite 000-default.conf
sudo a2ensite hoge.conf

そしてapacheを再起動。

sudo service apache2 restart

ステップ5.5:CGIプログラムを書く

プログラムがなきゃどうにもなりません。というわけで簡単なプログラムをVSCodeなりSublime Textなりで書きましょう。

   #!/usr/bin/perl --
   print "Content-type: text/html\n\n";
   print "<h1>hello,CGI</h1>";

hoge.cgiという名前でローカルの適当な場所に保存。

ステップ6:ローカルで作成したプログラムをサーバに転送する

サーバの方でvimなりnanoなりEmacsなり使って書いてってこともできますが、やっぱり一生懸命こさえた自分の開発環境でコーディングしたいもの。というわけで、自分で使っているPCの方で作業して、その作業結果をサーバにアップロードして反映するということを考えます。 色々ありますが今回はscpを使います。一旦サーバから離れて、自分で使っているPCのコマンドプロンプトを起動。アップロードしたいファイルがある階層まで移動したのち、以下のコマンドを叩く。

scp hoge.cgi serverUser@[サーバのIPアドレス]:/home/serverUser

アップロードが完了したら今度はサーバを弄ります。アップロードしたファイルを公開するため、アップロードした場所(ホームディレクトリ)から公開したいディレクトリ(今回は/var/www/cgi-bin)に移動させましょう。

sudo mv hoge.cgi /var/www/cgi-bin

一番右のディレクトリ部分には自分で設定したドキュメントルートを代入してください。この記事に沿って作業してきた場合はこのままでOKです。

ステップ7:パーミッションの設定をしよう

サーバを弄ります。パーミッションを設定してプログラムがちゃんと動くか確認しましょう。実行できるよう、パーミッション設定を755に変更します。まずはcgiファイルが置かれた階層まで移動。然る後以下のコマンドを叩く。

   sudo chmod -R 755 hoge.cgi

これパーミッションの変更が完了します。 hogeには自分でアップロードしたcgiファイルの名前を入れましょう。 変更後、アドレスバーに自分のサーバのアドレスに続いて"/hoge.cgi"を入力。hogeにはry

f:id:tabun-are:20220321224415p:plain

やったね! あとはどっかからスクリプトを落としてサーバにぶん投げればゲームの設置なんかもできるでしょう。

つまずきポイントまとめ

つまずき1:Forbiddenを吐かれた

apache側の設定がうまくできてない、あるいは反映されていない可能性が高い。  

  •  デフォルトの設定はちゃんと無効化しましたか?
  • 自分で書いた設定をちゃんと有効化しましたか?
  • サーバの再起動はしましたか?

あたりが一番多い要因かなと思います。次点で設定ファイルの書き間違いとか設定ファイルの置き場所間違い。

つまずき2:InternalServerError

改行コード

サーバー側でvimなりnanoなりEmacsなり使って書いたものなら動く場合、改行コードが原因である可能性が高いです。 調べによると、どうもRloginに備え付けられているSFTPだと改行コードを変換してくれないっぽい。 そんなわけで、一行目のインタプリタの場所を書く行の末尾に --を追加。

   #!/usr/bin/perl --

曰く、これによって改行のめんどくさい部分がいい感じに吸収されるとか。

パーミッションの設定忘れ

少なくとも何も弄っていない状態だと500吐いて終わります。ファイルに合わせて(cgiなら基本755、文献に指示があればそちらを優先)適切なパーミッションを設定してあげましょう。うぶんつの最近のバージョンだとlsしたときに755のファイルは緑色の文字で表示してくれます。便利。

それでも500エラーを吐かれたら

もしかしたら実行環境を呼び出せていないためにプログラムがそもそも動いていない可能性があります。各スクリプトの最初の行(#!とか書いてあるとこ)がちゃんとperlの実行環境のある場所を指しているかどうか確認しましょう。一見コメントっぽく見えますが、これはコメントではありません。意味のある文言です(プログラムを投げる先の実行環境はどこにあるかみたいな意味)。大抵は#!usr/local/bin/perlか#!usr/bin/perl(筆者の環境ではこっち)のどちらかで動いてくれるはずです(要出典)。

参考文献

qiita.com

note103.hateblo.jp

linuxserver.hatenadiary.jp

qiita.com