NodeJS 将Next.js部署到共享主机

zqdjd7g9  于 2023-03-17  发布在  Node.js
关注(0)|答案(4)|浏览(183)

我需要部署一个Next.js应用程序到一个支持Node.js的共享主机提供商。官方Next.js文档说你(只有?)需要在服务器上运行next start(我猜是通过SSH)。
1.我需要只部署build版本,还是需要通过ssh在服务器上运行build命令?
1.运行npm start真的是构建完成后我唯一需要做的事情吗?我有点担心服务器会因为某种原因停止运行,网站会宕机。我搜索了很多次,发现有人提到使用pm2(参考freeCodeCamp上的this文章)。但不确定Next.js是否会在生产时自动重启服务器?

ijnw1ujt

ijnw1ujt1#

在服务器上,你可以这样做,当然你应该让pm2(npm install -g pm2)和config for nginx to proxy传递你的下一个服务器将要运行的端口,例如6060(添加到nginx.conf/server/location这一行:代理传递http://localhost:6060),然后:
1.上传源文件夹(pages、public、src、package.json)-例如,将您的文件夹上传到/var/www/your-folder等位置
1.更改名称:sudo chown -R $用户:$USER /var/www/您的文件夹

  1. cd到你的文件夹并运行:国家预防机制-i
    1.然后编辑package.json并更改“next start -p your-port”,例如6060
  2. npm运行构建
    1.运行pm2(在你的文件夹中):pm2 start“npm运行启动”--随意命名项目
    要使pm2自动重启,请运行:pm2启动systemd,pm2将生成一行,您应该复制该行并运行它。
    在共享主机上,现在有很多提供商支持运行nodejs应用程序,但我不知道他们是否可以运行nextjs应用程序,例如在plesk中,您可以通过配置app.js路径和项目文件夹路径,公共文件夹路径等来配置运行nodejs应用程序,但对于下一个应用程序,您没有app.js来运行,但有一个脚本来启动下一个服务器。无论如何,您可以尝试:)
    或者你可以简单地转移到一个vps,它的价格现在相当便宜,你可以做很多事情与自己的服务器(谷歌计算引擎是免费的东西-几乎免费一年)
xtfmy6hx

xtfmy6hx2#

你可以在这里找到一个非常有帮助的讨论:https://github.com/vercel/next.js/discussions/12234
我发现缺少关于使用cPanel部署到共享主机的信息,所以在经历了许多尝试和错误之后,我希望这能帮助那些正在使用Nextjs部署到自定义服务器的人,就像Vercel文档中提到的那样,在这种情况下是共享主机。
1.构建
根据我在托管服务器上运行npm run build的经验,有时会导致build errors,这是由于共享托管服务器提供的有限的虚拟内存。因此,一个简单的解决方案是,在您的本地计算机上执行构建,只需将在您的计算机上创建的.next文件夹复制到托管服务器上您的项目的根文件夹。
1.更简单的部署
我不需要'pm2'或'nginx'来运行Nextjs项目。它是相当直接的,只需复制package.json,'server.js'和.next到您的项目的根文件夹,你就可以开始了。(见下面的server.js内容)
1.服务器启动程序文件
(you可以将其命名为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);
  });
q5iwbnjs

q5iwbnjs3#

在package.json文件中,您可以创建:

"scripts": {
    "dev": "next dev",
    "build": "next build",
    "start": "next start",
    "lint": "next lint",
    "export": "yarn build && next export"
},

并运行:
Yarn出口
然后,在out文件夹中,你可以通过filezila传递所有的文件,就像上面的图片

到主机上的文件夹

8iwquhpp

8iwquhpp4#

高级别后续行动:根据我读到的其他回复,似乎有些东西正在丢失,所以我们不要因为树木而失去森林。
如果您的应用只使用nextjs的前端部分,那么无论主机是否提供nodejs,它都可以在共享主机上运行,因为build命令使其可以部署在任何可以提供HTML的服务器上。
如果你的应用使用了nextjs的后端服务器,这时你就需要一个兼容版本的nodejs在你的主机上运行,如果你没有使用它们,也应该没问题,因为它基本上就像React一样。
我已经部署了几个React(CRA)应用程序到我的共享主机后,构建和他们都工作正常。主机是一个古老的廉价共享主机运行cloudlinux 6(想想:Linux内核~3.10)并且不提供nodejs后端,只提供Apache Web服务器。
如果他们使用后端服务器(例如nextjs、app.js),我将nextjs应用程序部署到HyperExpert托管的VPS-它们提供了一个空白的操作系统(我的是Ubuntu 20.04 ATM)。它要求你设置自己的代理服务器(例如nginx)和Web服务器(例如lightthttpd、Apache或nginx都可以),但是您可以更灵活地决定使用什么。
在VPS上,你也可以通过docker、podman、systemd-container等将你的应用打包成容器,这可以帮助在更新的情况下使重新部署更干净,并帮助安排时间,比如将你的应用作为服务运行和限制资源。

重要信息:我认为这就是人们迷失的地方
无论是哪种情况,* 您始终需要在本地运行构建命令,以准备应用程序进行部署。*

然后你只需要把生成的文件夹(例如.next)上传到你的主机,为它创建一个自己的文件夹,你就可以在浏览器中打开mydomain.com/folderyouuploaded了。
提示:如果你的名字开头没有.,它将不会被隐藏。例如,在上传之前运行mv .next myappnamev1.0.0
大多数人也会通过你的域名使用一个子域(myapp.mydomain.com)来指向你上传的文件夹中包含index.html的文件夹。这通常是在cPanel中完成的,或者任何你共享主机的面板类型。

除非你想在开发者模式下运行你的应用,否则你永远不应该运行npm i(我想不出在主机上这样做的好理由)。

如果你想把它容器化,那就有点麻烦了,但最终还是会有回报的。使用toolbox这样的工具,或者如果你使用tar.gz systemd-container,你甚至可以在容器中编辑文件,这在某些情况下肯定会很有帮助(想想:您希望避免整个容器重新部署的小调整)。
如果你的应用发展得足够大,我会推荐CI/CD管道,但这超出了这个答案的范围。

相关问题