nuxt3项目打包部署到服务器后配置端口号和开启https

nuxt3打包后的项目部署相对于一般vite打包的静态文件部署要稍微麻烦一些,还有一个主要的问题是开发环境配置的.env环境变量在打包后部署时获取不到,具体的解决方案可以参考我之前文章 nuxt3项目打包后获取.env设置的环境变量无效的解决办法
这里使用的方法是在部署时的项目根目录增加.env文件,并在server/index.mjs修改代码读取。网上搜索到的通过更改./server/chunks/_/nitro.mjs定义的port这种方法在现版本已不适用。

本文是只使用node的部署方案,未用nginx反向代理。

本次项目使用的主要依赖版本如下:

"node":"22.12.0",
"nuxt":"3.15.2",
"vue":"3.5.13",
"vue-router":"4.5.0"

部署项目的服务器版本为:

Windows Server 2022 Datacenter

我们先将项目执行打包,在成功打包后,会有一行代码提示:

✔ You can preview this build using node .output/server/index.mjs   

也就是说只要执行node .output/server/index.mjs,我们的项目就能跑起来了,执行后终端输出:

Listening on http://[::]:3000

可以看到默认使用的是http并且端口号是3000,那如何修改到使用https和目标端口号呢,这时需要打开.output/server/index.mjs文件,看看代码是如何执行的,主要是这段代码:

const cert = process.env.NITRO_SSL_CERT;
const key = process.env.NITRO_SSL_KEY;
const nitroApp = useNitroApp();
const server =
  cert && key
    ? new Server({ key, cert }, toNodeListener(nitroApp.h3App))
    : new Server$1(toNodeListener(nitroApp.h3App));
