さくらのVPS

【さくらのVPS】CentOS8+NginxでPlayframework2系を動かす設定

さくらのVPSでPlayframeworkを動かしたい

やりたいこと

さくらのVPSにCentOSを載せました。

WebサーバはNginxです。

そこに、Playframeworkアプリケーションを動かしたい。

前提・環境

それぞれのバージョンは以下の通りです。

■Nginxのバージョン

$ nginx -v

nginx version: nginx/1.14.1

■CentOSのバージョン

$ cat /etc/redhat-release

CentOS Linux release 8.4.2105

■sbtのバージョン

$ sbt -version

sbt script version: 1.5.5

これらがすでにさくらのVPS側に入っていることを前提とします。

さくらのVPSを最初、契約したときはまっさらな状態になっています。つまり何のソフトウェアも入っていません。

CentOSやNginxをインストールする方法はほかのサイトでも既出情報なので、それらを参考にしてインストールしてください。

※なお、sbtのインストール時に「403 Forbidden」が出るかもしれません。これはcurl経由でsbtをインストールしようとしたときに発生するものです。(=おそらくリンク切れ)

その場合は、下記記事を参考にインストールしてみてください。

手順1.Playframeworkのアプリケーション一式をさくらのVPSにアップロードする

Nginxの場合、ドキュメントルートディレクトリが「/usr/share/nginx/html」になります。

なので、その直下にプロジェクトファイルをアップロードします。

私はローカルでの開発に、IntelliJ IDEAを使っています。このIDEには「デプロイ」という機能があり、直接FTP通信ができるのですが、さくらのVPSでは秘密鍵方式のみ許可している設定にしています。

そのため、IDEAから秘密鍵方式によるFTP接続方法が分からず、WinSCPを使ってプロジェクトファイルを転送しました。

ドキュメントルートディレクトリ直下に配置できれば、やり方は何でもいいと思います。

私の場合は、 「/usr/share/nginx/html/プロジェクト名」フォルダを作り、そこにアップロードしました。

手順2.Playframeworkの起動ポートをNginxに登録する

Playframeworkを起動します。軌道法補はターミナルから「sbt start」をするだけです。

デフォルトだと「ポート9000」でPlayframeworkが起動しようとしますが、私の環境の場合、すでに使われているというエラーが出ます。

なので、「sbt “start 9001″」とすることでポート番号をずらして起動させました。

起動すると以下のようになります。

2021-08-01 16:04:08 INFO  play.core.server.AkkaHttpServer  Listening for HTTP on /0.0.0.0:9001

次に、Nginxにポート番号9001を登録させます。下記コマンドを打ち、Nginxの設定ファイルを編集します。

sudo vi /etc/nginx/nginx.conf

※パスワード入力が求められたら入力してください。

番号が付いている箇所を編集します。

http {
 :
#---> ①追加
    proxy_buffering    off;
    proxy_set_header   X-Real-IP $remote_addr;
    proxy_set_header   X-Scheme $scheme;
    proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header   Host $http_host;
    proxy_http_version 1.1;

    upstream to-playframework {
       server 127.0.0.1:9001;
    }
#<---①ここまで
 :
    server {
        listen       80 default_server;
        listen       [::]:80 default_server;
        server_name  (ドメイン);
        root         /usr/share/nginx/html;
        index        index.html index.htm index.php;

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

#--->②追加
        location /プロジェクト名{
          proxy_pass http://to-playframework;
        }
#<---②ここまで

        error_page 404 /404.html;
            location = /40x.html {
        }

        error_page 500 502 503 504 /50x.html;
            location = /50x.html {
        }
    }
}

※②のプロジェクト名は、手順1で配置したPlayframeworkのルートディレクトリを指します。

これでこのファイルは編集完了です。

保存するときは「:wq」でEnterを押します。

以上で、さくらのVPS側の設定は完了です。

手順3.Playframework側の設定

ここまでの設定を終えて、Playframeworkのルートディレクトリへアクセスしてみてください。

私の場合は「http://ドメイン/プロジェクト名/」

ドメイン部分に入るのは、以下「名前」か「IPアドレス」のどちらでもアクセス可能です。

おそらく、以下のエラーが出ると思います。

  1. 「Not Found For request ‘GET /プロジェクト名/」
  2. 「Bad Request For request ‘GET /プロジェクト名/’ [Host not allowed: ]」

これはPlayframework側の設定を変えるだけで解決できますので、この章でその解説をしていきます。

「 Bad Request For request」 が出た場合

Host not allowed となっているので、ホスト名が許可されていないというエラーです。

そのため、このようにします。

play.filters.hosts {
#全て許可する場合⇒  allowed = ["."]
    allowed = [
        "ドメイン名.sakura.ne.jp",
        "xxx.xxx.xxx.xxx",
         "localhost"
    ]
}

application.confの末尾にこの文言を入れてください。

こうすることで、許可するホスト名を指定することができます。ここでは、ローカル環境用と本番環境用の2種類を登録しています。

「 Not Found  For request 」が出た場合

URLの階層がNginx.confで設定した内容と違っていることが原因のエラーです。

手順2の「location /プロジェクト名{}」の通り、プロジェクト名階層が必要です。

しかし、Playframework側の設定にはその階層が登録されていないので、エラーになっているので、application.confに追加してあげます。

application.context = "/(プロジェクト名)/"

必ず「/(半角スラッシュ)」で前後を囲むようにしてください。「/プロジェクト名」などとすると、エラーが解消されませんので、注意が必要です。

これで、Playframework側の設定は完了です。

再び 「http://ドメイン/プロジェクト名/」 にアクセスしてみてください。今度はうまく画面が表示されると思います。

お疲れ様でした。

その他参考サイト

私がPlayframeworkをさくらのVPSで動かすまでの間で参考にしたサイトを紹介しておきます。

  1. フロント・エンドとなる HTTP サーバのセットアップ・・・Nginx.confの設定時に役立ちます
  2. [playframework2.6]Host not allowed エラー/AllowedHostsFilter・・・許可するホスト名の設定に役立ちます
  3. 許可されたホストフィルター・・・許可するホスト名の設定に役立ちます
  4. ネコでもわかる!さくらのVPS講座 ~第三回「Apacheをインストールしよう」・・・NginxではなくApacheを入れる際に役立ちます
  5. 【PlayFramework 2.5】データベースへの接続・・・DB接続の設定時に役立ちます
  6. Play Framework DBへの接続・・・DB接続設定時に役立ちます
  7. Play framework 開発中のデータベース参照方法・・・DB接続設定時に役立ちます
  8. H2データベース・・・ローカル環境でDBを扱いたい時に簡易DBとして役立ちます