NGINX and wrong memcached output

Hi,

At first let me tell my application was developped under PHP with
Symfony2, but I guess my problem is about nginx and memcached and not
about PHP. As I can see here is good community about nginx and I will be
glad for any help.

I have problem with nginx and memcached responses such as text/html or
application/json. My idea is:
-First request on nginx server (reverse proxy memcached server)
-Try if I have memcached response (memcached run on same server as
nginx)
-If not go to application server
-Application server makes response
-Stores response in to memcached
-And for next same request nginx hit response from memcached and return
to client.

But the problem is, when the application server stores response to
memcached (data in memcached are stored good and corectly) and NGINX hit
the request in memcached, but return totaly wrong hashed content.

For example:
First request, ngingx didnt find response in memcached, pass to
application server, and here is response … good and correct JSON.
------- Headers
HTTP/1.0 200 OK
Date: Sun, 22 Apr 2012 16:13:58 GMT
Server: Apache/2.2.16 (Debian)
X-Powered-By: PHP/5.3.3-7+squeeze8
cache-control: no-cache
x-debug-token: 4f942e4dee10b
Content-Length: 476
Connection: close
Content-Type: application/json
-------- Content
[{“id”:10,“title”:“Cinema”,“url”:“cinema”,“articles”:null},{“id”:2,“title”:“Computers”,“url”:“computer”,“articles”:null},{“id”:8,“title”:“Foto”,“url”:“foto”,“articles”:null},{“id”:12,“title”:“Literature”,“url”:“literature”,“articles”:null},{“id”:4,“title”:“Music”,“url”:“music”,“articles”:null},{“id”:18,“title”:“Society”,“url”:“society”,“articles”:null},{“id”:16,“title”:“Sport”,“url”:“sport”,“articles”:null},{“id”:6,“title”:“Travelling”,“url”:“travelling”,“articles”:null}]

But for the second request, when NGINX find response in memcached, NGINX
serves totaly wrong.
-------- Headers
Connection:keep-alive
Content-Length:164
Content-Type:application/json
Date:Sun, 22 Apr 2012 16:17:15 GMT
Server:nginx/0.7.67
-------- Content
xśuÎ1Â0ŕ˙rs+“’UpŇI·ââ)צ$AÄ˙nˇ59¤ßƒďÝ5o ˜zU0‚=uŘZ¨
˘űE„cÓ%ćO5ʵ‚ľí“ˆĹN͢Ţ}đâ3ĽŹaŐę摆y+)¶¬«ů…M8ĄH.ŰvJ‡Ő»gďĺ•eĚyÁn•í}”§4ď»űDfęŮŠ®ţ®_ß
ť

With text/html I have exactly the same problem. Do you have anybody any
idea plese? Here is my nginx configuration:

nginx virtual host from sites-available

server {
listen 80;
server_name dp-xskrha.local;
access_log /var/log/nginx/dp-xskrha/access.log;
error_log /var/log/nginx/dp-xskrha/error.log;

# Static content, images, css, js
location ~*

^.+.(jpe?g|gif|png|ico|css|zip|tgz|gz|rar|bz2|doc|xls|exe|pdf|ppt|txt|tar|mid|midi|wav|bmp|rtf|js|swf|avi|mp3)$
{
proxy_redirect off;
proxy_pass http://app.dp-xskrha.local:80;
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_cache dp-xskrha-static;
roxy_cache_valid 200 10m;
}

# Model api json
location /model-api {
    default_type          application/json;
    set $memcached_key    $uri;
    memcached_pass        127.0.0.1:11211;
    error_page            404 =200 @fallback;
}

# Dynamic content, all rest uri
location / {
    default_type            text/html;
    charset                 utf-8;
    set $memcached_key      $uri;
    memcached_pass          127.0.0.1:11211;
    error_page              404 =200 @fallback;
  }

# Memcached fallback for proxy pass
location @fallback {
    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_pass http://app.dp-xskrha.local:80;
}
}

nginx.conf
user www-data;
worker_processes 1;

error_log /var/log/nginx/error.log;
pid /var/run/nginx.pid;

events {
worker_connections 1024;
multi_accept on;
}

http {
include /etc/nginx/mime.types;

access_log    /var/log/nginx/access.log;

sendfile        on;
tcp_nopush     on;

#keepalive_timeout  0;
keepalive_timeout  65;
tcp_nodelay        on;

gzip  on;
gzip_disable "MSIE [1-6]\.(?!.*SV1)";

# proxy settings
proxy_cache_path  /data/nginx/cache  levels=1:2

keys_zone=dp-xskrha-static:10m
inactive=24h max_size=1g;

include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;

}

Thank you very much, for Your response :slight_smile:

Jacob

Hello!

On Sun, Apr 22, 2012 at 06:48:06PM +0200, Jakub wrote:

-Try if I have memcached response (memcached run on same server as

Content-Length: 476
Content-Type:application/json
Date:Sun, 22 Apr 2012 16:17:15 GMT
Server:nginx/0.7.67
-------- Content
xśuÎ1Â0ŕ˙rs+"’UpŇI·ââ)צ$AÄ˙nˇ59¤ßƒďÝ5o ˜zU0‚=uŘZ¨

˘űE„cÓ%ćO5ʵ‚ľí“ˆĹN͢Ţ}đâ3ĽŹaŐę摆y+)¶¬«ů…M8ĄH.ŰvJ‡Ő»gďĺ•eĚyÁn•í}"§4ď»űDfęŮŠ®ţ®_ß

ť

With text/html I have exactly the same problem. Do you have anybody any
idea plese? Here is my nginx configuration:

Content stored in memcached is compressed, and nginx just returns
what you have in memcached. You have to read docs on your
memcached client to instruct it to don’t do any
compression/serialization and store raw data instead.

Maxim D.

Hi Maxim,

yes, you are right. That was the problem. I have just solved it and my
app works correctly now. Thank you very much, for you response. And
NGINX is strong tool :slight_smile:

Regards,

Jacob