В начале этого года я планировал переписать свою программу в блоге на основе Express Framework с использованием Node.js, и с этого момента попрощаться с ASP.NET. Тем не менее, VPS, который я использую в настоящее время, является Windows Server System и IIS Server. Если Express и II оба послушают порт 80, будут очевидные конфликты. К счастью, существует расширение под названием iisnode, которое размещает программы Node.js для IIS. Более того, после хостинга это также означает, что могут использоваться различные функции в IIS (управление процессами, сжатие GZIP, ведение журнала, кэш, управление разрешением, привязка доменного имени и т. Д.).
Чтобы использовать iisnode, вам нужно установить:
1.node.js
2. IIS url rewrite модуль
3.IISNODE
После установки вы по -прежнему следуете обычным операциям, чтобы создать сайт в менеджере IIS и указывать на каталог программы Express. Ключ должен добавить файл web.config:
Кода -копия выглядит следующим образом:
<Конфигурация>
<System.Webserver>
<Handlers>
<add name = "iisnode" path = "bin /www" varb = "*" modules = "iisnode" resourceType = "uncestufifified" requireAccess = "script" />
</Handlers>
<rewrite>
<Правила>
<name = "all">
<match url = " /*" />
<action type = "rewrite" url = "bin /www" />
</rule>
</rules>
</rewrite>
</system.webserver>
</конфигурация>
Этот контент также может быть настроен через визуальный интерфейс IIS Manager. Это примерно означает переписывание всех запросов в Bin/www и запуск bin/www с использованием расширения iisnode. Однако после открытия сайта появляется сообщение об ошибке:
Кода -копия выглядит следующим образом:
Модуль фильтра запроса настроен для отклонения путей в URL, содержащем раздел Hiddensegration
Сначала я чувствовал, что мне не ясно об этом, но позже я вдруг понял, что каталог BIN в ASP.NET - это специальный каталог, к которому не разрешается получить доступ. Перепишите запрос в Bin/www, который достигает этого правила. Итак, просто измените имя каталога, например, измените корзин для запуска (оказалось не хорошей практикой, давайте поговорим об этом позже), и Web.Config также необходимо скорректировать соответствующим образом:
Кода -копия выглядит следующим образом:
<Конфигурация>
<System.Webserver>
<Handlers>
<add name = "iisnode" path = "запуск /www" varb = "*" modules = "iisnode" resourceType = "uncpendififified" requireAccess = "script" />
</Handlers>
<rewrite>
<Правила>
<name = "all">
<match url = " /*" />
<action type = "rewrite" url = "запуск /www" />
</rule>
</rules>
</rewrite>
</system.webserver>
</конфигурация>
После перезапуска сайта в IIS Manager, доступ к нему снова, он наконец начал работать, это было нелегко! Но я все еще был слишком счастлив.
Во время процесса тестирования функции программы было обнаружено, что полученный IP был пустым. В рамках Express IP получается через req.ip, что, в свою очередь, получает значение от remote_addr заголовка запроса. Через простой тестовый код, было обнаружено, что значение remote_addr также пусто. Очевидно, что эта информация о заголовке теряется во время процесса от IIS до Node.js. После Google я обнаружил, что у Iisnode есть эта проблема. Официальное решение состоит в том, чтобы использовать X-Forword-For, но я нашел другое решение.
В web.config существует конфигурация (перед добавлением ее в </system.webserver>), которая может сохранить remote_addr:
Кода -копия выглядит следующим образом:
<iisnode promoteServervars = "remote_addr" />
Согласно инструкциям, зарезервированный remote_addr будет переименован в x-iisnode-remote_addr, поэтому вам нужно перезаписать значение req.ip один раз и добавить функцию промежуточного программного обеспечения в App.js Express:
Кода -копия выглядит следующим образом:
app.use (function (req, res, next) {
req.ip = req.headers ['x-iisnode-remote_addr'];
следующий();
});
Однако после этой корректировки полученный IP все еще пуст, что неизбежно заставляет людей задуматься о том, не удалось ли назначение REQ.IP. Глядя на исходный код Express, вы обнаружите, что REQ.IP определяется через определение Getter, поэтому, чтобы перезаписать его, вы должны снова определить:
Кода -копия выглядит следующим образом:
app.use (function (req, res, next) {
Object.defineproperty (req, 'ip', {
get: function () {return this.headers ['x-iisnode-remote_addr']; }
});
следующий();
});
Эта проблема наконец была решена, но это не хороший метод. Это будет хлопотно, если в будущем Express Set Treq.ip только для чтения.
Продолжайте тестирование и найдите другую проблему. Обычно функция загрузки файла в фоне блога передает файл в каталог публики/загрузки, но на самом деле папка публика/загрузки генерируется в каталоге запуска (то есть в оригинальном каталоге бин). Фактически, причина в том, что файл www в качестве входа в программу находится в каталоге запуска, поэтому каталог запуска становится каталогом выполнения приложения. Мое решение состоит в том, чтобы изменить название каталога запуска обратно на корзину, создать запуск.js в корневом каталоге, чтобы вызвать Bin/www:
Кода -копия выглядит следующим образом:
#!/usr/bin/env node
требуется ('./ bin/www');
Затем измените запись программы на запуск.js:
Кода -копия выглядит следующим образом:
<Конфигурация>
<System.Webserver>
<Handlers>
<add name = "iisnode" path = "запуск.js" varb = "*" modules = "iisnode" resourceType = "unspecified" reptaCcess = "script" />
</Handlers>
<rewrite>
<Правила>
<name = "all">
<match url = " /*" />
<action type = "rewrite" url = "запуск.js" />
</rule>
</rules>
</rewrite>
<iisnode promoteServervars = "remote_addr" />
</system.webserver>
</конфигурация>
Очевидно, что iisnode не является зрелым продуктом, и, конечно, Node.js не (пока не 1,0), все требует дальнейшего изучения и улучшения.