[vercel/next.js]如何在生产服务器中部署NextJs项目?

2024-05-15 681 views
7

您好,我使用 NextJs 创建我的项目,它已准备好用于生产,但我有点困惑我们如何托管我已经运行以下命令的项目

npm run build
npm run start

现在我不确定我们需要上传哪个文件夹到服务器,我们需要上传完整的项目还是只上传 .next 文件夹,您可以帮助我吗?如何托管 NextJs 应用程序。

提前致谢。

回答

7

此链接可能对您有用。

这非常简单!首先,您希望 Nodejs 知道它正在生产中运行。因此,您可以像这样在生产环境中运行该应用程序NODE_ENV=production npm run start

但是您可以进行一些增强,以使您的服务器更好地做好生产准备。使用压缩或快速代理(例如 nginx)会做很多额外的工作,使服务器更快、更小。

1

看起来“下一个导出”在“out”文件夹上创建/导出静态页面,我想将其部署到 nginx,这是在生产服务器中部署它的正确方法吗?或者我在这里遗漏了什么吗?顺便说一句,我们正在使用 nodejs/mongodb 作为 api/后端。我不知道为什么我们有“下一个构建”以及“下一个导出”和“下一个构建”之间有什么区别。

7

只需将“导出”任务添加到 package.json 并运行“npm run-script prod”或您命名的任何名称即可。它会生成一个“out”文件夹,其中包含您需要的所有内容。只需将“out”文件夹中的内容复制到您的服务器即可。

包.json

"scripts": { "dev": "next", "build": "next build", "start": "next start", "prod": "next export" },

5

下一个导出是使用 nginx 在生产中运行下一个构建的唯一方法吗?

1

嘿,我对 next.js 很陌生,我正在尝试将我的项目部署到 Windows Web 服务器。我已经安装了node和iisnode,但我真的不知道如何让它工作。

4

@rezaHashemi8139 你能在 iis 上部署下一个 js 应用程序吗?

4

这个官方页面关于在生产中运行 Next.js 的内容非常薄弱。

例如:如何启用访问日志?是否需要前端 Web 服务器 (nginx)?为什么/为什么不?有哪些权衡?在 Kubernetes 中运行 next.js 的参考架构是什么?

有人可以向我指出有关这些主题的任何文献吗?

7

@timneutkens 您链接的自托管文档表示,要将混合页面节点服务器部署到生产环境,您应该“可能将 .next、node_modules 和 package.json 复制到您的服务器”。

这里的“潜在”是什么意思?特别是,什么决定了何时node_modules需要?我的node_modules文件很大,将其复制到服务器似乎无法达到 Webpack 的 tree-shaking 的目的,所以我想知道是否有办法解决这个问题。

1

您的项目依赖的所有node_modules都需要安装,包括next。树摇动应用于客户端捆绑,而不是服务器端。服务器端所有的node_modules都被标记为外部的。

0

感谢您及时的回复!新serverless目标是否可以解决这个问题并在服务器上拥有较小的版本?

3

取决于您的部署方式,使用无服务器,您必须将每个页面部署为单独的功能(而不是一台服务器),否则它将否定无服务器目标的优化

8

这是我部署 Next.JS 应用程序的方法,也许会对某人有所帮助。

这是我的 bash 脚本,它正在运行Jenkins以构建必要的文件

rm -rf $WORKSPACE/my-nextjs-project
git clone git@gitlab.com:me/my-nextjs-project.git $WORKSPACE/my-nextjs-project

cd $WORKSPACE/my-nextjs-project
git checkout master

yarn install
yarn build

mkdir my-nextjs-project

mv public/ my-nextjs-project/

NEXT_BUILD_ID=$(cat build/BUILD_ID)
LAST_COMMIT=$(git rev-parse HEAD)

# That's just for debugging purposes
echo "{git: ${LAST_COMMIT}, ci: ${BUILD_ID}, next: ${NEXT_BUILD_ID}}" > my-nextjs-project/CI

