ConohaVPSにデプロイする前にすること

Infrastructure

mysql.createConnection

MySQLへの接続情報を本番環境用に直します。

const connection = mysql.createConnection({
  host: 'localhost', // localhostのままでOK
  user: 'root',
  password: 'パスワード',
  database: 'データベース名', 
  port: '3306' // SQLのポート番号は3306
});

VPSサーバー上におけるDBサーバーのホスト名(=MySQLホスト名)を以下のコマンドで確認します。

mysql > select user, host from mysql.user;

私の場合はこれでlocalhostと出たのでhost: ‘localhost’の部分は変更する必要がありませんでした。

ーーーーー

※試しに「host: 160.xxx.xxx.xxx」でnode app.jsしてみたところ、

ECONNREFUSED 160.xxx.xxx.xxx:3306 と出ました。

これはIPアドレス「160.xxx.xxx.xxx」のサーバーに接続しようとしたけど、ポートに接続できないよ、つまりサーバーにアクセスを拒否られてるよ という意味です。

ーーーーー

MySQLの起動

MySQLを起動しておきます

systemctl start mysql // Ubuntuでアプリを起動させるときはsystemctlを使う
systemctl status mysql // 起動しているか確認

package.json

なんのために追加するのかよくわからない部分↓

"scripts":{
  "start":"node index.js" // 追加
}

パッケージのインストール

ローカルにはインストールしたけど、VPSサーバー上でインストールしてないパッケージをインストールします。

まず、適当にexpressでもインストールします。

$ npm install express
$ sudo apt install mysql-server

package.jsonと同じ階層でnpm install するとpackage.jsonが自動的に更新されるます。

そしたら以下のコマンドを実行します。

npm install

引数なしでnpm install するとpackage.jsonに書かれているパッケージ一覧を読み取ってnode_modulesディレクトリにインストールしてくれます。

app.listen

本番環境では3000番でアクセスしないので3000→80(HTTP)に変更してみましょう。

app.listen(80);

これでnode app.jsしてみると、次のようなエラーが出るはずです。

「Error: listen EADDRINUSE: address already in use :::80」

Nginxが80番を既に利用しているため、Expressでは80番を利用できませんよ、というエラーです。

解決方法

調べるといろいろなやり方があるようでしたが、次の2つは試してもうまくいきませんでした?

①nginx側で80番にアクセスしたら3000番に飛ばす設定を行う(https://yumeno.me/webserver

②nginxを80から8080に変更する(https://tech.mamezou00000.com/entry/nginx-port-change

③トップページだけ表示されたやつ→(https://vps-one.site/node-js-conoha-vps/

ーーー

最終的に上手く行った方法を説明します(なぜうまくいったのかはわからん)

nginxディレクトリ内のdefaultファイルを開きます。

$ vi /etc/nginx/sites-enabled/default

locationディレクティブにproxy_passを追加します

location / {
    proxy_pass http://160.xxx.xxx.xxx:3000; <==追加
    # First attempt to serve request as file. then
    # as directory, then fail back to displaying a 404.
    try_files $uri $uri/ =404;
}

このままファイルを保存してnode app.jsしたら、トップページ以外が404エラーになりました。

なので、try_filesを変更します。

デフォルトでは「try_files $uri $uri/ =404;」となっており、引数が3つかかれています。

try_filesは左から順に実体ファイルが存在しているかどうかを探し、あればそのままそのファイルを参照します。

「$uri 」にも「$uri/」にもファイルが存在しない場合は「=404」で404エラーを返す仕組みです。

「=404」の部分は変更できるので、これを次のように変更します。

location / {
    proxy_pass http://160.xxx.xxx.xxx:3000;
    # First attempt to serve request as file. then
    # as directory, then fail back to displaying a 404.
    try_files $uri $uri/ @app; <== 変更
}

location @app { <==追加
  proxy_pass http:localhost:3000; <==追加
} <==追加

これでファイルを保存します

ーーーーー

※proxy_passで指定した3000の後に「/」をつけるか付けないかで挙動が変わるので注意(https://qiita.com/mkuwan/items/dce68409aaf16142a438

※nginxのリバースプロキシについてはこちらのサイトがわかりやすかったです(https://qiita.com/maip0902/items/2fae4944e0115b40dcdc

※upsteamディレクティブについて

https://qiita.com/mby/items/9ece46893b0967c2296d

※defaultファイルにあるproxy_set_headerはアクセス元のIPアドレスやホスト情報を知りたい場合に使います。今回は知る必要がないので書いていません

※nodejsアプリをアップロード先がvar/www/html/appとした場合は、locationディレクティブ外のrootを直す必要があります。↓

root /var/www/html # デフォルトの状態
root /var/www/html/app # 変更後

ーーーーー

追加したら設定を反映させるために一度nginxを再起動(もしくはリロード)します(重要!)

$ systemctl restart nginx
$ sudo nginx reload

ーーーーー

※リロードとリスタートの違い

リロードは設定ファイルの変更を反映させますが、ファイル自体がおかしくて反映できない場合でも、エラーを吐くことなく続行します。

一方でリスタートは設定ファイルの変更が正常に終了しなかった場合、nginxが停止します。これはsystemctl status nginxで確認できます。

ーーーーー

これで、http://160.xxx.xxx.xxxにアクセスできるはずです。

(https://blog.nishi.network/2023/02/20/nginx-reverse-proxy-issue/)

永続起動

デプロイはできましたが、このままだと毎回サーバーを立ち上げてnode app.jsする必要があります。

しなくても済むようにNode.jsのプロセスをデーモン化させます。

まずはforeverというパッケージをインストールします。

1  npm install -g forever
2  npm install forever

次にForeverでサーバーを立ち上げます

グローバルインストールしない場合はパスが通っていないことに留意して下さい。

1  forever start ./bin/www
2  ./node_modules/forever/bin/forever start ./bin/www

ーーーーー

※デーモン化についてはforeverを使わずともsystemctlでもできるようです(https://pswork.jp/nodejs/ubuntu-nginx/

参考サイト

https://knmts.com/become-engineer-16/

BACK