Nginx 代理配置导致浏览器应用网页页面加载失败的分析与解决

Nginx 代理配置导致应用页面加载失败的分析与解决

前期部署信息:

部署DM数据库DEM时,配置了nginx代理,conf配置内容如下:

    charset utf-8;client_max_body_size 128M;listen 4567;server_name 192.168.1.156;root /opt/h5/;index index.html;location /tomcat {proxy_pass http://127.0.0.1:8080;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;# 隐藏 /tomcat 路径rewrite ^/tomcat(.*)$ $1 break;}

问题现象

我遇到了一个问题:直接访问http://192.168.1.156:8080/dem/是正常的,但是访问 http://192.168.1.156:4567/tomcat/dem/ 时,页面却无法正常显示,表现为一个不停转圈的加载状态,无法进入登录界面。

在这里插入图片描述
或者报错“获取系统属性失败!加密响应失败!”

分析原因

经过多次排查和测试,我发现问题主要出在 Nginx 的代理配置上,可能的原因包括以下几点:

  1. 资源路径不一致
    应用中的 JavaScript、CSS 等静态资源可能使用了相对路径或绝对路径。在代理过程中,如果 Nginx 没有正确映射这些路径,浏览器会无法加载资源,导致页面卡在加载状态。

  2. 路径重写配置问题
    我尝试使用 rewrite 指令隐藏代理路径(如 /tomcat),但与 proxy_pass 结合使用时,可能会导致请求 URL 被错误解析,后端应用接收到的路径与预期不符,从而引发加载失败。

  3. 代理转发未完全适配应用需求
    如果应用内部的 AJAX 请求或其他逻辑依赖特定的 URL 路径,而 Nginx 的代理配置没有正确处理这些请求,可能会导致功能异常。

处理方法

经过反复调整,我最终通过以下两种 Nginx 配置方案成功解决了问题:

方法一:精确代理到 /dem/ 路径

server {charset utf-8;client_max_body_size 128M;listen 4567; # 监听 4567 端口,便于局域网访问server_name 192.168.1.156;root /opt/h5/;index index.html;location /dem/ {                                #修改了这一行proxy_pass http://127.0.0.1:8080/dem/;               #修改了这一行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;# 尝试隐藏 /tomcat 路径(可选,未完全生效时可移除)rewrite ^/tomcat(.*)$ $1 break;}
}
  • 配置说明
    • 通过 location /dem/ 将请求直接代理到 http://127.0.0.1:8080/dem/,保持路径一致性。
    • 添加了基本的代理头信息(如 HostX-Real-IP 等),确保后端能正确识别请求来源。
    • rewrite 指令用于隐藏 /tomcat 路径,但测试发现它对最终成功访问并非必要,可根据需求保留或移除。

方法二:代理根路径到 Tomcat

server {listen 7890;server_name 192.168.1.156;location / {proxy_pass http://127.0.0.1:8080;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;}
}
  • 配置说明
    • 将所有请求代理到 http://127.0.0.1:8080/,适用于 Tomcat 应用部署在根路径下的场景。
    • 这种方式简单直接,减少了路径匹配的复杂性,适合不需要额外路径前缀的情况。

结果

经过以上配置调整,我成功实现了目标:

  • 方法一:访问 http://192.168.1.156:4567/dem/,页面正常加载并跳转到登录界面。
  • 方法二:访问 http://192.168.1.156:7890/dem/,同样可以正常访问应用,页面加载和功能运行无异常。

两种方法都解决了页面加载失败的问题,具体选择取决于你的应用部署方式和访问需求。

总结

通过这次排查和解决,我总结了以下几点经验,供其他开发者参考:

  1. 保持路径一致性
    在配置 proxy_pass 时,确保前端请求的路径与后端应用的实际路径一致,避免因路径不匹配导致资源加载失败。

  2. 谨慎使用路径重写
    rewrite 虽然可以隐藏代理路径,但与 proxy_pass 结合使用时容易出错。如果不需要复杂的路径转换,建议直接使用简单代理。

  3. 调试技巧
    在排查类似问题时,可以通过浏览器开发者工具(F12)检查网络请求,查看资源加载是否失败,或查看 Nginx 的 error_log 日志定位问题。

希望这篇文章能帮助到遇到类似问题的朋友!如果有其他疑问,欢迎在评论区交流。

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

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

相关文章

Windows 11【1001问】查看Windows 11 版本的18种方法

随着技术的飞速发展,操作系统作为连接硬件与软件的核心桥梁,其版本管理和更新变得尤为重要。对于用户而言,了解自己设备上运行的具体Windows 11版本不仅有助于优化系统性能,还能确保安全性和兼容性。然而,不同场景和需…

企业jsapi_ticket,java举例

在企业微信开发中,使用 Java 获取 jsapi_ticket 并生成签名的步骤如下。以下是完整的 Java 示例代码。 1. 获取 jsapi_ticket 的流程 获取 access_token。 使用 access_token 获取 jsapi_ticket。 使用 jsapi_ticket 生成签名(signature)。…

【Godot4.3】自定义简易菜单栏节点ETDMenuBar

概述 Godot中的菜单创建是一个复杂的灾难性工作,往往无从下手,我也是不止一次尝试简化菜单的创建。 从自己去年的发明“简易树形数据”用于简化Tree控件获得灵感,于是尝试编写了用于表示菜单数据的EasyMenuData类,以及对应的纯文…

大数据与金融科技:革新金融行业的动力引擎

大数据与金融科技:革新金融行业的动力引擎 在今天的金融行业,大数据与金融科技的结合正在以惊人的速度推动着金融服务的创新与变革。通过精准的数据分析与智能化决策,金融机构能够更高效地进行风险管理、客户服务、资产管理等一系列关键操作…

二、IDE集成DeepSeek保姆级教学(使用篇)

各位看官老爷好,如果还没有安装DeepSeek请查阅前一篇 一、IDE集成DeepSeek保姆级教学(安装篇) 一、DeepSeek在CodeGPT中使用教学 1.1、Edit Code 编辑代码 选中代码片段 —> 右键 —> CodeGPT —> Edit Code, 输入自然语言可编辑代码,点击S…

Rohm发布TOLL封装650V GaN HEMT,引领汽车用GaN器件大规模生产新浪潮

Rohm震撼发布TOLL封装650V GaN HEMT,引领汽车用GaN器件大规模生产新浪潮。在创新的TOLL(TO LeadLess)封装技术的怀抱中,Rohm精心孕育出650V GaN HEMT这一瑰宝,此技术正如一股强劲东风,日益吹拂于高功率处理…

Spring Boot 3.x 基于 Redis 实现邮箱验证码认证

文章目录 依赖配置开启 QQ 邮箱 SMTP 服务配置文件代码实现验证码服务邮件服务接口实现执行流程 依赖配置 <dependencies> <!-- Spring Boot Starter Web --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spr…

PHP的学习

PHP的基础前提【HTML、CSS】 第一步先进行VS cood的下载&#xff1a;Visual Studio Code - Code Editing. Redefined 【选择适合自己的电脑的版本eg:我就是64位的win】

XML 编辑器:全面指南与最佳实践

XML 编辑器:全面指南与最佳实践 引言 XML(可扩展标记语言)编辑器是处理XML文件的关键工具,对于开发人员、系统管理员以及任何需要处理XML数据的人来说至关重要。本文将全面介绍XML编辑器的概念、功能、选择标准以及最佳实践,旨在帮助读者了解如何选择和使用合适的XML编辑…

《Effective Objective-C》阅读笔记(下)

目录 内存管理 理解引用计数 引用计数工作原理 自动释放池 保留环 以ARC简化引用计数 使用ARC时必须遵循的方法命名规则 变量的内存管理语义 ARC如何清理实例变量 在dealloc方法中只释放引用并解除监听 编写“异常安全代码”时留意内存管理问题 以弱引用避免保留环 …

ORM Bee V2.5.2.x 发布,支持 CQRS; sql 性能分析;更新 MongoDB ORM分片

Bee, 一个具有分片功能的 ORM 框架. Bee Hibernate/MyBatis plus Sharding JDBC Jpa Spring data GraphQL App ORM (Android, 鸿蒙) 小巧玲珑&#xff01;仅 940K, 还不到 1M, 但却是功能强大&#xff01; V2.5.2 (2025・LTS 版) 开发中... **2.5.2.1 新年 ** 支持 Mong…

springboot之HTML与图片生成

背景 后台需要根据字段动态生成HTML&#xff0c;并生成图片&#xff0c;发送邮件到给定邮箱 依赖 <!-- freemarker模板引擎--> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-freemarker</artifa…

《从0到1:用Python在鸿蒙系统开发安防图像分类AI功能》

在人工智能与移动应用深度融合的当下,类目标签AI功能成为众多行业提升效率和用户体验的关键技术。本文聚焦于HarmonyOS NEXT API 12及以上版本,以图像分类在智能家居安防领域的应用为例,为开发者详细阐述如何利用Python开发类目标签AI功能,助力鸿蒙技术在该领域的创新应用。…

【AD】3-10 原理图PDF导出

文件—智能PDF 多页原理图导出 导出设置时选择工程&#xff0c;可自行选择导出一页或多页原理图&#xff0c;一般PCB不用导出

【deepseek第一课】从0到1介绍 采用ollama安装deepseek私有化部署,并实现页面可视化

【deepseek第一课】从0到1介绍 采用ollama安装deepseek私有化部署,并实现页面可视化 1. ollama安装1.1 linux安装1.2 windows安装2. deepSeek支持的7种蒸馏模型2.1 蒸馏模型介绍2.2 7种模型特点2.3 安装deepseek-r1:14b模型3. openwebui图形化页面安装4. java连接大模型的三…

【在线用户监控】在线用户查询、强退用户

文章目录 在线用户监控在线用户监控API(RestController)当前在线会话在线用户查询强退用户知识扩展: JwtJwtTokenUtil生成jwt解析token登录授权的实现:json web token + redis + springboot在线用户监控 在线用户监控API(RestController) @RestController @Tag(name = &qu…

超详细,多图文介绍redis集群方式并搭建redis伪集群

超详细&#xff0c;多图文介绍redis集群方式并搭建redis伪集群 超多图文&#xff0c;对新手友好度极好。敲命令的过程中&#xff0c;难免会敲错&#xff0c;但为了截好一张合适的图&#xff0c;一旦出现一点问题&#xff0c;为了好的演示效果&#xff0c;就要从头开始敲。且看且…

Hue Load Balance配置

个人博客地址&#xff1a;Hue Load Balance配置 | 一张假钞的真实世界 直接上配置&#xff1a; server {server_name 192.168.72.31;listen 8001;charset utf-8;proxy_connect_timeout 600s;proxy_read_timeout 600s;proxy_send_timeout 600s;location / {proxy_set_header H…

992. K 个不同整数的子数组

目录 一、题目二、思路2.1 解题思路2.2 代码尝试2.3 疑难问题 三、解法四、收获4.1 心得4.2 举一反三 一、题目 二、思路 2.1 解题思路 2.2 代码尝试 class Solution { public:int subarraysWithKDistinct(vector<int>& nums, int k) {//需要有数据结构来存储数组…

领域驱动设计:事件溯源架构简介

概述 事件溯源架构通常由3种应用设计模式组成,分别是:事件驱动(Event Driven),事件溯源(Event Source)、CQRS(读写分离)。这三种应用设计模式常见于领域驱动设计(DDD)中,但它们本身是一种应用设计的思想,不仅仅局限于DDD,每一种模式都可以单独拿出来使用。 E…