AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / server / Perguntas / 1081546
Accepted
Jorge Mauricio
Jorge Mauricio
Asked: 2021-10-25 08:06:15 +0800 CST2021-10-25 08:06:15 +0800 CST 2021-10-25 08:06:15 +0800 CST

Como implantar um aplicativo de reação de renderização do lado do servidor (SSR) (agregado pelo webpack) no Windows Server 2016 / IIS

  • 772

Apenas um aviso: esta é a primeira vez que tento implantar um aplicativo react em um servidor Windows personalizado, mas consegui fazê-lo com sucesso no Heroku e no Linux (PM2), então sei que a arquitetura do aplicativo é suposta para funcionar corretamente.

O cenário:

Eu construí um servidor de hospedagem Windows Server 2016/64 bits para hospedar vários sites. Eu usei o VPS Contabo para fazer isso. Eu testei todos os recursos que deveriam funcionar, mesmo com outros aplicativos, como ASP.NET, PHP, certificados SSL e tudo está funcionando bem.

Quanto ao projeto node js específico que estou tentando hospedar neste servidor, ele consiste em 2 partes principais:

  • Backend em node junto com um CMS, também desenvolvido em node/javascript.

Criei um espaço de hospedagem em um subdomínio para este e está funcionando perfeitamente, mesmo com o certificado SSL Let's Encrypt. Caso alguém queira acessá-lo, seria em: https://backendnode.fullstackwebdesigner.com/system

  • Frontend na renderização do lado do servidor de reação.

É aqui que está ocorrendo o problema. Se alguém quiser acessá-lo, aqui está o link: https://fullstackwebdesigner.com/

Eu usei basicamente a mesma técnica para ambos:

  • iisnode;
  • Extensão de reescrita de URL;
  • módulos de nó iis;
  • configuração do arquivo web.config;

O problema:

Eu consegui carregar como um site, assim como fiz com o backend, mas o problema é que parece não carregar os arquivos CSS, imagens e assim por diante. Portanto, o layout não carrega. No console, há uma mensagem de erro: Uncaught SyntaxError: Unexpected token '<'

O aplicativo react: Como eu disse antes, ele foi feito como um aplicativo de renderização do lado do servidor e empacotado com o webpack. Portanto, ele compila os arquivos agrupados em um diretório chamado “/build”. E neste diretório, há um diretório “/public” onde estão todos os ativos, como arquivos CSS e imagens.

Durante o desenvolvimento, eu executaria a compilação no terminal como: node build/bundle.react.js

E por mais estranho que pareça, quando executo isso no terminal do servidor windows, funciona perfeitamente. Mas só pode ser acessado através de: http://localhost:3001 Carrega tudo o que é suposto carregar.

Aqui está uma representação simplificada da estrutura do arquivo:

- /build/
--bundle.react.js
--/build/public/
---/files-layout/
---/fonts/
---bundle.react.client.js

Aqui está também o arquivo web.config que estou usando no espaço de hospedagem do site para a compilação do react:

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

Alguém tem alguma idéia do que pode estar faltando ou acontecendo, já que não houve muitas referências sobre a renderização do lado do servidor de hospedagem no servidor Windows na web? Talvez uma configuração extra no IIS, web.config ou no espaço de hospedagem do site?

Editar:

Um teste interessante que acabei de fazer: no meu computador de desenvolvimento local, quando executo pelo terminal:

node bundle.react.js

de dentro da pasta /build, recebo o mesmo resultado do problema que está acontecendo online (sem layout, estilos, imagens e assim por diante).

Mas quando eu corro pelo terminal:

node build/bundle.react.js

de fora da pasta /build (do diretório base), ele carrega perfeitamente.

Em mais coisa. Os diretórios base são organizados assim:

…(some folders)
- /build/
--bundle.react.js
--/build/public/
---/files-layout/
---/fonts/
---bundle.react.client.js
-node_modules
…(some root files, like webpack and so on)

Suponho que haja algum tipo de problema ao referenciar a pasta /node_modules por causa de como escrevi o arquivo web.config, mas não tenho idéia de como fazer referência a ele.

deployment iis node.js windows-server-2016
  • 1 1 respostas
  • 923 Views

1 respostas

  • Voted
  1. Best Answer
    Jorge Mauricio
    2021-10-25T12:45:29+08:002021-10-25T12:45:29+08:00

    Deu pra funcionar! O link a seguir me ajudou a fazer os ajustes finais, junto com o teste que fiz: https://www.thecodehubs.com/how-to-deploy-ssr-angular-universal-to-iis/

    Resumindo, acabei tendo que copiar o pacote do servidor para o diretório raiz. E altere o arquivo web.config para chamar o arquivo raiz. Veja como ficou o arquivo web.config, junto com mais algumas configurações que achei interessantes no link que postei (não testei ainda sem a configuração extra):

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

relate perguntas

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Você pode passar usuário/passar para autenticação básica HTTP em parâmetros de URL?

    • 5 respostas
  • Marko Smith

    Ping uma porta específica

    • 18 respostas
  • Marko Smith

    Verifique se a porta está aberta ou fechada em um servidor Linux?

    • 7 respostas
  • Marko Smith

    Como automatizar o login SSH com senha?

    • 10 respostas
  • Marko Smith

    Como posso dizer ao Git para Windows onde encontrar minha chave RSA privada?

    • 30 respostas
  • Marko Smith

    Qual é o nome de usuário/senha de superusuário padrão para postgres após uma nova instalação?

    • 5 respostas
  • Marko Smith

    Qual porta o SFTP usa?

    • 6 respostas
  • Marko Smith

    Linha de comando para listar usuários em um grupo do Windows Active Directory?

    • 9 respostas
  • Marko Smith

    O que é um arquivo Pem e como ele difere de outros formatos de arquivo de chave gerada pelo OpenSSL?

    • 3 respostas
  • Marko Smith

    Como determinar se uma variável bash está vazia?

    • 15 respostas
  • Martin Hope
    Davie Ping uma porta específica 2009-10-09 01:57:50 +0800 CST
  • Martin Hope
    kernel O scp pode copiar diretórios recursivamente? 2011-04-29 20:24:45 +0800 CST
  • Martin Hope
    Robert ssh retorna "Proprietário incorreto ou permissões em ~/.ssh/config" 2011-03-30 10:15:48 +0800 CST
  • Martin Hope
    Eonil Como automatizar o login SSH com senha? 2011-03-02 03:07:12 +0800 CST
  • Martin Hope
    gunwin Como lidar com um servidor comprometido? 2011-01-03 13:31:27 +0800 CST
  • Martin Hope
    Tom Feiner Como posso classificar a saída du -h por tamanho 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich O que é um arquivo Pem e como ele difere de outros formatos de arquivo de chave gerada pelo OpenSSL? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent Como determinar se uma variável bash está vazia? 2009-05-13 09:54:48 +0800 CST

Hot tag

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve