Magento的Nginx + PHP-FPM + FastCGIcachingconfiguration

你们中的一些人可能已经注意到了Magento最近发布的最近的Magento For Peak Performance白皮书。 尽pipe它主要是为EE用户编写的,但我相信我们也可以使用Community Edition的大部分技巧。

阅读好后,我继续将他们的Nginx + fastcgi / proxycachingconfiguration与我的标准虚拟主机configurationMagento合并,并做了一些小改进。 以下是我想到的:

fastcgi_cache_path /tmp/fcgi levels=1:2 keys_zone=MAGE:64m max_size=128m inactive=10h; server { listen 99999; ## Nginx port server_name domain.com www.domain.com; root /www/magento; ## App folder index index.php; location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ { expires max; access_log off; log_not_found off; } location /index { try_files $uri @fcgi_nocache; } location /checkout { try_files $uri @fcgi_nocache; } location / { try_files $uri @fcgi_cache; if ($cookie_frontend) { return 413; } if ($cookie_CUSTOMER_AUTH) { return 413; } if ($request_method = POST ) { return 413; } error_page 413 = @fcgi_nocache; } # Deny access to hidden files location ~ (/(app/|includes/|/pkginfo/|var/|report/config.xml)|/\.svn/|/.hta.+) { deny all; } # Forward paths like /js/index.php/x.js to relevant handler location ~ .php/ { rewrite ^(.*.php)/ $1 last; } # Manually purge pages location ~ /purge(/.*) { fastcgi_cache_purge MAGE "$scheme$request_method$host$1"; } location @fcgi_cache { #if (!-e $request_filename) { rewrite / /index.php last; } ## Catch 404s that try_files miss fastcgi_pass unix:/var/spool/phpfpm.sock; ## php-fpm socket include fastcgi_params; fastcgi_connect_timeout 60; fastcgi_send_timeout 60; fastcgi_read_timeout 60; fastcgi_buffer_size 4k; fastcgi_buffers 512 4k; fastcgi_busy_buffers_size 8k; fastcgi_temp_file_write_size 256k; fastcgi_intercept_errors off; fastcgi_param SCRIPT_FILENAME $document_root/index.php; fastcgi_param SCRIPT_NAME /index.php; #fastcgi_keep_conn on; # NGINX 1.1.14 fastcgi_temp_path /tmp/fcgi2 1 2; fastcgi_cache MAGE; #fastcgi_cache_key "$request_method|$http_if_modified_since|$http_if_none_match|$host|$request_uri"; ## Original fastcgi_cache_key "$scheme$request_method$host$request_uri$http_if_modified_since$http_if_none_match"; #fastcgi_cache_lock on 5s; # NGINX 1.1.12 fastcgi_cache_valid 200 301 302 304 1h; fastcgi_hide_header "Set-Cookie"; if ($http_cookie !~ "X-Store=1" ) { add_header Set-Cookie "X-Store=1; path=/"; } fastcgi_ignore_headers "Cache-Control" "Expires" "Set-Cookie"; fastcgi_cache_min_uses 1; fastcgi_cache_valid 30m; fastcgi_cache_use_stale updating error timeout invalid_header http_500; fastcgi_cache_bypass $cookie_EXTERNAL_NO_CACHE $cookie_CUSTOMER_AUTH; fastcgi_no_cache $cookie_EXTERNAL_NO_CACHE $cookie_CUSTOMER_AUTH; #add_header X-Cache-Status $upstream_cache_status; # Test } location @fcgi_nocache { #if (!-e $request_filename) { rewrite / /index.php last; } ## Catch 404s that try_files miss fastcgi_pass unix:/var/spool/phpfpm.sock; ## php-fpm socket include fastcgi_params; fastcgi_connect_timeout 60; fastcgi_send_timeout 60; fastcgi_read_timeout 60; fastcgi_buffer_size 4k; fastcgi_buffers 512 4k; fastcgi_busy_buffers_size 8k; fastcgi_temp_file_write_size 256k; fastcgi_intercept_errors off; fastcgi_param SCRIPT_FILENAME $document_root/index.php; fastcgi_param SCRIPT_NAME /index.php; #fastcgi_keep_conn on; # NGINX 1.1.14 fastcgi_temp_path /tmp/fcgi2 1 2; if ($http_cookie !~ "X-Store=1" ) { add_header Set-Cookie "X-Store=1; path=/"; } #add_header X-Cache-Status $upstream_cache_status; # Test } } 

经过一些testing,结果似乎令人印象深刻的通过AB,但我真的不那么自信,如果他们是准确的,如果caching系统完全按预期工作。 有人能详细说明@fcgi_cache和@fcgi_nocache以及cookie的实际逻辑是什么? 谁实际上获得caching页面? 当PHP-FPMclosures(?)时,陈旧的caching似乎不工作。 我有点困惑,有些困惑与我得到不同的标题。

build议任何人?

这种类型的配置对于magento来说绝对是无用的,他们只是为了获得最大的“虚拟”吞吐量,而这种配置逻辑甚至在少数地方中断了。 你会更好地配置打孔全页面缓存扩展,它会重新插入你的动态块,并将保持你的网站总是缓存。 新添加的产品和数量变化等也必须进行缓存刷新。

我知道这是一个老问题,但是如果有人在这个话题上磕磕绊绊,我只想指出,最新的Magento发布(> = 1.13企业&> = 1.8社区)将打破这种nginx缓存方法。

一旦升级和缓存启用,您的用户将不再能够添加到购物车,如果他们正在寻找一个缓存页面。 这个背后的原因是,Magento添加了“添加到购物车”按钮的URL形式的关键,以防止跨站点脚本。 在打开nginx缓存的情况下,第一个URL表单密钥将被缓存,下一组用户将加载一个无效的表单密钥,而不会附加到他们的会话中。 据我所知,没有办法打孔nginx缓存,这(引用ADM)使“nginx缓存绝对无用”。 如果有谁知道是否有办法打孔nginx缓存,我都耳朵。

如果你继续使用nginx缓存,我强烈建议你看看你如何在没有禁用的情况下站起来,在升级到最新版本的Magento时会为你节省很多麻烦。