一、工具准备

openSSL:需要针对https请求头 生成对应的 自签名证书。

Nginx:服务器搭建工具

nodeJS: Express API运行环境

PM2: node进程管理器。用于替代npm命令管理 启动命令。

二、openSSL 本地自签名证书生成。

创建服务器空文件夹(这里可以和Nginx程序包位置在一起,也可以单独放置)例如:D:demo

在D:demo 文件夹 下创建 文件 generate_cert.sh

内容:

#!/bin/bash
mkdir -p cert && cd cert
openssl req -x509 -nodes -days 365 -newkey rsa:2048 \-keyout server.key -out server.crt \-subj "/C=CN/ST=Beijing/L=Beijing/O=LocalDev/CN=localhost"

执行这个sh, 

或者创建 cert文件夹,cmd命令执行命令

openssl req -x509 -nodes -days 365 -newkey rsa:2048 \-keyout server.key -out server.crt \-subj "/C=CN/ST=Beijing/L=Beijing/O=LocalDev/CN=localhost"

win系统文件权限问题可能导致 sh执行生成文件夹和文件失败。

这样就生成了这两个自签名文件,可以支持本地的https请求头使用。(浏览器访问会出现不安全提示,需要保存到本地系统可信任证书列表中)

三、Express API 相关配置、程序启动和PM2管理

     拷贝Express API 程序到 D:demo 文件夹 下。

     相关配置修改(例如环境变量中 环境参数改为生产环境对应值)

     ssl相关内容也要配置修改

     Express API 程序中 拷贝一份cert 文件夹到程序根目录

     app.js入口文件中配置

     

...
const keyPath = path.join(__dirname, '../cert/localhost+3-key.pem');
const certPath = path.join(__dirname, '../cert/localhost+3.pem');const options = {key: fs.readFileSync(keyPath),cert: fs.readFileSync(certPath)
};
...// 创建HTTPS服务器https.createServer(options, app).listen(process.env.API_PORT, () => {...console.log(`Server running on https://localhost:${process.env.API_PORT}`);});

     项目根目录下添加ecosystem.config.cjs 文件用于PM2 启动参数配置

    

