Home在线笔记

上传或选择Markdown文件,实时查看解析后的HTML效果

登录

文件上传

📄

拖放Markdown文件到此处,或点击上传

上传路径:

Manual目录中的文件

专题目录

《Node.js应用如何部署到Nginx环境》预览

文档样式:

针对Node.js环境开发的应用如何进行发布、部署,本文一文讲清楚,如何开发Node app 在本文就不再赘述,可以参考我以前发布的文章。本文主要讲述如何将开发的Node app 打包,并在运行nginx的环境中部署。

一、生成发布包

npm run build

生成后的目录结构如下图所示:
项目结构:

    服务器上的目录/
    ├── dist/          ← 前端静态文件(刚才 build 生成的)
    ├── uploads/       ← 上传文件存储目录
    ├── file-db.json   ← 上传记录数据库
    ├── server.js      ← Node.js 后端
    └── package.json ← 应用包的描述,包含应用依赖的模块

二、部署方案

nginx 托管前端 + 反向代理后端

第一步:把文件传到服务器

```bash
# 在你的开发机上,压缩项目
cd /Users/liquancun/.hermes/my-hermes-vite-app

# 1. 前端 build 产物:dist/
# 2. 后端运行文件:
#    - server.js
#    - package.json (含 busboy, express, uuid, cors 等依赖)
#    - 项目根目录下

# 上传到服务器(示例 IP 为 1.2.3.4)
scp -r dist/ root@1.2.3.4:/usr/share/nginx/html/hermes-admin/
scp server.js package.json root@1.2.3.4:/usr/share/nginx/html/hermes-admin/
```

### 第二步:服务器上安装后端依赖并启动

```bash
# SSH 到服务器
ssh root@1.2.3.4

cd /usr/share/nginx/html/hermes-admin

# 安装依赖
npm install --production

# 创建上传目录
mkdir -p uploads

# 用 PM2 (比用node直接启动应用更可靠,更好管理应用)守护进程运行后端(推荐)
npm install -g pm2
pm2 start server.js --name hermes-backend
pm2 save
pm2 startup    # 开机自启

# 后端运行在 localhost:3001
```

### 第三步:配置 nginx

**Nginx 配置文件** `/etc/nginx/nginx.conf` 有的nginx的配置文件在/etc/nginx/sites-available/default, 此时可以在该目录下增加一个配置文件如hermes-admin:

```nginx
server {
    listen 8096;
    server_name www.heyanper.top;  # 改成你的域名或 IP
    root /usr/share/nginx/html/hermes-admin/dist;

    # 1. 前端静态文件
    location / {
        try_files $uri $uri/ /index.html;
    }

    # 2. 上传文件的静态访问(用户已上传的文件)
    location /uploads/ {
        alias /usr/share/nginx/html/hermes-admin/uploads/;
    }

    # 3. 后端 API —— 反向代理到 Node.js
    location /api/ {
        proxy_pass http://127.0.0.1:3001;
        proxy_http_version 1.1;
        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;

        # 大文件上传需要
        client_max_body_size 10G;
        proxy_request_buffering off;
        proxy_buffering off;
    }
}
```

启用配置:

```bash

# 检查配置语法
nginx -t

# 重载 nginx
systemctl reload nginx
```

### 关键配置说明

| 配置项 | 作用 |
|--------|------|
| `try_files $uri $uri/ /index.html` | React SPA 路由支持,刷新页面不 404 |
| 代理 `/api/` 到 `localhost:3001` | 前端所有 API 请求通过同域转发,避免 CORS |
| `client_max_body_size 10G` | 大文件上传不限制大小 |
| `proxy_request_buffering off` | 分片上传流式传输,不缓冲到磁盘 |

### 可选:HTTPS 配置

部署完后用 Certbot 一键配置:

```bash
# 安装 certbot
apt install certbot python3-certbot-nginx

# 自动配置 HTTPS
certbot --nginx -d your-domain.com
```

### 前端 API 地址调整

你当前的前端代码中(FileUpload.jsx)有一处硬编码的 `http://localhost:3001`,部署到 nginx 后需要改为空字符串或相对路径,这样请求会走 nginx 的反向代理:

三、测试

在浏览器中输入 http://www.heyanper.top:8096, 此时nginx就会通过反向代理的方式将http://27.0.0.1:3001的内容反馈给用户。

本人把nginx.conf配置文件增加反向代理后的详细配置如下:

user  root;
worker_processes  1;
error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;
events {
    worker_connections  1024;
}
http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
    access_log  /var/log/nginx/access.log  main;
    sendfile        on;
    #tcp_nopush     on;
    keepalive_timeout  120;
    client_max_body_size 20m;
    client_body_timeout 60s;
    #gzip  on;
    server {
        listen       80;
        server_name  www.heyanper.top;
        root /usr/share/nginx/html;
        index index.php index.html index.htm;

        # 强制跳转到 HTTPS
        # return 301 https://$server_name$request_uri;

        location ~ \.php$ {
                root            /usr/share/nginx/html;
                fastcgi_pass    unix:/run/php/php8.1-fpm.sock;
                fastcgi_index   index.php;
                fastcgi_param   SCRIPT_FILENAME $document_root$fastcgi_script_name;
                include         fastcgi_params;

        }

        location ~* \.txt$ {
                 add_header Content-Type "text/plain; charset=utf-8";
        }

        location /nginx_status {
                stub_status on;
                access_log off;
                #allow 127.0.0.1;允许哪个ip可以访问
        }
    }

    #增加一个端口号为8096的块,用于作为node.js应用的反向代理
    server {
        listen 8096;
        server_name www.heyanper.top;  # 改成你的域名或 IP
        root /usr/share/nginx/html/hermes-admin/dist;

        # 1. 前端静态文件
        location / {
            try_files $uri $uri/ /index.html;
        }

        # 2. 上传文件的静态访问(用户已上传的文件)
        location /uploads/ {
            alias /usr/share/nginx/html/hermes-admin/uploads/;
        }

        # 3. 后端 API —— 反向代理到 Node.js
        location /api/ {
            proxy_pass http://127.0.0.1:3001;
            proxy_http_version 1.1;
            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;

            # 大文件上传需要
            client_max_body_size 10G;
            proxy_request_buffering off;
            proxy_buffering off;
        }
    }
}