実現したいこと
forever を使用し、SSH切断後も正常にDBへの接続・情報取得を行いたい
前提
※ 文面に不備・不適合な説明がありましたら、ご容赦下さいませ。
現在、node.js、express、React、mariadb の環境で、Webアプリを作成しております初心者です。
上記環境でサンプルWebアプリを作成し、テスト環境で実行する事が出来ました。
その後、buildし本番環境(実際には本番前の確認)を行っていたところ、
SSH接続を切断すると、buildしたアプリからアクセス・実行出来なくなりましたため、こちらの質問に至りました。
発生している問題・エラーメッセージ
実際に出ているエラーは、コンソール上では確認出来ません(エラーが出ておりません)
該当のソースコード
directory
1back 2 ├ node_modules 3 ├ app.js 4 ├ package-lock.json 5 └ package.json 6 7front 8 ├ dist 9 ├ node_modules 10├ package-lock.json 11├ package.json 12└ webpack.config.js
back/app.js
1const express = require('express'); 2const bodyParser = require('body-parser'); 3const app = express(); 4const multer = require('multer'); 5const iconv = require('iconv-lite'); 6const Papa = require('papaparse'); 7 8const allowedOrigins = ['http://localhost:3000', 'https://domain.com']; 9app.use((req, res, next) => { 10 const origin = req.headers.origin; 11 if (allowedOrigins.includes(origin)) { 12 res.setHeader('Access-Control-Allow-Origin', origin); 13 } 14 res.setHeader('Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content-Type, Accept'); 15 res.setHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE'); 16 res.setHeader('Access-Control-Allow-Credentials', true); 17 next(); 18}); 19 20const mariadb = require('mariadb'); 21const pool = mariadb.createPool({ 22 host: 'localhost', 23 user: 'root', 24 password: 'PASSWORD', 25 database: 'DBNAME', 26 connectionLimit: 200 27}); 28 29app.use(bodyParser.json()); 30app.post('/api/search', (req, res) => { 31 〜〜 省略 〜〜 32}); 33 34const storage = multer.memoryStorage(); 35const upload = multer({ storage: storage }).single('csv'); 36app.post('/upload', upload, async (req, res) => { 37 〜〜 省略 〜〜 38}); 39 40app.listen(8080, () => console.log('Example app listening on port 8080!'))
back/package.json
1{ 2 "name": "back", 3 "version": "1.0.0", 4 "description": "", 5 "main": "index.js", 6 "scripts": { 7 "test": "echo \"Error: no test specified\" && exit 1" 8 }, 9 "keywords": [], 10 "author": "", 11 "license": "ISC", 12 "devDependencies": { 13 "nodemon": "^2.0.22" 14 }, 15 "dependencies": { 16 "body-parser": "^1.20.2", 17 "express": "^4.18.2", 18 "iconv": "^3.0.1", 19 "mariadb": "^3.1.1", 20 "multer": "^1.4.5-lts.1", 21 "mysql2": "^3.2.0", 22 "papaparse": "^5.4.1" 23 } 24}
front/package.json
1{ 2 "name": "front", 3 "version": "1.0.0", 4 "description": "", 5 "main": "index.js", 6 "scripts": { 7 "start": "webpack-dev-server --mode development", 8 "build": "webpack --mode production" 9 }, 10 "keywords": [], 11 "author": "", 12 "license": "ISC", 13 "devDependencies": { 14 "@babel/core": "^7.21.3", 15 "@babel/preset-env": "^7.20.2", 16 "babel-loader": "^9.1.2", 17 "css-loader": "^6.7.3", 18 "html-webpack-plugin": "^5.5.0", 19 "style-loader": "^3.3.2", 20 "webpack": "^5.76.2", 21 "webpack-cli": "^5.0.1", 22 "webpack-dev-server": "^4.13.1" 23 }, 24 "dependencies": { 25 "@babel/preset-react": "^7.18.6", 26 "@shopify/polaris": "^10.38.0", 27 "encoding-japanese": "^2.0.0", 28 "exceljs": "^4.3.0", 29 "iconv-lite": "^0.6.3", 30 "papaparse": "^5.4.1", 31 "react": "^18.2.0", 32 "react-dom": "^18.2.0", 33 "react-scripts": "^5.0.1" 34 } 35}
front/webpack.config.js
1const path = require("path"); 2const HtmlWebpackPlugin = require("html-webpack-plugin"); 3 4module.exports = { 5 mode: "development", // production <-> development 6 entry: path.resolve(__dirname, "./src/index.js"), 7 module: { 8 rules: [ 9 { 10 test: /\.(js|jsx|ts|tsx)$/, 11 exclude: /node_modules/, 12 use: [ 13 { 14 loader: "babel-loader", 15 }, 16 ], 17 }, 18 { 19 test: /\.(scss|css)$/, 20 use: ["style-loader", "css-loader"], 21 }, 22 ], 23 }, 24 output: { 25 path: path.resolve(__dirname, "dist"), 26 filename: "bundle.js", 27 }, 28 resolve: { 29 extensions: ["*", ".js", ".jsx", ".ts", ".tsx", ".json"], 30 }, 31 plugins: [ 32 new HtmlWebpackPlugin({ 33 template: "./src/index.html", 34 }), 35 ], 36 devServer: { 37 static: { 38 directory: path.join(__dirname, "dist"), 39 }, 40 port: 3000, 41 }, 42};
試したこと
上記でbuildを行ったところ、正常に稼働しましたので、そのまま実際の使用を試すために公開ディレクトリへアップロードしました。
動作を確認すると、正常にDBの情報を取得出来ますが、SSH接続を切断するとDBの情報を取得することが出ませんでした。
そこで、express 常駐化の forever 利用の情報を得て、forever 導入し $ forever start app.js を実行。
$ forever list
info: Forever processes running
data: uid command script forever pid id logfile uptime
data: [0] mgML /usr/local/bin/node app.js 358560 358568 /home/USERNAME/.forever/mgML.log 0:0:0:13.745
と、正常に稼働している様子です。
ここでSSHを切断すると、DBへのアクセスが出来ず、情報が取得出来ません。
再度、SSH接続すると、DBとの接続が正常になり、情報を取得する事が出来ます。
express のサーバーが落ちているのかと思い、$ forever list を確認すると、
$ forever list
info: Forever processes running
data: uid command script forever pid id logfile uptime
data: [0] mgML /usr/local/bin/node app.js 358560 358568 /home/USERNAME/.forever/mgML.log 0:0:2:54.126
と、uptime は正常に経過しており、サーバーダウン等の問題では無い様子です。
他の常駐情報を調べ、
<Ctrl + Z>
$ bg
$ disown
のコマンドも試しましたが、上記と同様(SSH切断するとDBの情報が取得出来ない)の状態に変化は御座いません。
ポートの競合かと思いポートも確認しましたが、競合が確認出来ず、何が原因なのかが不明で行き詰まっている状態です。
原因として、何が考えられますでしょうか。
解決方法が御座いませんでしょうか。
初歩的な問題・質問かと思いますが、ご教授いただければ幸いです。
何卒、よろしくお願いいたします。
補足情報(FW/ツールのバージョンなど)
Server:Xserver VPS
Node.js:v18.15.0
$ npm ls
body-parser:1.20.2
express:4.18.2
iconv:3.0.1
mariadb:3.1.1
multer:1.4.5-lts.1
mysql2:3.2.0
nodemon:2.0.22
papaparse:5.4.1
0 コメント