初心者がレンタルサーバ上でNuxt.jsをどうにか動かした

シェアする:

この記事をおすすめしたい人

  • Node.jsも知らんのにNuxt.jsを始めようとしてる人
  • レンタルサーバ上でNuxt.jsを動的出力させたい人
  • つまりオレ

何も知らない超初心者が脱WordPressしたくてNuxt.jsでサイト構築していくシリーズです。

今回はサーバサイドでNuxt.jsを動かすテストです。 インストールオプションに出てきた「Deployment target」の「Server」です。
(Staticの場合はビルドしたHTMLをアップロードするだけだと思います)

エックスサーバーというサーバ上でテストを行いますが、どうもね…。 これは非常にマイナーな選択のようなんですよね。

でもまぁこのブログはエックスサーバーで動かしてるので、そのままエックスサーバーでNuxt.jsも動かしてみたいと思います。

僕はNuxt.js/Vue.js/Node.jsだけでなく、サーバの知識もからっぽです。 そんなバカチンがどうにかNuxt.jsのデモ画面をエックスサーバー上で表示させるまでのお話をします。

WordPressの上でな!

※ このブログはWordPress製です

まずはサーバへSSH接続

これまでの環境構築の流れから、Nuxt.jsを動かすにはNode.jsが必須であることが分かっています。

Node.jsをサーバへインストールするには、SSH接続からコマンドで通信する必要があります。

なのでまずはSSH接続から。

サーバーパネルからSSHの設定

エックスサーバーのサーバーパネルへログインし、「アカウント」内の「SSH設定」を開きます。

「SSH設定」タブで「ONにする」にチェックを入れて「設定する」ボタンを押します。

「公開鍵認証用鍵ペアの生成」タブにて「パスフレーズ」を入力し「確認画面へ進む」ボタンを押します。 パスフレーズはパスワードと思えばいいんでしょう。 進んだ画面で「生成する」ボタンを押します。

「(サーバーID).key」というファイルがダウンロードされるので、上の「パスフレーズ」と合わせて大事に保管。

ターミナルでSSHの接続設定

この手のツールは「ターミナル」と呼ぶそうですね。

僕はRLoginというフリーソフトを使いました。

ここから先はソフトによって設定項目が変わってくるでしょうから、違った場合は雰囲気で読み替えてください。

エントリー(設定の名前)は「エックスサーバー」。
プロトコルは「SSH」。
ホスト名は「(サーバーID).xsrv.jp」。
TCPポートは「10022」(通常は22だそうですがエックスサーバーは10022にしてねと注意書きがあります)。
ログインユーザー名は「(サーバーID)」。
パスワードは先ほどのパスフレーズ。
SSH認証鍵は先ほどダウンロードしたkeyファイルを指定。

これで無事に接続できました。

次にNode.jsのインストール

WindowsNAS(QNAP)とNuxt.jsの開発環境を構築してきましたが、そういえばコマンドでNode.jsをインストールしたことなかったので検索。

一応、既に入ってたりしないかなと思って試してみましたが、残念ながら。


$ node -v
-bash: node: コマンドが見つかりません

というわけで調べた方法を実践していきます。

nodebrewをインストール

いきなりNode.jsはインストールできないようなので、nodebrewとかいうのを先にインストールします。

nodebrewはNode.jsのバージョン管理をするツールだそうです。 今回はバージョン管理がしたいわけではありませんが、nodebrewからインストールできるそうなので問題ありません。

まずはnodebrewをダウンロード。


$ wget git.io/nodebrew

次にnodebrewをセットアップ。


$ perl nodebrew setup

このままではパスが通っていなくて実行できません。


$ nodebrew -v
-bash: nodebrew: コマンドが見つかりません

通すパスはセットアップ終了時に提示されていました。


Export a path to nodebrew:

export PATH=$HOME/ .nodebrew/ current/ bin:$PATH

(折り返しの都合/の後にスペースを入れています)

これを利用してこの↓ように。


$ echo 'export PATH=$HOME/ .nodebrew/ current/ bin:$PATH' >> ~/.bashrc
$ source ~/.bashrc

