Apache httpd 2.4反向代理不压缩
使用ApacheHttpd2.2,可以设置反向代理并使用mod_deflate压缩代理内容,以尊重Apache httpd 2.4反向代理不压缩,apache,mod-proxy,mod-deflate,Apache,Mod Proxy,Mod Deflate,使用ApacheHttpd2.2,可以设置反向代理并使用mod_deflate压缩代理内容,以尊重Accept Encoding:gzip头 此配置足以使其工作: LoadModule deflate_module modules/mod_deflate.so LoadModule filter_module modules/mod_filter.so SetOutputFilter DEFLATE LoadModule proxy_module modules
Accept Encoding:gzip
头
此配置足以使其工作:
LoadModule deflate_module modules/mod_deflate.so
LoadModule filter_module modules/mod_filter.so
SetOutputFilter DEFLATE
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so
ProxyRequests Off
ProxyPass /tomcat http://localhost:8880/
ProxyPassReverse /tomcat http://localhost:8880/
ProxyPass /other http://localhost:8001/
ProxyPassReverse /other http://localhost:8001/
现在,在升级到2.4(Windows上为2.4.29)之后,同样的配置也被接受,它确实压缩了DocumentRoot提供的静态内容。但当通过ProxyPass检索时,相同的内容会以未压缩的方式返回
我知道我可以配置Tomcat来进行压缩,但是还有另一个服务器忽略了Accept编码头
如何设置反向代理并压缩代理内容
编辑:
Listen 80
LoadModule authz_user_module libexec/apache2/mod_authz_user.so
LoadModule authz_core_module libexec/apache2/mod_authz_core.so
LoadModule access_compat_module libexec/apache2/mod_access_compat.so
LoadModule filter_module libexec/apache2/mod_filter.so
LoadModule deflate_module libexec/apache2/mod_deflate.so
LoadModule mime_module libexec/apache2/mod_mime.so
LoadModule log_config_module libexec/apache2/mod_log_config.so
LoadModule headers_module libexec/apache2/mod_headers.so
LoadModule version_module libexec/apache2/mod_version.so
LoadModule proxy_module libexec/apache2/mod_proxy.so
LoadModule proxy_http_module libexec/apache2/mod_proxy_http.so
LoadModule unixd_module libexec/apache2/mod_unixd.so
<IfModule unixd_module>
User _www
Group _www
</IfModule>
<IfModule mime_module>
TypesConfig /private/etc/apache2/mime.types
</IfModule>
LogLevel debug
<IfModule log_config_module>
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b" common
<IfModule logio_module>
# You need to enable mod_logio.c to use %I and %O
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio
</IfModule>
CustomLog "/private/var/log/apache2/access_log" common
</IfModule>
ErrorLog "/private/var/log/apache2/error_log"
TraceEnable off
SetOutputFilter DEFLATE
ProxyRequests Off
ProxyPass /tomcat http://localhost:8880/
ProxyPassReverse /tomcat http://localhost:8880/
ProxyPass /other http://localhost:8001/
ProxyPassReverse /other http://localhost:8001/
DocumentRoot /Library/WebServer/Documents
以下是返回的标题,说明2.4服务器未压缩代理内容:
----- Retrieving uncompressed from DocumentRoot ---------------------------------
C:\Temp>curl -I http://localhost/test.txt
HTTP/1.1 200 OK
Date: Tue, 09 Jan 2018 17:11:59 GMT
Server: Apache/2.4.29 (Win64) OpenSSL/1.1.0g
Last-Modified: Fri, 05 Jan 2018 12:58:40 GMT
ETag: "75441-5620701eb471c"
Accept-Ranges: bytes
Content-Length: 480321
Vary: Accept-Encoding
Content-Type: text/plain
----- The same from Tomcat ------------------------------------------------------
C:\Temp>curl -I http://localhost:8880/rr/test.txt
HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Accept-Ranges: bytes
ETag: W/"480321-1515157120042"
Last-Modified: Fri, 05 Jan 2018 12:58:40 GMT
Content-Type: text/plain
Content-Length: 480321
Date: Tue, 09 Jan 2018 17:11:59 GMT
----- 2.4.29: Retrieving compressed from DocumentRoot ---------------------------
C:\Temp>curl -I -H "Accept-Encoding: gzip" http://localhost/test.txt
HTTP/1.1 200 OK
Date: Tue, 09 Jan 2018 17:11:59 GMT
Server: Apache/2.4.29 (Win64) OpenSSL/1.1.0g
Last-Modified: Fri, 05 Jan 2018 12:58:40 GMT
ETag: "75441-5620701eb471c-gzip"
Accept-Ranges: bytes
Vary: Accept-Encoding
Content-Encoding: gzip
Content-Length: 48265
Content-Type: text/plain
----- 2.4.29: Not getting any compression for proxied Tomcat content ------------
C:\Temp>curl -I -H "Accept-Encoding: gzip" http://localhost/tomcat/rr/test.txt
HTTP/1.1 200 OK
Date: Tue, 09 Jan 2018 17:11:59 GMT
Server: Apache-Coyote/1.1
Accept-Ranges: bytes
ETag: W/"480321-1515157120042"
Last-Modified: Fri, 05 Jan 2018 12:58:40 GMT
Content-Type: text/plain
Content-Length: 480321
----- 2.2.14: Retrieving compressed from DocumentRoot ---------------------------
C:\Temp>curl -I -H "Accept-Encoding: gzip" http://localhost:81/test.txt
HTTP/1.1 200 OK
Date: Tue, 09 Jan 2018 17:11:59 GMT
Server: Apache/2.2.14 (Win32)
Last-Modified: Fri, 05 Jan 2018 12:58:40 GMT
ETag: "90000000e7463-75441-5620701eb471c"
Accept-Ranges: bytes
Vary: Accept-Encoding
Content-Encoding: gzip
Content-Length: 48265
Content-Type: text/plain
----- 2.2.14: Proxied Tomcat content comes compressed ---------------------------
C:\Temp>curl -I -H "Accept-Encoding: gzip" http://localhost:81/tomcat/rr/test.txt
HTTP/1.1 200 OK
Date: Tue, 09 Jan 2018 17:11:59 GMT
Server: Apache-Coyote/1.1
Accept-Ranges: bytes
ETag: W/"480321-1515157120042"
Last-Modified: Fri, 05 Jan 2018 12:58:40 GMT
Content-Type: text/plain
Vary: Accept-Encoding
Content-Encoding: gzip
Content-Length: 20
所有这些都在从下载的普通2.4.29安装上进行了测试。上述配置已添加到httpd.conf中,其他配置未做任何更改。这同样适用于2.2.14安装(2009年从下载),但该安装被另外更改为端口81。我已经成功地重现了您描述的
curl
+apache/tomcat
行为
这就是我复制它的方式(OS X El Capitan):
Tomcat:
docker run -it --rm -p 8880:8080 tomcat:6.0
Apache
httpd -v
Server version: Apache/2.4.18 (Unix)
Server built: Feb 20 2016 20:03:19
httpd -l
Compiled in modules:
core.c
mod_so.c
http_core.c
prefork.c
Apache配置(全部):
Listen 80
LoadModule authz_user_module libexec/apache2/mod_authz_user.so
LoadModule authz_core_module libexec/apache2/mod_authz_core.so
LoadModule access_compat_module libexec/apache2/mod_access_compat.so
LoadModule filter_module libexec/apache2/mod_filter.so
LoadModule deflate_module libexec/apache2/mod_deflate.so
LoadModule mime_module libexec/apache2/mod_mime.so
LoadModule log_config_module libexec/apache2/mod_log_config.so
LoadModule headers_module libexec/apache2/mod_headers.so
LoadModule version_module libexec/apache2/mod_version.so
LoadModule proxy_module libexec/apache2/mod_proxy.so
LoadModule proxy_http_module libexec/apache2/mod_proxy_http.so
LoadModule unixd_module libexec/apache2/mod_unixd.so
<IfModule unixd_module>
User _www
Group _www
</IfModule>
<IfModule mime_module>
TypesConfig /private/etc/apache2/mime.types
</IfModule>
LogLevel debug
<IfModule log_config_module>
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b" common
<IfModule logio_module>
# You need to enable mod_logio.c to use %I and %O
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio
</IfModule>
CustomLog "/private/var/log/apache2/access_log" common
</IfModule>
ErrorLog "/private/var/log/apache2/error_log"
TraceEnable off
SetOutputFilter DEFLATE
ProxyRequests Off
ProxyPass /tomcat http://localhost:8880/
ProxyPassReverse /tomcat http://localhost:8880/
ProxyPass /other http://localhost:8001/
ProxyPassReverse /other http://localhost:8001/
DocumentRoot /Library/WebServer/Documents
如您所见,输出与您的示例非常匹配
这是有趣的部分
如果我使用常规的GET请求而不是HEAD(通过浏览器或curl
而不使用-I),tomcat的响应不会被压缩
curl -D - -H 'Accept-Encoding: gzip' 'http://localhost/tomcat' 2>/dev/null | strings
HTTP/1.1 200 OK
Date: Sat, 13 Jan 2018 13:37:19 GMT
Server: Apache-Coyote/1.1
Accept-Ranges: bytes
ETag: W/"7454-1491118183000-gzip"
Last-Modified: Sun, 02 Apr 2017 07:29:43 GMT
Content-Type: text/html
Vary: Accept-Encoding
Content-Encoding: gzip
Content-Length: 2526
(some junk)
不知道为什么会发生这种情况,看起来Apache在HEAD请求上的+mod_proxy/defate错误行为。
如果你说它在Apache2.2中还可以,我猜它可能与此有关
因此,我将检查您案例中的GET请求是否仍然存在问题。
如果是-提供有关设置的更多详细信息,以便可以100%复制您的环境-apache和tomcat的有效Dockerfile可以隔离可能存在的环境差异您发送的HTTP HEAD请求中带有curl中的
-I
标志。正如ffeast的回答所表明的,这可能是问题的原因
如果确实是这样,那么它要么是一个bug,要么是有意识地忽略了HTTP RFC:
9.4头
HEAD方法与GET相同,只是服务器不能
在响应中返回消息正文。包含的元信息在HTTP中,响应头请求的头应该相同 响应GET请求而发送的信息
如果是这样,您应该通过以下过程将其报告为可能的错误:代理响应的平均大小是多少?您可以发布更大的样本吗?至少在包含DocumentRoot和VirtualHost内部的整个配置(如果使用)以及curl-D-“”和curl-D-“”@ffeast返回的头的情况下,大小从几KB到几MB不等。由于我这边的bandwith有限,我特别感兴趣的是压缩大型的。@ffeast为了测试这个问题,我使用了一个新的安装(从下载了2.4.29)。这个问题包含了我在配置中修改过的所有内容,因此这里有
DocumentRoot“${SRVROOT}/htdocs”
,并且没有虚拟主机(此时)。将根据您的请求使用响应标题更新问题。我已经检查了您在OSX和Ubuntu上的设置-都很好。这可能是Windows特有的错误,或者说明中缺少某些内容。你能在linux上的云中的某个地方打开你的配置来检查它是否工作吗?如果问题再次出现,可能需要一个很好的发现。我确实依赖于HEAD请求返回的头,但未能仔细查看GET结果。
mod_deflate will now skip compression if it knows that the size overhead added by the compression is larger than the data to be compressed.