Невозможно обработать сеансы входа пользователя в систему с помощью кэширования nginx

У нас проблемы с пользовательскими сеансами входа в систему, они кэшируются из-за файла конфигурации nginx.

Наше приложение разработано в CakePHP. Невозможно остановить кэширование определенного файла с помощью nginx.

Найдите приведенный ниже файл конфигурации nginx и предложите наилучший способ обработки сеансов входа пользователя в систему с помощью 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;
    }
}

1 ответ

На самом деле вы предоставили только небольшой фрагмент вашей конфигурации Nginx, но, похоже, вы перепутали параметры кэширования Nginx. Показанный параметр proxy_no_cache предназначен для функциональности веб-прокси Nginx (пересылка запроса на другой веб-сервер).

Что касается локально размещенных статических файлов (например, images, css, js ...), пожалуйста, разрешите Nginx отправлять правильный заголовок кэширования с помощью опции expires.

Что касается PHP-приложения, вы можете использовать Nginx' FastCGI-кэширование. Как вы, возможно, знаете, Nginx будет пересылать запросы демону PHP, такому как PHP-FPM. Вся магия PHP происходит в этом демоне PHP-FPM, и Nginx получит только окончательный ответ, чтобы отправить его обратно клиенту.

Приложение PHP теперь может решить включить заголовки кэширования в этот ответ. Если разрешено кэширование (например, общедоступная страница), PHP может вернуть заголовок Cache-Control, чтобы разрешить кэширование.

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

Если кэширование не разрешено, PHP может вернуть другой заголовок Cache-Control, чтобы запретить кэширование:

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

Если ваше PHP-приложение может отправлять правильный заголовок кэширования, вы можете использовать Nginx FastCGI, используя следующую конфигурацию:

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;
    }
}

Если ваше PHP-приложение не может отправлять правильные заголовки кэширования, вы можете принудительно кэшировать или перезаписать неправильные заголовки кэша. Будьте осторожны, это может привести к публикации личных данных для общественности!

Заключение

Всегда должно быть веб-приложение (здесь приложение PHP), определяющее, какую страницу кэшировать, а какую нет. Использование веб-сервера (Nginx, Apache и т. Д.) Для принятия этого решения похоже на управление автомобилем извне с помощью аварийных барьеров. Это работает, но использование руля умнее.

Другие вопросы по тегам