Проведя некоторое время с отладчиком, я думаю, что у меня есть ответ на OP.
Проблема (по крайней мере из того, что я видел) связана с некластеризованными файлами дискового кэша и тем, как они возвращаются обратно. В файле net.sf.ehcache.store.compound.factories.DiskPersistentStorageFactory .java, метод:
public DiskPersistentStorageFactory(Ehcache cache, String diskPath) {
super(getDataFile(diskPath, cache), cache.getCacheConfiguration().getDiskExpiryThreadIntervalSeconds(),
cache.getCacheConfiguration().getDiskSpoolBufferSizeMB(), cache.getCacheEventNotificationService(), false);
indexFile = new File(getDataFile().getParentFile(), getIndexFileName(cache));
flushTask = new IndexWriteTask(indexFile, cache.getCacheConfiguration().isClearOnFlush());
if (!getDataFile().exists() || (getDataFile().length() == 0)) {
LOG.debug("Matching data file missing (or empty) for index file. Deleting index file " + indexFile);
indexFile.delete();
} else if (getDataFile().exists() && indexFile.exists()) {
if (getDataFile().lastModified() > (indexFile.lastModified() + TimeUnit.SECONDS.toMillis(1))) {
LOG.warn("The index for data file {} is out of date, probably due to an unclean shutdown. "
+ "Deleting index file {}", getDataFile(), indexFile);
indexFile.delete();
}
}
diskCapacity = cache.getCacheConfiguration().getMaxElementsOnDisk();
memoryCapacity = cache.getCacheConfiguration().getMaxElementsInMemory();
memoryPolicy = determineEvictionPolicy(cache.getCacheConfiguration());
}
проверяет временные метки в файлах данных. Проблема, с которой я сталкиваюсь, заключается в том, что независимо от того, как я заканчиваю работу с кэшем / менеджером, файлы никогда не синхронизируются должным образом. Мой быстрый и грязный обходной путь состоял в том, чтобы отрегулировать время файла данных, чтобы оно было сразу после отметки времени в файле индекса:
File index = new File( path, name + ".index" );
File data = new File( path, name + ".data" );
data.setLastModified( index.lastModified() + 1 );
Конечно, это не элегантно, но оно служит моим потребностям, поскольку наш проект использует кластерные кеши, и это позволяет мне отлаживать автономно с постоянным кешем ... и без необходимости запускать Terracotta локально.
Одним из предостережений является то, что для некластеризованных кэшей мне необходимо выполнять flush () после каждого put () и remove (), чтобы сохранить образ диска свежим, особенно при отладке из-за отсутствия завершения работы поддержка, когда вы просто «потяните за вилку».
Оказалось, что он не установлен ни в Nginx, ни в Passenger.
Он находится в файле benchmarking.rb в /gems/actionpack-2.3.2/lib/action_controller/, строка 90.
В Apache вы можете использовать mod_headers , чтобы удалить любой заголовок из ответа (или запроса в этом отношении).
Чтобы удалить заголовки, вам необходимо включить модуль:
# a2enmod headers
Затем вы можете использовать параметр unset для директивы Header, чтобы отключить их:
Header unset X-Runtime
Header unset X-Powered-By
Эта директива может использоваться как на глобальном уровне, так и для отдельного виртуального -сервер
Следующее предназначено для Apache. Я неправильно прочитал вопрос. :)
Включите модуль заголовков, mod_headers
, и добавьте следующее в конфигурацию Apache
Header always unset "X-Runtime"
Вы, вероятно, также захотите удалить заголовок X-Powered-By
, поэтому добавьте также следующее.
Header always unset "X-Powered-By"