У меня есть приложение, которое обслуживается двумя серверами apache2, и я хочу настроить ETags для статического содержимого. В будущем я также хотел бы использовать CDN. Я вижу, что это должно быть проблемой, потому что информация Etag будет отличаться от сервера к серверу ...
Формат ETag для Apache 1.3 и 2.x - это временная метка размера inode. Хотя данный файл может находиться в одном каталоге на нескольких серверах и иметь одинаковый размер файла, разрешения, временную метку и т. Д., Его индексный дескриптор отличается от одного сервера к другому.
Поэтому, если вы используете более одного веб-сервера для размещения своего приложения (например, 90% веб-приложений, которые вы используете каждый день), это должно быть проблемой. Однако я вижу, что Google использует Etags, и, конечно же, они используют несколько серверов и CDN, пограничное кеширование и т. Д. Я получаю ответ 304 на любой кэшированный контент Google. Как они это делают? Как решить проблему с несколькими серверами? Есть ли способ настроить это с помощью Apache?
Текущий практика заключается в удалении ETags, именно по причинам, указанным в сообщении OP. Вместо этого вы можете полагаться на другие заголовки кеширования, то есть на Cache-Control и Expires, и безусловно кэшировать ресурсы (предположим, что статический контент по заданному URL-адресу не подлежит изменению, поэтому, когда контент должен измениться, вы также даете ему новый URL-адрес). Стив Содерс обосновал это в Yahoo! и опубликовал хороший книга об этом и других улучшениях производительности.
Вы жестяная банка используйте ETags, если хотите; вам просто нужно хорошо позаботиться о том, чтобы все серверы были настроены точно так же, и чтобы ETags генерировались из чего-то, что не зависит от машины. Один из способов сделать это - сгенерировать ETags из хэша содержимого файла или хэша (имя файла + размер), как писал Джеймс.
Я предполагаю - без каких-либо доказательств - что Google не использует сторонние CDN, они просто используют свои собственные серверы в своих многочисленных центрах обработки данных по всему миру. Затем они поддерживают согласованность конфигурации своих веб-серверов по всему миру и просто используют что-то вроде (время последнего изменения + размер файла) в качестве основы для своего ETag.
Для остальных из нас, ИМХО, проще и лучше не использовать ETags.
Вы можете настроить Apache так, чтобы он не использовал индексный дескриптор как часть хэша. Увидеть FileETag директива.