ในช่วงต้นปีนี้ฉันวางแผนที่จะเขียนโปรแกรมบล็อกของฉันใหม่ตามกรอบด่วนโดยใช้ node.js และกล่าวคำอำลากับ ASP.NET นับจากนี้ อย่างไรก็ตาม VPS ที่ฉันใช้อยู่ในปัจจุบันคือ Windows Server System และ IIS Server หาก Express และ IIS ทั้งคู่ฟังพอร์ต 80 จะมีความขัดแย้งที่ชัดเจน โชคดีที่มีส่วนขยายที่เรียกว่า iisnode ที่โฮสต์โปรแกรม node.js ไปยัง IIS ยิ่งไปกว่านั้นหลังจากโฮสติ้งก็หมายความว่าฟังก์ชั่นต่าง ๆ ใน IIS สามารถใช้งานได้ (การจัดการกระบวนการ, การบีบอัด GZIP, การบันทึก, แคช, การควบคุมการอนุญาต, การผูกชื่อโดเมน ฯลฯ )
ในการใช้ iisnode คุณต้องติดตั้ง:
1.node.js
2. IIS URL เขียนโมดูลใหม่
3. iisnode
หลังจากการติดตั้งคุณยังคงติดตามการดำเนินการตามปกติเพื่อสร้างไซต์ใน IIS Manager และชี้ไปที่ไดเรกทอรีของโปรแกรมด่วน กุญแจสำคัญคือการเพิ่มไฟล์ web.config:
การคัดลอกรหัสมีดังนี้:
<การกำหนดค่า>
<System.webserver>
<แฮนด์เลอร์>
<เพิ่ม name = "iiSnode" path = "bin /www" verb = "*" modules = "iisnode" resourceType = "undertecified" quardeaccess = "สคริปต์" />>
</handlers>
<rewrite>
<rules>
<rule name = "all">
<match url = " /*" />
<action type = "rewrite" url = "bin /www" />>
</rule>
</rules>
</Swrite>
</system.webserver>
</การกำหนดค่า>
เนื้อหานี้ยังสามารถกำหนดค่าผ่านอินเทอร์เฟซภาพของ IIS Manager มันหมายถึงการเขียนคำขอทั้งหมดไปยัง bin/www ใหม่และเรียกใช้ bin/www โดยใช้ส่วนขยาย iisnode อย่างไรก็ตามหลังจากเปิดไซต์ข้อความแสดงข้อผิดพลาดจะปรากฏขึ้น:
การคัดลอกรหัสมีดังนี้:
โมดูลตัวกรองคำขอได้รับการกำหนดค่าให้ปฏิเสธเส้นทางใน URL ที่มีส่วน hiddensegment
ตอนแรกฉันรู้สึกว่าฉันไม่ชัดเจนเกี่ยวกับเรื่องนี้ แต่หลังจากนั้นฉันก็รู้ทันทีว่าไดเรกทอรีถังขยะใน ASP.NET เป็นไดเรกทอรีพิเศษที่ไม่ได้รับอนุญาตให้เข้าถึง เขียนคำขอไปยัง bin/www ใหม่ซึ่งมีกฎนี้ ดังนั้นเพียงแค่เปลี่ยนชื่อไดเรกทอรีตัวอย่างเช่นเปลี่ยนถังขยะเพื่อเปิดตัว (กลับกลายเป็นว่าไม่ใช่วิธีปฏิบัติที่ดีลองพูดคุยกันในภายหลัง) และ web.config ก็ต้องปรับเปลี่ยนตาม:
การคัดลอกรหัสมีดังนี้:
<การกำหนดค่า>
<System.webserver>
<แฮนด์เลอร์>
<เพิ่ม name = "iiSnode" path = "Launch /www" verb = "*" modules = "iiSnode" ResourceType = "undertecified" quardeaccess = "สคริปต์" />
</handlers>
<rewrite>
<rules>
<rule name = "all">
<match url = " /*" />
<action type = "rewrite" url = "Launch /www" />
</rule>
</rules>
</Swrite>
</system.webserver>
</การกำหนดค่า>
หลังจากรีสตาร์ทไซต์ใน IIS Manager เข้าถึงอีกครั้งในที่สุดมันก็เริ่มทำงานมันไม่ใช่เรื่องง่าย! แต่ฉันก็ยังมีความสุขเกินไป
ในระหว่างกระบวนการทดสอบฟังก์ชั่นโปรแกรมพบว่า IP ที่ได้รับนั้นว่างเปล่า ในเฟรมเวิร์กด่วนนั้นได้รับ IP ผ่าน REQ.IP ซึ่งจะได้รับค่าจาก remote_addr ของส่วนหัวคำขอ ผ่านรหัสทดสอบอย่างง่ายพบว่าค่าของ remote_addr นั้นว่างเปล่าเช่นกัน เห็นได้ชัดว่าข้อมูลส่วนหัวนี้หายไปในระหว่างกระบวนการจาก IIS ไปยัง Node.js หลังจาก Google ฉันพบว่า iisnode มีปัญหานี้ ทางออกอย่างเป็นทางการคือการใช้ X-forword-for แต่ฉันพบวิธีแก้ปัญหาอื่น
มีการกำหนดค่าใน web.config (ก่อนที่จะเพิ่มลงใน </system.webserver>) ที่สามารถรักษา remote_addr:
การคัดลอกรหัสมีดังนี้:
<iisNode ProMotEserVars = "Remote_addr" />>>
ตามคำแนะนำ Remote_addr ที่สงวนไว้จะถูกเปลี่ยนชื่อเป็น X-iisnode-remote_addr ดังนั้นคุณต้องเขียนทับค่าของ req.ip หนึ่งครั้งและเพิ่มฟังก์ชั่นมิดเดิลแวร์ลงใน app.js ของ Express:
การคัดลอกรหัสมีดังนี้:
app.use (function (req, res, ถัดไป) {
req.ip = req.headers ['x-iisnode-remote_addr'];
ต่อไป();
-
อย่างไรก็ตามหลังจากการปรับเปลี่ยนนี้ IP ที่ได้รับยังคงว่างเปล่าซึ่งย่อมทำให้ผู้คนสงสัยว่าการกำหนด REQ.IP ล้มเหลวหรือไม่ เมื่อดูที่ซอร์สโค้ดของ EXPRES
การคัดลอกรหัสมีดังนี้:
app.use (function (req, res, ถัดไป) {
Object.defineProperty (req, 'ip', {
รับ: function () {return this.headers ['x-iisnode-remote_addr']; -
-
ต่อไป();
-
ปัญหานี้ได้รับการแก้ไขในที่สุด แต่นี่ไม่ใช่วิธีที่ดี มันจะลำบากถ้า Express Sets req.ip เป็นอ่านอย่างเดียวในอนาคต
ทดสอบต่อและค้นหาปัญหาอื่น โดยปกติฟังก์ชั่นการอัปโหลดไฟล์ในพื้นหลังบล็อกจะส่งผ่านไฟล์ไปยังไดเรกทอรีสาธารณะ/อัปโหลด แต่ในความเป็นจริงโฟลเดอร์สาธารณะ/อัพโหลดจะถูกสร้างขึ้นในไดเรกทอรีการเปิดตัว (นั่นคือไดเรกทอรี Bin ดั้งเดิม) ในความเป็นจริงเหตุผลก็คือไฟล์ www เป็นทางเข้าโปรแกรมอยู่ในไดเรกทอรีการเปิดตัวดังนั้นไดเรกทอรีการเปิดตัวจึงกลายเป็นไดเรกทอรีการดำเนินการของแอปพลิเคชัน ทางออกของฉันคือการเปลี่ยนชื่อของไดเรกทอรีการเปิดตัวกลับไปที่ Bin สร้างการเปิดใช้งาน js ในไดเรกทอรีรูทเพื่อเรียก bin/www:
การคัดลอกรหัสมีดังนี้:
#!/usr/bin/env node
ต้องการ ('./ bin/www');
จากนั้นเปลี่ยนรายการโปรแกรมเป็น Launch.js:
การคัดลอกรหัสมีดังนี้:
<การกำหนดค่า>
<System.webserver>
<แฮนด์เลอร์>
<เพิ่ม name = "iiSnode" path = "launch.js" verb = "*" modules = "iiSnode" ResourceType = "unstecified" quireccess = "script" />
</handlers>
<rewrite>
<rules>
<rule name = "all">
<match url = " /*" />
<action type = "rewrite" url = "launch.js" />
</rule>
</rules>
</Swrite>
<iisNode ProMotEserVars = "Remote_addr" />>>
</system.webserver>
</การกำหนดค่า>
เห็นได้ชัดว่า iisnode ไม่ใช่ผลิตภัณฑ์ที่เป็นผู้ใหญ่และแน่นอน node.js ไม่ใช่ (ยังไม่ถึง 1.0) ทุกอย่างต้องการการสำรวจและปรับปรุงเพิ่มเติม