将React+Next.js的项目部署到服务器的方法

 更新时间:2025年03月11日 14:29:58   作者:low神  
本文详细介绍了将React+Next.js项目部署到服务器的步骤,包括服务器环境准备、项目配置与构建、启动服务、配置Nginx反向代理、HTTPS配置、验证与监控以及高级优化,感兴趣的朋友一起看看吧

一、服务器环境准备

1. 安装依赖 Node.js : · Next.js需要Node.js环境(建议使用LTS版本)。

 # Ubuntu示例 curl -fsSL https://deb.nodesource.com/setup_lts.x | sudo -E bash - sudo apt-get install -y nodejs 

· PM2 (进程管理工具,用于保持应用运行):

sudo npm install -g pm2 

· Nginx (可选,用于反向代理和静态资源处理):

sudo apt install 

· 2. nginx 配置防火墙 · 开放必要端口(如80、443、3000):

sudo ufw allow 80 /tcp sudo ufw allow 443 /tcp sudo ufw allow 3000 /tcp sudo ufw reload

二、项目配置与构建

1. 上传代码到服务器 · 通过Git克隆项目(确保服务器有访问仓库的权限):

git clone https://your-repo-url.git
cd your-project

也可手动上传代码压缩包并解压。

2.安装依赖并构建 · 安装依赖:

npm install --production

·环境变量配置: 在项目根目录创建或更新 .env.production 文件。构建时Next.js会读取该文件(变量需以 NEXT_PUBLIC_ 前缀暴露到客户端)。 · 构建项目:

npm run build

2. 启动Next.js服务

· 使用PM2启动:

pm2 start npm --name "next-app" -- start
pm2 save
pm2 startup

三、配置Nginx反向代理(推荐)

1. 创建Nginx配置文件 · 新建文件 /etc/nginx/sites-available/next-app ,内容如下:

server {
    listen 80;
    server_name your-domain.com; # 替换为公司内部域名或IP
    location / {
        proxy_pass http://localhost:3000; # 转发到Next.js服务
        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;
    }
    # 静态资源缓存(可选)
    location /_next/static {
        alias /path/to/your-project/.next/static;
        expires 365d;
        access_log off;
    }
}

2. 启用配置并重启Nginx

sudo ln -s /etc/nginx/sites-available/next-app /etc/nginx/sites-enabled/
sudo nginx -t  # 测试配置是否正确
sudo systemctl restart nginx

四、HTTPS配置(可选)

使用Let’s Encrypt申请证书(需公网域名)或公司内部CA签发。修改Nginx配置监听443端口并添加SSL证书路径:

server {
    listen 443 ssl;
    server_name your-domain.com;
    ssl_certificate /path/to/cert.pem;
    ssl_certificate_key /path/to/privkey.pem;
    # ...其他配置同上
}

五、验证与监控

1. 检查服务状态

pm2 status       # 查看PM2进程状态
systemctl status nginx  # 检查Nginx是否运行

2. 查看日志

pm2 logs next-app  # Next.js日志
journalctl -u nginx -f  # Nginx日志

六、高级优化(可选)

1. 使用Docker容器化部署 · 创建 Dockerfile :

FROM node:18-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install --production
COPY . .
RUN npm run build
CMD ["npm", "start"]

· 构建镜像并运行:

docker build -t next-app .
docker run -d -p 3000:3000 next-app

2. 配置CI/CD

· 通过Jenkins/GitLab CI自动触发部署脚本。

  • 环境变量 :确保生产环境变量(如API地址)正确配置,敏感信息不要提交到代码库。
  • 资源限制 :Node.js可能需调整内存限制,可在启动时添加 –max-old-space-size=4096 。
  • 备份与回滚 :部署前备份旧版本,便于快速回滚。

完成以上步骤后,访问服务器的IP或域名即可查看部署成功的应用。

完整部署脚本:

以下是为Node.js环境设计的完整部署脚本,包含依赖安装、项目构建、进程管理及Nginx反向代理配置,可直接保存为 deploy.sh 并执行:

