【发布时间】:2021-04-23 15:20:00
【问题描述】:
我在 cPanel 上托管一个 node.js 应用程序。它只不过是使用包含 CRUD 的 express 的简单 RESTful Web API。我面临的问题是进程的数量随着时间的推移而增加,这意味着以前的一些进程永远不会结束,应用程序会不断添加,直到我的服务器达到资源限制并且所有应用程序停止工作。
cPanel 实际上没有办法console.log() 我在应用程序内部编写代码要执行的任何错误。我所能看到的只是流程产生的主要域。
我尝试为此编写自己的日志文件,但这也无济于事
我在我的终端中写这个来检查进程ps -ef | grep node(因为我知道所有的进程都只是 node.js 进程)。我注意到我可以在此命令中看到的进程数量与我在 cPanel 仪表板中看到的不同(少得多)!
更新:
例如,这是造成问题的 API 之一:
我的app.js(入口点):
require("dotenv").config();
const fs = require("fs");
const path = require("path");
const express = require("express");
const bodyParser = require("body-parser");
const morgan = require("morgan");
const cors = require("cors");
const mongoose = require("mongoose");
// Initialize the app
const app = express();
// Enable CORS
app.use(cors({ origin: true }));
// create a write stream (in append mode)
var accessLogStream = fs.createWriteStream(path.join(__dirname, 'access.log'), { flags: 'a' })
// setup the logger
app.use(morgan('combined', { stream: accessLogStream }))
// Parse the body to JSON
app.use(bodyParser.json());
// Serving static files
app.use("/images", express.static("images"));
// Routes middlewares go here!
app.use("/api/categories", require("./routes/category-routes"));
app.use("/api/users", require("./routes/user-routes"));
app.use("/api/sellers", require("./routes/seller-routes"));
app.use("/api/services", require("./routes/service-routes"));
app.use("/api/resellers", require("./routes/reseller-routes"));
app.use("/api/support", require("./routes/support-routes"));
app.use("/api/trackings", require("./routes/tracking-routes"));
app.use((err, req, res, next) => {
console.log(err);
res
.status(500)
.send({ success: false, error: err, errors: ["Something went wrong"] });
});
// Start listening finally
const port = process.env.PORT || 5000;
mongoose
.connect(process.env.MONGO_URI, {
// .connect(process.env.MONGO_URI_NAI_NAI_NAI, {
useNewUrlParser: true,
useUnifiedTopology: true,
useFindAndModify: false,
})
.then(() => {
app.listen(() => {
console.log(`Server started on port ${port}`);
});
})
.catch((err) => {
try {
fs.appendFileSync("my-own-log-file.txt", `\n\n${err}`);
} catch (err) {
console.log(err);
}
process.exit(1)
console.log(err);
});
我在这里注册路线:
// @route POST /api/services/filtered-by-state
// @desc To fetch all services filtered by state
// @access public
router.post(
"/filtered-by-state/",
body("state")
.trim()
.not()
.isEmpty()
.withMessage("Please enter choose a state"),
checkValidity,
serviceControllers.getServicesFilteredByState
);
这是控制器:
exports.getServicesFilteredByState = (req, res) => {
let page = req.query.page || 1;
const { state, sellerId } = req.body;
let options = {};
if (page) {
page = parseInt(page);
}
if (state === "Australia Wide") {
options = { state }; // Look for only documents where state is 'Australia wide'
} else {
// Look for documents where state is 'Australia wide' or ```state``` itself
options = { state: { $in: ["Australia Wide", state] } };
}
if (!sellerId) {
options.isHidden = false;
}
let totalItems = 0;
Service.find(options)
.countDocuments()
.then((numServices) => {
totalItems = numServices;
return Service.find(options)
.sort("sortingOrder")
.populate("sellerId")
.populate("categoryId");
// .skip((page - 1) * ITEMS_PER_PAGE)
// .limit(ITEMS_PER_PAGE);
})
.then((foundServices) => {
res.status(200).json({
success: true,
totalItems,
services: foundServices,
});
})
.catch((err) => {
console.log(err);
res.status(500).status("Something went wrong");
});
};
这是简单的 CRUD!
【问题讨论】:
-
您是否尝试过使用例如 pm2 运行应用程序?它会自动写入一个可能对您有帮助的日志
-
感谢您的建议,我实际上使用 pm2 启动了我的应用程序,但我不知道在哪里可以检查此特定应用程序有多少进程。它向我展示了一些基本的东西,比如 cpu mem 使用和正常运行时间等,你能帮我看看我的应用程序的进程数吗?
-
我不确定我是否了解数字进程是如何准确增加的。是他们在重新启动期间没有被杀死还是只是随机产生?我的期望是,一个简单的 RESTful API 在启动后不应该真正产生任何新进程。
-
@TayyabFerozi 能否分享一下你创建的进程和增加的进程的截图
-
@aRvi 当我向他们的支持团队询问他们如何定义
number of processes时,他们回答说:“进程是您的计算机进行的计算,因此进程数将是您的计算机可以进行的计算数同时制作”。这里是你想要的图片:imgur.com/a/4xQp5AB
标签: node.js express hosting cpanel web-hosting