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