Au début de cette année, j'ai prévu de réécrire mon programme de blog en fonction du cadre express à l'aide de Node.js et de dire au revoir à ASP.NET à partir de maintenant. Cependant, le VPS que j'utilise actuellement est Windows Server System et IIS Server. Si Express et Iis écoutent tous deux le port 80, il y aura des conflits évidents. Heureusement, il existe une extension appelée iisnode qui héberge les programmes Node.js à IIS. De plus, après l'hébergement, cela signifie également que diverses fonctions dans IIS peuvent être utilisées (gestion des processus, compression GZIP, journalisation, cache, contrôle d'autorisation, liaison du nom de domaine, etc.).
Pour utiliser iisnode, vous devez installer:
1.Node.js
2. IIS URL REWRITE MODULE
3.Iisnode
Après l'installation, vous suivez toujours les opérations habituelles pour créer un site dans le gestionnaire IIS et indiquez le répertoire du programme Express. La clé consiste à ajouter un fichier web.config:
La copie de code est la suivante:
<Iconguration>
<système.webserver>
<Handlers>
<add name = "iisnode" path = "bin / www" verb = "*" modules = "iisnode" ResourceType = "non spécifié" requiseAccess = "script" />
</ Handlers>
<Rewrite>
<règles>
<règle name = "all">
<match url = "/ *" />
<action type = "rewrite" url = "bin / www" />
</cuest>
</ Règles>
</r / réécriture>
</System.webserver>
</FIGIGURATION>
Ce contenu peut également être configuré via l'interface visuelle du gestionnaire IIS. Cela signifie à peu près réécrire toutes les demandes de bin / www et exécuter bin / www en utilisant l'extension iisnode. Cependant, après avoir ouvert le site, un message d'erreur apparaît:
La copie de code est la suivante:
Le module de filtre de demande est configuré pour rejeter les chemins dans l'URL contenant la section Hiddense
Au début, je sentais que je n'étais pas clair à ce sujet, mais plus tard, j'ai soudainement réalisé que le répertoire bac dans ASP.NET est un répertoire spécial qui n'est pas autorisé à être accessible. Réécrivez la demande de bin / www, qui atteint cette règle. Donc, il suffit de modifier le nom du répertoire, par exemple, changez de poubelle en lancement (il ne se révèle pas être une bonne pratique, parlons-en plus tard), et web.config doit également être ajusté en conséquence:
La copie de code est la suivante:
<Iconguration>
<système.webserver>
<Handlers>
<add name = "iisnode" path = "lancement / www" verb = "*" modules = "iisnode" ResourceType = "non spécifié" requiseAccess = "script" />
</ Handlers>
<Rewrite>
<règles>
<règle name = "all">
<match url = "/ *" />
<action type = "rewrite" url = "lancement / www" />
</cuest>
</ Règles>
</r / réécriture>
</System.webserver>
</FIGIGURATION>
Après avoir redémarré le site dans IIS Manager, y accédant à nouveau, il a finalement commencé à fonctionner, ce n'était pas facile! Mais j'étais encore trop heureux.
Au cours du processus de test de la fonction du programme, il a été constaté que l'IP obtenue était vide. Dans le cadre express, IP est obtenu via req.ip, qui à son tour obtient la valeur de Remote_Addr de l'en-tête de demande. Grâce à un code de test simple, il a été constaté que la valeur de Remote_Addr est également vide. Il est évident que ces informations d'en-tête sont perdues pendant le processus de IIS à Node.js. Après Google, j'ai trouvé qu'Iisnode a ce problème. La solution officielle consiste à utiliser X-Forword-For, mais j'ai trouvé une autre solution.
Il y a une configuration dans web.config (avant de l'ajouter à </System.webserver>) qui peut conserver la distance_addr:
La copie de code est la suivante:
<iisnode promoseservervars = "rote_addr" />
Selon les instructions, le Remote_Addr réservé sera renommé X-Iisnode-Remote_Addr, vous devez donc écraser la valeur de req.ip une fois et ajouter une fonction middleware à l'App.js d'Express:
La copie de code est la suivante:
app.use (function (req, res, suivant) {
req.ip = req.heders ['x-iisnode-remote_addr'];
suivant();
});
Cependant, après cet ajustement, la propriété intellectuelle obtenue est toujours vide, ce qui fait inévitablement se demander si l'affectation de req.ip a échoué. En regardant le code source d'Express, vous constaterez que req.ip est défini via le getter Define, donc pour l'écraser, vous devez définir à nouveau:
La copie de code est la suivante:
app.use (function (req, res, suivant) {
Object.defineproperty (req, 'ip', {
get: function () {return this.headers ['x-iisnode-remote_addr']; }
});
suivant();
});
Ce problème a finalement été résolu, mais ce n'est pas une bonne méthode. Il sera gênant si Express définit Req.ip à en lecture seule à l'avenir.
Continuez à tester et trouvez un autre problème. Normalement, la fonction de téléchargement de fichiers dans l'arrière-plan du blog passera le fichier au répertoire public / téléchargement, mais en fait, le dossier public / téléchargement est généré dans le répertoire de lancement (c'est-à-dire le répertoire bin d'origine). En fait, la raison en est que le fichier www comme entrée du programme se trouve dans le répertoire de lancement, donc le répertoire de lancement devient le répertoire d'exécution de l'application. Ma solution consiste à modifier le nom du répertoire de lancement en bin, à créer un lancement.js dans le répertoire racine pour appeler bin / www:
La copie de code est la suivante:
#! / USR / bin / env
require ('./ bin / www');
Modifiez ensuite l'entrée du programme sur Launch.js:
La copie de code est la suivante:
<Iconguration>
<système.webserver>
<Handlers>
<add name = "iisnode" path = "lancers.js" verb = "*" modules = "iisnode" ResourceType = "non spécifié" requiseAccess = "script" />
</ Handlers>
<Rewrite>
<règles>
<règle name = "all">
<match url = "/ *" />
<action type = "réécriture" url = "lancement.js" />
</cuest>
</ Règles>
</r / réécriture>
<iisnode promoseservervars = "rote_addr" />
</System.webserver>
</FIGIGURATION>
De toute évidence, iisnode n'est pas un produit mature, et bien sûr Node.js n'est pas (pas encore 1.0), tout a besoin d'exploration et d'amélioration plus approfondie.