我需要部署一个Next.js应用程序到一个支持Node.js的共享主机提供商。官方Next.js文档说你(只有?)需要在服务器上运行next start
(我猜是通过SSH)。
1.我需要只部署build
版本,还是需要通过ssh在服务器上运行build命令?
1.运行npm start
真的是构建完成后我唯一需要做的事情吗?我有点担心服务器会因为某种原因停止运行,网站会宕机。我搜索了很多次,发现有人提到使用pm2
(参考freeCodeCamp上的this文章)。但不确定Next.js是否会在生产时自动重启服务器?
4条答案
按热度按时间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.然后编辑package.json并更改“next start -p your-port”,例如6060
1.运行pm2(在你的文件夹中):pm2 start“npm运行启动”--随意命名项目
要使pm2自动重启,请运行:pm2启动systemd,pm2将生成一行,您应该复制该行并运行它。
在共享主机上,现在有很多提供商支持运行nodejs应用程序,但我不知道他们是否可以运行nextjs应用程序,例如在plesk中,您可以通过配置app.js路径和项目文件夹路径,公共文件夹路径等来配置运行nodejs应用程序,但对于下一个应用程序,您没有app.js来运行,但有一个脚本来启动下一个服务器。无论如何,您可以尝试:)
或者你可以简单地转移到一个vps,它的价格现在相当便宜,你可以做很多事情与自己的服务器(谷歌计算引擎是免费的东西-几乎免费一年)
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应用程序定义一致即可)。以下是服务器启动器文件所需的最少代码:
q5iwbnjs3#
在package.json文件中,您可以创建:
并运行:
Yarn出口
然后,在out文件夹中,你可以通过filezila传递所有的文件,就像上面的图片
到主机上的文件夹
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管道,但这超出了这个答案的范围。