Nginx + PM2 實現Express API + React 前端 本地測試服務器搭建

一、工具準備

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部署 我…