Медленное статическое обслуживание файлов с помощью Node в Ubuntu

#node.js #express #testem

#node.js #экспресс #testem

Вопрос:

Мы используем Testem для обслуживания множества HTML-файлов (шаблонов). Под прикрытием Testem использует экспресс-метод «res.sendfile» для отправки статического файла обратно клиенту. На компьютерах Mac это происходит очень быстро — 1-2 мс на файл в соответствии с трассировкой сети Chrome. Однако на компьютере с Ubuntu это занимает 39 мс.

Это на последнем стабильном узле — 0.10.29. Testem использует Express 3.1.

Любые предложения о том, что может вызвать это или как я могу это диагностировать дальше?

Комментарии:

1. Предостережения: Я точно ничего не знаю о Testem; но, как полный аутсайдер, вот чего я не вижу в вашем вопросе: работают ли на Mac и на компьютере Ubuntu одна и та же версия node.js ? Установлена ли версия Mac через HomeBrew? Если вы отправляете 1 файл; получаете ли вы тот же результат для каждого файла, что и при отправке нескольких файлов? Если вы выполняете трассировку с каждой машины, каковы результаты — используют ли они одни и те же сетевые пути (при прочих равных условиях)? Является ли машина Ubuntu виртуальной машиной или коробкой? Что еще нам нужно, чтобы попытаться воспроизвести это?

2. Да, странно, что в OSX это, кажется, решается намного быстрее, является ли Ubuntu env каким-то удаленным сервером или локальной машиной?

3. @GeorgeStocker — та же версия Node (управляется через Nave, а не Homebrew). Ubuntu — это голый металл, без виртуальной машины. Мне нужно будет посмотреть, смогу ли я сократить сценарий, чтобы сделать простое воспроизведение.

Ответ №1:

Обычно я обслуживаю статические файлы напрямую, используя:

 app.use( express.static(__dirname '/public') );
  

промежуточное программное обеспечение. Ваши статические файлы будут храниться в

 /<app-path>/public
  

Это позволит вам /<app-path>/public/some.html получить доступ к:

 http://yoursite.com/some.html
  

Если вы введете file.html /<app-path>/public/html/ , следующее разрешит:

 http://yoursite.com/html/file.html

http://yoursite.com/public/html/file.html
  

Если желаемый результат — иметь чистые URL-адреса без расширений, то мое предложение не подойдет. Однако, если вы не возражаете против расширений файлов в URL-адресах, статическое промежуточное программное обеспечение должно сократить время запросов, возможно, даже значительно. Кроме того, может быть, движок шаблонов, подобный dust or jade , может помочь? Это позволит вам использовать res.render fn.

Дело в том, что я видел, как время запросов увеличивается при использовании:

 res.sendfile(somepath  '/some.html');
  

Потому что express перед отправкой файла передаст его через промежуточное ПО разрешения пути регулярных выражений. Если у вас много маршрутов, это также может замедлить время запроса.

Надеюсь, это поможет!

Комментарии:

1. Почему разрешение пути регулярных выражений будет медленнее в Linux по сравнению с OS X?

2. Я не думаю, что регулярное выражение будет медленнее от ОС к ОС, но я знаю, что sendfile() по сравнению с обслуживанием статического файла медленнее. Это кажется сложной задачей для решения и определения того, чем именно отличается запуск вашего приложения express в OSX от Ubuntu. Может быть, вы могли бы попробовать запустить приложение с помощью экспресс-отладчика? DEBUG=express:* node app.js