incapaz de lidar com sessões de login do usuário com o cache nginx

1

Estamos tendo problemas com as sessões de login do usuário, que são armazenadas em cache devido ao arquivo de configuração nginx.

Nosso aplicativo desenvolvido no cakephp. Não é possível parar o armazenamento em cache do arquivo específico com nginx.

Por favor, encontre o arquivo abaixo nginx conf e, por favor, sugira a melhor maneira de lidar com as sessões de login do usuário com o nginx

user  nginx;
worker_processes  auto;

error_log  /var/log/nginx/error.log;
pid        /var/run/nginx.pid;
events {
worker_connections 4024;
}

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;
    tcp_nodelay         on;

    #keepalive_timeout   0;
    keepalive_timeout   650;
    types_hash_max_size 2048;

#        gzip         on;
#       gzip_disable "msie6";

#       gzip_vary on;
#       gzip_proxied any;
#       gzip_comp_level 6;
#       gzip_buffers 16 8k;
#       gzip_http_version 1.1;
#       gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;

    # Load modular configuration files from the /etc/nginx/conf.d directory.
    # See http://nginx.org/en/docs/ngx_core_module.html#include
    # for more information.
    include /etc/nginx/conf.d/*.conf;

    index   index.php;


fastcgi_cache_path /home/main_domain/public_html/nginx/cache levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=600m;
fastcgi_cache_key "$scheme$request_method$host$request_uri";


server {
    listen   80;
    server_name main_domain.com;
    rewrite ^ http://www.main_domain.com$request_uri;
}

#server {
#    server_name main_domain.com;
#    return 301 $scheme://www.main_domain.com$request_uri;
#}
server {
    listen   80;
    server_name www.main_domain.com;

    # root directive should be global
    root   /home/main_domain/public_html/;
    index  index.php index.html;

 #   set $no_cache 0;

    access_log /home/main_domain/public_html/access.log;
    error_log /home/main_domain/public_html/error.log;

    location / {
        try_files $uri $uri/ /index.php?$1;
       # proxy_cache my_cache;
       # proxy_pass http://main_domain2.com;
       # proxy_cache_valid  200 302  60m;
       # proxy_cache_valid  404      1m;
    }

location ~* \favicon.ico$ {
        expires 6m;
    }

location ~* \.(js|css)$ { try_files $uri /index.php?$query_string; expires 1h; add_header Pragma "public"; add_header Cache-Control "public, must-revalidate, proxy-revalidate"; }

    location ~ \.php$ {
        try_files $uri =404;
#        fastcgi_cache my_cache;
#        fastcgi_cache_valid 200 60m; # Only cache 200 responses, cache for 60 minutes
#        fastcgi_cache_methods GET HEAD; # Only GET and HEAD methods apply
#        add_header X-Fastcgi-Cache $upstream_cache_status;
#        fastcgi_cache_bypass $no_cache;  # Don't pull from cache based on $no_cache
#        fastcgi_no_cache $no_cache; # Don't save to cache based on $no_cache
#        fastcgi_buffer_size 128k;
#        fastcgi_buffers 256 4k;
#        fastcgi_busy_buffers_size 256k;
#        fastcgi_temp_file_write_size 256k;

   include /etc/nginx/fastcgi_params;
        fastcgi_pass    unix:/var/run/php-fpm/php-fpm.sock;
        fastcgi_index   index.php;
        fastcgi_param SCRIPT_FILENAME /home/main_domain/public_html/$fastcgi_script_name;
fastcgi_read_timeout 300;
    }
}


server {
    listen   80;
    server_name www.subdomain1.main_domain.com;

    # root directive should be global
    root   /home/main_domain/public_html/dev/subdomains/subdomain1/app/webroot;
    index  index.php index.html;

    set $no_cache 0;

#    location /users {
#     try_files $uri $uri/ /index.php?$1;
#     expires off;
#    proxy_no_cache $no_cache;
#    proxy_cache_bypass $no_cache;
    if ($request_uri ~* "/users.*") {
    set $no_cache 1;
      }
#    }





#    if ($request_uri ~* "(/admin|/users|/login)") {
#   set $no_cache 1;
#    }
#    proxy_no_cache $no_cache;
#    proxy_cache_bypass $no_cache;



    access_log /home/main_domain/public_html/dev/subdomains/subdomain1/access.log;
    error_log /home/main_domain/public_html/dev/subdomains/subdomain1/error.log;

    location /blog/ { try_files $uri $uri/ /blog/index.php?$args; }

    location / {
        try_files $uri $uri/ /index.php?$1;
       # proxy_cache my_cache;
       # proxy_pass http://main_domain2.com;
       # proxy_cache_valid  200 302  60m;
       # proxy_cache_valid  404      1m;
    }

location ~* \favicon.ico$ {
        expires 6m;
    }

location ~* \.(js|css)$ { try_files $uri /index.php?$query_string; expires 1h; add_header Pragma "public"; add_header Cache-Control "public, must-revalidate, proxy-revalidate"; }

    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_cache my_cache;
        fastcgi_cache_valid 200 60m; # Only cache 200 responses, cache for 60 minutes
        fastcgi_cache_methods GET HEAD; # Only GET and HEAD methods apply
        add_header X-Fastcgi-Cache $upstream_cache_status;
        fastcgi_cache_bypass $no_cache;  # Don't pull from cache based on $no_cache
        fastcgi_no_cache $no_cache; # Don't save to cache based on $no_cache
        fastcgi_buffer_size 128k;
        fastcgi_buffers 256 4k;
        fastcgi_busy_buffers_size 256k;
        fastcgi_temp_file_write_size 256k;


 include /etc/nginx/fastcgi_params;
        fastcgi_pass    unix:/var/run/php-fpm/php-fpm.sock;
        fastcgi_index   index.php;
        fastcgi_param SCRIPT_FILENAME /home/main_domain/public_html/dev/subdomains/subdomain1/app/webroot$fastcgi_script_name;
    }
}


server {
    listen   80;
    server_name subdomain2.main_domain.com;
    rewrite ^ http://www.subdomain2.main_domain.com$1 permanent;
}

server {
    listen   80;
    server_name www.subdomain2.main_domain.com;
    set $mobile_rewrite do_not_perform;

    if ($http_user_agent ~* "(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino") {
  set $mobile_rewrite perform;
}

    if ($mobile_rewrite = perform) {
        rewrite ^ http://m.main_domain.com$request_uri? redirect;
        break;
    }  

    # root directive should be global
    root   /home/main_domain/public_html/dev/subdomains/subdomain2/app/webroot;
    index  index.php index.html;

 #   set $no_cache 0;

    access_log /home/main_domain/public_html/dev/subdomains/subdomain2/access.log;
    error_log /home/main_domain/public_html/dev/subdomains/subdomain2/error.log;

    location / {
        try_files $uri $uri/ /index.php?$1;
       # proxy_cache my_cache;
       # proxy_pass http://main_domain2.com;
       # proxy_cache_valid  200 302  60m;
       # proxy_cache_valid  404      1m;
    }

location ~* \favicon.ico$ {
        expires 6m;
    }

location ~* \.(js|css)$ { try_files $uri /index.php?$query_string; expires 1h; add_header Pragma "public"; add_header Cache-Control "public, must-revalidate, proxy-revalidate"; }

#avoid php readfile()
location ^~ /blog {
        internal;
        alias /home/main_domain/public_html/dev/subdomains/subdomain2/app/webroot/blog ;
        access_log off; log_not_found off;      expires max;
}

    location ~ \.php$ {
        try_files $uri =404;
#        fastcgi_cache my_cache;
#        fastcgi_cache_valid 200 60m; # Only cache 200 responses, cache for 60 minutes
#        fastcgi_cache_methods GET HEAD; # Only GET and HEAD methods apply
#        add_header X-Fastcgi-Cache $upstream_cache_status;
#        fastcgi_cache_bypass $no_cache;  # Don't pull from cache based on $no_cache
#        fastcgi_no_cache $no_cache; # Don't save to cache based on $no_cache
#        fastcgi_buffer_size 128k;
#        fastcgi_buffers 256 4k;
#        fastcgi_busy_buffers_size 256k;
#        fastcgi_temp_file_write_size 256k;


 include /etc/nginx/fastcgi_params;
        fastcgi_pass    unix:/var/run/php-fpm/php-fpm.sock;
        fastcgi_index   index.php;
        fastcgi_param SCRIPT_FILENAME /home/main_domain/public_html/dev/subdomains/subdomain2/app/webroot$fastcgi_script_name;
    }
}
    
por chitroju sai hari Krishna 19.11.2016 / 12:28

1 resposta

2

Na verdade, você forneceu apenas um pequeno trecho de sua configuração do Nginx, mas parece que você está misturando as opções de cache do Nginx. A opção proxy_no_cache mostrada é para a funcionalidade de proxy da Web do Nginx (encaminhando uma solicitação para outro servidor da Web).

Em relação aos arquivos estáticos hospedados localmente (por exemplo, imagens, css, js ...), permita que o Nginx envie o cabeçalho de cache adequado usando a opção expira .

Em relação a um aplicativo PHP, você pode usar o cache FastCGI do Nginx. Como você talvez saiba, o Nginx encaminhará solicitações para um daemon PHP, como o PHP-FPM. Toda a mágica do PHP ocorre neste daemon do PHP-FPM e o Nginx só receberá a resposta final para enviá-lo de volta ao cliente.

O aplicativo PHP agora pode decidir incluir cabeçalhos de cache nesta resposta. Se o armazenamento em cache for permitido (por exemplo, uma página pública), o PHP pode retornar um cabeçalho Cache-Control para permitir o armazenamento em cache.

<?php
...
header('Cache-Control: public, max-age=3600');
...
?>

Se o armazenamento em cache não for permitido, o PHP poderá retornar um cabeçalho Cache-Control diferente para negar o armazenamento em cache:

<?php
...
header('Cache-Control: private, no-store, max-age=0');
...
?>

Se o seu aplicativo PHP puder enviar o cabeçalho de cache apropriado, você poderá usar o cache Nginx FastCGI usando a seguinte configuração:

fastcgi_cache_path /tmp/fastcgi_cache levels=1:2 keys_zone=phpfpm:64m inactive=24h max_size=512M;

server {
    listen         80;
    server_name    www.mysite.com;

    root   /var/www/xyz;
    index  index.php index.html;

    # check for static files and deliver, for everything else use /index.php
    location / {
        try_files $uri $uri/ /index.php;
    }

    # set caching header for static files
    location ~* \.(jpg|jpeg|gif|png|css|js|ico|svg|ttf)$ {
        access_log          off;
        log_not_found       off;
        expires             30d;
    }

    # set caching header for asset files, don't exec index.php just show 404
    location ^~ /assets/ {
        try_files           $uri =404;
        access_log          off;
        log_not_found       off;
        expires             30d;
    }

    # PHP handler, allow FastCGI caching
    location ~ \.php$ {
        access_log              /var/log/nginx/access.log combined;
        include                 fastcgi_params;
        fastcgi_keep_conn       on;
        fastcgi_pass            unix:/run/php/php5.6-fpm.sock;
        fastcgi_index           index.php;
        fastcgi_param           SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param           SCRIPT_NAME $fastcgi_script_name;
        fastcgi_cache           phpfpm;
        fastcgi_cache_use_stale updating error timeout invalid_header http_500;
    }
}

Se o seu aplicativo PHP não conseguir enviar cabeçalhos de cache apropriados, você poderá forçar o armazenamento em cache ou substituir os cabeçalhos incorretos do cache. Cuidado, isso pode resultar na publicação de dados privados para o público!

Conclusão

Deve ser sempre o aplicativo da web (aqui um aplicativo PHP) definindo qual página deve ser armazenada em cache e quais não. Usar um servidor da Web (Nginx, Apache ou qualquer outro) para tomar essa decisão é como controlar um carro de fora usando barreiras de travamento. Funciona, mas usar o volante é mais inteligente.

    
por 20.11.2016 / 19:51