#!/bin/bash
# 部署脚本:自动部署Next.js项目到本地服务器(Node.js环境)
# 使用方法:chmod +x deploy.sh && ./deploy.sh
# ----------------------------------
# 配置区(根据实际情况修改)
# ----------------------------------
PROJECT_NAME="my-next-app"       # 项目名称
PROJECT_PORT=3000                # Next.js服务端口
PROJECT_GIT_REPO="https://github.com/yourusername/your-repo.git"  # Git仓库地址
PROJECT_DIR="/var/www/$PROJECT_NAME"     # 项目部署目录
NGINX_AVAILABLE="/etc/nginx/sites-available/$PROJECT_NAME.conf"  # Nginx配置路径
NGINX_ENABLED="/etc/nginx/sites-enabled/$PROJECT_NAME.conf"      # Nginx启用链接
# ----------------------------------
# 颜色输出函数
# ----------------------------------
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[0;33m'
NC='\033[0m' # 恢复默认颜色
success() { echo -e "${GREEN}$1${NC}"; }
error() { echo -e "${RED}$1${NC}"; exit 1; }
warning() { echo -e "${YELLOW}$1${NC}"; }
# ----------------------------------
# 1. 安装依赖
# ----------------------------------
install_dependencies() {
    success "\n[1/6] 安装系统依赖..."
    # 安装Node.js(LTS版本)
    if ! command -v node &> /dev/null; then
        warning "未安装Node.js,正在安装..."
        curl -fsSL https://deb.nodesource.com/setup_lts.x | sudo -E bash -
        sudo apt-get install -y nodejs || error "Node.js安装失败"
    fi
    # 安装PM2
    if ! command -v pm2 &> /dev/null; then
        sudo npm install -g pm2 || error "PM2安装失败"
    fi
    # 安装Nginx(可选)
    if ! command -v nginx &> /dev/null; then
        warning "未安装Nginx,正在安装..."
        sudo apt install -y nginx || error "Nginx安装失败"
    fi
}
# ----------------------------------
# 2. 配置防火墙
# ----------------------------------
configure_firewall() {
    success "\n[2/6] 配置防火墙..."
    sudo ufw allow $PROJECT_PORT/tcp    # 开放Next.js端口
    sudo ufw allow 'Nginx Full'         # 开放HTTP/HTTPS
    sudo ufw reload
}
# ----------------------------------
# 3. 拉取项目代码
# ----------------------------------
clone_project() {
    success "\n[3/6] 拉取项目代码..."
    if [ -d "$PROJECT_DIR" ]; then
        warning "检测到已有项目目录,更新代码..."
        cd $PROJECT_DIR
        git pull || error "代码拉取失败"
    else
        sudo mkdir -p $PROJECT_DIR
        sudo chown -R $USER:$USER $PROJECT_DIR
        git clone $PROJECT_GIT_REPO $PROJECT_DIR || error "代码克隆失败"
        cd $PROJECT_DIR
    fi
}
# ----------------------------------
# 4. 安装依赖并构建
# ----------------------------------
build_project() {
    success "\n[4/6] 安装依赖并构建..."
    npm install --production || error "依赖安装失败"
    # 检查环境变量文件是否存在
    if [ ! -f .env.production ]; then
        warning "检测到缺少 .env.production 文件,请手动创建!"
        touch .env.production
    fi
    npm run build || error "项目构建失败"
}
# ----------------------------------
# 5. 启动PM2进程
# ----------------------------------
start_pm2() {
    success "\n[5/6] 启动PM2进程..."
    # 检查是否已存在同名进程
    if pm2 list | grep -q $PROJECT_NAME; then
        pm2 reload $PROJECT_NAME || error "PM2进程重启失败"
    else
        pm2 start npm --name "$PROJECT_NAME" -- start || error "PM2进程启动失败"
    fi
    pm2 save
    pm2 startup  # 提示用户执行生成的命令以设置开机启动
}
# ----------------------------------
# 6. 配置Nginx反向代理
# ----------------------------------
configure_nginx() {
    success "\n[6/6] 配置Nginx反向代理..."
    sudo bash -c "cat > $NGINX_AVAILABLE << EOF
server {
    listen 80;
    server_name _;  # 替换为实际域名或IP
    location / {
        proxy_pass http://localhost:$PROJECT_PORT;
        proxy_set_header Host \$host;
        proxy_set_header X-Real-IP \$remote_addr;
        proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto \$scheme;
    }
    # 静态资源缓存
    location /_next/static {
        alias $PROJECT_DIR/.next/static;
        expires 365d;
        access_log off;
    }
}
EOF"
    # 创建启用链接
    sudo ln -sf $NGINX_AVAILABLE $NGINX_ENABLED
    sudo nginx -t || error "Nginx配置测试失败"
    sudo systemctl restart nginx
}
# ----------------------------------
# 主执行流程
# ----------------------------------
install_dependencies
configure_firewall
clone_project
build_project
start_pm2
configure_nginx
success "\n✅ 部署完成!访问 http://服务器IP 查看站点"
warning "提示:若需HTTPS,请手动修改Nginx配置添加SSL证书"

1. 修改配置

打开脚本,修改顶部的配置区:
- PROJECT_NAME : 项目名称(用于PM2和Nginx配置
- PROJECT_PORT : Next.js服务端口(默认3000)
- PROJECT_GIT_REPO : 你的Git仓库地址(确保服务器有访问权限 )
- PROJECT_DIR : 项目部署目录(默认/var/www/my-next-app )

2. 赋予执行权限

chmod +x deploy.sh 

3. 运行脚本

 ./deploy.sh 

4. 后续操作

· 根据提示手动创建 .env.production 文件并填写生产环境变量

cd /var/www/my-next-app 
nano .env.production # 示例内容:NEXT_PUBLIC_API_URL=http://api.example.com 
  • · 执行 pm2 startup 生成的命令(设置开机自启)
  • · 日志监控: 使用 pm2 logs 查看实时日志:
pm2 logs my-next-app

到此这篇关于如何将React+Next.js的项目部署到服务器的文章就介绍到这了,更多相关React Next.js部署到服务器内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • React中组件间数据共享的多种方案

    React中组件间数据共享的多种方案

    在现代前端开发中,React以其组件化思想为核心,极大地提升了代码的可复用性和可维护性,随着应用复杂度的提升,一个不可避免的问题浮出水面:如何在不同组件间高效、清晰、可预测地共享数据,本文将全面、深入地探讨React中组件间数据通信的各种方法
    2025-09-09
  • React中传递组件的三种方式小结

    React中传递组件的三种方式小结

    通过传递组件,我们可以将复杂组件内部的一部分 UI 交由外部组件来控制渲染,这也是控制反转(Inversion of Control)的一种体现,在 React 中,我们可以通过三种方式来传递组件,本文就来给大家述说这三种方式,需要的朋友可以参考下
    2023-07-07
  • React组件中的this的具体使用

    React组件中的this的具体使用

    这篇文章主要介绍了React组件中的this的具体使用,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-02-02
  • react antd-design Select全选功能实例

    react antd-design Select全选功能实例

    这篇文章主要介绍了react antd-design Select全选功能实例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-03-03
  • React函数组件与类的区别有哪些

    React函数组件与类的区别有哪些

    函数式组件的基本意义就是,组件实际上是一个函数,不是类,下面这篇文章主要给大家介绍了关于React中函数组件与类的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-10-10
  • React自定义实现useWatch的方式和特点

    React自定义实现useWatch的方式和特点

    这篇文章主要介绍了React自定义实现useWatch的方式和特点,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2025-05-05
  • React常见跨窗口通信方式实例详解

    React常见跨窗口通信方式实例详解

    这篇文章主要为大家介绍了React常见跨窗口通信方式实例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-10-10
  • React中事件绑定this指向三种方法的实现

    React中事件绑定this指向三种方法的实现

    这篇文章主要介绍了React中事件绑定this指向三种方法的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-05-05
  • 在react中使用mockjs的方法你知道吗

    在react中使用mockjs的方法你知道吗

    这篇文章主要为大家详细介绍了在react中使用mockjs的方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-03-03
  • react-router-dom 降低版本的两种方法详解

    react-router-dom 降低版本的两种方法详解

    这篇文章主要介绍了react-router-dom 降低版本的两种方法,本篇文章就记录下如何降低 react-router-dom 为 v5 版本的两种方法,需要的朋友可以参考下
    2022-12-12

最新评论