Назад | Перейти на главную страницу

невозможно обрабатывать сеансы входа в систему с кешированием 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;
    }
}

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

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

Что касается приложения PHP, вы можете использовать кеширование FastCGI Nginx. Как вы, возможно, знаете, 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 или чего-то еще) для принятия этого решения похоже на управление автомобилем извне с помощью защитных барьеров. Работает, но умнее пользоваться рулем.