我需要将Next.js应用程序部署到支持Node.js的共享托管提供程序。 Next.js官方文档说您(仅?)需要在服务器上运行next start
(我想通过SSH)。
build
版本,还是需要通过ssh在服务器上运行build命令?npm start
确实是构建准备就绪后我唯一需要做的事情吗?我有点担心服务器由于某种原因而停止运行并且该站点出现故障。我在Google上搜索了很多,发现有人提到使用pm2
(请参阅freeCodeCamp上的this文章。)但是不确定Next.js是否在生产中自动重启服务器?答案 0 :(得分:2)
您可以在这里找到非常有用的讨论: https://github.com/vercel/next.js/discussions/12234
我发现缺少使用 cPanel 部署到共享主机的信息,所以经过多次反复试验,我希望这对那些正在使用 Nextjs 部署到 自定义服务器 的人有所帮助,因为它在 Vercel 中提到文档,在这种情况下是共享托管。
根据我在托管服务器上运行 npm run build
的经验,由于共享托管服务器中提供的有限的虚拟内存,有时会导致 build errors
。
因此,解决方法很简单,在您的本地机器上执行构建,然后将您机器上创建的 .next
文件夹复制到托管服务器上项目的根文件夹。
我不需要“pm2”或“nginx”来运行 Nextjs 项目。这相当简单,只需将 package.json
、'server.js' 和 .next
复制到项目的根文件夹中,就可以了。 (参见下面的 server.js 内容)
(您可以将其命名为 server.js 或 app.js 或 index.js 或任何您想要的名称,只要它与您在 cPanel 中对 Node 应用程序的定义一致即可)。 这是服务器启动文件所需的最少代码:
const { createServer } = require("http");
const { parse } = require("url");
const next = require("next");
const dev = process.env.NODE_ENV !== "production";
const port = !dev ? process.env.PORT : 3000;
// Create the Express-Next App
const app = next({ dev });
const handle = app.getRequestHandler();
app
.prepare()
.then(() => {
createServer((req, res) => {
const parsedUrl = parse(req.url, true);
const { pathname, query } = parsedUrl;
handle(req, res, parsedUrl);
console.log("pathname", pathname);
}).listen(port, (err) => {
if (err) throw err;
console.log(`> Ready on http://localhost:${port}`);
});
})
.catch((ex) => {
console.error(ex.stack);
process.exit(1);
});
答案 1 :(得分:1)
在服务器上,您可以这样做,当然,您应该具有pm2(npm install -g pm2)和nginx的配置,以代理将要运行下一个服务器的端口,例如6060(添加到nginx。 conf / server / location此行:proxy_pass http:// localhost:6060),然后:
要使pm2自动重新启动,请运行:pm2 startup systemd,pm2将产生一行,您应复制该行并运行它。
在共享主机上,现在有很多提供程序支持运行nodejs应用程序,但是我不知道他们是否可以运行nextjs应用程序,例如,在plesk中,您可以通过配置app.js路径和项目文件夹路径,公共文件夹来配置运行nodejs应用程序路径等,但是对于下一个应用程序,您没有要运行的app.js,而是用于启动下一个服务器的脚本。无论如何,您都可以尝试:)
或者您可以简单地转移到vps,它的价格现在相当便宜,并且您可以使用自己的服务器做很多事情(Google Compute Engine提供免费的东西-几乎免费一年)