网站的部署及发布

前言:这是第一篇正式的文章,写这篇文章一方面用于总结自己从制作网站到部署并最后发布的整个流程,另一方面也是想真实考验下本系统是否能承担起开发它的目的。


阅读须知  

本站代码基于:Html5,Asp.net MVC 4,Entity Framework 5,Sql Server 2008 R2、Windows Server 2008

服务器提供商:阿里云

域名提供商:Godaddy.com

阅读难度:低

受众:初次部署网站的童鞋

所须背景知识:了解域名、DNS这些名词,有过开发网站的经验更佳

阅读建议:有经验的童鞋,直接选择感兴趣的阅读即可


前 传

写这篇文章的时候,我刚吃好晚饭。屋里没有开灯,只有电脑屏幕的灯亮着,伴随着动感的音乐,在键盘上欢快地敲敲停停,停停敲敲~ 就在这个时候,音乐和屏幕嘎然而止,“我擦,文章还没来得及保存”,顿时感觉一阵阵的蛋疼。这时内心深处传来了伟大的声音“毛主席:蛋定~”, 接着我扭头一看窗外,还好地球一切正常,没有外星人的进攻,更不是世界末日,只不过整片小区都黑了。“靠,原来是停电了。”后来证明是我想得太天真了,这根本不只是停电,凡是生活所需的一切资源都断了,原来我们这片区域是违章建筑,“尼码,一夜回到改革开放前,吭爹的吧~~”。


以上内容,完全瞎扯,如有雷同,定是天意~~ 当然也不是完全和正文无关(咱又不靠字数吃饭,没必要瞎编一段填充字数),因为我觉得这个和我要讲的内容很相似。要建立网站并发布,就需要一份网站源代码、一个空间、一个域名(和DNS)、一个备案号,有条件的,可以再撒上点味精、椒盐,这样一份色香味俱全的网站就出炉了。


言归正传,要有房子,首先就要有块地,地就相当于是空间;有了空间后才可以开始盖房子,这个时候你就可以把源代码拷贝复制到空间了,这样房子也盖好了;但是光有房子还不行,还要给它通上电接上水,水电就相当于网站的内容来源(比如从数据库获取数据)。一切就绪,只差门牌号了,没有门牌号,别人要怎么样才能找到你家呢?莫非,你打算告诉别人你家的坐标?这样不只找起来麻烦,记都很困难。网站的门牌号就是域名了,就如你现在浏览器地址栏中所看到的chenxu.me,这个东东就是所谓的域名了,这样以后你只要把你家地址偷偷地告诉别人,他就可以找到你了。但是,还见不得光,因为在天朝,你盖个房啥的不领个证,改天城管就该堵你家门口了。所以,有了域名之后,还得去所属的通信管理局备案。等备案通过,恭喜,你的网站可以大白于天下了。


下面,详细介绍下chenxu.me部署及发布的整个流程。


准备源代码

如果你平时工作就是写代码,那这个对你来说就如同家常便饭,轻而易举,唯一的区别就是你要对需求有更清楚的把握:你要做什么、谁是你的客户、预期流量多少等,这些因素对于你前期的架构选择会有很大的影响。比如,你的客户只有中国人,那么你就可以省去本地化的设计;如果你的客户不分群体,那么你就需要考虑支持各版本的浏览器;如果你期望流量会不断增加,那么就要考虑使用弹性的框架以便你可以轻易得更换组件以支持上升的吐吞量;如果你对你的服务收取费用,那就该在稳定性、可靠性上做更多的考虑。


我做这个网站的最初目的就是记录自己感兴趣的点点滴滴,顺便把自己所知的微软各项技术进行一个汇总。因此我选用以C#语言为主的各项框架和技术:Asp.Net MVC 4、Entity Framework 5、Sql Server 2008 R2、IIS 7+。搭配使用IoC、Repository、MVC和三层架构进行构建。表现层则使用当前最流行的Html5 进行页面的展示。


