Я скомпилировал Nginx 1.4.3 из исходников с помощью модуля SPDY.
Однако, когда SPDY включен, похоже, что мой заголовок Vary: Accept-Encoding нарушается.
Моя конфигурация Nginx:
./configure
--conf-path=/etc/nginx/nginx.conf
--pid-path=/var/run/nginx.pid
--error-log-path=/var/log/nginx/error.log
--http-proxy-temp-path=/var/cache/nginx/proxy_temp
--http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp
--http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp
--http-scgi-temp-path=/var/cache/nginx/scgi_temp
--http-log-path=/var/log/nginx/access.log
--with-http_ssl_module --prefix=/usr
--add-module=./nginx-sticky-module-1.1
--add-module=./headers-more-nginx-module-0.23
--with-http_spdy_module
Мой файл `nginx.conf ':
user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#Compression Settings
gzip on;
gzip_http_version 1.0;
gzip_comp_level 2;
gzip_proxied any;
gzip_min_length 1100;
gzip_buffers 16 8k;
gzip_types text/plain text/css application/x-javascript text/xml application/xml application/xml+rss text/javascript image/svg+xml;
# Some version of IE 6 don't handle compression well on some mime-types,
# so just disable for them
gzip_disable "MSIE [1-6].(?!.*SV1)";
# Set a vary header so downstream proxies don't send cached gzipped
# content to IE6
gzip_vary on;
proxy_cache_path /var/www/nginx_cache levels=1:2 keys_zone=qnx-cache:10m inactive=24h max_size=1g;
proxy_temp_path /var/www/nginx_cache/tmp;
server_tokens off;
include /etc/nginx/conf.d/*.conf;
map $geo $mapping {
default default;
US US;
DE DE;
CA CA;
GB GB;
}
geo $geo {
default default;
include geo.conf;
}
upstream default.backend {
# sticky;
server 192.168.0.5:8080;
server 192.168.0.6:8080;
server 192.168.0.7:8080;
}
upstream mysite.backend {
sticky name=servIDTrack hash=sha1;
server 192.168.0.5:8080 weight=10 max_fails=3 fail_timeout=10s;
server 192.168.0.6:8080 weight=10 max_fails=3 fail_timeout=10s;
server 192.168.0.7:8080 weight=10 max_fails=3 fail_timeout=10s;
}
server {
listen 80;
server_name secure.mysite.com;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl;
server_name secure.mysite.com;
more_set_headers "Server: X-nginx/v1.1 [LB01]";
ssl_certificate /etc/nginx/ssl/secure_mysite_com_ssl.cert;
ssl_certificate_key /etc/nginx/ssl/secure_mysite_com_ssl.key;
ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2;
# ssl_ciphers RC4:HIGH:!aNULL:!MD5;
ssl_ciphers ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-RC4-SHA:ECDHE-RSA-RC4-SHA:ECDH-ECDSA-RC4-SHA:ECDH-RSA-RC4-SHA:ECDHE-RSA-AES256-SHA:RC4-SHA;
ssl_prefer_server_ciphers on;
keepalive_timeout 120;
ssl_session_cache builtin:1000 shared:SSL:10m;
ssl_session_timeout 10m;
location / {
proxy_pass http://mysite.backend;
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_redirect off;
proxy_http_version 1.1;
add_header Strict-Transport-Security "max-age=31556926; includeSubdomains";
# Cache
proxy_cache qnx-cache;
proxy_cache_valid 200 301 302 120m;
proxy_cache_valid 404 1m;
add_header X-Cache-Status $upstream_cache_status;
proxy_cache_key "$scheme$host$request_uri";
}
}
}
Результаты заголовка с включенным / отключенным SPDY:
url: mypage.php (SPDY enabled)
HTTP/1.1 200 OK
cache-control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
content-encoding: gzip
content-type: text/html; charset=utf-8
date: Wed, 20 Nov 2013 13:39:30 GMT
expires: Thu, 19 Nov 1981 08:52:00 GMT
pragma: no-cache
server: X-nginx/v1.1 [LB01]
status: 200
strict-transport-security: max-age=31556926; includeSubdomains
version: HTTP/1.1
x-cache-status: MISS
url: mypage.php (SPDY disabled)
HTTP/1.1 200 OK
Date: Wed, 20 Nov 2013 13:45:00 GMT
Content-Type: text/html; charset=utf-8
Transfer-Encoding: chunked
Connection: keep-alive
Vary: Accept-Encoding
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Server: X-nginx/v1.1 [LB01]
Strict-Transport-Security: max-age=31556926; includeSubdomains
X-Cache-Status: MISS
Content-Encoding: gzip
url: mystyle.css (SPDY enabled)
HTTP/1.1 200 OK
date: Wed, 20 Nov 2013 12:53:49 GMT
content-encoding: gzip
last-modified: Mon, 18 Nov 2013 22:09:32 GMT
server: X-nginx/v1.1 [LB01]
x-cache-status: HIT
strict-transport-security: max-age=31556926; includeSubdomains
content-type: text/css
status: 304
expires: Wed, 18 Dec 2013 22:42:35 GMT
cache-control: max-age=2592000
version: HTTP/1.1
url: mystyle.css (SPDY disabled)
HTTP/1.1 200 OK
Date: Wed, 20 Nov 2013 13:45:01 GMT
Content-Type: text/css
Transfer-Encoding: chunked
Connection: keep-alive
Vary: Accept-Encoding
Last-Modified: Mon, 18 Nov 2013 22:09:32 GMT
Cache-Control: max-age=2592000
Expires: Wed, 18 Dec 2013 22:10:13 GMT
Server: X-nginx/v1.1 [LB01]
Strict-Transport-Security: max-age=31556926; includeSubdomains
X-Cache-Status: HIT
Content-Encoding: gzip
Как видите, когда SPDY включен, Vary: Accept-Encoding
заголовки исчезают.
Это проблема моего nginx.conf
настроен?
SPDY (и HTTP / 2.0) требует, чтобы пользовательские агенты поддерживали сжатие, и это привлекает Vary: Accept-Encoding
заголовок бесполезен. Вот почему nginx отбрасывает заголовок.
Это может быть или не быть ошибкой, но поскольку SPDY всегда использует сжатие и в настоящее время нет прокси-серверов SPDY для пересылки (поскольку SPDY всегда использует TLS), заголовок Vary бесполезен. Vary используется прокси только для определения того, следует ли отправлять сжатый или несжатый контент.
По сути, если подключаемая система поддерживает SPDY, она также поддерживает сжатый с помощью gzip контент, поэтому нет необходимости тратить байты на заголовок Vary. Это то, что делают по крайней мере некоторые крупные сайты, поддерживающие SPDY. Видеть эта страница для получения дополнительной информации.
Теоретически в один прекрасный день могут появиться прокси-серверы SPDY в корпорациях, за которыми стоят устаревшие браузеры, которые не поддерживают сжатие HTTP, но я очень надеюсь, что нет. Даже если бы это было так, прокси мог бы просто распаковать на лету с небольшими накладными расходами, если бы клиент не отправил заголовок «Accept-Encoding: gzip».
SPDY и HTTP / 2 имеют свои собственные механизмы сжатия заголовков. В стандарты подразумевают, что браузер должен поддерживать сжатие данных, чтобы использовать SPDY или HTTP / 2, что делает добавление заголовка Vary избыточным. Исключение заголовка Vary в этом случае также позволяет сэкономить несколько байтов в каждом сообщении запроса.
Более подробное объяснение этого Вот.