const port = destr(process.env.NITRO_PORT || process.env.PORT) || 3e3;
const host = process.env.NITRO_HOST || process.env.HOST;
const path = process.env.NITRO_UNIX_SOCKET;
const listener = server.listen(path ? { path } : { port, host }, (err) => {
  if (err) {
    console.error(err);
    process.exit(1);
  }
const protocol = cert && key ? "https" : "http";

很明显,它都是通过环境变量来判断是开启http还是https,以及是否有定义端口号,那我们只需要这里定义的环境变量能正常获取就行了。

需要注意的是:开启https还需要提供相应的SSL/TLS证书

假如项目部署的根目录是:D:\server-project

  1. 先将.output下的全部文件复制到server-project文件夹下,然后新建ssl文件夹,将证书文件放入;
  2. 新建.env文件,定义环境变量,添加如下内容:
NITRO_PORT=443 //端口号
NITRO_SSL_KEY="./ssl/demo.key" //相对于根目录的路径
NITRO_SSL_CERT="./ssl/demo.crt" //相对于根目录的路径,也可以是.pem文件

结果如图:
在这里插入图片描述

  1. 修改server-project/server/index.mjs,修改处已加注释说明,全文如下:
import process from "node:process";
globalThis._importMeta_ = { url: import.meta.url, env: process.env };
import { Server as Server$1 } from "node:http";
import { Server } from "node:https";
import {
  t as toNodeListener,
  d as destr,
  u as useRuntimeConfig,
  a as trapUnhandledNodeErrors,
  s as setupGracefulShutdown,
  b as useNitroApp,
} from "./chunks/_/nitro.mjs";
import "node:crypto";
import "node:buffer";
import "node:fs";
import "node:url";
import "uuid";
import "node:path";
/*  新增加的代码--start */
import { resolve } from "node:path";
import { loadEnvFile } from "node:process";
import { readFileSync } from "node:fs";
loadEnvFile(resolve(process.cwd(), "./.env"));
/*  新增加的代码--end */
const cert = process.env.NITRO_SSL_CERT;
const key = process.env.NITRO_SSL_KEY;
const nitroApp = useNitroApp();

 /* server更改前
 const server =
   cert && key
     ? new Server({ key, cert }, toNodeListener(nitroApp.h3App))
     : new Server$1(toNodeListener(nitroApp.h3App));
*/

// server修改后,主要是将cert和key的值读取后返回给Server
const server =
  cert && key
    ? new Server(
        {
          key: readFileSync(resolve(process.cwd(), key)),
          cert: readFileSync(resolve(process.cwd(), cert)),
        },
        toNodeListener(nitroApp.h3App)
      )
    : new Server$1(toNodeListener(nitroApp.h3App));
// 修改代码结束
const port = destr(process.env.NITRO_PORT || process.env.PORT) || 3e3;
const host = process.env.NITRO_HOST || process.env.HOST;
const path = process.env.NITRO_UNIX_SOCKET;
const listener = server.listen(path ? { path } : { port, host }, (err) => {
  if (err) {
    console.error(err);
    process.exit(1);
  }
  const protocol = cert && key ? "https" : "http";
  const addressInfo = listener.address();
  if (typeof addressInfo === "string") {
    console.log(`Listening on unix socket ${addressInfo}`);
    return;
  }
  const baseURL = (useRuntimeConfig().app.baseURL || "").replace(/\/$/, "");
  const url = `${protocol}://${
    addressInfo.family === "IPv6"
      ? `[${addressInfo.address}]`
      : addressInfo.address
  }:${addressInfo.port}${baseURL}`;
  console.log(`Listening on ${url}`);
});
trapUnhandledNodeErrors();
setupGracefulShutdown(listener, nitroApp);
const nodeServer = {};

export { nodeServer as default };
//# sourceMappingURL=index.mjs.map

代码修改完成后,在server-project目录下执行:

node ./server/index.mjs

到这一步,输入域名后网站就能正常访问了。

本次项目使用的是pm2部署,那么就还需要在server-project目录下新建一个pm2的配置文件ecosystem.config.json(也可以是ecosystem.config.js)和logs文件夹,这个按自己的部署需求配置就可以了,我的配置如下:

{
  "apps": [
    {
      "script": "./server/index.mjs",
      "name": "web",
      "instances": 1,
      "error_file": "./logs/err.log",
      "out_file": "./logs/out.log",
      "log_date_format": "YYYY-MM-DD HH:mm:ss",
      "log_type": "json",
      "ignore_watch": ["node_modules", "ssl", "logs"],
      "port": 443
    }
  ]
}

配置完成后执行:

pm2 start ecosystem.config.json

对于NITRO_HOST这个环境变量不建议设置,让其自行分配,除非是必须,经过自己的实测,如果设置了这个值,比如:127.0.0.1,在服务器的浏览器上输入https://127.0.0.1,可以正常访问,但在外网通过域名则不能访问。

这种方法也有弊端,就是如果每打包一次,就得按以上方法修改一次,有些繁琐,如果有更好的方案,也欢迎大家多多推荐。

当你使用`pm2`管理部署了基于Nuxt.js v3构建的项目后,要在Nginx上设置域名并启用HTTPS,需要按照以下步骤进行: 1. **配置Nginx服务器**: - 首先,你需要在Nginx的配置文件(通常位于 `/etc/nginx/sites-available/your-project.conf` 或 `~/nginx/conf.d/`)中创建一个新的站点配置。 2. **添加域名块**: ``` server { listen 80; # 网站监听80端口 server_name your-domain.com; # 替换为你想要绑定的域名 # 使用HTTP跳转到HTTPS location / { return 301 https://$host$request_uri; } # 关闭默认的网站目录访问 root /path/to/your/nuxt/dist; # 替换为你的Nuxt应用实际打包后的路径 try_files $uri $uri/ @nuxt; } ``` 3. **启用HTTPS**: - 对于HTTPS支持,你需要生成SSL证书。可以购买商业证书或通过Let's Encrypt免费获取。将证书文件(如`cert.pem`, `key.pem`)放到合适的路径下。 4. **更新Nginx配置以包含HTTPS**: ``` server { listen 443 ssl; # HTTPS监听443端口 server_name your-domain.com; ssl_certificate cert.pem; # 你的SSL证书路径 ssl_certificate_key key.pem; # 私钥路径 # 其他SSL选项(如加密套件等),这里省略 include snippets/ssl-params.conf; # Nuxt的路由配置继续在这里,保持@nuxt部分不变 location @nuxt { proxy_pass http://your-ip:your-port; # PM2运行的Nuxt应用的IP地址端口号 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Nginx-Proxy true; } } ``` 5. **重启Nginx服务**: ``` sudo service nginx restart ``` 6. **验证配置**: - 使用`curl`或浏览器访问`https://your-domain.com`确认配置是否生效。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值