# trim package.json and leave only things that you need in production
cat package.json | jq '. | {name: .name, private: true, version: .version, scripts: {start: .scripts.start}, dependencies: .dependencies}' > my-nextjs-project/package.json

# I'm using next-compose-plugins, so here we need to dump config. If you have next.config.js as an object then just copy config file 
NEXT_CONFIG=$(node -e 'var configFile = require("./next.config.js"); var config = configFile([], {}); delete config.webpack; console.log(JSON.stringify(config));')
echo "module.exports = ${NEXT_CONFIG}" > my-nextjs-project/next.config.js # result => {distDir: "build", poweredByHeader: false}

mv build my-nextjs-project/

cd my-nextjs-project

yarn install 

cd $WORKSPACE/my-nextjs-project

# dump folder tree structure just for Jenkins console output logs
tree -h -L 1 build/

tar czf $WORKSPACE/my-nextjs-project.tar.gz my-nextjs-project
cd $WORKSPACE

rm -rf $WORKSPACE/my-nextjs-project

将结果上传到您的服务器(scp例如,将您的客户端 ssh 密钥添加到.ssh/authorized_keys服务器端以绕过密码验证),解压上传的存档(例如/var/www/my-nextjs-project)并运行它。

您可以将节点应用程序安装为systemd服务。这是我的/etc/systemd/system/nextjs.service

[Unit]
Description=My Next.JS app

[Service]
ExecStart=node ./node_modules/.bin/next start -p 6200
Restart=always
User=www-data
Group=www-data
Environment=PATH=/usr/bin:/usr/local/bin
Environment=NODE_ENV=production
WorkingDirectory=/var/www/my-nextjs-project
StandardOutput=append:/var/log/www/my-nextjs-project/common.log
StandardError=inherit

[Install]
WantedBy=multi-user.target

既然现在是一项服务,您可以sudo systemctl start|stop|restart nextjs

我使用 Java 作为我的项目的 API,因此我将nginxAPI 请求路由到 Java。 Next.js 在 port 上运行6200,Java 在62000.

server {
    listen 80;
    server_name my-nextjs-project.com www.my-nextjs-project.com;

    access_log /var/log/nginx/my-nextjs-project/access.log;
    error_log /var/log/nginx/my-nextjs-project/error.log;

    root /var/www/my-nextjs-project/public;

    location / {
        proxy_pass              http://localhost:6200;
        proxy_set_header        X-Real-IP $remote_addr;
        proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header        Host 127.0.0.1;
    }

    location ~ ^/api/v1/ {
        proxy_pass              http://localhost:62000; # Pass API calls to Java api
        proxy_set_header        X-Real-IP $remote_addr;
        proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header        Host 127.0.0.1;
    }
}

非常有爱❤️

3

我如何访问.next/serverVercel?

我有一个package.json像这样的脚本:

{
 "export": "next export",
 "build": "next build && npm run export && npm run build:rss",
 "build:rss": "node ./.next/server/scripts/build-rss.js",
 "start": "next start",
}

它有build:rss指向./.next/server/scripts/build-rss.js但在 Vercel 上找不到它。如何在 Vercel 上正确指向它?我收到以下错误并且无法部署我的网站:

> node ./.next/server/scripts/build-rss.js
15:14:05.786 internal/modules/cjs/loader.js:968
15:14:05.786 throw err;
15:14:05.786 ^
15:14:05.786 Error: Cannot find module '/vercel/workpath0/.next/server/scripts/build-rss.js'
15:14:05.786 at Function.Module._resolveFilename (internal/modules/cjs/loader.js:965:15)
15:14:05.786 at Function.Module._load (internal/modules/cjs/loader.js:841:27)
15:14:05.786 at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:71:12)
15:14:05.786 at internal/main/run_main_module.js:17:47 {
6

答案是使用.serverless而不是.server因为 Vercel 有一个.serverless目录,所以我将build:rss脚本更改为:

{
 "export": "next export",
 "build": "next build && npm run export && npm run build:rss",
 "build:rss": "node ./.next/serverless/scripts/build-rss.js",
 "start": "next start",
}
5

@message 谢谢老兄!你救了我)