何をやっているのかさっぱり分かりませんが、パスを通す作業だそうです。 不安な人は自分でやり方を見つけてください。


$ nodebrew -v
nodebrew 1.0.1

はい、ちゃんとパスが通り、無事にnodebrewが実行できました。

Node.jsをインストール

nodebrewインストール時にどうも最新版のNode.jsは用意されているようで、「list」をつけるとそれ↓が確認できます。


$ nodebrew list
v14.4.0

current: none

v14.4.0が用意済みだけど、「current: none」から有効にはなってないよ、ってことなんでしょう。 試しにコマンド叩いてみましたがダメでした。


$ node -v
-bash: node: コマンドが見つかりません

というわけでv14.4.0をアクティブにします。 他のバージョンが良い場合はもしかすると先にダウンロード作業とか必要かもしれません。 僕はバージョンの違いなんかよく分かんないのでv14.4.0。


$ nodebrew use v14.4.0

無事にNode.jsが動きました↓。


$ node -v
v14.4.0

お次はNuxt.jsのセットアップですが…

どこへインストールすれば…?

この問題が再度発生しました。

自分のパソコンやらNASやらならいいですよ。 どこにインストールしても自分の所有物なんだから。 万が一壊れても自分が困るだけです。

でもレンタルサーバですからね。 おまけにサーバの知識ないポンコツがやろうとしてるんです。

変なとこにインストールしちゃって大変なことになったら…

まずはディレクトリ構造を確認

SSH接続後、「ls」というコマンドを叩くとその階層に次のようなフォルダがあることが確認できました。

  • Maildir
  • nodebrew
  • ore-shika.com
  • ssl
  • (サーバーID).xsrv.jp

いつもFTPでログインしているところですね。

「ore-shika.com」というのはこのブログのルートドメインです。

「ore-shika.com/dev/」にHTMLやPHPファイルを置けばこのサイトのアドレスでアクセスできるようになります。

ですが、Nuxt.jsはそういう形式で動いているわけではないようなので、「ore-shika.com/dev/」にインストールしても「https://dev.ore-shika.com/」からアクセスできるようにはなりません。

じゃーどこに…。 どこでもいいのか…。

どこにインストールしてもいいらしい

いつものアニキに教えてもらったっところ、権限的に許可されている場所ならどこでもいいそうです。

提示された例にならって、「nuxt」フォルダをまず作り、その中にルートドメインの「ore-shika.com」、サブドメインの「dev」と作りました。 視覚的にどのサイトのプロジェクトなのか分かりやすいようきっちり作りましたが、「/nuxt/nuxt-site1/」みたいなのでもよさそう。 「/nuxt/」の部分もなんでもよさそう。

今回は「/nuxt/ore-shika.com/dev/」。 サブドメインに作るケースは希だと思うので、サンプルとして「/nuxt/nuxt-test/」へインストールする例で紹介します。

最後の「nuxt-test」はNuxt.jsインストール時に作られるので、カレントディレクトリを「/nuxt/」へ移動してからインストール。


$ cd nuxt
$ npx create-nuxt-app nuxt-test

この先はWindowsやNASへインストールする時と同様です。 インストール時に聞かれる選択肢はインストールオプションの記事を見てください。


Successfully created project nuxt-test

  To get started:

        cd nuxt-test
        npm run dev

  To build & start for production:

        cd nuxt-test
        npm run build
        npm run start

無事にインストールできました。

とうとうNuxt.jsを起動するわけですが…

ローカルの開発環境では「npm run dev」ですが「dev」ってたぶん「development」とかの開発モードってことじゃないかと思います。

サーバ側で開発なんて無知な僕にはハードル高すぎるので、productionモードで実行してみます。

えいっ


$ npm run start
(略)
FATAL  No build files found in /home /(サーバーID)/ nuxt/ ore-shika.com/ dev/ .nuxt/ dist/ server.

(折り返しの都合/の後にスペースを入れています)

ビルドしたファイルがありませんよ、と。