本人纯属自娱自乐,开发环境就是手头的电脑(Win 7 x64,Visual Studio 2012),磨磨蹭蹭耗时N个月,总算是有了个雏形。由于是自娱自乐,前期没有写详细的项目计划,也没有明确的迭代目标,导致在开发过程中无法跟踪项目的进度,一度想要放弃。所以,前期的准备工作是相当有必要的。


开发完成后,利用Visual Studio 的发布功能,根据向导进行简单配置就可以把整个网站发布到本地的文件系统,这样源代码就算准备就绪了。

准备源代码

图 1:准备源代码

注:在使用Visual Studio的发布功能时,可能会遇到编译失败的问题,提示你某些dll的元数据没有找到,这个时候首先要检查在Web项目中是否已经把所有其它项目和所需要的第三方库都作为引用添加到该项目中了。其次,检查每个项目各自所添加的第三方库的dll是否一致,比如在DAL项目中添加的Entity Framework版本为4.3,而Web项目中则为5.0。最后,再把System.Web.Mvc、System.Web.Razor、System.Web.WebPages、System.Web.WebPages.Razor、System.Web.Http、System.Web.Helpers的“复制到本地”属性设置为true。

购买域名

在“前传”中,我已经解释过了,域名就相当于是门牌号码。而好的门牌号码不仅方便他人记忆,同时也非常有价值。所以,挑选一个好的域名也是一门相当深奥的学问。不过,域名不是你想买,想买就能买,往往想要的域名早就名花有主了。至于如何挑选域名,此处省略一万字(请大家自己谷歌)。最后挑来选去,在万花丛中找到了chenxu.me。一来,chenxu只有6个字母,长度适中;二来,chenxu是本人姓名的拼音,只要认识我且学过拼音的童鞋都不难记住;三来,me在英文中的意思是"我",从这个角度说,那是相当得适合拿来个人建站。


下一步,就是掏钱了,这里推荐大家使用Godaddy这个域名提供商,因为它不只是提供的操作多(毕竟是国内外都很有声誉的商家,所以在配套功能方面做得很完善。方便用户管理DNS,管理InstantPage等),而且价格也很便宜,还可以使用优惠卷。同样是".me"域名,国内万网的报价要300多/年,而Godaddy上连续三年总价也就300多,如果再加上优惠卷,还可以更便宜。缺点是该站点没有提供中文的语言版本,有一部分优惠卷也并没有对中国市场开放,而且有些地区的电信不知是出于啥原因封掉了Godaddy的部分DNS地址。


但这些缺点哪难得住咱天朝的子民,各种中文教程早就漫天遍野了;至于优惠卷,Godaddy会有很多不定期的促销活动,所以只要你注册了Godaddy的用户,之后系统就会经常向你推送可用的优惠卷,你只要留意查看就好了;我猜大家最关心的估计就是DNS的问题了,这里有2个解决办法:1、网上有童鞋写了个程序来监测Godaddy的各个DNS的封锁情况,大家可以根据这个DNS动态,选用正常的DNS服务器;2、选用第三方的DNS服务器,我现在使用的就是第三方的服务器 --- DNSPod.cn (提供免费和收费两种服务)。

购买空间(服务器)

有了门牌号码,有了源代码,该找个地儿放了。有些童鞋包括我自己也曾经想过把代码就放自己电脑上了,其实这样也未尝不可,网上下载个花生壳,然后绑定自己的IP同样可以实现访问。如果你只是随便玩玩,那这样绝对没有问题。但是如果你想提供稳定可靠的访问质量和日益增多的流量,那就需要你的服务器能够7*24小时不间断运行,需要你有足够的南北带宽,你还要预防可能的黑客攻击等危险。我没有具体实践过,因为我是个怕麻烦的人,既然人家云服务器能够省去这些麻烦,我就牺牲点大洋吧。


其实云服务器这个概念由来已久,与传统的虚拟主机比具有N多优势,比如高稳定性、按需调整机器配置和带宽、灵活地支付方式等等。我在这里就不废话了,留个链接,大家瞧下就一目了然了。本网站就是放在阿里云服务器上,本人对阿里的印象一向都很好,所以就不考虑其它云服务器了。因为只是个人网站,加上前期流量比较小,就选择了如下图所示的服务器配置:(单核,1.5G,1M带宽,40G数据盘,Server 2008 R2 x64)

