我现在一直试图让nginx服务gzip内容主要是因为谷歌速度测试告诉我这样做,我们正试图增加我们的搜索引擎优化。我无法理解这里的生活:
我们位于防火墙后面,在负载均衡器下面提供两个网络头。无论我尝试过什么,我都无法通过content-encoding:gzip
获得回复标题。但是,当我使用curl发出请求时,我可以。此外,当我通过https访问该网站时,我确实得到了gzip的响应,但它与nginx无关,因为我已经在nginx中关闭了gzip,我仍然得到相同的响应。还有什么能像gzip那样提供内容?
更新
对不起发布这几次没有回应后我感到有点沮丧。以下是一些信息:
我们正在使用带有php-fpm的nginx 1.8.0。该网站是Magento框架。我正在尝试提供使用gzip压缩的主要html页面以及包含的css / javascript文件。这些文件目前显示未在响应标头中压缩,而Google pagespeed也表示它们未压缩。这是我看到的示例响应标题
Cache-Control:max-age=31536000
Connection:keep-alive
Content-Type:application/x-javascript; charset=utf-8
Date:Tue, 15 Mar 2016 15:15:13 GMT
ETag:"pub1448944926;gz"
Expires:Wed, 15 Mar 2017 15:15:13 GMT
Keep-Alive:timeout=8
Last-Modified:Tue, 01 Dec 2015 04:42:06 GMT
Server:nginx
Transfer-Encoding:chunked
Vary:Accept-Encoding
当我通过curl请求页面时,我得到了gzip内容。
curl -I -H 'Accept-encoding:gzip' mysite.com
我们已从负载均衡器中删除了暂存站点,问题仍然存在;消除可能来自负载均衡器的任何问题(现在)。
当我通过https访问该网站时,我获得了gzip内容,这里是响应标题
Cache-Control:max-age=31536000
Connection:keep-alive
Content-Encoding:gzip
Content-Length:67085
Content-Type:application/x-javascript; charset=utf-8
Date:Tue, 15 Mar 2016 15:51:31 GMT
ETag:"pub1448944926;gz"
Expires:Wed, 15 Mar 2017 15:51:31 GMT
Keep-Alive:timeout=8
Last-Modified:Tue, 01 Dec 2015 04:42:06 GMT
Server:nginx
Vary:Accept-Encoding
以下是nginx的相对配置文件
nginx.conf
user nginx;
worker_processes 4;
pid /var/run/nginx.pid;
error_log /var/log/nginx/error.log;
events {
worker_connections 1024;
multi_accept on;
use epoll;
}
http {
include /etc/nginx/mime.types;
charset utf-8;
default_type application/octet-stream;
#access_log /var/log/nginx/access.log main;
access_log off;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
# compression
gzip on;
gzip_http_version 1.0;
gzip_vary on;
gzip_comp_level 5;
gzip_proxied any;
gzip_min_length 100;
# gzip_min_length 10240;
gzip_buffers 16 8k;
gzip_types text/plain text/css application/x-javascript text/comma-separated-values text/xml application/xml application/xml+rss application/atom+xml text/javascript;
#gzip_disable "MSIE [1-6].(?!.*SV1)";
# general options
sendfile on;
tcp_nopush on;
tcp_nodelay off;
autoindex off;
server_tokens off;
merge_slashes on;
client_header_buffer_size 1k;
client_body_buffer_size 32k;
client_max_body_size 64m;
server_names_hash_bucket_size 128;
large_client_header_buffers 2 1k;
# timeouts
send_timeout 10;
keepalive_timeout 2 8;
keepalive_requests 200;
client_body_timeout 12;
client_header_timeout 12;
reset_timedout_connection on;
# pass through from load balancer
real_ip_header X-Forwarded-For;
set_real_ip_from 0.0.0.0/0;
# detect https
map $scheme $fastcgi_https {
default "";
https on;
}
# PHP-FPM
upstream phpfpm {
server unix:/run/php-fpm/php-fpm.sock weight=1 max_fails=5 fail_timeout=10;
}
# include active sites
include /etc/nginx/sites-enabled/*;
server {
listen 80 spdy default_server;
root /var/www/mysite.com;
location ^~ /app/ { return 403; }
location ^~ /includes/ { return 403; }
location ^~ /media/downloadable/ { return 403; }
location ^~ /pkginfo/ { return 403; }
location ^~ /report/config.xml { return 403; }
location ^~ /var/ { return 403; }
location ^~ /lib/ { return 403; }
location ^~ /dev/ { return 403; }
location ^~ /RELEASE_NOTES.txt { return 403; }
location ^~ /downloader/pearlib { return 403; }
location ^~ /downloader/template { return 403; }
location ^~ /downloader/Maged { return 403; }
location ~* ^/errors/.+\.xml { return 403; }
}
}
/ mysite的启用站点 -
server {
#mysiteip is an actual ip that I've removed for security
listen mysiteip:80;
server_name www.test.mysite.com;
return 301 $scheme://test.mysite.com$request_uri;
}
server {
# settings
listen mysiteip:80;
listen mysiteip:443 ssl;
server_name test.mysite.com;
root /var/www/mysite.com/testing/current/;
index index.html index.htm index.php;
# security
ssl_protocols TLSv1.2;
ssl_ciphers RC4:HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
# SSL Certificate Settings
ssl_certificate /etc/nginx/ssl/bundle.crt;
ssl_certificate_key /etc/nginx/ssl/star_mysite_com.key;
access_log /var/log/nginx/mysite.access.log;
error_log /var/log/nginx/www-mysite-com_error.log;
# routes
include /etc/nginx/conf.d/security.conf;
include /etc/nginx/conf.d/assets.conf;
include /etc/nginx/conf.d/rewrites.conf;
# Attempt to serve the request by trying direct file, directory, Magento front controller
large_client_header_buffers 8 16k;
location / {
try_files $uri $uri/ /index.php?$args;
expires max;
}
# The downloader has its own index.php that needs to be used
location ~* ^(/downloader)(.*) {
try_files $uri $uri/ /downloader/index.php$1;
}
# REST API endpoint
location /api {
rewrite ^/api/rest /api.php?type=rest last;
rewrite ^/api/v2_soap /api.php?type=v2_soap last;
rewrite ^/api/soap /api.php?type=soap last;
}
# Pass PHP scripts to PHP-FPM daemon
location ~* \.php$ {
# filter out problem conditions
location ~ \..*/.*\.php$ { return 404; }
# bring in parameters
include /etc/nginx/conf.d/fastcgi.conf;
fastcgi_param MAGE_RUN_CODE default;
fastcgi_param MAGE_RUN_TYPE store;
# DEVELOPER MODE
#fastcgi_param MAGE_IS_DEVELOPER_MODE true;
# send requests to upstream, but blacklist media location from fcgi
if ($uri !~ "^/(media)/") {
fastcgi_pass phpfpm;
}
}
}
conf.d / rewrites.conf
# I am using this rewrite for the fooman speedster extension
location /skin/m {
rewrite ^/skin/m/([^/]+)(/.*.(js|css))$ /lib/minify/m.php?f=$2&d=$1;
}
任何有关正在发生或正在做错事的见解都将非常感激。如果需要,我可以提供更多信息。另外Fooman的重写用于缩小,即使没有安装此扩展并且重写被删除,我仍然没有得到gzip。
答案 0 :(得分:0)
您的HTTP响应可能已缓存。这些HTTP标头可以解决这个问题:
Cache-Control:max-age=31536000
Expires:Wed, 15 Mar 2017 15:15:13 GMT
这基本上告诉每个请求响应的人按照他们认为合适的方式缓存响应,因为它将在2017年3月之前有效并可缓存。在您的示例中,这是针对Javascript的,所以很好,但是如果你再次测试资源,很可能返回旧的响应。您需要确保每个缓存都已清空,并且没有代理缓存响应。否则,您可能会从中间位置获得响应,而不是您的Nginx服务器,因此在这种情况下您无法验证任何GZIP设置。
HTTPS请求通常不会被任何代理缓存(因为它们看不到内容),因此这可能就是它在那里工作的原因。
配置中的以下行可能会导致意外缓存:
location / {
try_files $uri $uri/ /index.php?$args;
expires max;
}
Nginx在这里使用expires指令为所有请求添加expires和max-age缓存控制头,甚至是动态请求。您应该检查您的HTML / PHP页面是否未使用此标头进行缓存,如果这可能是问题的一部分。
答案 1 :(得分:0)
由于Bounty,现在不能添加评论。 @iquiot @iquito谢谢我禁用过期最大,没有运气。我追踪到了Fooman扩展中的这个设置。并将max-age设置为零。这是新的响应头...但仍然没有gzip
Cache-Control max-age=0
Connection keep-alive
Content-Type text/css; charset=utf-8
Date Thu, 17 Mar 2016 19:35:05 GMT
Etag "pub1457625059;gz"
Last-Modified Thu, 10 Mar 2016 15:50:59 GMT
Server nginx/1.8.0
Transfer-Encoding chunked
Vary Accept-Encoding
更新:
我从较大的图片中删除了自己,尝试调试此问题。我创建了一个test.html文件,并使用它来尝试查看是否可以进行任何类型的压缩。我注意到的一个奇怪的事情是,如果我将gzip_min_length设置为100,当内容小于100时,我会在标题中获得内容长度,但是一旦超过100,内容长度就会消失。
更新2: 当使用curl时,任何类型的"接受:"设置的标头不会在响应中返回gzip。这可能是罪魁祸首吗?
更新3: 使用这个小工具的Firefox https://addons.mozilla.org/en-US/firefox/addon/modify-headers/developers 我能够修改发送的标头。 通过完全禁用用户代理标头,我现在可以通过内容编码gzip获得正确的响应标头。但是我的nginx配置中没有任何地方可以为gzip设置禁用参数集,这会产生这样的行为。