You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ubuntu部署NextJS遇502错误,pm2提示.next目录不存在但实际存在

Next.js部署后502 Bad Gateway及.build目录检测异常排查

问题现象

在Ubuntu服务器部署Next.js应用后,执行pm2 start npm --name myapp -- start启动应用,PM2状态显示为online,但浏览器访问时出现502 Bad Gateway nginx/1.18.0 (Ubuntu)错误。查看PM2日志,发现循环输出以下错误:

1|myapp  | > sample-app-nodejs@1.0.0 start
1|myapp  | > next start
1|myapp  | ready - started server on 0.0.0.0:3000, url: http://localhost:3000
1|myapp  | Error: Could not find a production build in the '/var/www/myapp/.next' directory. Try building your app with 'next build' before starting the production server.

已在应用目录执行npm run build,且目录列表显示存在.next文件夹,目录结构如下:

total 1008
  4 drwxrwxrwx  14 root   root     4096 Sep 22 11:56 .
  4 drwxr-xr-x   4 root   root     4096 Sep 22 11:02 ..
  4 -rwxrwxrwx   1 root   root      623 Sep 22 11:01 .env.example
  4 drwxrwxrwx   8 root   root     4096 Sep 22 11:01 .git
  4 -rwxrwxrwx   1 root   root     1609 Sep 22 11:01 .gitignore
  4 drwxrwxrwx   5 root   root     4096 Sep 22 12:02 .next
  ...(剩余目录内容略)

.next目录内容:

4 drwxrwxrwx  5 root   root    4096 Sep 22 12:02 .
 4 drwxrwxrwx 14 root   root    4096 Sep 22 11:56 ..
 4 -rw-rw-r--  1 ubuntu ubuntu   749 Sep 22 12:02 build-manifest.json
 4 drwxrwxr-x  4 ubuntu ubuntu  4096 Sep 22 11:43 cache
 ...(剩余目录内容略)

当前Nginx配置:

server {
    listen 80;
    server_name MY_UBUNTU_IP_ADDRESS_IS_HERE
    
    gzip on;
    gzip_proxied any;
    gzip_types application/javascript application/x-javascript text/css text/javascript;
    gzip_comp_level 6;
    gzip_buffers 16 8k;
    gzip_min_length 256;
    
    location /_next/static/ {
        alias /var/www/myapp/.next/static/;
        expires 365d;
        access_log off;
    }
    
    location / {
        proxy_pass http://127.0.0.1:3000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
}

排查与解决方案

1. 修复Nginx配置语法错误

当前Nginx配置中server_name行末尾缺少分号,这会导致Nginx无法正确加载配置,进而引发502错误。

  • 修改配置,在server_name MY_UBUNTU_IP_ADDRESS_IS_HERE后添加分号:
    server_name MY_UBUNTU_IP_ADDRESS_IS_HERE;
    
  • 验证配置并重启Nginx:
    sudo nginx -t
    sudo systemctl restart nginx
    

2. 指定PM2启动的工作目录

PM2启动时可能未在应用根目录执行,导致next start无法找到.next目录。

  • 启动时通过--cwd参数指定应用根目录:
    pm2 delete myapp
    pm2 start npm --name myapp --cwd /var/www/myapp -- start
    
  • 或者创建ecosystem.config.js配置文件(更持久的方式):
    module.exports = {
      apps : [{
        name: 'myapp',
        script: 'npm',
        args: 'start',
        cwd: '/var/www/myapp'
      }]
    }
    
    然后用配置文件启动:
    pm2 delete myapp
    pm2 start ecosystem.config.js
    

3. 修复.next目录权限问题

.next目录内的文件属主为ubuntu用户,若PM2以root用户运行,可能存在访问权限限制。

  • 修改.next目录及文件的属主为PM2运行用户(若PM2以root运行):
    sudo chown -R root:root /var/www/myapp/.next
    
  • 或者切换到ubuntu用户启动PM2:
    sudo -u ubuntu pm2 start npm --name myapp --cwd /var/www/myapp -- start
    

4. 验证Next.js服务是否正常监听

执行以下命令确认3000端口是否被正确监听:

netstat -tulpn | grep 3000

若未找到监听记录,说明PM2启动的服务实际未正常运行,需结合PM2日志进一步排查构建文件完整性。


内容的提问来源于stack exchange,提问作者Moaz Ali

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 15:00:18