在 IIS 中部署 SPA 应用,多么痛的领悟!
作者 | 小码甲
来源 | 全栈码农画像(ID:nodotnet)
头图 | CSDN 下载自东方IC
目前公司的 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 应用的全过程。
可算解决了前后端团队开发、自测阶段一大痛点,我把这个问题定义为[效率工具]类,有兴趣的读者可以试一试。
更多精彩推荐
☞谁说中国没有 Linus?中国初代 IT 宗师封神榜
☞程序员连续加班在餐厅泪崩,谁不是每逢上线必通宵!
☞打工人,今年双十一你刷啥?☞有了图分析,可解释的AI还远吗?☞一文教你如何在生产环境中在Kubernetes上部署Jaeger
☞数字政务是“新常态”——如何确保其合乎道德规范?
点分享点点赞点在看
在 IIS 中部署 SPA 应用,多么痛的领悟!相关推荐
- 在IIS中部署SPA应用,多么痛的领悟!
目前公司的Web项目是SPA应用,采用前后端分离开发,所以有时也会倒腾Vue框架. " 前后端应用最终以容器形态.在k8s中部署, 为此我搭建了基于Gitlab flow的Devops流程. ...
- 如何在 IIS 中部署 WCF
在 IIS 中部署 WCF ,最重要的 是 Web.config 文件的配置 . 首先, 正常安装 IIS 2,注册 ServiceModelReg.exe -i 3, WCF 的发布 , 需要 拷 ...
- 总是想起一首歌:多么痛的领悟
总是想起一首歌:多么痛的领悟 - 总是想起一首歌:多么痛的领悟 有一种真挚的感情,远远比缠绵悱恻的爱情珍贵,那是人间最纯真的情感,不需要任何的基础和依靠的爱,不需要停泊和追逐永恒的爱. 这种爱叫着&q ...
- 多么痛的领悟!——我的2013拾遗总结
多么痛的领悟!--我的2013拾遗总结 2013即将过去,回首走过的一年,是真学生时代终结的一年,是再次步入社会开启IT工作的一年,是从东北跨到南方第一次体会四季如春的一年,最重要的是彻底告别&quo ...
- 多么痛的领悟 ——我的2013拾遗总结
多么痛的领悟!--我的2013拾遗总结 2013即将过去,回首走过的一年,是真学生时代终结的一年,是再次步入社会开启IT工作的一年,是从东北跨到南方第一次体会四季如春的一年,最重要的是彻底告别&quo ...
- 华为8年女硕离职:多么痛的领悟...
华为8年女硕离职:多么痛的领悟... 2016-01-20 51CTO 一年前的十月,我离开了华为,不咸不淡.这个十月,和我一同入职的先生也离开了,心里的五味杂陈却异常凶猛的翻涌起来.过去的一年里,我 ...
- 多么痛的领悟!差不多2015年的时候,我开始关注股票
多么痛的领悟!差不多2015年的时候,我开始关注股票.如果当时放50万进去买茅台,现在股票资产就会超过2000万. 之前看到过巴菲特讲过一句话,找到一个又湿又厚又长的坡,像滚雪球一样让财富越滚越大.我 ...
- 关于.NET5在IIS中部署的几个问题总结
本来我的系列教程已经慢慢剥离开IIS了,毕竟有了Docker容器以后,配合Nginx使用真的很不错.但是还是有很多同学使用IIS的,这个不可否认IIS的重要性.随着.NET的发布,很多小伙伴已经开始升 ...
- 在IIS中部署Asp.net Mvc
概述: 最近在做一个MVC 3的项目,在部署服务器时破费了一番功夫,特将过程整理下来,希望可以帮到大家! 本文主要介绍在IIS5.1.IIS6.0.IIS7.5中安装配置MVC 3的具体办法! 正文: ...
最新文章
- 敏捷(Agile)与精益(Lean)对比
- 网络犯罪分子为何针对中小企业?—Vecloud微云
- 数据双向绑定_手把手教你用JavaScript如何实现数据双向绑定
- A Walk Through the Forest HDU - 1142(dijkstra+动态规划)
- Go语言重新开始,Go Modules 的前世今生与基本使用
- matlab 贝叶斯工具箱,matlab的BNT贝叶斯工具箱错误求教
- 声明式事务、Spring 中常用注解、Ajax
- Bootstrap3 弹出提示插件的使用方法
- LCD液晶显示的51单片机简单计算器
- mysql 动态插入日期_mysql 如何动态传入一个时间得到此时间的某个时间点
- simpledateformat格式_为什么日期格式化时必须有使用y表示年,而不能用Y?
- 注册(二)之增加绑定
- 《labuladong的算法小抄》| 笔记
- python数据的存储结构是指_python数据结构
- 2017山东单招计算机试题,2017年山东单招数学模拟试题及标准答案.docx
- 驱动力3.0,动力全开~
- JAVA静态代理与动态代理(JDK和CGLIB)
- 目标码格式解析之DSP目标码Cinit段
- HDU-2140 Michael Scofield's letter 水题
- Posix API 与 网络协议栈 详细介绍
热门文章
- Java SE 8 docs:Static Methods、Instance Methods、Abstract Methods、Concrete Methods和Fields
- javax.mail.MessagingException: 553 authentication is required
- 写在这一年实习的总结
- vue项目首屏加载过久处理笔记
- node(基础)_node中的javascript
- EL表达式,JSP内置对象
- Webpack基础学习
- HTMO DOM部分---小练习;列表之间移动、日期选择、好友选中、滑动效果、滚动条效果、飞入飞出效果。...
- HDU 5515 Game of Flying Circus 二分
- 《编码规范和测试方法——C/C++版》作业 ·003——宏定义作用整理、设计删除数组元素的函数