module.exports = {apps: [{name: 'PM2启动进程别名',script: './dist/app.js',type: 'module',  // 启用ES模块支持watch: false,env: {//PM2启动默认设置环境变量}}]
}

cd 到 API程序根目录下 cmd  npm run build (package.json 配置的编译命令 其实就是 tsc 命令)

D:demo/API/项目根目录下 会生成一个dist编译后的包。

然后执行 pm2 start "D:\demo\API\ecosystem.config.cjs" 命令(win 需要使用绝对路径)

启动程序

pm2 ls 可以看到 全部的 已管理的 node服务进程,

常用命令  pm2 logs <PM2服务名>、pm2 stop <PM2服务名>、 pm2 save <PM2服务名>

到这一步 Express API 本地 服务就搭建好了可通过https://localhost:端口号/路由地址

的方式访问API接口。

四、React 前端 Nginx 服务发布


https://localhost:端口号/路由地址react 前端程序 通过本地 环境 修改配置 适配 生产环境(例如:代理的API链接直接连接刚刚发布的API连接。还有一些 生产环境变量变动)

运行 npm run build (真实命令tsc -b && vite build),生产dist包。

拷贝本地生产 dist包 到D:demo文件夹下改名为 前端包对应的名称例如:demo-app.

 新建 nginx.conf文件

配置如下

worker_processes  1;
events {worker_connections 1024;
}http {include       ...mime.types;//nginx程序目录下的mime.types文件导入(win下用绝对路径)default_type  application/octet-stream;sendfile        on;keepalive_timeout  65;server {listen 443 ssl;server_name localhost;//自签名文件对应的配置(win下配置绝对路径)ssl_certificate ../cert/server.crt;ssl_certificate_key ../cert/server.key;# 前端服务location / {root ./demo/demo-app; // win下配置绝对路径try_files $uri $uri/ /index.html;index index.html;autoindex off;  server_tokens on;add_header X-Content-Type-Options "nosniff";add_header Content-Type "text/html; charset=utf-8";# 允许所有来源访问add_header 'Access-Control-Allow-Origin' '*';# 允许的请求方法add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, PUT, DELETE';# 允许的请求头add_header 'Access-Control-Allow-Headers' 'Content-Type, Authorization, X-Requested-With';# 允许带凭证的跨域请求add_header 'Access-Control-Allow-Credentials' 'true';# 预检请求处理if ($request_method = 'OPTIONS') {add_header 'Access-Control-Max-Age' 1728000;add_header 'Content-Type' 'text/plain; charset=utf-8';add_header 'Content-Length' 0;return 204;}}# API代理location /api/ {proxy_pass https://localhost:[端口号]/api/;proxy_ssl_verify off;  proxy_http_version 1.1;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection 'upgrade';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;proxy_cache_bypass $http_upgrade;# 跨域传递add_header 'Access-Control-Allow-Origin' '$http_origin';add_header 'Access-Control-Allow-Credentials' 'true';add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, DELETE, OPTIONS';}# 静态文件代理location /static/ {proxy_pass https://localhost:[端口号]/static/;proxy_ssl_verify off;  proxy_http_version 1.1;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection 'upgrade';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;proxy_cache_bypass $http_upgrade;# 跨域传递add_header 'Access-Control-Allow-Origin' '$http_origin';add_header 'Access-Control-Allow-Credentials' 'true';add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, DELETE, OPTIONS';}}
}

具体配置结合业务需求修改。

这块就把 Express API 代理 和 前端的页面配到了一个服务。

之后就cd 到 nginx 程序目录下 cmd  nginx -c ../nginx.conf (win用绝对路径)

没有报错,在 浏览器中使用 https://localhost 测试 nginx 服务是否发布成功。

成功会跳转到发布的本地测试服务 首页

也可以用https://[局域网本机IP]  访问测试服务。(局域网内测试使用)

扩展:如果追求安全性可以使用 Docker容器中的 nginx镜像 发布应用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/93042.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/93042.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/93042.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OTG原理讲解

文章目录一、什么是 OTG&#xff08;USB On-The-Go&#xff09;&#xff1f;✅ OTG 的定义&#xff1a;二、传统 USB 与 OTG 的区别三、OTG 的核心机制&#xff1a;**通过 ID 引脚判断角色**1. 对于 Micro-USB OTG&#xff1a;2. 电路如何感知 ID 引脚&#xff1f;四、OTG 电路…

数据结构系列之红黑树

前言 红黑树是比较重要的一颗树了&#xff0c;map和set的底层就是红黑树&#xff0c;一定要牢牢记住。 一、什么是红黑树 首先&#xff1a;红黑树仍然是一颗搜索二叉树&#xff0c;但他引入了颜色这一概念&#xff0c;每个结点多一个存储位来存储颜色&#xff0c;它通过维护下…

在OpenMP中,#pragma omp的使用

在OpenMP中&#xff0c;#pragma omp for 和 #pragma omp parallel for&#xff08;或 #pragma omp parallel num_threads(N)&#xff09;有本质区别&#xff0c;主要体现在 并行区域的创建 和 工作分配方式 上。以下是详细对比&#xff1a;1. #pragma omp for 作用 仅分配循环迭…

停止“玩具式”试探:深入拆解ChatGPT Agent的技术栈与实战避坑指南

摘要&#xff1a; 当许多人还在用ChatGPT写周报、生成样板代码时&#xff0c;其底层的Agent化能力已经预示着一场深刻的开发范式变革。这不再是简单的“AI辅助”&#xff0c;而是“人机协同”的雏形。本文旨在穿透表面的功能宣传&#xff0c;从技术栈层面拆解Agent模式的实现基…

element-plus安装以及使用

element-plus时为vue.js 3开发的组件库。 在引入前需要做如下准备 安装node.js https://blog.csdn.net/zlpzlpzyd/article/details/147704723 安装vue的脚手架vue-cli https://blog.csdn.net/zlpzlpzyd/article/details/149647351 安装element-plus github地址 https://git…

学习随想录-- web3学习入门计划

#60 转方向 web3 golang 以太坊应用 这是课表部分&#xff08;Golang以太坊方向&#xff09; Sheet b站up学习计划 第一阶段&#xff1a;基础能力构建&#xff08;1-2 个月&#xff09; 学习目标 掌握 Golang 核心语法与以太坊底层基础概念&#xff0c;建立开发知识框架。…

【RAG优化】PDF复杂表格解析问题分析

在构建检索增强生成(RAG)应用时,PDF文档无疑是最重要、也最普遍的知识来源之一。然而,PDF中潜藏着RAG系统的难点问题——复杂表格。这些表格富含高密度的结构化信息,对回答精准问题至关重要,但其复杂的视觉布局(多层表头、合并单元格、跨页表格等)常常让标准的文本提取…

ReAct Agent(LangGraph实现)

文章目录参考资料一 AI Agent二 ReAct三 LangGraph实现ReAct代理3.1 SerperAPI实时联网搜索3.2 ReAct实现参考资料 entic RAG 架构的基本原理与应用入门 一 AI Agent AI Agent 整个过程是一个动态循环。Agent不断从环境中学习&#xff0c;通过其行动影响环境&#xff0c;然后…

如何从0到1的建立组织级项目管理体系【现状诊断】

今天我想给大家分享是“如何在企业中从0到1的去建立PMO的组织级项目管理体系。”的系列文章&#xff0c;这是我近几年来一直在努力的尝试去探索和实践的过程&#xff0c;从0到1的过程。当我最开始去接手这样一个场景的时候所需要做的第一件事情是诊断和差距分析。这是多年以来做…

网络通信协议详解:TCP协议 vs HTTP协议

在计算机网络中&#xff0c;TCP&#xff08;传输控制协议&#xff09;和HTTP&#xff08;超文本传输协议&#xff09;是两个核心协议&#xff0c;但它们的职责和层级完全不同。TCP是底层传输协议&#xff0c;负责数据的可靠传输&#xff1b;HTTP是应用层协议&#xff0c;定义了…

[Qt]QString隐式拷贝

引言在Qt框架中&#xff0c;QString 作为字符串处理的核心类&#xff0c;其高效的内存管理机制一直是开发者津津乐道的特性。这背后的关键便是 隐式共享&#xff08;Implicit Sharing&#xff09;&#xff0c;也称为 写时复制&#xff08;Copy-On-Write, COW&#xff09;。本文…

命令行创建 UV 环境及本地化实战演示—— 基于《Python 多版本与开发环境治理架构设计》的最佳实践

命令行创建 UV 环境及本地化实战&#xff1a;基于架构设计的最佳实践 Python 多版本环境治理理念驱动的系统架构设计&#xff1a;三维治理、四级隔离、五项自治 原则-CSDN博客 使用 Conda 工具链创建 UV 本地虚拟环境全记录——基于《Python 多版本与开发环境治理架构设计》-CS…

跨域问题全解:从原理到实战

在计算机网络中&#xff0c;跨域&#xff08;Cross-Origin&#xff09; 指的是浏览器出于安全考虑&#xff0c;限制网页脚本&#xff08;如 JavaScript&#xff09;向与当前页面不同源&#xff08;Origin&#xff09; 的服务器发起请求的行为。这是由浏览器的同源策略&#xff…

(46)elasticsearch-华为云CCE无状态负载部署

一、准备好elasticsearch镜像并提前上传到镜像仓库 此次准备的是elasticsearch:v7.10.2 二、开始部署 负载名称:es-deployment 注意:内部配额太低会造成多次重启 环境变量: #单节点启动(实例pod可以多增加几个) discovery.type single-node 三、添加svc 四、注意:…

HCLP--MGER综合实验

一、拓扑图二、需求1、R5为ISP&#xff0c;只能进行IP地址配置&#xff0c;其所有地址均配为公有I地址; 2、R1和R5间使用PPP的PAP认证&#xff0c;R5为主认证方&#xff0c; R2与R5之间使用ppp的CHAP认证&#xff0c;R5为主认证方; R3与R5之间使用HDLc封装; 3、R1、R2、R3构建一…

idea中无法删除模块,只能remove?

1.先对module右键想要删除的module&#xff0c;选择remove module&#xff08;这是idea为了避免误操作&#xff09; 2.在remove module后&#xff0c;模块并未从项目结构中删除&#xff08;磁盘中也依旧存在&#xff09;&#xff0c;但再次右击你会发现&#xff0c;出现了del…

青藤天睿RASP再次发威!捕获E签宝RCE 0day漏洞

在2025年HVV关键攻防节点上&#xff0c;攻击队对E签宝电子合同服务发起的0day攻击被青藤天睿RASP截获。该漏洞可使攻击者在未授权情况下实现服务器远程代码执行&#xff08;RCE&#xff09;&#xff0c;进而控制服务器&#xff0c;构成横向渗透的关键跳板。>>>>漏洞…

Lua(字符串)

Lua字符串基础Lua中的字符串是不可变序列&#xff0c;可以包含任意字节数据&#xff08;包括嵌入的\0&#xff09;。字符串可以用单引号、双引号或长括号&#xff08;[[ ]]&#xff09;定义&#xff1a;str1 "Hello" str2 World str3 [[Multi-line string]]字符串…

大模型蒸馏(distillation)---从DeepseekR1-1.5B到Qwen-2.5-1.5B蒸馏

目录 1.1 蒸馏目标 2 环境准备 2.1依赖库安装 2.2 硬件要求 2.3 模型与数据集下载 2.3.1 教师模型下载 2.3.2 学生模型下载 2.3.3 数据集准备或下载 3.过程日志 4. 模型加载与配置 4.1 加载教师模型 4.2 加载学生模型 4.3 数据预处理函数 4.4 数据收集器 4.5 定义…

通过redis_exporter监控redis cluster

环境说明&#xff1a; 现在有一套redis cluster&#xff0c;部署是3主机6实例架构部署。需要采集对应的指标&#xff0c;满足异常监控告警&#xff0c;性能分析所需。 环境准备 以下环境需要提前部署完成。 redis cluser prometheus alertmanager grafna redis_exporter部署 我…