Nginx Reverse Proxy Gzip zum Client


10

Ich habe einen IIS 6.0-Webserver, der dem Internet ausgesetzt ist und Gzipping nicht zuverlässig ausführt. Ich weiß, dass es alt ist, aber es ist alles, womit ich für diese eine Instanz arbeiten muss.

Was ich tun möchte, ist, Nginx (oder ähnliches) als Reverse-Proxy- und Caching-Server vor IIS zu stellen, um die Website zu beschleunigen. Ich bin mir jedoch nicht sicher, ob es möglich ist, den Nginx-Server von sich aus in den Webbrowser zu übertragen. Wenn IIS Gzipped-Anforderungen an nginx zurückgibt, kehren sie problemlos zum Browser zurück.

gzip                on;
gzip_min_length     1000;
gzip_buffers        4 8k;
gzip_http_version   1.0;
gzip_disable        "msie6";
gzip_types          text/plain text/css;
gzip_vary           on;

location / {
    proxy_set_header x-real-IP $remote_addr;
    proxy_set_header x-forwarded-for $proxy_add_x_forwarded_for;
    proxy_set_header host $host;
    proxy_pass http://192.168.5.37;
}

HTTP-Anfrage (/css/components.css)

GET /css/components.css HTTP/1.1
Host: www.mydomain.co.uk
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache
Accept: text/css,*/*;q=0.1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.71 Safari/537.36
Accept-Encoding: gzip, deflate, sdch
Accept-Language: en-GB,en-US;q=0.8,en;q=0.6

HTTP-Antwort (/css/components.css)

HTTP/1.1 200 OK
Server: nginx/1.8.0
Date: Thu, 22 Oct 2015 14:26:08 GMT
Content-Type: text/css
Transfer-Encoding: chunked
Connection: keep-alive
Vary: Accept-Encoding
Last-Modified: Sat, 22 Aug 2015 09:36:54 GMT
ETag: W/"07f8614bedcd01:8beb"
X-Powered-By: ASP.NET

Gibt es einen magischen Parameter, den ich irgendwo vermisse, um ihn anzuweisen, die Dateien in Nginx zu komprimieren?

Vielen Dank!

Dean

Antworten:


10

Sie können die gzip_proxied any;Direktive zu Ihrer conf hinzufügen.

bearbeiten:

Mein Test:
Ich habe auf meinem Computer (192.168.122.1) mit einen einfachen HTTP-Server eingerichtet (der nicht in der Lage ist, selbst zu gzip) python -m http.server 8080. Wenn ich es anfordere, bekomme ich:

[pat@morbier ~]$ curl -I -H 'Accept-Encoding: gzip,deflate' http://192.168.122.1:8080/
HTTP/1.0 200 OK
Server: SimpleHTTP/0.6 Python/3.5.0
Date: Thu, 22 Oct 2015 17:41:39 GMT
Content-type: text/html; charset=utf-8
Content-Length: 1197

Ich habe einen Proxy mit nginx eingerichtet (192.168.122.224)

gzip_min_length     1000;
gzip_buffers        4 8k;
gzip_http_version   1.0;
gzip_disable        "msie6";
gzip_types          text/plain text/css;
gzip_vary           on;

location / {
    proxy_set_header x-real-IP $remote_addr;
    proxy_set_header x-forwarded-for $proxy_add_x_forwarded_for;
    proxy_set_header host $host;
    proxy_pass http://192.168.122.1:8080;
}

Wenn ich das gleiche mit dem Proxy anfordere, bekomme ich

[pat@morbier ~]$ curl -I -H 'Accept-Encoding: gzip,deflate http://192.168.122.224/
HTTP/1.1 200 OK
Server: nginx/1.8.0
Date: Thu, 22 Oct 2015 17:46:08 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 1197
Connection: keep-alive

Dann füge ich dem Proxy conf hinzu

gzip on;
gzip_proxied any;

Und ich verstehe

[pat@morbier ~]$ curl -I -H 'Accept-Encoding: gzip,deflate' http://192.168.122.224/
HTTP/1.1 200 OK
Server: nginx/1.8.0
Date: Thu, 22 Oct 2015 17:47:54 GMT
Content-Type: text/html; charset=utf-8
Connection: keep-alive
Content-Encoding: gzip

Sie können es auch sehen, wenn Sie sich ohne -I kräuseln (so dass die gesamte Seite angezeigt wird). In meinem Fall wird auf dem Terminal eine Binärdatei angezeigt, was die Tatsache verstärkt, dass es komprimiert ist. Wenn ich die reguläre Website kräusele, die nicht gzippt, erhalte ich den Inhalt der Webseite (HTML).

edit2:
Es funktioniert tatsächlich nur mit aktivierten Optionen. Es scheint, dass gzip_proxied nicht erforderlich ist.
Ah, Sie fordern an, ohne den Header 'Accept-Encoding: gzip, deflate' zu übergeben (ich denke, Sie verwenden Telnet). In diesem Fall funktioniert dies nicht, da Sie dem Server nicht sagen, dass Sie gzip-codierte Binärdateien verarbeiten können.
Versuchen Sie es bitte mit Locken.


Ich fürchte, das hat keinen Unterschied gemacht.
Dean Thomas

Ich habe meine Antwort bearbeitet, um Ihnen weitere Details zu geben.
Pierre-Alain TORET

Vielen Dank dafür, ich werde morgen ein neues Setup und eine neue Konfiguration durchführen. Es macht im Moment nicht viel Sinn. In Bezug auf Edit2: Ich übergebe Accept-Encoding. Ich habe diese Anfrage buchstäblich von den Entwicklertools von Chrome kopiert.
Dean Thomas

0

Ja, das ist sicher möglich. Ich habe es versehentlich herausgefunden (in meinem Fall ist es 8.5, das perfekt funktioniert hat, bis ich den Nginx-Reverse-Proxy davor gestellt habe und gzip aus der Browser-Perspektive verloren gegangen ist).

Die hier gezeigte Konfiguration:

nginx: gzip auf dem Server geht während des Proxys verloren

Ermöglicht Ihren Kunden die gzip-Interaktion mit nginx, unabhängig davon, was iis tut.

Passen Sie die Mimetypen nach Geschmack an.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.