ああ、さっきのコレ↓は上から順に実行しろってことだったのね。


  To build & start for production:

        cd nuxt-test
        npm run build
        npm run start

というわけで先にbuild。


$ npm run build

10秒ほどで完了し、今度はstart。


$ npm run start

Nuxt.js @ v2.13.2

▸ Environment: production
▸ Rendering:   server-side
▸ Target:      server

Memory usage: 66.5 MB (RSS: 142 MB)

Listening: http://localhost:3000/

無事に起動しました。

どうやってアクセスするのか

はい、皆目見当が付きません。

「/ore-shika.com/」フォルダは「https://ore-shika.com/」でアクセスできますが、今回は「/nuxt/ore-shika.com/」です。

「https://nuxt/ore-shika.com/」なんかでいけるわけもなく…。

アニキ助けてえええ!

.htacessを使う

エックスサーバーは3000番ポートが開いていない…。
nginxからnuxt.jsにアクセスを中継させる…。

謎な回答が帰ってきました。

ですがアニキは僕のお馬鹿っぷりをよく知っているので、

「/ore-shika.com/dev/の.htacessにリダイレクトを設定すればいいよ」

と教えてくれました。

指示通り以下のように設定します。


RewriteRule ^(.*)$ http://localhost:3000/$1 

すると…。

や、やったよアニキ!

エックスサーバーでとうとうNuxt.jsが動きました。

どういう原理か無知なりに考えてみた

まずですね。


Listening: http://localhost:3000/

ここから分かる通り、僕が契約しているエックスサーバーのアカウント?内で、「http://localhost:3000/」というアドレスでNuxt.jsのデモ画面が起動しています。

これを前提に、まずは「https://dev.ore-shika.com/」へアクセスします。

するとそこに配置されていた「.htacess」が読み込まれます。

中には「ここにきたアクセスは全部http://localhost:3000/にリダイレクトしてね」と書いてあります。

Nuxt.jsが待機している「http://localhost:3000/」へリダイレクトされてきます。

Nuxt.jsのデモ画面が表示されます。

たぶんこんな感じなんでしょう。

SSRで動いているNuxt.jsの挙動の確認

サーバ側で動かした時にどうなるのか、僕が気になっていた点を実験して確認します。

SSH切ったら切断されない?

開発モードの「npm run dev」の時は接続を切るとページが表示されなくなっていました。

今は「npm run start」で起動していますが、同様だととても困ってしまいます。

「npm run stop」のようなコマンドはないようなので、Ctrl+Cキーで待機状態に戻します。
→ ページは見えています。

SSH接続を切断してみる。
→ ページは見えています。

ターミナルソフトの終了。
→ ページは見えています。

オッケーです。 「start」したら切断しても動き続けるようです。

ファイルを更新する場合はどうするのか?

切断してもページが見えているということはずっと実行され続けているわけじゃないですか?

ってことは、ファイルを更新して上書きする際にこういう↓感じのことが起きるんじゃないの?

実験しなくては話が進まないので、とりあえず上書きしてみます。 対象は「/pages/index.vue」。 トップページの中身ですね。

特にエラーは出ずに上書きできました。

ですがサイトの方が更新されていません。 startが参照してるファイルは別にあるってことか。

再度「build」して「start」すると更新内容が反映されました。

つまり、buildで表示用のファイルをビルドし、startでそれを表示開始、みたいな?

build→startのどの段階で更新されるのか

build中
→ 前バージョンが表示されている。

build終了後
→ 前バージョンが表示されている。

start
→ 新しいバージョンが表示されている。

ふむ。 つまり、startしない限りは前バージョンで表示されると。

開発用、buildしたもの、startで表示するものの3つがあるってことですかね。

「.nuxt/dist/」以下にそれっぽいファイルがあったからそれかな…。

翌日アクセスしたらNuxt.jsが停止していた

次の日、エックスサーバーで動かしていたテストサイトにアクセスするとこんな↓表示が。

(クリックで拡大)

あちゃー、テストサイトなのに1日でそんなに人気出ちゃったかー。

ということではありません。

