2012-09-19 39 views
3

目前我正在做緩存使用fastcgi_cache爲未登錄的用戶,並使用(如果+ fastcgi_no_cache + fastcgi_cache_bypass)傳遞登錄用戶,在用戶直接到後端,這是PHP-FPM。fastcgi緩存如何緩存登錄用戶,並使其爲每個用戶定製

這項工作不夠好,但是當PHP-FPM開始按500+ req/s開始緩慢/加載時。

所以我在想的是爲登錄用戶創建一個緩存,每個用戶都有自己的緩存文件,這可能嗎?如果是的話,請給我提供一些關於這方面的提示。我已經看了很多,但沒有任何幫助。

運行定製的PHP CMS與MySQL和Memcached和APC網站

貓/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-fpm config

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 

也是否需要改變php cms運行自己的cookie的方式?

服務器內存:32GB DDR3處理器:雙E5620 Centos6 64

回答

2

只是一個建議(與目前我在做什麼)......

你爲什麼不使用不同的緩存爲每一個獨特的cookie是nginx在你站點的「登錄」部分從它的上游cgi服務器(php-fpm)獲取 - 這或多或少意味着每個登錄用戶都會得到他們自己的緩存 - 這不是最優的,但會有所幫助。

如果你想開始使用真正奇特的緩存選項與餅乾/動態內容等,你可能需要在nginx前使用varnish-cache。

我還有一些特定位置可以清除任何緩存的數據(對於那個URI),比如/ admin或/ system等等 - 我想要的最後一件事就是nginx爲我的管理員後端提供一個緩存副本它的敏感信息給黑客,而php-fpm處於離線狀態。

1

你可能會喜歡這個例子爲WordPress:

 set $cs_session ""; 
     if ($http_cookie ~* "wordpress_logged_in_[^=]*=([^%]+)%7C") { 
       set $cs_session wordpress_logged_in_$1; 
     } 

fastcgi_cache_key    "$scheme$request_method$host$request_uri$cs_session"; 
相關問題