记一次Nginx ngx_http_substitutions_filter_module 无法正常工作问题的解决方案

由于项目需要使用Nginx做反向代理时,需要对源站返回的内容做一些替换,这些内容有 HTML,CSS,和JS等,Nginx自带的ngx_http_sub_module 模块可以实现替换的功能,但相对于YaoWenBin开发的ngx_http_substitutions_filter_module来说,功能还是稍弱一些:1、不支持大小写区分;2、不支持正则表达式;3、不支持替换多个字符串(ngx_http_sub_module从1.9.4版本开始支持此功能)。

但在使用ngx_http_substitutions_filter_module发现 HTML的内容可以替换,但是JS\CSS文件却替换不了,我将Respone Body内容复制到另外一台服务器上,然后再做反代,发现并没有什么问题,可以正常工作。

我的核心配置文件如下(已经设置了禁用gzip压缩)

location /demo/ {
		proxy_pass http://192.168.1.2
		proxy_set_header Accept-Encoding ‘‘;
		subs_filter src_string dst_string;
		subs_filter_types *;
		proxy_redirect off;
	}

排查了近两天,尝试过升级Nginx版本等一系列操作,并没有解决我的问题。

最后只能使用Nginx的Debug功能来排查,发现Debug的日志如下:

2016/05/20 10:47:59 [debug] 390#0: *1 http proxy header: "Content-Encoding: gzip"
2016/05/20 10:47:59 [warn] 390#0: *1 http subs filter header ignored, this may be a compressed response. while reading response header from upstream, client: 192.168.1.2, server: demo.xxxx.com, request: "GET /demo/login.js HTTP/1.1", upstream: "http://192.168.1.2:80/demo/login.js", host: "demo.xxxx.com"

日志反映两个问题:1、响应的HTTP HEADER中显示内容使用GZIP格式压缩;2、响应的内容可能时压缩过的,http subs filter 模块忽略,不处理!原来源站返回的JS和CSS内容还是被压缩了,但是我已经设置了proxy_set_header Accept-Encoding ‘‘了啊?为何返回的内容还是压缩的?决定使用Wireshark抓包查看底层的数据包。

从数据包来看,请求的HEADER确实设置了不压缩,但返回的内容确还是压缩的,看来问题出在源站的WEB服务器。

向源站的管理员求证,得到的结果是:JS和CSS的文件已经是被压缩过了的,所以不论请求的是否接收压缩,返回的内容都是被压缩的,这一点不能修改。

源站不能修改,只能从Nginx这里想办法了,但是Nginx替换必须得不是解压缩的,这就不好办了。

摸索中发现这篇文章: Nginx 反代 Gzip 内容时, sub_filter 等 content filter 无效的另一种解决

虽然多了一次请求,但更加节省网络带宽资源。由于使用gunzip模块解压缩,只能再次重新编译Nginx(这次排查问题,重新编译了10次都不止啊)。

文章中采用的是unix socket的方式,但从一些网友的测试来看,并不如tcp socket稳定(Php-fpm TcpSocket vs UnixSocket),我觉得还是采用监听TCP端口的方式。最终的配置如下:

location /demo-gzip/ {
        proxy_pass http://192.168.1.2/;
	gunzip on;
        allow 127.0.0.1/32;
        deny all;
}
location /demo/ {
        proxy_pass http://127.0.0.1/t5060-gzip/;
	proxy_set_header Host demo.xxxx.com;
	proxy_set_header Accept-Encoding ‘‘;
	subs_filter src_string dst_string;
	subs_filter_types application/javascript text/css;
}
时间: 2025-01-13 18:35:54

记一次Nginx ngx_http_substitutions_filter_module 无法正常工作问题的解决方案的相关文章

深入理解PHP之:Nginx 与 FPM 的工作机制

完全转载(算是一个收藏了) https://zhuanlan.zhihu.com/p/20694204 网络上有很多关于如何配置 Nginx + FPM 的文章,但它们更多从操作的角度出发,告诉我们怎么做,但却没有告诉我们为什么要这么做,本文从 Nginx 与 FPM 的工作机制出发,探讨配置背后的原理,让我们真正理解 Nginx 与 PHP 是如何协同工作的. 要说 Nginx 与 PHP 是如何协同工作的,首先得说 CGI (Common Gateway Interface) 和 FastC

你真的掌握 LVS、Nginx 及 HAProxy 的工作原理吗