服务器配置 - 网站的部署及发布 - Charley Blog

图 2:服务器配置

服务器使用起来很方便,可以用Windows的远程连接工具直接连接,然后就像操作本地文件一样,粘贴复制到服务器上。刚买的空间那个清澈呀,啥都没有,IIS 和 数据库都需要自己安装 (阿里云提供关系型数据存储,但是考虑价格太高,就决定自己下载安装数据库)。


为了保证服务器在使用过程中的安全性,有条件的可以使用一些硬件防火墙等设备对类似 DDos的攻击进行拦截,没有条件的可以从软件上进行预防,最简单就是修改并关闭一些可能让黑客侵入的端口,比如3389, 135等。

备 案(个人,浙江)

备案,说白了,就是一张用于向天朝表明网站合法身份的证件。在天朝,只要你的内容(网站)使用的是国内的空间就必须要进行备案。另外,如果内容在国外,而域名是".cn",因为这个域名代表的是中国,所以需要提供类似申请书的东东把你的服务器什么的说明一下才能够正常解析。所以选择合适的域名和空间能够为你发布网站节省不小的麻烦。


国内的备案一项都是个令人头痛的事情,一来繁琐,二来龟速。而且不同的地区备案细则可能还不一样。所以你如果确定了一个发布日期,一定要事先留下充足的时间供备案所需。我备案的过程也是曲折复杂,因为一个备案主体只能有一个备案号,而我曾经有过一次备案,只不过后来网站关闭了也就没去理会。现在要么注销之前的备案,要么将新的域名添加到原备案号中并将备案号转入到阿里云。最后我选择注销备案,干干净净,从头再来。于是,从浙江省通信管理局网站上下载注销申请表,然后根据表格进行填写,并邮寄给浙江省通管局。差不多过了5个工作日,收到答复表示已经注销了。随后,我通过阿里云官网提供的备案系统,根据提示选择“新增备案”,进行一步步的操作,10天的时间居然就通过备案了,这个速度那真是叫快! 详细步骤此处就不赘述了,请大家查看我在阿里云论坛的帖子


注:一般备案就是针对顶级域名的备案,像blog.chenxu.me这样的域名隶属于chenxu.me(俗称二级域名),所以不需要再备案,直接使用顶级域名的备案号就可。另外,同一个备案号下允许有多个不同的顶级域名。


一般情况下备案只需要备一次就可以了,不需要每年都备。但是,如果备案时候录入的信息在一段时间后有改动,比如你的手机号码,那就需要进行“修改备案信息”的操作,否则管局随时可能要求你关站。不过,阿里云的备案人员会定期于你核查,然后通知你进行 “修改备案” 的操作。修改备案与初次备案流程相关无几。

部署网站

部署,顾名思义,就是把东西放到该放的地方。在上面的步骤中,我们已经购买了空间(服务器)了,为了让网站能在空间上正常运行,往往需要对空间进行一些设置。

因为是Asp.Net Mvc网站,所以要通过如下步骤来进行服务器软件安装和配置:

1,安装IIS(2008上需要通过:服务器管理器 / 角色管理 / 添加角色 来添加IIS,版本为7.5);

2,安装.Net Framework 4.0 或 更高的版本(从网上下载);

3,安装Sql Server 2008 R2(从网上下载);

4,复制源代码到服务器硬盘上;

5,打开IIS,添加应用程序池并配置使用 .Net Framework 4.0 作为框架;


应用程序池的配置

图 3:应用程序池配置

6,添加一个网站,使用刚刚创建的应用程序池,并将网站的目录指向源代码;

7,在IIS中,选择网站进行预览就可以访问了(此时只能通过IP进行访问);


注:如果步骤 1 和 2 执行顺序相反,则需要执行aspnet_iis -iru 来对IIS进行一个配置。

If IIS was previously enabled on the computer, the setup process for the .NET Framework automatically registers ASP.NET 4 with IIS. However, if you install the .NET Framework 4 before you enable IIS, you must run the ASP.NET IIS Registration tool in order to register the .NET Framework with IIS and create application pools that use the .NET Framework 4.


