ConohaVPSにデプロイする前にすること
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/)