Невозможно обработать сеансы входа пользователя в систему с помощью кэширования 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 и т. Д.) Для принятия этого решения похоже на управление автомобилем извне с помощью аварийных барьеров. Это работает, но использование руля умнее.