Nimのcgiをさくらのレンタルサーバで実行する

1 min read読了の目安(約1700字

方針・ローカル環境

  • 共有サーバ上のため、サーバ内ではコンパイルせず、ローカルの仮想環境上のFreeBSDにてコンパイルしcgiをサーバにアップロード。

環境

  • Windows10 Pro.
  • 仮想実行環境:Hyper-v
  • 仮想マシン:FreeBSD12.2
  • さくらのレンタルサーバ(プレミアム):
    FreeBSD 11.2-RELEASE-p14 amd64

手順

FreeBSDの仮想マシンを設定

FreeBSDに、pkgを利用してNimをインストール。

pkg update -f
sudo pkg install nim
  • nimbleを使う場合は、gitが必要なので、pkgでgitをインストールする。
sudo pkg install git

FreeBSDでnimのcgi用コードを作成.

  • ただ、「test」と表示するだけのコード。
import cgi

writeContentType()
writeLine(stdout, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\">")
writeLine(stdout, "<html><head><title>Test</title></head><body>")
writeLine(stdout, "test ")
writeLine(stdout, "</body></html>")

C言語のバイナリをコンパイル

nim --o:test.cgi cc test.nim

さくらのレンタルサーバにアップロード

  • FTP経由で上記のバイナリを公開ディレクトリにアップロード。このとき「バイナリ」で転送することに注意する。

cgiファイルのパーミッションを変更

  • ファイルが実行できるよう、「755」、または、「705」にパーミンションを変更。

表示確認

  • ブラウザで、以下のURLにアクセス。
  • サンプルコードの「test」が表示されれば成功。
https://[アクセスドメイン]/test.cgi

エラーについて

ブラウザでアクセスした時に、InternalServerError(500)になる場合、以下のようなエラーログが管理画面から確認できます。

/home/XXXX/www/YYYY/test.cgi: Shared object has no run-time symbol table: /home/XXXX/www/YYYY/test.cgi

[cgi:error] [pid 24132] [client XXX.XXX.XXX.XXX:0] End of script output before headers: test.cgi

いろいろな原因があると思いますが、私の場合、FTPの際にバイナリでの転送をしていないために起きていました。
参考までに。

最後に

かなり端折って書きましたが、とりあえず、nimのコードでつくったcgiファイルをさくらのレンタルサーバで実行できることは確認しました。
 もっと簡単な方法があれば、コメントに書いてもらえると助かります。
 コーディング、デバッグ、デプロイまでをもっと簡単にできる方法を実験して、それができたらまた投稿したいと思います。
 もっと、Nimmerが増えることを期待しています。