Проблемы с обновлением статических файлов при использовании web сервера на VirtualBox

Владимир | | Web разработка, Разное.

virtualbox sendfile

На сегодняшний день при разработке на PHP совсем не обязательно использовать такую же операционную систему, как и на продакшн сервере.

Т.е. вполне можно работать с версией PHP для Windows, а на рабочем сервере использовать Linux. При этом в большинстве случаев проблем не возникает. Но, тем не менее, перед деплоем желательно протестировать код в условиях максимально приближенных к продакшн среде. И самое простое решение в данной ситуации – использовать VirtualBox.

В большинстве случаев поступают следующим образом:

  1. Создают виртуальную машину.
  2. Устанавливают на неё web сервер, базу данных и всё остальное ПО.
  3. Создают общую папку, в которой находится код приложения. Это позволяет работать с кодом из основной операционной системы, что значительно удобнее.

В результате получаем виртуальную машину, в которой версии программ и конфигурационные файлы полностью совпадают с продакшн сервером. Но разница всё же существует. Гостевая операционная система работает с железом не напрямую, а через VirtualBox, и это создаёт проблему.

В дефолтных настройках Apache по-умолчанию включена директива enablesendfile.

EnableSendfile On

У nginx она по-умолчанию отключена, но если вы переносите конфиги с продакшн среды, то она, скорее всего, будет включена.

Дело в том, что эта директива позволяет ускорить отправку файлов клиенту за счёт того, что при её использовании web серверу не нужно считывать файл перед отправкой. Естественно, операционная система должна поддерживать эту возможность, а при использовании VirtualBox эта функция работает неправильно.

Проявляется это в том, что после изменения статических файлов (например, CSS или JS) сервер отправляет их старые версии. По моим наблюдениям обновление происходит, только если изменяется значительная часть файла.

Вообще проблема известная, и решается отключением директивы sendfile.

Например, если вы используете Debian 6 и web сервер Apache, добавьте в файл /etc/apache2/httpd.conf строку

EnableSendfile Off

Для Nginx – в файл /etc/nginx/nginx.conf

http {

...
sendfile off;
...
}

После изменения конфига не забудьте перезапустить сервер.

Надеюсь, этот пост сэкономит кому-нибудь время 😉