你真的掌握 LVS.Nginx 及 HAProxy 的工作原理吗 当前大多数的互联网系统都使用了服务器集群技术,集群是将相同服务部署在多台服务器上构成一个集群整体对外提供服务,这些集群可以是 Web 应用服务器集群,也可以是数据库服务器集群,还可以是分布式缓存服务器集群等等. 在实际应用中,在 Web 服务器集群之前总会有一台负载均衡服务器,负载均衡设备的任务就是作为 Web 服务器流量的入口,挑选最合适的一台 Web 服务器,将客户端的请求转发给它处理,实现客户端到真实服务端的透明转发. 最近

Nginx的架构及工作流程

NGINX是一个免费的,开源的,高性能的HTTP服务器和反向代理,以及IMAP / POP3代理服务器.NGINX以其高性能,稳定性,丰富的功能集,简单的配置和低资源消耗而闻名,也是为解决C10K问题而编写的服务器之一.本文主要介绍Nginx的架构及工作流程. 一.Nginx的架构如下图 1.nginx启动后会有一个master进程和多个worker进程(woeker进程数量可配置,一般设置与机器的核心数一致),master进程负责管理worker进程(接收外界信号,发送信号到各worker进程

电脑一直弹出来adb.exe已停止工作的对话框解决方案

电脑一直弹出来adb.exe已停止工作的对话框解决方案 你可以用控制面板里面的删除程序-网银插件(貌似是工商的) 是 window键+r 输入msconfig 然后启动项 把xx银行网银前面的对号去掉然后重启. 也可能这个adb是别的软件,卸载了该软件就可以了. 占用了同一个端口.重启adb.

记一次nginx部署yii2项目时502 bad gatewary错误的排查

周六闲来无事,就试着安装和部署下yii2,安装过程没什么问题,但部署到nginx上时遇到了502 bad gatewary问题,折腾了半天才搞定.这个问题是我以前在部署yii2时没有遇到过的,因此记在这里以备忘. 1,安装和部署环境 操作系统:macOS,php版本:5.6,nginx版本:1.10.1,yii2版本:2.0. 2,yii2的安装 yii2的安装很简单,参考官网的手册即可.我这里安装的是yii2-app-advanced(Yii 2 Advanced Project Templa

nginx中父子进程工作的主体函数

根据Nginx(0.7.67版本)的代码,对Nginx基本的进程创建,进程主体以及事件处理进行了简要的分析. 基本上,父进程(即主进程)一开始会初始化及读取配置,并加载各模块的功能,然后fork()出N个子进程(即工作进程),具有相同的工作逻辑和功能.父进程负责监听信号(如HUP,QUIT等),通过socket pair把信号传递给子进程(子进程间一般不通信).子进程通过事件来处理父进程传递的信号.因为每个子进程都共享服务监听端口(如http 80),当用户发送请求时,会触发子进程的事件调用函数

nginx之旅(第六篇):nginx优化--nginx优化目的、工作进程优化、长连接设置、数据压缩、客户端缓存

一.Nginx优化目的 标准情况下,软件默认的参数都是对安装软件的硬件标准来设置的,目前我们服务?的硬件资源远远大于要求的标准,所以为了让服务?性能更加出众,充分利用服务?的硬件资源,我们一般需要优化APP的并发数来提升服务器?的性能. 二.工作进程优化 1) worker_processes worker_processes指Nginx的工作进程,这个值是直接受到服务器CPU核数量影响的(当然也有其他影响),Nginx默认配置为auto,意思是会自动检测CPU核做修改,建议worker_pro

记一次Nginx 400错误

  在一个非CDN的域名下有一个页面,需要请求CDN域名下的资源.所以在CDN的那台源站的Nginx上设置了 add_header 'Access-Control-Allow-Headers' 'X-Requested-With' add_header 'Access-Control-Allow-Methods' 'GET,POST,OPTIONS add_header 'Access-Control-Allow-Origin' 'xx.com'   该页面同时也会请求一个.do接口,而这个接口

Nginx反向代理的工作方式

如图所示: 当客户端发来HTTP请求时,Nginx并不会立刻转发到上游服务器,而是先把用户的请求(包括HTTP包体)完整地接收到Nginx所在服务器的硬盘或者内存中,然后再向上游服务器发起连接,把缓存的客户端请求转发到上游服务器. 这种方式的缺点: 延长了一个请求的处理时间,并增加了用于缓存请求内容的内存和磁盘空间. 优点: 降低了上游服务器的负载,尽量把压力放在了Nginx服务器上.(通常,客户端与代理服务器之间的网络环境会比较复杂,多半是“走”公网,网速平均下来可能较慢,因此,一个请求可能要