OXID CE / PE Hinter Squid Proxy?

Hallo in die Forums-Runde!

In der EE Version wird für den OXID ja eine Integration (?) mit dem Varnish Reverse Proxy angeboten. Hat schon jemand mal probiert, die Seite einfach hinter einen Standard-Reverse-Proxy (CE) wie Squid zu stellen?

viele Grüße
Gregor

ich habe mal ein bisschen mit varnish und esx rumexperimentiert, das ganze funktioniert schon allein deswegen nicht (oder bringt nichts) weil Oxid die Sprache sofort beim ersten start als Cookie rüber schiebt. Und sobald Cookies oder Sessions im Spiel sind wird das ganze kniffelig.

Ich denke solang es nicht ein umfangreiches Modul oder eine direkte Unterstützung in Oxid gibt kann man die ganze reverse proxy Geschichte knicken.

Natürlich lasse ich mich gerne eines besseren belehren.

Hab mal nen Test mit Squid-Reserve-Proxy gemacht, das schnallt OXID anscheinend und codiert alle links direkt mit forceSID=xxx um. Damit ist die Cache-Geschichte natürlich aus, da der Squid standardmäßig keine URLs mit ? cached.
Meine Idee war, das im OXID zu steuern (ja, wahrscheinlich per Modul), dass sobald der User etwas in den Warenkorb o-ä- legt, die Session-ID in die URL übernommen wird, und dem Proxy bring ich bei, alle URLs mit Session-ID eben nicht zu cachen.

Die 5er EE hat ja eine Integration von Varnish… gibt’s dazu eigentlich mehr Infos?

viele Grüße
Gregor

Hi,

[QUOTE=KingBBQ;106236]
Die 5er EE hat ja eine Integration von Varnish… gibt’s dazu eigentlich mehr Infos?
[/QUOTE]

Klar:
http://www.oxid-esales.com/en/products/facts/preview.html

Gruß

Sobald es aber mit der Lagerhaltung los geht wird es wieder schwierig, denn die “Lagerampel” sollte man nicht cachen. Ich hab schon mal mit einem Modul angefangen dass sich damit beschäftigt - aber leider muss man dazu die oxshopcontrol hacken. Denn was machst du wenn der Admin einen Artikel, Kategorie, Content etc. deaktviert oder löscht - das ist alles immer ein Wechselspiel zwischen dem Shop und dem Squid. Aber ich wäre auf jeden Fall auch interessiert.

So hab mich nochmal mit dem Zeug rumgeärgert - also in der CE/PE scheint es mir so als ob reverse proxies komplett ignoriert werden. Im Code gibt es keinen Part der sich um ESX o.Ä. kümmert - schade drum, damit könnte man alle shops ziemlich gut tunen und den Umsatz steigern. Eine EE lohnt sich natürlich nicht für Klein- und Mittelstand. Der Wiki Eintrag zu den Widgets ist hinfällig, auch wenn er für 4.7 gekennzeichnet ist ist er nur für 5.0 verwendbar.

Ach ja, ganz vergessen - hier ist die vcl Datei für varnish wenn man nur “nicht eingeloggtes” zeug cachen will - das geht mit jeder Version. Hier wird davon ausgegangen dass der Varnish in Version 3 läuft und auf Port 80 hört. Ist eventuell noch müll drin - aber funktioniert ganz gut. Geiler wäre es natürlich wenn die ESI Geschichten gingen. Ich habe die von Magento einfach umgebaut.


 backend default {
     .host = "www.meinedomain.de";
     .port = "80"; # We will then configure apache to listen to port 81
 }

acl trusted {
    "127.0.0.1";
    # Add other ips that are allowed to purge cache
}

