โปรดทราบ: นี่เป็นครั้งแรกที่ฉันพยายามปรับใช้แอปพลิเคชันตอบสนองบนเซิร์ฟเวอร์ Windows ที่สร้างขึ้นเอง แต่ฉันจัดการได้สำเร็จบน Heroku และ Linux (PM2) ดังนั้นฉันจึงรู้ว่าสถาปัตยกรรมแอปพลิเคชันนั้น สมมติว่าทำงานได้อย่างถูกต้อง
สถานการณ์:
ฉันได้สร้างเซิร์ฟเวอร์โฮสติ้ง Windows Server 2016 / 64 บิตเพื่อโฮสต์เว็บไซต์หลายแห่ง ฉันเคยใช้ VPS Contabo เพื่อทำเช่นนั้น ฉันได้ทดสอบคุณลักษณะทั้งหมดที่ควรจะใช้งานได้ แม้กับแอปพลิเคชันอื่นๆ เช่น ASP.NET, PHP, ใบรับรอง SSL และทุกอย่างทำงานได้ดี
สำหรับโปรเจ็กต์โหนด js เฉพาะที่ฉันพยายามโฮสต์บนเซิร์ฟเวอร์นี้ ประกอบด้วย 2 ส่วนหลัก:
- แบ็กเอนด์ในโหนดร่วมกับ CMS พัฒนาในโหนด / จาวาสคริปต์ด้วย
ฉันสร้างพื้นที่โฮสติ้งบนโดเมนย่อยสำหรับโดเมนนี้ และมันก็ทำงานได้อย่างสมบูรณ์ แม้ว่าจะใช้ใบรับรอง SSL ของ Letâs Encrypt ก็ตาม เผื่อใครอยากเข้าจะได้ที่:
https://backendnode.fullstackwebdesigner.com/system
- ส่วนหน้าในการเรนเดอร์ฝั่งเซิร์ฟเวอร์ตอบสนอง
นี่คือที่ที่ปัญหาเกิดขึ้น หากใครต้องการเข้าใช้ นี่คือลิงค์:
https://fullstackwebdesigner.com/
ฉันใช้เทคนิคเดียวกันโดยพื้นฐานสำหรับทั้งคู่:
- iisnode;
- ส่วนขยายการเขียน URL ใหม่;
- โมดูลโหนด iis;
- การกำหนดค่าไฟล์ web.config;
ปัญหา:
ฉันจัดการเพื่อให้โหลดเป็นเว็บไซต์ได้ เช่นเดียวกับที่ฉันทำกับแบ็กเอนด์ แต่ปัญหาคือดูเหมือนว่าจะโหลดไฟล์ CSS รูปภาพ และอื่นๆ ไม่ได้ ดังนั้นเลย์เอาต์จึงไม่โหลด บนคอนโซล มีข้อความแสดงข้อผิดพลาด:
Uncaught SyntaxError: โทเค็นที่ไม่คาดคิด '<'
แอปพลิเคชันตอบสนอง:
อย่างที่ฉันได้กล่าวไปก่อนหน้านี้ มันถูกสร้างเป็นแอปพลิเคชันการแสดงผลฝั่งเซิร์ฟเวอร์และมาพร้อมกับ webpack ดังนั้นมันจึงสร้างไฟล์รวมไปยังไดเร็กทอรีชื่อ â/buildâ และในไดเร็กทอรีนี้ มีไดเร็กทอรี â/publicâ ที่เนื้อหาทั้งหมดอยู่ในนั้น เช่น ไฟล์ CSS และรูปภาพ
ในขณะที่กำลังพัฒนา ฉันจะรันบิลด์บนเทอร์มินัลเป็น:
โหนด build/bundle.react.js
และดูแปลกอย่างที่เห็น เมื่อฉันเรียกใช้สิ่งนี้บนเทอร์มินัลบนเซิร์ฟเวอร์ windows มันทำงานได้อย่างสมบูรณ์ แต่สามารถเข้าถึงได้ผ่าน:
http://localhost:3001
มันโหลดทุกอย่างที่ควรโหลด
นี่คือการแสดงโครงสร้างไฟล์แบบง่าย:
- /สร้าง/
--bundle.react.js
--/สร้าง/สาธารณะ/
---/รูปแบบไฟล์/
---/แบบอักษร/
---bundle.react.client.js
นี่คือไฟล์ web.config ที่ฉันใช้บนพื้นที่โฮสต์เว็บไซต์สำหรับการสร้างปฏิกิริยา:
<configuration>
<system.webServer>
<iisnode nodeProcessCommandLine="C:\Program Files\nodejs\node.exe" />
<handlers>
<add name="iisnode" path="/build/bundle.react.js" verb="*" modules="iisnode" />
</handlers>
<rewrite>
<rules>
<!-- Redirect to HTTPS (alternative). -->
<rule name="Redirect to HTTPS / SSL" stopProcessing="true">
<match url="(.*)" />
<conditions>
<add input="{HTTPS}" pattern="off" ignoreCase="true" />
</conditions>
<action type="Redirect" redirectType="Found" url="https://{HTTP_HOST}/{R:1}" />
</rule>
<!-- Don't interfere with requests for logs. -->
<rule name="LogFile" patternSyntax="ECMAScript" stopProcessing="true">
<match url="^[a-zA-Z0-9_\-]+\.js\.logs\/\d+\.txt$" />
</rule>
<!-- Node. -->
<rule name="sendToNode">
<match url="(.*)" />
<conditions>
<add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
</conditions>
<action type="Rewrite" url="/build/bundle.react.js" />
</rule>
</rules>
</rewrite>
<defaultDocument>
<files>
<clear />
<add value="/build/bundle.react.js" />
</files>
</defaultDocument>
<security>
<requestFiltering>
<hiddenSegments>
<add segment="node_modules" />
</hiddenSegments>
</requestFiltering>
</security>
</system.webServer>
<system.web>
<compilation defaultLanguage="js" />
</system.web>
</configuration>
ใครมีความคิดเกี่ยวกับสิ่งที่อาจขาดหายไปหรือกำลังเกิดขึ้น เนื่องจากยังไม่มีการอ้างอิงมากมายเกี่ยวกับการเรนเดอร์ฝั่งเซิร์ฟเวอร์โฮสติ้งบน windows server บนเว็บ อาจมีการกำหนดค่าเพิ่มเติมบน IIS, web.config หรือบนพื้นที่โฮสต์เว็บไซต์
แก้ไข:
การทดสอบที่น่าสนใจที่ฉันเพิ่งทำ: บนคอมพิวเตอร์สำหรับการพัฒนาในพื้นที่ของฉัน เมื่อฉันรันผ่านเทอร์มินัล:
โหนด Bundle.react.js
จากภายในโฟลเดอร์ /build ฉันได้รับผลลัพธ์เดียวกันกับปัญหาที่เกิดขึ้นทางออนไลน์ (ไม่มีเลย์เอาต์ สไตล์ รูปภาพ และอื่นๆ)
แต่เมื่อฉันวิ่งผ่านเทอร์มินัล:
โหนด build/bundle.react.js
จากภายนอกโฟลเดอร์ /build (จากไดเร็กทอรีฐาน) จะโหลดได้อย่างสมบูรณ์
ในสิ่งที่มากขึ้น ไดเร็กทอรีฐานมีการจัดระเบียบดังนี้:
â¦(บางโฟลเดอร์)
- /สร้าง/
--bundle.react.js
--/สร้าง/สาธารณะ/
---/รูปแบบไฟล์/
---/แบบอักษร/
---bundle.react.client.js
-node_modules
â¦(ไฟล์รูทบางไฟล์ เช่น webpack เป็นต้น)
ฉันเดาว่ามีปัญหาบางอย่างในการอ้างอิงโฟลเดอร์ /node_modules เนื่องจากฉันเขียนไฟล์ web.config แต่ฉันไม่รู้ว่าควรอ้างอิงอย่างไร