nginx代理前端请求

一,项目配置

我在 ip 为 192.168.31.177 的机器上使用 vue3 开发前端项目,项目中使用 axios 调用后端接口。

这是 axios 的配置:

import axios from 'axios';const request = axios.create({baseURL: 'http://192.168.31.177:8001',// 设置请求头headers: {},// 设置超时时间timeout: 2000,
});// 请求拦截器
request.interceptors.request.use(config => {// 在发送请求之前做些什么return config;},error => {// 对请求错误做些什么return Promise.reject(error);}
);// 响应拦截器
request.interceptors.response.use(response => {if (response) {// 响应数据为二进制流处理(数据导出)if (response.data.data instanceof Blob) {return response}const {code, msg} = response.dataif (code === 200) {return Promise.resolve(response.data)} else {return Promise.resolve(response)}} else {return Promise.reject(new Error('系统出错'))}},function (error) {// 对响应错误做点什么// 比如:根据响应状态码,做不同的响应处理console.log(error)return Promise.reject(error)}
)export default request

这是页面中的请求:

axios.get('/api/getNumbers').then(res => {ElMessage({message: res.msg,type: 'success'})}).catch(err => {ElMessage({message: err,type: 'error'})})

这是 package.json 中的配置:

  "scripts": {"dev": "vite --host 192.168.31.177","build": "vite build","preview": "vite preview"}

然后在 ip 为 192.168.31.45 的机器上启动 expressjs 开发的后端项目 192.168.31.45:3000:

app.get('/api/getNumbers', (req, res) => {// 生成两个随机数const number1 = Math.floor(Math.random() * 100);const number2 = Math.floor(Math.random() * 100);res.json({code: 200,msg: '成功!',data: {"a": number1,"b": number2,}});
});

现在想使用 nginx 将前端的请求代理到后端,下面将介绍 nginx 需要怎样配置以及具体原理。

二,配置 nginx

前端项目运行在 192.168.31.177(开发机器),后端运行在 192.168.31.45:3000,Nginx 需要配置为反向代理,将前端请求转发到后端。

在开发机器(192.168.31.177)上 Nginx 的配置文件(nginx.conf):

http {server {listen 8001;                # Nginx 监听的端口,前端 axios 中配置的 端口server_name 192.168.31.177; # 前端 axios 中配置的 IPlocation / {try_files $uri $uri/ /index.html; # 支持Vue路由的history模式}# 代理后端API请求location /api {proxy_pass http://192.168.31.45:3000;	# 后端项目运行的地址# 可选:如果后端接口路径不包含/api,移除前缀# rewrite ^/api/(.*) /$1 break;# 添加必要的代理头信息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;}}
}

配置完成后执行:

G:\nginx-1.24.0>nginx -t		 # 检查配置语法
nginx: the configuration file G:\nginx-1.24.0/conf/nginx.conf syntax is ok
nginx: configuration file G:\nginx-1.24.0/conf/nginx.conf test is successfulG:\nginx-1.24.0>start nginx		# 启动nginxG:\nginx-1.24.0>nginx -s reload # 不停止,重新加载
  • 打开【任务管理器——进程,搜索 nginx,可以看到两个进程,说明 nginx 正确启动。

启动前端项目,访问 http://192.168.31.177:5173/。打开页面后调用接口,获取到接口数据。

在这里插入图片描述

三,Nginx 代理原理

在这里插入图片描述

反向代理的作用:

  1. 请求转发:Nginx 监听前端请求(如 http://192.168.31.177:8080/api/getNumbers),并将匹配 /api 的请求转发到后端服务器 http://192.163.109.134:3000。

  2. 隐藏后端细节:前端无需知道后端地址,只需与 Nginx 通信。

  3. 解决跨域:浏览器认为请求是同源的(都是 http://192.168.31.177:8080),实际由 Nginx 转发到不同域的后端。

  4. 关键配置解释

    location /api:匹配所有以 /api 开头的请求路径。proxy_pass:将匹配的请求转发到后端服务器。proxy_set_header:设置请求头,确保后端能获取客户端的真实 IP 和协议信息。add_header:添加 CORS 响应头,显式允许跨域(可选,如果代理已解决跨域,可能不需要)。
    

为什么这样配置?

  1. 解决跨域问题:浏览器默认禁止跨域请求,但通过 Nginx 代理:前端请求发送到 http://192.168.31.177:8080/api(同源)。Nginx 将请求转发到 http://192.163.109.134:3000/api,后端响应通过 Nginx 返回前端。浏览器认为请求是“同源”的,不会触发跨域限制。

  2. 灵活的路由控制:可以按路径(如 /api)或域名分发请求。

  3. 支持负载均衡、缓存等高级功能(开发阶段可能不需要)。

  4. 统一入口:前端和后端通过同一个端口(如 8080)通信,简化开发配置。

验证配置是否生效:

  1. 在浏览器中访问后端 API http://192.163.109.134:3000/api/getNumbers,确保后端正常返回数据。
  2. 通过 Nginx 访问 API http://192.168.31.177:8080/api/getNumbers,检查是否返回相同数据。
  3. 检查看 Nginx 的访问日志和错误日志,确认请求是否被正确转发。
  4. Nginx 未启动或配置错误问题排查
    status nginx 检查服务状态。
    nginx -t 检查配置语法。
    

四,源码

nginx代理前端请求——教程源码

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

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

相关文章

老外讲解用Delphi 12.3作web

老外Delphi WebStencils系列教程,从项目入门到发布部署,讲的非常详细,欢迎观看https://www.bilibili.com/video/BV16LZVYpETK

2.Excel :快速填充和拆分重组

一 案例1:快速填充 电子邮件中包含每个人的人名,现在要提取电子邮件中的姓名到名字列。 方法1:将 Nancy 复制到单元格后,邮件会高亮,然后输入A的时候系统就会知道提取名字了。 补充:如果第三个位置输入错误…

股票App开发第一步:如何免费快速的获取股票数据(如何免费获取金融数据)

文章目录 🌱 入坑指南:Python 如何免费获取股市数据!🌴 演示环境 🌴📒 Python 炒股数据,免费午餐,快来尝尝!📒💡 全面又亲民:数据界的“瑞士军刀”!🕰️ 专注历史:老股民的“时光机”!🌟 真正免费:开源社区的“宝藏”!🎣 实在不行,咱就自己捞!⚠…

联核防爆无人叉车:高危环境中的安全搬运守护者

联核防爆AGV无人叉车是专为易燃易爆环境设计的智能搬运设备,其特点、功能与应用场景均围绕“安全”与“智能”核心展开:联核科技官网-AGV叉车十大品牌-无人叉车厂家-自动化叉车-智能搬运码垛机器人-智能叉车系统解决方案专家 一、核心特点 防爆设计电气…

6、进程理论和简单进程创建

一、了解进程推荐看这个视频,很详细 1、概念 进程(Process)程序的运行过程,是系统进行资源分配和调度的独立单元程序的运行过程:多个不同程序 并发,同一个程序同时执行多个任务。 就需要很多资源来实现这个过程。 每个进程都有一…

Java通信

Trae - AI 原生 IDE目录 同步代码块 ​编辑 同步方法​编辑​编辑 二者对比 ​编辑 lock对象 通信 cs架构​编辑​编辑​编辑 mac地址,物理地址​编辑 取地址​编辑 127 0 0 1和IP 127.0.0.1和ipconfig获得的IP地址是什么关系 。127.0.0.1 和通过 ipcon…

K8S学习之基础五十八:部署nexus服务

部署nexus服务 Nexus服务器是一个代码包管理的服务器,可以理解 Nexus 服务器是一个巨大的 Library 仓库。Nexus 可以支持管理的工具包括 Maven , npm 等,对于 JAVA 开发来说,只要用到 Maven 管理就可以了。Nexus服务器作用&#x…

hackmyvm-reversteg

arp-scan -l nmap -sS -v 192.168.222.45 在源码中可以看到 根据下面的提示可以猜测117db0148dc179a2c2245c5a30e63ab0是一个图像文件 将图片下载到本地 隐写术 在两张图片上使用strings,发现有一些可打印的字符串 strings 117db0148dc179a2c2245c5a30e63ab0.jpg base64解码…

通过国内源在Ubuntu20.0.4安装repo

国内三大免费源: 清华大学:清华大学开源软件镜像站 | Tsinghua Open Source Mirror中国科技大学:USTC Open Source Software Mirror阿里云:阿里巴巴开源镜像站-OPSX镜像站-阿里云开发者社区 repo只在清华源网站里搜到:…

基于EFISH-SBC-RK3576的无人机智能飞控与数据存储方案

一、方案背景 民用无人机在电力巡检、农业植保、应急救援等领域快速普及,但传统方案面临‌多协议设备兼容性差‌、‌野外环境数据易丢失‌、‌复杂电磁干扰‌三大痛点。 电鱼智能推出‌EFISH-SBC-RK3576‌,可集成双冗余总线接口与工业级加固存储&#x…

飞牛NAS本地部署小雅Alist结合内网穿透实现跨地域远程在线访问观影

文章目录 前言1. VMware安装飞牛云(fnOS)1.1 打开VMware创建虚拟机1.3 初始化系统 2. 飞牛云搭建小雅Alist3. 公网远程访问小雅Alist3.1 安装Cpolar内网穿透3.2 创建远程连接公网地址 4. 固定Alist小雅公网地址 前言 嘿,小伙伴们&#xff0c…

Java多线程与高并发专题—— CyclicBarrier 和 CountDownLatch 有什么异同?

引入 上一篇我们了解CountDownLatch的原理和常见用法,在CountDownLatch的源码注释中,有提到: 另一种典型用法是将一个问题分解为 N 个部分,用一个Runnable描述每个部分,该Runnable执行相应部分的任务并对闭锁进行倒计…

自建隐私优先的元搜索引擎:SearXNG 部署全指南

一、SearXNG 简介 SearXNG 是一款开源的元搜索引擎,通过聚合 Google、Bing、DuckDuckGo 等 70 多个搜索引擎的结果,为用户提供无广告、无追踪的搜索体验。其核心特性包括: 隐私保护:不记录用户 IP、搜索记录或使用 Cookie。多格式输出:支持 HTML 和 JSON 格式,便于与其他…

新手SEO优化实战快速入门

内容概要 对于SEO新手而言,系统化掌握基础逻辑与实操路径是快速入门的关键。本指南以站内优化为切入点,从网站结构、URL设计到内链布局,逐层拆解搜索引擎友好的技术框架;同时聚焦关键词挖掘与内容策略,结合工具使用与…

递归、搜索、回溯算法

记忆化搜索算法 记忆化搜索是一种将动态规划与递归相结合的算法,它通过记录已解决的子问题的解来避免重复计算,从而提高算法的效率。它主要用于解决具有重叠子问题性质的问题,例如斐波那契数列的计算、最短路径问题等。记忆化搜索的实现通常采…

Windows 10 ARM64平台MFC串口程序开发

Windows 10 IoT ARM64平台除了支持新的UWP框架,也兼容支持老框架MFC。使得用户在Windows 10 IoT下可以对原MFC工程进行功能升级,不用在新框架下重写整个工程。熟悉MFC开发的工程师也可以在Windows 10 IoT平台下继续使用MFC进行开发。 本文展示MFC串口程序…

browser-use 库网页元素点击测试工具

目录 代码代码解释输出结果 代码 import asyncio import jsonfrom browser_use.browser.browser import Browser, BrowserConfig from browser_use.dom.views import DOMBaseNode, DOMElementNode, DOMTextNode from browser_use.utils import time_execution_syncclass Eleme…

vue 点击放大,图片预览效果

背景: 在vue框架element组件的背景下,我们对图片点击放大(单张);如果是多张图片,要支持左右滑动查看多张图片(多张)。 图片单张放大,el-image图片组件,或者原生的img标签。previewSrcList string[单个] 图片…

个人学习编程(3-27) leetcode刷题

合并两个有序链表: 当我们执行 current->next node; 时,current 最初指向的是 dummy 节点,因此这行代码实际上是: dummy->next node; /*** Definition for singly-linked list.* struct ListNode {* int val;* st…

游戏引擎学习第177天

仓库:https://gitee.com/mrxiao_com/2d_game_4 今日计划 调试代码有时可能会非常困难,尤其是在面对那些难以发现的 bug 时。显然,调试工具是其中一个非常重要的工具,但在游戏开发中,另一个非常常见的工具就是自定义的调试工具&a…