fastcgicaching如何cachinglogin的用户,并为每个用户定制

目前,我正在使用fastcgi_cache来caching非login用户,并使用(如果+ fastcgi_no_cache + fastcgi_cache_bypass)将login用户直接传递到PHP-FPM的后端。

这个工作足够好,但是当PHP-FPM开始达到500+ req / s时,缓慢/加载开始。

所以我在想的是为login用户创build一个caching,每个用户都有它自己的caching文件,这可能吗? 如果是的话,请给我提供一些关于这方面的提示。 我已经看了很多,但没有任何帮助。

运行mysql和memcached和apc的自定义php cms的网站

cat /etc/nginx/nginx.comf

user username username; worker_processes 8; worker_rlimit_nofile 20480; pid /var/run/nginx.pid; events { worker_connections 10240; use epoll; } http { include 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 off; error_log /var/log/nginx/error.log warn; log_not_found off; log_subrequest off; server_tokens off; sendfile on; tcp_nopush on; tcp_nodelay on; keepalive_timeout 3; keepalive_requests 50; send_timeout 120; connection_pool_size 256; chunked_transfer_encoding on; ignore_invalid_headers on; client_header_timeout 60; large_client_header_buffers 4 128k; client_body_in_file_only off; client_body_buffer_size 512K; client_max_body_size 4M; client_body_timeout 60; request_pool_size 32k; reset_timedout_connection on; server_name_in_redirect off; server_names_hash_max_size 4096; server_names_hash_bucket_size 256; underscores_in_headers off; variables_hash_max_size 4096; variables_hash_bucket_size 256; gzip on; gzip_buffers 4 32k; gzip_comp_level 1; gzip_disable "MSIE [1-6]\."; gzip_min_length 0; gzip_proxied any; gzip_types text/plain text/css application/x-javascript text/javascript text/xml application/xml application/xml+rss application/atom+xml; open_file_cache max=3000 inactive=20s; open_file_cache_min_uses 1; open_file_cache_valid 20s; open_file_cache_errors off; fastcgi_buffer_size 8k; fastcgi_buffers 512 8k; fastcgi_busy_buffers_size 16k; fastcgi_cache_methods GET HEAD; fastcgi_cache_min_uses 1; fastcgi_cache_path /dev/shm/nginx levels=1:2 keys_zone=website:2000m inactive=1d max_size=2000m; fastcgi_connect_timeout 60; fastcgi_intercept_errors on; fastcgi_pass_request_body on; fastcgi_pass_request_headers on; fastcgi_read_timeout 120; fastcgi_send_timeout 120; proxy_temp_file_write_size 16k; fastcgi_max_temp_file_size 1024m; include /etc/nginx/vhosts/*.conf; } 

虚拟主机设置:

 server { listen 80; server_name domain.com; access_log off; error_log /var/log/nginx/error.log warn; root /home/username/public_html; location ~ \.php$ { # pass cache if logged in set $nocache ""; if ($http_cookie ~ (MyCookieUser*|MyCookiePass*)) { set $nocache "Y"; } fastcgi_no_cache $nocache; fastcgi_cache_bypass $nocache; fastcgi_cache website; fastcgi_cache_key $host$uri$is_args$args; fastcgi_cache_valid 200 301 302 304 40s; fastcgi_cache_valid any 5s; fastcgi_cache_use_stale error timeout invalid_header updating http_500 http_503 http_404; fastcgi_ignore_headers Set-Cookie; fastcgi_hide_header Set-Cookie; fastcgi_ignore_headers Cache-Control; fastcgi_hide_header Cache-Control; fastcgi_ignore_headers Expires; fastcgi_hide_header Expires; fastcgi_no_cache $nocache; fastcgi_cache_bypass $nocache; fastcgi_index index.php; fastcgi_pass 127.0.0.1:8081; fastcgi_param SCRIPT_FILENAME /home/username/public_html$fastcgi_script_name; include /etc/nginx/fastcgi_params; } location ~* ^.+\.(jpg|jpeg|gif|png|ico|css|zip|tgz|gz|rar|bz2|pdf|ppt|txt|mid|swf|midi|wav|bmp|js)$ { root /home/username/public_html; expires max; add_header Cache-Control cache; } } 

php-fpmconfiguration

 emergency_restart_threshold = 10 emergency_restart_interval = 60s process_control_timeout =10s rlimit_files = 102400 events.mechanism = epoll [www] user = username group = username listen = 127.0.0.1:8081 listen.backlog = 10000 pm = dynamic pm.max_children = 2048 pm.start_servers = 64 pm.min_spare_servers = 20 pm.max_spare_servers = 128 pm.process_idle_timeout = 10s; pm.max_requests = 50000 request_slowlog_timeout = 40s request_terminate_timeout = 60s 

服务器内存:32GB DDR3处理器:双E5620 Centos6 64bit

您只需将一个variablesstring添加到表示用户标识的fastcgi_cache_key 。 就像是:

 set $user_key 0; if ($cookie_userid != "") { // you set cookie "userid" via your app set $user_key $cookie_userid; } fastcgi_cache_key $user_key$scheme$host$uri$args; 

这样,所有匿名用户将获得$user_key = 0 ,其余的用户将拥有自己的每个页面的caching版本。

根据您的stream量,这可能会沉重,无论您select的存储,因为您将节省大量的重复页面(可能?)小个性化。