Điểm:0

Cách triển khai ứng dụng phản ứng kết xuất phía máy chủ (SSR) (được gói theo gói web) trên máy chủ windows 2016/IIS

lá cờ cn

Xin lưu ý: Đây là lần đầu tiên tôi thử triển khai ứng dụng phản ứng trên máy chủ Windows được xây dựng tùy chỉnh, nhưng tôi đã quản lý để thực hiện thành công trên Heroku và Linux (PM2), vì vậy tôi biết rằng kiến ​​trúc ứng dụng là giả sử để làm việc một cách chính xác.

Kịch bản:

Tôi đã xây dựng một máy chủ lưu trữ Windows Server 2016/64 bit để lưu trữ nhiều trang web. Tôi đã sử dụng VPS Contabo để làm như vậy. Tôi đã thử nghiệm tất cả các tính năng được cho là hoạt động, ngay cả với các ứng dụng khác như ASP.NET, PHP, chứng chỉ SSL và mọi thứ đều hoạt động tốt.

Đối với dự án node js cụ thể mà tôi đang cố lưu trữ trên máy chủ này, Nó bao gồm 2 phần chính:

  • Phần phụ trợ trong nút cùng với một CMS, cũng được phát triển trong nút / javascript.

Tôi đã tạo không gian lưu trữ trên miền phụ cho miền này và nó đang hoạt động hoàn hảo, ngay cả với chứng chỉ SSL Letâs Encrypt. Trong trường hợp bất cứ ai muốn truy cập nó, sẽ là: https://backendnode.fullstackwebdesigner.com/system

  • Giao diện người dùng trong kết xuất phía máy chủ phản ứng.

Đây là nơi vấn đề đang xảy ra. Nếu bất cứ ai muốn truy cập nó, đây là liên kết: https://fullstackwebdesigner.com/

Về cơ bản, tôi đã sử dụng cùng một kỹ thuật cho cả hai:

  • iisnode;
  • phần mở rộng viết lại URL;
  • mô-đun nút iis;
  • cấu hình tệp web.config;

Vấn đề:

Tôi đã quản lý để tải nó dưới dạng một trang web, giống như tôi đã làm với phần phụ trợ, nhưng vấn đề là có vẻ như nó không tải được các tệp CSS, hình ảnh, v.v. Vì vậy, bố cục không tải. Trên bảng điều khiển, có thông báo lỗi: Uncaught SyntaxError: Mã thông báo không mong muốn '<'

Ứng dụng phản ứng: Như tôi đã nói trước đây, nó được thực hiện như một ứng dụng kết xuất phía máy chủ và đi kèm với webpack. Vì vậy, nó xây dựng các tệp được đóng gói vào một thư mục có tên là â/buildâ. Và trong thư mục này, có một thư mục â/publicâ chứa tất cả nội dung, chẳng hạn như tệp CSS và hình ảnh.

Trong khi phát triển, tôi sẽ chạy bản dựng trên thiết bị đầu cuối dưới dạng: xây dựng nút/gói.react.js

Và thật kỳ lạ, khi tôi chạy cái này trên thiết bị đầu cuối trên máy chủ windows, Nó hoạt động hoàn hảo. Nhưng chỉ có thể được truy cập thông qua: http://localhost:3001 Nó tải mọi thứ được cho là tải.

Đây là một biểu diễn đơn giản hóa cấu trúc tệp:

- /xây dựng/
--bundle.react.js
--/xây dựng/công khai/
---/bố cục tệp/
---/phông chữ/
--- bó.react.client.js

Đây cũng là tệp web.config tôi đang sử dụng trên không gian lưu trữ trang web để xây dựng phản ứng:

<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>

Bất kỳ ai cũng có bất kỳ ý tưởng nào về những gì có thể bị thiếu hoặc đang diễn ra, vì chưa có nhiều tài liệu tham khảo về kết xuất phía máy chủ lưu trữ trên máy chủ windows trên web? Có thể là một cấu hình bổ sung trên IIS, web.config hoặc trên không gian lưu trữ trang web?