startしたNuxt.jsが停止しているようです。

うーむ、簡単にはいかない。

調べていると、Node.jsを永続化できるモジュールを見つけました。

foreverモジュールのインストール

まずはプロジェクトフォルダへ移動(cdコマンド)し、公式サイトの例に習い次のコマンドを叩くだけです。


$ npm install forever -g

foreverの実行

公式を参考に、foreverからNuxt.jsを実行してみます。


$ forever start "npm run start"

無事に動きました。

1日、2日経過とみてみましたが、しっかりと永続化されています。

ところが1週間後…

今度は停止させてみようとforeverを停止したところ、サイトが止まりません。 表示されたままです。

foreverはデフォルトでログを取っていたようでそちらを確認してみると、なんと700MBものログが!

内容を見てみるとこんな↓ログが大量に…。


Error: Address `localhost:3000` is already in use.  

どういうことなのかは分かりませんが、foreverでNuxt.jsの再起動?がかかって、でも最初のが動いたままなので新たにNuxt.jsを起動して…みたいなことを繰り返してたのかな。

Nuxt.jsのプロセスも多数立ち上がっていたので、サーバのプロセスを落とす方法を調べて無事に停止させることができました。

う~ん…。

設定が悪かったのか…。

それとも、やっぱできないのか?

今回のやり方はマイノリティでした

やる前からひしひしと伝わってきていましたが、今回の手法はマイノリティです。

ネットでNuxt.jsを検索すると「Netlify」「Firebase」「GitHub」などを利用しているような話ばかり出てきて、「エックスサーバーでNuxt.jsやってます」「さくらサーバーでNuxt.jsやってます」みたいな話は全然出てきません。 WordPressだと後者なんですけどね。

この辺の話はどうも静的HTMLを出力する場合のようでして、ローカルで出力したHTMLを上記ホスティングに配置するだけ?

これがおそらく最メジャーの手法。

今回のように動的出力する場合はVPSというサービスがメジャーなようです。

初心者が勉強したVPS

何やらよく分かりませんが、調べた印象としては…。

まずレンタルサーバから。 これは1台のサーバを複数のアカウントでシェアする方式です。 サーバのOSやハードウェア、使えるプログラム、設定など、自由に選べない。

それに対して専用サーバ。 サーバのパソコンをまるまる1台レンタルします。 まるごとレンタルしてるので設定は自由自在。 ただしめちゃくちゃ高い。 エックスサーバーだと安い方のプランでも初期費用10万円、月額4万円くらい。

最後にVPS。 仮想的に専用サーバを作る仕組みらしいです。 1台のサーバに仮想化された複数のVPSがある感じ? お値段はさくらの一番安いので月額585円。 レンタルサーバなら131円。 ちょっと高いです。

VPSだと管理者権限でいろいろ触れるので、Node.jsやらのプログラムを自由に入れられるんだそうです。

なぜエックスサーバーでNode.jsを動かせたのか

ごめん、わかんない。

SSHが使えるから?
実はこっそりVPS寄りのサービス?

理由は不明ですが、高いだけあって高機能だったのかな。

とりあえず動きました。

ホスティングサービスは何か?

レンタルサーバ=ホスティングサービス、と考えていたのでちょっと違いが分からないです。

Nuxt.jsの記事を読んでいると「サーバーレス」なんて言葉を見かけるので、ホスティングサービスはレンタルサーバからサーバ機能を抜いたもの?

テキトーですが、Webサイトを公開できてなおかつPHPやPerlが動く仕組みを持っているのがレンタルサーバ、Webサイトを公開する機能しかないものがホスティング?

そんな印象を受けました。

きっと値段が安くて、Nuxt.jsで静的出力する場合にはPHPなんかが不要なのでホスティングサービスが人気?なのかな?

次回予告

さてさて、理解度は低いですがどうにかエックスサーバーでNuxt.jsを動かすことができました。

次は「コンテンツをどうやって管理していくのか」を考えて、さっさと脱WordPressしたいと思います!

以上、WordPressからお届けしました!

シェアする: