在IIS中部署SPA应用,多么痛的领悟!

news/2024/7/10 2:15:08 标签: web, nginx, 内存结构, vue, devops

目前公司的Web项目是SPA应用,采用前后端分离开发,所以有时也会倒腾Vue框架。

前后端应用最终以容器形态、在k8s中部署, 为此我搭建了基于Gitlab flow的Devops流程。

在Devops实践中,容器部署成为良方和事实标准。

但是在开发和自测阶段,不要滥打镜像,前后端团队还需要一个友好的联调+自测的验证环境

最友好、最顺手的web服务器当属IIS,(后端API已经使用WebDeploy部署到IIS),本文记录使用IIS托管Vue应用的姿势。

前置条件:安装IIS、Url Rewrite Module !!!

1. 部署Vue应用

我们以Github上Vue Todo应用为例,执行yarn build

如果build成功,你会发现生成了一个dist静态资源文件夹。

2. 创建web.config

将yarn生成的dist文件夹拷贝到C:\dist,并添加以下web.config文件, 这个文件实际是我们在IIS Url-Rewrite module上配置的结果。

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <system.webServer>
        <rewrite>
            <rules>
                <rule name="Handle History Mode and custom 404/500" stopProcessing="true">
                    <match url="(.*)" />
                    <conditions logicalGrouping="MatchAll">
                        <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
                        <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
                    </conditions>
                    <action type="Rewrite" url="/" />
                </rule>
            </rules>
        </rewrite>
        <httpErrors>
            <remove statusCode="404" subStatusCode="-1" />
            <remove statusCode="500" subStatusCode="-1" />
            <error statusCode="404" path="/survey/notfound" responseMode="ExecuteURL" />
            <error statusCode="500" path="/survey/error" responseMode="ExecuteURL" />
        </httpErrors>
        <modules runAllManagedModulesForAllRequests="true"/>
    </system.webServer>
</configuration>

3. 在IIS上部署Vue应用

点击确定

4.运行Vue应用

Nice!现在你的Vue静态应用就运行在IIS上。

But, 在前后端分离模式中,我们的Vue应用不仅有静态资源,还要发起动态api请求。

一般情况下webpack打包后的api请求路径是/, 会尝试请求同域名下api资源, 实际并不存在。

我们需要将对Vue应用的api请求代理到真实后端地址。

5. 反向代理动态api请求

Vue应用站点还要充当一部分反向代理服务器的作用。

假设真实后端api地址部署在10.200.200.157:8091地址上,api请求以/api为前缀。

下面利用Url Rewrite Module 反向代理api请求到真实后端:

   点击站点功能视图---> Url重写---> 添加入站规则

Url重写的结果其实就是下面的web.config文件

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <!-- To customize the asp.net core module uncomment and edit the following p. 
  For more info see https://go.microsoft.com/fwlink/?linkid=838655 -->
  <system.webServer>
    <rewrite> 
       <rules> 
       <clear /> 
           <rule name="ReverseProxyInboundRule" stopProcessing="true"> 
                <match url="api/([_0-9a-z/-]+)" />
                <conditions logicalGrouping="MatchAll" trackAllCaptures="false" />
                <action type="Rewrite" url="http://10.200.200.157:8091/{R:0}" /> 
           </rule> 
           <rule name="ResourceToIndex" stopProcessing="true">
                <match url="(.*)" />
                <conditions logicalGrouping="MatchAll" trackAllCaptures="false">
                <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
                <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
                </conditions>
                <action type="Rewrite" url="/" />
           </rule>
      </rules>
    </rewrite>
    <httpErrors>
      <remove statusCode="404" subStatusCode="-1" />
      <remove statusCode="500" subStatusCode="-1" />
      <error statusCode="404" path="/survey/notfound" responseMode="ExecuteURL" />
      <error statusCode="500" path="/survey/error" responseMode="ExecuteURL" />
    </httpErrors> 
 
  </system.webServer>
</configuration>
<!--ProjectGuid: 068855e8-9240-4f1a-910b-cf825794513b-->

注意:黄色背景行便是反向代理规则ReverseProxyInboundRule, 注意反向代理规则要在静态资源规则ResourceToIndex的前面。

这样我们就完成了在前后端分离开发模式下,使用IIS托管Vue应用的全过程。  

-----

可算解决了前后端团队开发、自测阶段一大痛点,我把这个问题定义为[效率工具]类,有兴趣的读者可以试一试。


http://www.niftyadmin.cn/n/1864573.html

相关文章

解锁环境变量在云原生应用中的各种姿势

应用程序在某些时刻总是需要一些外挂配置&#xff0c;云原生应用的实践是在容器化之前就将应用程序配置保留在代码之外。“12-Factors App&#xff1a;Store config in the environment① 外挂配置文件&#xff1a;业务配置 appsettings.json“可以在代码中要求加载appsetting.…

一套标准的ASP.NET Core容器化应用日志收集分析方案

点击上方蓝字给一个关注吧讲故事关注我公众号的朋友&#xff0c;应该知道我写了一些云原生应用收集和分析相关的文章&#xff0c;其中内容大多聚焦某个具体的组件&#xff1a;超级有用的TraceId&#xff0c;快点用起来吧&#xff01;如何利用NLog输出结构化日志&#xff0c;并在…

Oh my God, Swagger API文档竟然可以这样写?

最好的总会在不经意间出现。“作为后端程序员&#xff0c;免不了与前端同事对接API&#xff0c; 一个书写良好的API设计文档可有效提高与前端对接的效率。为避免联调时来回撕逼&#xff0c;今天我们聊一聊正确编写Swaager API文档的姿势。基础Swagger用法在ConfigureServices配…

SQL常见基础疑点问答总结

以下文章都是摘自fcuandy 的&#xff0c;供自己和大家参考。 --建立测试环境IFobject_id(tb) ISNOTNULLDROPTABLEtb GOCREATETABLEtb(id INTIDENTITY(1,1),v VARCHAR(10)) GOINSERTtb SELECTaUNIONALLSELECTbINSERTtb SELECTxUNIONALLSELECTzGO(1)字串变量当数据库对象用 SQL c…

有关Quartz.NET,与一线码农大佬对个线?

跟[一线码农大佬]翻译的某技术文对个线最近看到一线码农大佬翻译的《如何在 ASP.NET Core 中使用 Quartz.NET 执行任务调度》&#xff0c;行文思路&#xff1a;安装Quartz.NETQuartz.NET 中的Job,triggers 和 Schedulers创建 Scheduler开启和停止 scheduler创建 job 工厂创建 J…

JS四舍五入

//保留小数点后两位function Transfer(num){var _value parseFloat(num);if(isNaN(_value)){return;}num _value.toFixed(2);return num;} 转载于:https://www.cnblogs.com/xjyggd/archive/2008/07/31/1257364.html

敏捷 | 如何正确理解敏捷?

【敏捷开发】| 作者/Edison Zhou在过去的五年时间里&#xff0c;我所在的公司和团队一直使用的都是敏捷开发模式&#xff0c;我也在2018年底获取了Scrum联盟的CSM认证&#xff0c;对于敏捷的理解也是从最初的感性认识到现在的理性认识。今天开始和你一起重新温习敏捷&#xff0…

《单元测试之道》读书笔记

What to Test: Right-BICEP Right---结果是否正确 B&#xff0d;&#xff0d;边界条件 I&#xff0d;&#xff0d;检查反向关联&#xff08;用相反的逻辑关系来验证&#xff09; C&#xff0d;&#xff0d;交叉检查 E&#xff0d;&#xff0d;Error是否可以强制错误条件发生&am…