Chỉnh sửa:

Một thử nghiệm thú vị mà tôi vừa thực hiện: trên máy tính phát triển cục bộ của mình, khi tôi chạy qua thiết bị đầu cuối:

gói nút.react.js

từ bên trong thư mục /build, tôi nhận được kết quả giống như sự cố đang xảy ra trực tuyến (không có bố cục, kiểu, hình ảnh, v.v.).

Nhưng khi tôi chạy qua thiết bị đầu cuối:

xây dựng nút/gói.react.js

từ bên ngoài thư mục/build (từ thư mục cơ sở), nó tải hoàn hảo.

Về điều nhiều hơn nữa. Các thư mục cơ sở được tổ chức như sau:

â¦(một số thư mục)
- /xây dựng/
--bundle.react.js
--/xây dựng/công khai/
---/bố cục tệp/
---/phông chữ/
--- bó.react.client.js
-node_modules
â¦(một số tệp gốc, như webpack, v.v.)

Tôi đoán có một số loại vấn đề khi tham chiếu thư mục /node_modules do cách tôi viết tệp web.config, nhưng tôi không biết nên tham chiếu nó như thế nào.

Điểm:0
lá cờ cn

Có nó để làm việc! Liên kết sau đây đã giúp tôi thực hiện các điều chỉnh cuối cùng, cùng với bài kiểm tra mà tôi đã thực hiện: https://www.thecodehubs.com/how-to-deploy-ssr-angular-universal-to-iis/

Tóm lại, hóa ra tôi phải sao chép gói máy chủ vào thư mục gốc. Và thay đổi tệp web.config để gọi tệp gốc.Đây là cách tệp web.config kết thúc, cùng với một số cấu hình khác mà tôi thấy thú vị trong liên kết tôi đã đăng (chưa kiểm tra nếu không có cấu hình bổ sung):

<configuration>
    <system.webServer>
        <iisnode nodeProcessCommandLine="C:\Program Files\nodejs\node.exe" />
        
        <handlers>
            <add name="iisnode" path="bundle.react.js" verb="*" modules="iisnode" />
        </handlers>

        <rewrite>
            <rules>
                <!-- Redirect to HTTPS. -->
                <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="bundle.react.js" />
                </rule>
                
                <rule name="StaticContent" stopProcessing="true">
                  <match url="([\S]+[.](jpg|jpeg|gif|css|png|js|ts|cscc|less|ico|html|map|svg))" />
                  <action type="None" />
                </rule>
            </rules>
        </rewrite> 
        
        <staticContent>
            <clientCache cacheControlMode="UseMaxAge" />
            <remove fileExtension=".svg" />
            <remove fileExtension=".eot" />
            <remove fileExtension=".ttf" />
            <remove fileExtension=".woff" />
            <remove fileExtension=".woff2" />
            <remove fileExtension=".otf" />
            <mimeMap fileExtension=".ttf" mimeType="application/octet-stream" />
            <mimeMap fileExtension=".svg" mimeType="image/svg+xml"  />
            <mimeMap fileExtension=".eot" mimeType="application/vnd.ms-fontobject" />
            <mimeMap fileExtension=".woff" mimeType="application/x-woff" />
            <mimeMap fileExtension=".woff2" mimeType="application/x-woff" />
            <mimeMap fileExtension=".otf" mimeType="application/otf" />
        </staticContent>
        
        
        <defaultDocument>
            <files>
                <clear />
                <add value="bundle.react.js" />
            </files>
        </defaultDocument>

        <security>
          <requestFiltering>
            <hiddenSegments>
              <add segment="node_modules" />
              <!--add segment="iisnode" /-->
            </hiddenSegments>
          </requestFiltering>
        </security>
    </system.webServer>
    <system.web>
        <compilation defaultLanguage="js" />
    </system.web>
</configuration>

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.