#
# http://www.varnish-cache.org/docs/2.1/tutorial/vcl.html#vcl-recv
# @param req    Request object
sub vcl_recv {
    
    set req.http.host = "www.meinedomain.de";

    if (req.http.x-forwarded-for) {
        set req.http.X-Forwarded-For = req.http.X-Forwarded-For+","+client.ip;
    }
    else {
        set req.http.X-Forwarded-For = client.ip;
    }

    if (req.request == "PURGE") {
        # Allow requests from trusted IPs to purge the cache
        if (!client.ip ~ trusted) {
           error 405 "Not allowed.";
        }
        ban("req.url ~ " + req.url);
        error 200 "Ok"; #We don't go to backend
        #return(lookup); # @see vcl_hit
    }

    if (req.request != "GET" &&
       req.request != "HEAD" &&
       req.request != "PUT" &&
       req.request != "POST" &&
       req.request != "TRACE" &&
       req.request != "OPTIONS" &&
       req.request != "DELETE") {
         /* Non-RFC2616 or CONNECT which is weird. */
         return (pipe);
    }

     # Cache only GET or HEAD requests
     if (req.request != "GET" && req.request != "HEAD") {
         /* We only deal with GET and HEAD by default */
         return (pass);
     }

    # parse accept encoding rulesets to normalize
    if (req.http.Accept-Encoding) {
        if (req.http.Accept-Encoding ~ "gzip") {
            set req.http.Accept-Encoding = "gzip";
        } elsif (req.http.Accept-Encoding ~ "deflate") {
            set req.http.Accept-Encoding = "deflate";
        } else {
            # unkown algorithm
            remove req.http.Accept-Encoding;
        }
    }

     # Rules for static files
     if (req.url ~ "\.(jpeg|jpg|png|gif|ico|swf|js|css|gz|rar|txt|bzip|pdf)(\?.*|)$" || req.url ~ "boshi\.php") {
        set req.http.staticmarker = "1";
        unset req.http.Cookie;

        return (lookup);
    }

    # Don't cache pages for Magento Admin
    # FIXME: change this rule if you use custom url in admin
    if (req.url ~ "^/admin") {
        return(pass);
    }

    # Don't cache checkout/customer pages, product compare
    if (req.url ~ "force_sid=" || req.http.cookie ~ "sid") {
        return(pass);
    }

    # Remove cookie
    unset req.http.Cookie;
    set req.http.magicmarker = "1"; #Instruct varnish to remove cache headers received from backend
    return(lookup);
 }

sub vcl_pipe {
#     # Note that only the first request to the backend will have
#     # X-Forwarded-For set.  If you use X-Forwarded-For and want to
#     # have it set for all requests, make sure to have:
#     # set req.http.connection = "close";
#     # here.  It is not set by default as it might break some broken web
#     # applications, like IIS with NTLM authentication.
     return (pipe);
}

#sub vcl_pass {
#     return (pass);
#}

sub vcl_hash {
    if(req.url ~ "[\?&]force_sid="){
      hash_data(regsub(req.url,"[\?&]force_sid=([A-Za-z0-9]+)",""));
    }else{
      hash_data(req.url);
    }
    hash_data(req.http.host);
    return (hash);
}

# Called after a cache lookup if the req. document was found in the cache.
sub vcl_hit {
    if (req.request == "PURGE") {
        ban_url(req.url);
        error 200 "Purged";
    }

    if (!(obj.ttl > 0s)) {
        return (pass);
    }
    return (deliver);
}

# Called after a cache lookup and odc was not found in cache.
sub vcl_miss {
    if (req.request == "PURGE"){
        error 200 "Not in cache";
    }
    return (fetch);
}

# Called after document was retreived from backend
# @var req      Request object.
# @var beresp   Backend response (contains HTTP headers from backend)
sub vcl_fetch {
    set req.grace = 30s;

   # Current response should not be cached
   if(beresp.http.Set-Cookie ~ "sid") {
        return (deliver);
   } 
   if (req.http.magicmarker){
        unset beresp.http.magicmarker;
        unset beresp.http.Cache-Control;
        unset beresp.http.Expires;
        unset beresp.http.Pragma;
        unset beresp.http.Cache;
        unset beresp.http.Server;
        unset beresp.http.Set-Cookie;
        unset beresp.http.Age;

        # default ttl for pages
        set beresp.do_esi = true;
        set beresp.ttl = 1d;
    }
    if (req.http.staticmarker) {
        set beresp.ttl = 30d; # static file cache expires in 30 days
        unset beresp.http.staticmarker;
        unset beresp.http.ETag; # Removes Etag in case we have multiple frontends
    }

    return (deliver);
}

# Called after a cached document is delivered to the client.
sub vcl_deliver {
    if (obj.hits > 0) {
        set resp.http.X-Cache = "HIT ("+obj.hits+")";
    } else {
        set resp.http.X-Cache = "MISS";
        #    set resp.http.X-Cache-Hash = obj.http.hash;
    }
    return (deliver);
}