perl(Mojolicious)をレンタルサーバーXserverを使って公開する手順まとめ

perlのMVCフレームワーク「Mojolicious」をレンタルサーバーのXserverを使って公開する方法を紹介していきます。

基本的には、WEBアプリはVPSやAWSのサーバーを借りて運用すべきですが、個人の遊びとして格安のレンタルサーバーを使いたい場合があります。

今回は、Xserverを使ってWEBアプリを公開しましたが、他のさくらとかロリポップなどのレンタルーサーバーでも可能だと思います。

ボクの開発環境 

  • MacOS 10.14.4

今回はMacを使いましたが、Linuxであれば同じような方法でできると思います。

はじめに:Xserverのサーバーの環境について

公開手順の前に、そもそもXserverのサーバー環境はどのようになっているかを理解しましょう。

以下の公式ドキュメントに記載されているように、Xserverのサーバー環境は以下のようになっています。

f:id:toumasuxp:20190410124250p:plain

参考:プログラム言語・コマンドパス | レンタルサーバー【エックスサーバー】

公式アナウンスではPerlのバージョンは5.16.xとされていますが、サーバーの中身を調べてみると、2019.04.10時点ではPerl5.16.3のバージョンを使用していました。

また、標準でインストールされているPerlモジュールは以下の通りです。
(画像はXserverのインフォパネルにログインして「サーバー情報」から見れます。)

f:id:toumasuxp:20190410124543p:plain

ただXserverではcpanさらには cpanmが使えるので自分でモジュールを追加することができます。

Xserverで使用されているOSはLinuxですが、ディストリビューション(Linuxの種類)は公式から発表はありません。ただ、サーバーの中身をのぞいて見ると、パッケージマネージャのyumが使われているので、おそらくCentOSだと推測されます。

(ただし、Xserverに限らずレンタルサーバーはrootユーザーで操作できないので、yumは使えません。なので、あまりOSは関係ないですね。)

Xserverを使っての公開手順

以下は、Xserverに公開する手順を見ていきます。その前に、Xserverの申し込みとドメインの追加は済ませてください。今回は例として、example.comと言う独自ドメインを使用してXserverで公開する、と言う前提で説明していきます。

1,SSH接続の準備する

XserverにPerlアプリを公開する一歩として、SSH接続ができるようにしましょう。SSH接続とは、かなりザックリ説明すると、「Xserverのサーバーを遠隔操作をすること」を言います。

とは言っても、基本的には公式ドキュメント「SSH設定 | レンタルサーバー【エックスサーバー】」の通りに行えば、上手くいきます。

  • サーバーパネルにログイン
  • 「SSH設定」をクリック
  • 「ONにする」をクリック

とすればOKです。

次に公開鍵を作成する必要がありますが、ボクは上記の公式ドキュメントの「公開鍵認証用鍵ペアの生成」の手順から公開鍵を作りました。(公開鍵とは、SSH認証をするため、コンピュータが使う超長いパスワードみたいなものです。)

公開鍵の作成の際に「パスフレーズ」を入力する欄がありますが、そこには自分が使いやすいパスワードを入力します。(パスフレーズとは、公開鍵を使うためのパスワードですね。パスワードのパスワードみたいな。)

