Re: при изменении static файла nginx отдает мусор (BUG?)
Evgeniy Berdnikov
bgx на protva.ru
Ср Окт 11 18:26:55 UTC 2017
On Wed, Oct 11, 2017 at 12:56:49PM -0400, neomaq wrote:
> При изменении static файла nginx отдает мусор несколько секунд
Файл можно менять по-разному, т.е. разными последовательностями сисколов.
Есть атомарная замена через rename(2), есть другие варианты.
Редактор vi меняет не атомарно -- он сначала переименовывает старый файл,
добавляя к имени тильду (~), а потом открывает новый и пишет в него.
Здесь и файл можно получить битый (то есть с содержимым, не совпадающим
с результатом редактирования, так как файл пишется не мгновенно),
плюс есть промежуток времени, когда файла с нужным именем в каталоге
просто нет, т.е. клиент может получить статус-код 404.
> по http заголовкам видно, что первые 5-15 секунд скачет вперед-назад во
> времени заголовок "Last-Modified"
> и "Content-length" и "Etag"
Здесь разные процессы выдают результаты кэширования в разные моменты времени.
> при 300-500 rps клиенты успевают нахватать некорректных js/css файлов, что
> ломает отображение сайта во время деплоя
А здесь, наверное, смешаны два разных вопроса:
1. Ваш ролик демонстрирует небитые файлы, но из-за кэшировния процессы
nginx выдают разные их версии.
2. Если выдача разных версий js/css ломает изображение, значит, эти
версии не соответствуют содержимому других элементов страницы, в том
числе коду других js/css, которые подгружает страница.
Чтобы файл выдавался небитым, его нужно заменять атомарно.
Чтобы страница не ломалась, нужно, чтобы все её элементы были нужной
версии. То есть требуется транзакционность деплоя, а не просто
атомарность замены отдельных файлов.
--
Eugene Berdnikov
Подробная информация о списке рассылки nginx-ru