--<ASP.NET IIS Registration Tool>

发布网站

到这步之前,因为域名还没有和我们网站的地址进行关联,用户访问域名时仍旧无法查看到你的网站。需要我们进行DNS设置,从而把这个域名和空间地址(IP地址)联系在一起。DNS相信童鞋们都不陌生,它的主要作用就是把域名和空间的地址绑定在一起,当人们通过浏览器访问域名的时候,浏览器就会去向DNS服务器发起请求,DNS服务器随后返回该域名对应的IP,之后浏览器就可以直接与该IP进行通信了。


管理DNS,各个域名提供商的操作大同小异,我在"购买域名"那一节也提到用DNSPod进行DNS管理,从而避免Godaddy被封的状况。因为我做的是一个个人网站,所以选择的是它的免费服务。在管理界面,我把用到的域名和我的空间IP地址进行一一绑定,这里选择“A记录”来指向IP。之后再回到Godaddy的DNS管理界面,用DNSPod的DNS服务器地址替换Godaddy的DNS服务器地址。

DNS配置

图 4:DNS配置


DNS配置完成后,访问域名就可以正常解析到我们的空间了。但是倘若你的空间中有多个网站,那IIS该如何返回正确的网站呢?这就需要在IIS中进行进一步的配置。选中对应的网站 / 编辑绑定 / 设置主机名,大功告成!

IIS绑定

图 5:IIS绑定


到这一步,已经基本完成一个网站的发布了,童鞋们,赶紧Try 一下吧。

后 续

当一个用户可以正常访问到你的网站之后,是不是就可以高枕无忧了呢?要是你和我一样懒,那就等着服务器Down机吧。为了提高服务器的稳定性、可靠性,还需要学会如何对服务器进行例行的维护,学会设置日志,查看日志。另外,不得不说下令每一个站长都魂牵梦绕的东东------SEO(搜索引擎优化),优秀的SEO,会让你的网站流量迅速上升,从而.... (你懂的)。至于如何进行SEO,那可是又一个技术活,我也是小白,等以后学会了,再来把这个后续补充完整。最后,送上一张无比灿烂的笑脸,感谢你从头看到尾。


可能出现的问题

Authorize 失败

在一次部署 Asp.Net Mvc 网站的时候遇到一个问题,即所有应用了 [Authorize] 标签的地方都出错了,具体的错误信息由于当时没有截图,已经无法得知。大概的错误就是指 Authorize 失败,而且在 global 中加的所有与 authroize 相关的管道事件都没有命中,比如 AuthorizeRequest、PostAuthorizeRequest 事件。

导致这个问题的可能原因是,MVC 的 route 出了问题,请求并没有从 Asp.Net 的管道中走。当时为了解决这个问题,我们在 web.config 中加了如下的语句:

<modules runAllManagedModulesForAllRequests="true">


但是该语句会导致所有的请求(静态资源)都会经历 Asp.Net 的所有模块,导致性能变差。

因此,更好的解决办法是安装 windows 的一个 QFE 补丁,或者只让 URL routing 的模块对所有 request 启用。

<system.webServer>
      <modules>    
        <remove name="UrlRoutingModule-4.0" />    
        <add name="UrlRoutingModule-4.0" type="System.Web.Routing.UrlRoutingModule" preCondition="" />  
      </modules>
    </system.webServer>

默认的 preCondition 是managedhandler,表示只有对托管资源的请求时,才会使用 UrlRoutingModule。


关于该 Route 的问题,大家可能仔细阅读 StackOverflow 中的这个问题《ASP.NET 4.5 MVC 4 not working on Windows Server 2008 IIS 7》,及《How ASP.NET MVC Routing Works and its Impact on the Performance of Static Requests


注:若有错别字或者理解有误,请童鞋们凶残的指出来。

文章索引

[隐 藏]

本站采用知识共享署名 3.0 中国大陆许可协议进行许可。 ©2014 Charley Box | 关于本站 | 浙ICP备13014059号