公開鍵の作成が終わったら、秘密鍵と言うヤツを公式ドキュメントの通りにダウンロードしましょう(ボクの場合は自動でダウンロードが開始されなかったので、手動でダウンロードしました。

開発環境でSSH接続の設定を行う

上記の方法で秘密鍵(例として、sample.keyと言う名前とします。)をダウンロードをしたら、Mac環境では~/Downloads/sample.keyと言う場所に秘密鍵があると思います。

MacやLinuxなどのUnil系統のOSでは、~/.sshのディレクトリにある秘密鍵を使うようになっているので、先ほどの~/Downloads/sample.key~/.sshに移動します。

そのために開発環境のターミナル上で以下のコマンドを実行します。

#.sshディレクトリの作成
$ mkdir ~/.ssh
#ファイルの移動
$ mv ~/Downloads/sample.key ~/.ssh/

あと、ついでにsample.keyの名前をid_xserver_rsaに変更しておきましょう。

$cd ~/.ssh/
$mv sample.key id_xserver_rsa

次にパーミッションの変更もします。

$ chmod 700 ~/.ssh
$ chmod 600 ~/.ssh/id_xserver_rsa

SSH接続を楽にするためにConfigファイルも作成しておきます。

$cd ~/.ssh/
$vim config

vimには以下のように記述。

Host xserver
HostName サーバーID.xsrv.jp
Port 10022
User サーバーID
IdentityFile ~/.ssh/id_sample_rsa
ServerAliveInterval 60

ここまで来ると、あとは以下のコマンドでSSH接続ができるはずです。

ssh xserver

Xserverに入って設定を行う

SSH接続ができたら、Xserver内で色々設定をしましょう。

まずは、cpanmを用意するために以下のコマンドを実行。

cpan App::cpanminus

これでcpanmが使えるようになりました。

参考:Installing Perl Modules – www.cpan.org

本当はplenvなどでバージョン管理をすべきですが、Xserverだとplenv使うのも難しいので今回は見送ります。

次にcpanmを使って必要なモジュールをインストールしていきます。今回はMojoliciousを使いたかったので、以下のようにしました。

cpanm Mojolicious
cpanm Exporter

ここも本当はgitとかdockerとかで管理すべきですが、今回は見送ります。(と言うより、git使えるの?)

Mojoliciousのアプリを公開する

いよいよperlのアプリを公開していましょう。perlアプリ(Mojolicious)の公開のために行うことは、以下の3つになります。

  • script/myappのファイルを編集する
  • .htaccessを作成する
  • Xserverのpublic_htmlディレクトリにデプロイ(公開)する

以下は、詳しく見ていきます。

script/myappのファイルを編集する

Mojoliciousでアプリを作る時には、mojo generate app Myappのようなコマンドを実行して以下のディレクトリ構造を作成すると思います。

Myapp
- lib/
- t/
-script/
myapp
以下略

重要なのはscript/myappのファイルでこのファイルの名前をscript/index.cgiに変更した上で、scriptディレクトリではなくルートディレクトリに配置しましょう。

Myapp
- lib/
- t/
-script/
myapp
index.cgi
以下略

なぜindex.cgiに直す必要があるかと言うと、Xserverにはデフォルトドキュメントが設定されており、index.cgiと言うファイル名に直しておかないと、http://example.com/にアクセスした時に処理してくれないからです。

また、index.cgiの中身は以下のように書き換えてください。(username等の細かい部分が書き直してください。)

#! /usr/bin/perl
use strict;
use warnings;
use FindBin;
BEGIN {unshift @INC, "/home/username/perl5/lib/perl5","/home/username/perl5/lib/perl5/x86_64-linux-thread-multi"}
// デフォルトでは"$FindBin::Bin/../lib" だが、Xserver用に書き直している。
BEGIN { unshift @INC, "$FindBin::Bin/lib" }
use Mojolicious::Commands;
# Start command line interface for application
Mojolicious::Commands->start_app('Myapp');

上記のコードでポイントになるのは2つ。

1つ目は、コードの先頭に#! /usr/bin/perlと書くこと。perlの実行ファイルがどこになるのかを、プログラムに知らせています。

2つ目は、以下のコードのように@INC変数を使うこと。Xserverのperlモジュールの場所を追加しています。

use FindBin;
BEGIN {unshift @INC, "/home/username/perl5/lib/perl5","/home/username/perl5/lib/perl5/x86_64-linux-thread-multi"}
BEGIN { unshift @INC, "$FindBin::Bin/lib" }

.htaccessファイルを作成する

次に、Myappのルートディレクトリ内に.htaccessファイルを作成して以下のように書きましょう。

 AddHandler cgi-script .cgi
Options +ExecCGI
IndexIgnore *
RewriteEngine on
RewriteCond %{DOCUMENT_ROOT}/public/%{REQUEST_URI} -f
RewriteRule ^(.*) public/$1 [L]
RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_URI} !-f
RewriteRule ^(.*) index.cgi [L] 

これでどのURLからアクセスしても、index.cgiを経由して処理してくれます。

参考:Apache deployment · mojolicious/mojo Wiki · GitHub

Xserverのpublic_htmlディレクトリにデプロイ(公開)する

ここまで来れば、あとはでXserverにデプロイするだけ。適当なFTPフリーソフトを使ってデプロイしましょう。XserverのFTP設定は、公式ドキュメント「FTPソフトの設定 | レンタルサーバー【エックスサーバー】」が詳しいです。

Xserverでは、public_htmlディレクトリがルートディレクトリとして扱われます。なので、独自ドメインをexapmle.comとして運用する場合は、/expample.com/public_htmlディレクトリにデプロイすればOKです。

デプロイ後の`/expample.com/public_htmlの構成は以下のようになっているはずです。

  - lib/
- t/
-script/
myapp
index.cgi
以下略

試しにhttp://example.comにアクセスしてみると、うまく表示されるはずです。開発時にはmorbo script/myappのようにしてサーバーを起動しますが、Xserverではすでにサーバーが起動されいてるので、何もしなくて良いです。

もし、500エラーなどが発生する場合は、

  • ディレクトリやファイルのパーミッションが間違っている
  • プログラムの記述が間違っている。

などが考えられるので、ファイルとかディレクトリのパーミッションを755に変えたりログを見ると良いです。

参考:CGI – よくある質問 | レンタルサーバー【エックスサーバー】

ReratedPosts

perlで「Can't locate Sample/Module.pm in @INC」と言うエラーが起こる原因と対処法3つ
perlでファイルの読み込みとか作成とか削除のまとめ
Perlモジュール「Moo」(Moose)の使い方をまとめてみる
perlでは何がtrueで何がfalseと判定されるのか
perlでファイルの中身を全て読み込みたい時の方法
perlでIO::Socketを使う時に「permission deny」と言うエラーが出た時の対処法