Conoha VPSにLaravelアプリケーションをデプロイして公開する

ConoHa VPSでLaravelアプリケーションってどうやって公開するんだろう?

そんな疑問を解消するために、この記事ではConoHa VPSでLaravelアプリケーションを公開するっていうことをやっていきます。

記事の内容
  • ConoHa VPSでサーバー構築をする
  • ローカルのLaravelアプリケーションをConoHa VPSに公開する
  • データベース設定をする

    ConoHa VPSでLaravelアプリを公開したい方は参考にしてみてください。

    ConoHa VPSでLaravel扱っていこう。

    使用するConoHa VPSのプラン

    今回使用するConoHa VPSのプランは512MBの一番安いプラン。

    安く使えていいんだけど、このプランは契約後にプラン変更ができないので、スペックを上げたいからプラン変更しよう!っていうことができません

    ちゃんと運用するなら1GB以上のプランを使うといいでしょう。今回はLaravellアプリケーションをデプロイするっていう目的なので512MBのプランでいきます。

    もしまだConoHa VPSに申し込んでいない場合は、ConoHa VPSから申し込むと最大1ヶ月無料で使える700円分クーポンがプレゼントされるみたいです。

    ConoHa VPSを使ったLaravelデプロイの手順

    ConoHa VPSを使ったLaravelデプロイの手順は以下。

    Laravelアプリのデプロイ手順
    1. サーバーを再構築し、Laravelをインストール
    2. LaravelアプリケーションをFTPソフトでアップロード
    3. データベースの作成
    4. データベースとLaravelアプリケーションを接続する

    ConoHa VPSにはサーバー構築時にLaravelを選択すれば、それだけでLaravelの環境を整えてくれるからそれを使います。

    そこからローカルにあるLaravelアプリケーションのファイルたちをアップロード、MySQLと繋げていきたいと思う。

    サーバーを再構築しLaravelをインストールする

    初期契約時でもいいんだけど、サーバーを構築する際にはアプリケーションとしてLaravelを選択することができます。

    ここでLaravelを選べばLaravelの環境が作られ、IPアドレスにブラウザからアクセスするとLaravelの初期画面が表示される。

    ただ今回ConoHa VPSは契約済みで既にサーバーがあるので、サーバーを再構築してLaravelをインストールしていきます。再構築の際も同じようにLaravelを選択して構築することができる。

     既に運用しているサーバーの再構築はやめよう

    今回はLaravelアプリケーションを動かすためにサーバーの再構築をするけど、再構築するとサーバーが再構築されるので元のサーバーは吹き飛びます。既に運用しているサーバーの場合は新しくサーバーの追加を検討しましょう。

    サーバーを停止させる

    サーバーを再構築する際には一旦サーバーを停止させないといけないので、シャットダウンさせます。

    停止したらVPSのネームタグをクリックして、表示された画面でサーバー再構築を選択。

    ここで再構築するイメージを選択することができるから、アプリケーションタブからアプリケーションにLaravelを選択しよう。

    • rootパスワード・・・好きなパスワードを設定。
    • SSH Key・・・作成したKeyがあるなら登録済みキー、ないなら新規キー登録にしておくといいです。「SSH Key」の項目で登録済みキーを選択すると、rootユーザーにこの公開鍵が設定された状態でサーバーが起動します。

    rootパスワードやSSH Keyの選択をして[サーバー再構築]をクリック。サーバー再構築には少し時間がかかるから気長に待とう。

    サーバーの再構築が終わったらIPアドレスにアクセスして表示を確かめてみる。サーバーのネームタグをクリックしてVPS設定からIPアドレスをコピーしてブラウザに貼り付ける。

    このIPアドレスをブラウザに貼り付けて確かめてみるとLaravelの初期画面が表示されます。

    サーバーの中を確かめると既にLaravelのアプリケーションが作られていて、ドキュメントルートがアプリケーション配下のpublicを見るようになっています。気になる方はSSH接続したり、コンソールから見てみるといいですよ。

    自作したLaravelアプリケーションを表示させる場合

    サーバーを構築した時点でLaravelアプリケーションの初期画面は表示されています。アプリケーションのパスは/var/www/html/laravel。

    この中身を自分の好きなように変えてアプリケーションを作っていくか、既にローカルにあるLaravelアプリケーションのファイルたちをアップロードするかだけど、今回はローカルにあるLaravelアプリケーションのファイルたちをアップロードして行いたいと思います。

    アップロードするLaravelアプリケーション

    今回ConoHa VPSにアップロードしたいLaravelアプリケーションは以下。dockerを使っていてnginxとphp、mysqlの構成です。

    phpのimageはphp:8-fpm、mysqlはmysql:5.7です。立ち上げたDockerコンテナの中に入ってLaravelのバージョンを確認すると8.74.0でした。

    • Webサーバー・・・nginx
    • データベース・・・mysql5.7
    • phpのimage・・・php:8-fpm
    • Laravel・・・8.74.0

    アプリケーションは超適当で/drinksページでデータベースのdrinksテーブルから飲み物の名前を取得して表示するっていうだけのやつ。

    こんなゴミみたいなアプリケーションを公開することはないだろうけど、今回はLaravelアプリケーションをConoHaVPSで動かすっていうのが目的だからこれでいきます。

    ちなみにConoHa VPSでサーバーを構築する際にDockerを選択することができるんだけど、今回は使いません。

    Docker使いたい人はDockerをサーバー構築時に選んでみてもいいですよね。この記事を見ている人はDockerを使っていない人もいるだろうから、使わないでやります。

    LaravelアプリケーションをFTPソフトでConoHa VPSにアップロード

    ローカルにあるLaravelアプリケーションのファイルたちをConoHa VPSにアップロードしたいです。アップロードする際にはFTPソフトを使ってやります。FTPソフトには色々種類があるけど、Cyberduckを使ってやりますね。

    CyberduckでConoHa VPSに接続する

    接続方法方SFTPでやります。赤枠で囲った部分を入力して接続しよう。

    • サーバー・・・VPSのIPアドレス
    • ユーザ名・・・ユーザー名。作成していないならroot。(本当はユーザー作ってやった方がいいですがrootで今回やります
    • パスワード・・・パスワード。作成していないならrootのパスワード
    • SSH Private Key・・・ダウンロードしたプライベートキー

    VPSのIPアドレスは以下の画面で確認できます。

    SSH Private Keyは[セキュリティ→SSH Key]から取得することができる。

    SFTP接続に成功するとこんな画面になります。

    Laravelアプリケーションのファイルをアップロードする

    ローカルにあるLaravelアプリケーションのファイルたちをアップロードしたいんだけど、/var/www/html配下にlaravelという名前でアプリケーションが作られています。

    これは使わないので削除。

    うまく削除できなかったらSSH接続してコマンドで削除したりするといいでしょう。

    そしたらローカルにあるLaravelアプリケーションのフォルダを/var/www/htmlにアップロードします。

    アップロードしたらドキュメントルートを今アップロードしたフォルダに変更したいです。

    SSH接続してDocumentRootを変更しましょう。

    $ vi /etc/httpd/conf/httpd.conf

    httpd.confの下の方にDocumentRootの記述があるから、ここは今アップロードしたファイル名に変更。

    変更したらrestart。

    $ restart httpd.service

    うまくいけば画面が表示されると思います。が、ローカルとVPSの環境の違いによりPHPのバージョンエラー起きました。

    こういうの環境違うからまあ起きてしまうよなあ・・・バージョンアップしよう・・・

    PHPのバージョンアップをする

    PHPのバージョンが古いと怒られてしまったので、PHPのバージョンアップをします。php -vで確認すると7.3.31(cli)となっています。現在インストールされているphpと関連するものを見てみると7.3.31系のものがずらっと並んでいる。

    新しいバージョンのPHPを使うため、これらはいりません。削除します。

    $ yum erase -y php*

    削除したら新しいPHPバージョンを入れるためにremiのパッケージを確認しておきます。今回はphp81を有効化したいですね。

    中身をいじって有効化します。enabled=0の部分をenabled=1に変更。

    $ vi remi-php81.repo
    # This repository only provides PHP 8.1 and its extensions
    # NOTICE: common dependencies are in "remi-safe"
    
    [remi-php81]
    name=Remi's PHP 8.1 RPM repository for Enterprise Linux 7 - $basearch
    #baseurl=http://rpms.remirepo.net/enterprise/7/php81/$basearch/
    #mirrorlist=https://rpms.remirepo.net/enterprise/7/php81/httpsmirror
    mirrorlist=http://cdn.remirepo.net/enterprise/7/php81/mirror
    enabled=1⇦0から1に変更
    gpgcheck=1
    gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-remi
    
    

    これでphp をインストールしてやります。

    $ yum install php
    $ php -v
    => PHP 8.1.2 (cli)

    インストールしたらphp -vとするとPHP 8.1.2 (cli)と表示されました。restartして表示を確認してみる。

    $ restart httpd.service

    これで表示を確認してみると・・・

    うーーん、別のエラーが出ましたね。storageのPermission deniedですか。たださっきのPHPバージョンのエラーは出なくなりました。

    Storageディレクトリに権限を与える

    storageディレクトリに権限を与えて開けるようにします。

    $ chmod 777 -R storage/

    これでアクセスすると無事Laravelの画面が表示されました。

    データベースの設定

    今回このアプリケーションでは/drinksページでデータベースにアクセスする処理があるので、MySQLをインストールしたいです。

    ConoHa VPSのMySQLをセットアップするにインストール方法が載っているから参考にしつつ進めていこうと思ったら、既にMariaDBが入っているようですね。ただmysql -urootとしてもログインできません。-pつけてもログインできません

    Access denied for user 'root'@'localhost'

    /etc/my.cnfをちょっと編集します。skip-grant-tablesを記述。

    restartして再度ログイン。

    $ systemctl restart mariadb
    $ mysql -uroot

    これでログインすることができるから、ここからrootのパスワードを変更。

    $ ALTER USER 'root'@'localhost' IDENTIFIED BY '新しいパスワード';

    これで設定したパスワードで入れるかなーとか思ったんだけど、パスワードを入力してもダメでした。。なので一旦userテーブルを消して新たにrootを作成して権限を与えます。

    $ mysql -uroot;
    $ use mysql;
    $ truncate table user;
    $ flush privileges;
    $ create user 'root' identified by '好きなパスワード';
    $ grant all privileges on *.* to 'root';
    $ flush privileges;

    これでskip-grant-tablesの記述を消して、設定したパスワードでログインできました。

    $ mysql -uroot -p

    ただ正直ここら辺どうなっているのか結構わかりません、詳しい方は色々覗いてみてください。

    データベースとLaravelアプリケーションを接続する

    データベースの作成

    mysqlにログインしてLaravelアプリケーションと接続するデータベースを作ります。

    $ create database データベース名;

    LaravelのDB接続情報は.envで管理しているので.envを今作成したデータベースに接続できるように書き換える。

    DB_HOST=localhost
    DB_PORT=3306
    DB_DATABASE=作成したデータベース名
    DB_USERNAME=root
    DB_PASSWORD=設定したパスワード

    テーブルの作成

    Laravelでmigrationファイルがあるのでそれを実行してテーブルを作ります。migrateを実行。

    $ php artisan migrate

    マジでエラーしか起きない。。。

    PDOが見つからんとか言っていますね。そういえば多分ドライバないですね、入れます。

    $ yum -y install --enablerepo=remi,remi-php81 php-mysqlnd

    入ったのを確認します。pdo_mysqlが入りました。

    これでphp artisan migrete。そしてまたエラーが出ますね。

    これはmysql違いによるエラーか。/etc/my.cnfの設定変えればいけると思って設定変えてみても謎に解消しなかったので、Laravel側で解決します。

    AppServiceProviderに以下の記述を追加。

    use Illuminate\Support\Facades\Schema;
    
    public function boot()
    {
      Schema::defaultStringLength(191);
    }

    参考:https://laravel-news.com/laravel-5-4-key-too-long-error

    これでphp artisan migrate。

    やっとできましたね・・ふう・・・

    テーブルも作成されたので必要なデータをテーブルに入れておきます。seederとか使っていないので、画面表示に必要なデータを適当にinsertしておく。

    MariaDB [sample]> insert into drinks (name) values ('三ツ矢サイダー');
    Query OK, 1 row affected (0.00 sec)

    画面表示を確認する

    ここまででデータベースも作ったしmigrationを実行してテーブルも作成しました。必要なデータもinsertしたので画面を表示してみます。

    するとこんな感じに表示されました。ローカルにあるものと同じように表示されましたね。

    データベースに入れたデータも反映されていまね。とりあえずローカルのLaravelアプリケーションをConoHa VPSで公開するっていうことはできました。

    まとめ

    今回ConoHa VPSにローカルにあるLaravelアプリケーションをデプロイするっていうことをやりました。うーん結構エラー発生して面倒だったけど、表示までできてよかったです。

    ただSSL化やroot以外のユーザーを作っていなかったりして、ちゃんとやろうとすると諸々設定がまだ必要になってきます。

    分からないところがあると結構しんどい部分もあると思いますが、きっと君ならできる。頑張っていきましょう。