やりたいこと
さくらの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アドレス」のどちらでもアクセス可能です。
おそらく、以下のエラーが出ると思います。
- 「Not Found For request ‘GET /プロジェクト名/」
- 「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で動かすまでの間で参考にしたサイトを紹介しておきます。
- フロント・エンドとなる HTTP サーバのセットアップ・・・Nginx.confの設定時に役立ちます
- [playframework2.6]Host not allowed エラー/AllowedHostsFilter・・・許可するホスト名の設定に役立ちます
- 許可されたホストフィルター・・・許可するホスト名の設定に役立ちます
- ネコでもわかる!さくらのVPS講座 ~第三回「Apacheをインストールしよう」・・・NginxではなくApacheを入れる際に役立ちます
- 【PlayFramework 2.5】データベースへの接続・・・DB接続の設定時に役立ちます
- Play Framework DBへの接続・・・DB接続設定時に役立ちます
- Play framework 開発中のデータベース参照方法・・・DB接続設定時に役立ちます
- H2データベース・・・ローカル環境でDBを扱いたい時に簡易DBとして役立ちます