如何在无Node.js服务场景下通过Nginx部署Next.js应用
Next.js 纯Nginx部署实现方案
纯Nginx无法直接运行依赖Node.js运行时的Next.js动态能力,仅能托管静态导出模式生成的纯静态文件,具体操作步骤如下:
- 配置Next.js开启静态导出
编辑项目根目录下的next.config.js/next.config.mjs,添加静态输出配置,关闭不兼容静态模式的默认图片优化:/** @type {import('next').NextConfig} */ const nextConfig = { output: 'export', images: { unoptimized: true, }, trailingSlash: true, // 可选,适配Nginx路径匹配规则,避免路由跳转异常 } module.exports = nextConfig注意:静态导出模式不支持SSR、ISR、API路由、服务端Middleware、依赖服务端运行时的动态组件/逻辑,相关功能需要改造为纯静态客户端逻辑才能正常运行。
- 构建生成静态文件
在项目根目录执行构建命令:
构建完成后,项目根目录会生成npm run build # 若使用yarn/pnpm,对应执行yarn build / pnpm buildout目录,内为所有可直接托管的静态资源。 - 上传静态文件到服务器
将本地生成的out目录完整上传到服务器静态资源路径,例如/var/www/next-blog/out,并给Nginx运行用户分配读取权限:sudo chown -R www-data:www-data /var/www/next-blog/out sudo chmod -R 755 /var/www/next-blog/out - 修改Nginx配置
替换原有反向代理规则为静态文件托管规则,同时适配Next.js客户端路由刷新404问题,保留原有Certbot生成的HTTPS配置即可,完整配置参考:server { if ($host = example.com) { return 301 https://$host$request_uri; } # managed by Certbot server_name example.com; return 301 https://example.com$request_uri; } server { listen 443 ssl; server_name example.com; ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; # managed by Certbot ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; # managed by Certbot include /etc/letsencrypt/options-ssl-nginx.conf; ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # 静态资源根目录指向上传的out文件夹 root /var/www/next-blog/out; index index.html; # 静态资源缓存规则 location ~* \.(?:css|js|woff2?|ttf|eot|png|jpg|jpeg|gif|ico|svg|webp)$ { expires 1y; add_header Cache-Control "public, immutable"; try_files $uri =404; } # 适配客户端路由,所有未匹配到静态文件的请求统一回退到index.html location / { try_files $uri $uri.html $uri/ /index.html; } } - 校验并重载Nginx配置
执行以下命令校验配置合法性,重载后即可生效,无需启动任何Node.js服务:sudo nginx -t sudo systemctl reload nginx
内容的提问来源于stack exchange,提问作者Park JongIk
相关产品推荐
相关产品推荐

