视频播放网站CDN内容分发网络简单代码实现

news/2024/5/20 22:12:45/文章来源:https://blog.csdn.net/weixin_34321977/article/details/93426093

视频播放如果只有一台视频服务器,当访问用户过多时,服务器将承受不了负载。

所以我们需要在视频服务器下面增加边缘服务器,下面以视频服务器加三台边缘服务器为例。

网络环境图:

image

 

1. 用户可通过PC机或手机访问网站。

2. 网站将用户请求转向到负载较小的边缘服务器。

3. 边缘服务器接收到用户请求,先在本地检查用户请求文件是否存在。

4. 如果存在则直接返回本地文件进行播放。

5. 如果不存在则将用户请求转向到视频服务器,并将该视频文件下载到本地。

6. 当用户请求边缘服务器上视频文件,将更新文件最后修改时间,最后修改时间超过一定天数则将该文件删除。

 

根据以上介绍我们应该对CDN有了一些了解,下面来看看代码方面怎么实现:

第一步先编写一个用于检查本地文件是否存在的IModule,该IModule存在以下文件:

配置文件:Config.xml

<?xml version="1.0" encoding="utf-8" ?>
<Config><!-- 本地点播下载IP --><LocalIP>192.168.1.103</LocalIP><!-- 本地点播下载端口 --><LocalPort>8002</LocalPort><!-- 服务器IP --><ServerIP>192.168.1.6</ServerIP><!-- 服务端口 --><ServerPort>80</ServerPort><!-- 本地文件保存路径 --><SavePath>C:\\File</SavePath><!-- 待下载文件TXT路径 --><TxtPath>C:\\IisFileCheckModule\\WaitDownFile.txt</TxtPath>
</Config>

 

文件检查IModule:FileCheckModule.cs

public class FileCheckModule : IHttpModule
{/// <summary>/// 初始化/// </summary>/// <param name="app"></param>public virtual void Init(HttpApplication app){app.BeginRequest += new EventHandler(app_BeginRequest);app.AuthenticateRequest += new EventHandler(app_AuthenticateRequest);}void app_AuthenticateRequest(object sender, EventArgs e){HttpApplication app = (HttpApplication)sender;if (!String.IsNullOrEmpty(app.Request.Path) && app.Request.Path != "/"){FileCheckConfig config = new FileCheckConfig();//获得文件路径string filePath = config.SavePath + app.Request.Path.Replace("/", "\\");//获得文件名string fileName = Path.GetFileName(filePath);string fileExtension = Path.GetExtension(filePath);if (!String.IsNullOrEmpty(fileExtension)){if (!File.Exists(filePath)){//生成点播或下载路径string downUrl = "http://" + config.ServerIP + app.Request.Path;//在文本文件中新增待下载文件WaitDownFileTxtManage myWaitDownFileTxtManage = new WaitDownFileTxtManage();myWaitDownFileTxtManage.AddNewFileDownText(fileName, filePath, downUrl);//重写用户请求URLapp.Context.Response.Redirect(downUrl);}else{//生成本地点播或下载路径string localUrl = "http://" + config.LocalIP + app.Request.Path;//设置请求文件修改时间为当前时间File.SetLastWriteTime(filePath, DateTime.Now);//重写用户请求URLapp.Context.Response.Redirect(localUrl);}}}}protected void app_BeginRequest(object sender, EventArgs e){}/// <summary>/// 释放/// </summary>public virtual void Dispose(){}
}

 

文件检查配置获取:FileCheckConfig.cs

public class FileCheckConfig
{private string localIP;/// <summary>/// 本地点播IP地址/// </summary>
    public string LocalIP{get { return localIP; }set { localIP = value; }}private string serverIP;/// <summary>/// 服务器IP地址/// </summary>
    public string ServerIP{get { return serverIP; }set { serverIP = value; }}private string savePath;/// <summary>/// 文件保存路径/// </summary>
    public string SavePath{get { return savePath; }set { savePath = value; }}private string txtPath;/// <summary>/// 待下载文件列表txt文件路径/// </summary>
    public string TxtPath{get { return txtPath; }set { txtPath = value; }}public FileCheckConfig(){XmlDocument doc = new XmlDocument();//string configPath =  ConfigurationManager.AppSettings["ConfigPath"].ToString();
        doc.Load("C:\\inetpub\\IISCdn\\IisFileCheckModule\\Config.xml");XmlNode configNode = doc.SelectSingleNode("Config");LocalIP = configNode.SelectSingleNode("LocalIP").InnerText + ":" + configNode.SelectSingleNode("LocalPort").InnerText;ServerIP = configNode.SelectSingleNode("ServerIP").InnerText + ":" + configNode.SelectSingleNode("ServerPort").InnerText;SavePath = configNode.SelectSingleNode("SavePath").InnerText;TxtPath = configNode.SelectSingleNode("TxtPath").InnerText;}
}

 

待下载文件信息添加:WaitDownFileTxtManage.cs

public class WaitDownFileTxtManage
{/// <summary>/// 配置对象/// </summary>
    FileCheckConfig config = null;public WaitDownFileTxtManage(){config = new FileCheckConfig();//检查文件是否存在
        if (!File.Exists(config.TxtPath)){//创建一个新的txt文件
            StreamWriter sw = File.CreateText(config.TxtPath);sw.Close();}}/// <summary>/// 添加一个新的下载文件/// </summary>/// <param name="fileName">文件名称</param>/// <param name="fileSavePath">文件保存路径</param>/// <param name="fileDownPath">文件下载路径</param>
    public void AddNewFileDownText(string fileName, string fileSavePath, string fileDownPath){try{string downFile = fileName + ";" + fileSavePath + ";" + fileDownPath;//检查是否已存在相同下载文件
            using (StreamReader sr = new StreamReader(config.TxtPath)){String line;while ((line = sr.ReadLine()) != null){if (line == downFile)return;}}//添加待下载文件
            using (StreamWriter sw = File.AppendText(config.TxtPath)){sw.WriteLine(downFile);sw.Close();}}catch (System.Exception e){WriteLog("添加待下载文件时出现异常:" + e.Message, true);}}/// <summary>/// 打印日志方法/// </summary>/// <param name="message">错误信息</param>/// <param name="isShowDate">是否显示时间</param>
    public static void WriteLog(string message, bool isShowDate){string LogPath = "C:\\Log";FileStream MainFileStream = null;string outMess = message;if (isShowDate){string dateStamp = System.DateTime.Now.ToString("HH:mm:ss") + " >> ";outMess = dateStamp + message;}outMess = outMess + "\r\n";//
        string year = System.DateTime.Now.Year.ToString();//
        string month = System.DateTime.Now.Month.ToString();//
        string day = System.DateTime.Now.Day.ToString();string aimPath = LogPath + "/" + year + "/" + month + "/" + day;if (!Directory.Exists(aimPath)){#regiontry{Directory.CreateDirectory(aimPath);}catch (Exception me){me.ToString();}#endregion}try{string currentLogPath = aimPath + "/" + System.DateTime.Now.Hour.ToString() + ".txt";byte[] messB = System.Text.Encoding.Default.GetBytes(outMess);MainFileStream = new FileStream(currentLogPath, System.IO.FileMode.Append, System.IO.FileAccess.Write, System.IO.FileShare.ReadWrite);MainFileStream.Write(messB, 0, messB.Length);}catch (Exception me){me.ToString();}finally{if (MainFileStream != null){MainFileStream.Flush();MainFileStream.Close();}}}
}

 

这里将待下载文件信息记录在txt文档里,大家在做的时候可以用一个Access数据库实现。

在部署该IModule的时候,需要将IIS处理程序映射中的StaticFile删除

image

然后添加新的脚本映射

image

可执行文件路径为

C:\Windows\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll

这样的话,IModule便部署完成了,IModule接收到用户请求后先会在配置文件配置的本地文件路径中查找视频文件,如果找到文件则会转向到本地IIS中部署的另外一个文件站点;如果未找到文件则将请求转向到视频服务器。

 

第二步我们需要编写一个文件下载服务,该服务存在以下文件:

配置文件:App.config

<appSettings><!-- 服务器地址 --><add key="ServerIP" value="192.168.1.6"/><!-- 本地文件保存路径 --><add key="SavePath" value="C:\\inetpub\\IISCdn\\File"/><!-- 待下载XML文件路径 --><add key="txtPath" value="C:\\inetpub\\IISCdn\\IisFileCheckModule\\WaitDownFile.txt"/><!-- 服务运行间隔时间 --><add key="Interval" value="1"/><!-- 并行下载数 --><add key="QueueCount" value="5"/>
</appSettings>

 

下载文件服务,需在服务中添加一个时间控件:FileDown.cs

partial class FileDown : ServiceBase
{//保存下载文件
    Hashtable htDowFile = new Hashtable();//下载文件数
    int queueCount = Convert.ToInt32(ConfigurationManager.AppSettings["QueueCount"]);//当前下载文件数
    int downCount = 0;public FileDown(){InitializeComponent();}protected override void OnStart(string[] args){// TODO: 在此处添加代码以启动服务。
        fileDownTimer.Interval = 10000;fileDownTimer.Start();//记录服务运行日志
        Logger.LogDebug("FileDown", "OnStart", "文件下载服务开始运行。", null);}protected override void OnStop(){// TODO: 在此处添加代码以执行停止服务所需的关闭操作。
        fileDownTimer.Stop();//记录服务运行日志
        Logger.LogDebug("FileDown", "OnStop", "文件下载服务停止运行。", null);}/// <summary>/// 时间控件处理事件/// </summary>/// <param name="sender"></param>/// <param name="e"></param>
    private void fileDownTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e){//记录文件下载日志
        Logger.LogDebug("FileDown", "fileDownTimer_Elapsed", "开始一轮新的文件下载。", null);fileDownTimer.Stop();WaitDownFileTxtManage myWaitDownFileXmlManage = new WaitDownFileTxtManage();FileDownCommon myFileDownCommon = new FileDownCommon();//从配置文件内获取txt文件路径
        string txtPath = ConfigurationManager.AppSettings["txtPath"].ToString();//循环下载所有文件
        using (StreamReader sr = new StreamReader(txtPath)){String line;while ((line = sr.ReadLine()) != null){string[] fileElement = line.Split(';');string downFileSavePath = fileElement[1] + ".downing";if (!File.Exists(downFileSavePath)){if (downCount <= queueCount){downCount++;ThreadPool.QueueUserWorkItem(DownFile, line);}}}}//记录文件下载日志
        Logger.LogDebug("FileDown", "fileDownTimer_Elapsed", "结束一轮新的文件下载。", null);Double interval = Convert.ToDouble(ConfigurationManager.AppSettings["Interval"].ToString());fileDownTimer.Interval = interval * 60 * 1000;fileDownTimer.Start();}/// <summary>/// 下载文件方法/// </summary>/// <param name="downFile">下载文件</param>
    private void DownFile(object downFile){WaitDownFileTxtManage myWaitDownFileTxtManage = new WaitDownFileTxtManage();string[] fileElement = downFile.ToString().Split(';');string fileName = fileElement[0];string downFileSavePath = fileElement[1] + ".downing";string trueFilePath = fileElement[1];string fileDownPath = fileElement[2];string pathNoFile = downFileSavePath.Substring(0, downFileSavePath.LastIndexOf("\\"));//检查保存路径是否存在
        if (!Directory.Exists(pathNoFile)){Directory.CreateDirectory(pathNoFile);}//记录文件下载日志
        Logger.LogDebug("FileDownCommon", "DownFile", "\"" + fileDownPath + "\"文件开始下载。", null);//打开上次下载的文件或新建文件
        long lStartPos = 0;System.IO.FileStream fs;if (System.IO.File.Exists(downFileSavePath)){fs = System.IO.File.OpenWrite(downFileSavePath);lStartPos = fs.Length;fs.Seek(lStartPos, System.IO.SeekOrigin.Current); //移动文件流中的当前指针
        }else{fs = new System.IO.FileStream(downFileSavePath, System.IO.FileMode.Create);lStartPos = 0;}//打开网络连接
        try{System.Net.WebRequest webRequest = System.Net.WebRequest.Create(fileDownPath);webRequest.Timeout = 10000;System.Net.HttpWebRequest request = (System.Net.HttpWebRequest)webRequest;System.Net.HttpWebResponse response = (System.Net.HttpWebResponse)request.GetResponse();//System.Net.HttpWebRequest request = (System.Net.HttpWebRequest)System.Net.HttpWebRequest.Create(fileDownPath);//请求正常
            if (response.StatusCode == System.Net.HttpStatusCode.OK){if (lStartPos > 0)request.AddRange((int)lStartPos); //设置Range值//向服务器请求,获得服务器回应数据流
                System.IO.Stream ns = response.GetResponseStream();byte[] nbytes = new byte[10240];int nReadSize = 0;nReadSize = ns.Read(nbytes, 0, 10240);while (nReadSize > 0){fs.Write(nbytes, 0, nReadSize);nReadSize = ns.Read(nbytes, 0, 10240);}fs.Close();ns.Close();File.Move(downFileSavePath, trueFilePath);//删除下载完成的文件
                myWaitDownFileTxtManage.DeleteDownFile(fileName, trueFilePath, fileDownPath);downCount--;//记录文件下载日志
                Logger.LogDebug("FileDownCommon", "DownFile", "\"" + fileDownPath + "\"文件下载完成。", null);}//文件未找到
            else if (response.StatusCode == System.Net.HttpStatusCode.NotFound){//删除不存在的文件
                myWaitDownFileTxtManage.DeleteDownFile(fileName, trueFilePath, fileDownPath);downCount--;fs.Close();Logger.LogDebug("FileDownCommon", "DownFile", "\"" + fileDownPath + "\"文件在服务器上不存在。", null);}}catch (FileNotFoundException fileEx){fs.Close();downCount--;//删除不存在的文件
            myWaitDownFileTxtManage.DeleteDownFile(fileName, trueFilePath, fileDownPath);//记录异常日志
            Logger.LogError("FileDownCommon", "DownFile", AppError.EROR, 0, fileEx, "\"" + fileDownPath + "\"文件在服务器上不存在。", null);}catch (Exception ex){fs.Close();downCount--;//记录异常日志
            Logger.LogError("FileDownCommon", "DownFile", AppError.EROR, 0, ex, "下载文件\"" + fileDownPath + "\"过程中出现错误:" + ex.ToString(), null);}}
}

 

待下载文件读取:WaitDownFileTxtManage.cs

public class WaitDownFileTxtManage
{//txt文件路径
    string txtPath = "";public WaitDownFileTxtManage(){//从配置文件内获取txt文件路径
        txtPath = ConfigurationManager.AppSettings["txtPath"].ToString();//检查文件是否存在
        if (!File.Exists(txtPath)){//创建一个新的txt文件
            StreamWriter sw = File.CreateText(txtPath);sw.Close();}}/// <summary>/// 删除一个下载文件/// </summary>/// <param name="fileName">文件名称</param>/// <param name="fileSavePath">文件保存路径</param>/// <param name="fileDownPath">文件下载路径</param>
    public void DeleteDownFile(string fileName, string fileSavePath, string fileDownPath){try{string downFile = fileName + ";" + fileSavePath + ";" + fileDownPath;//将除了要删除的下载文件外的所有下载文件取出
            ArrayList list = new ArrayList();using (StreamReader sr = new StreamReader(txtPath)){String line;while ((line = sr.ReadLine()) != null){if (line == downFile)continue;list.Add(line);}sr.Close();}//重写下载文件
            using (StreamWriter sw = new StreamWriter(txtPath)){for (int i = 0; i < list.Count; i++)sw.WriteLine(list[i].ToString());sw.Close();}}catch (System.Exception e){//记录异常日志
            Logger.LogError("WaitDownFileTxtManage", "DeleteDownFile", AppError.EROR, 0, e, "删除下载文件节点出错:" + e.ToString(), null);}}/// <summary>/// 更新下载文件状态/// </summary>/// <param name="fileName">文件名称</param>/// <param name="fileSavePath">文件保存路径</param>/// <param name="fileDownPath">文件下载路径</param>/// <param name="oldStatus">旧状态</param>/// <param name="newStatus">新状态</param>
    public void UpdateDownFileStatus(string fileName, string fileSavePath, string fileDownPath, string oldStatus, string newStatus){try{string downFile = fileName + ";" + fileSavePath + ";" + fileDownPath + ";" + oldStatus;string newDownFile = fileName + ";" + fileSavePath + ";" + fileDownPath + ";" + newStatus;//将除了要删除的下载文件外的所有下载文件取出
            ArrayList list = new ArrayList();using (StreamReader sr = new StreamReader(txtPath)){String line;while ((line = sr.ReadLine()) != null){if (line == downFile)continue;list.Add(line);}}//重写下载文件
            using (StreamWriter sw = new StreamWriter(txtPath)){for (int i = 0; i < list.Count; i++)sw.WriteLine(list[i].ToString());sw.Close();}using (StreamWriter sw = File.AppendText(txtPath)){sw.WriteLine(newDownFile);sw.Close();}}catch (System.Exception e){//记录异常日志
            Logger.LogError("WaitDownFileTxtManage", "UpdateDownFileStatus", AppError.EROR, 0, e, "更新下载文件节点状态出错:" + e.ToString(), null);}}
}

 

通过以上几步便完成了一个简单的CDN视频文件内容分发网络。

大家在实现的时候还需要编写一个定时删除边缘服务器上过期文件的服务,该服务比较简单,这里便不做说明了。

希望我的文章对大家有帮助!

Technorati 标签: CDN,内容分发,视频网站

转载于:https://www.cnblogs.com/fanmenglife/archive/2009/07/16/1524765.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_793711.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

招聘SEO外链专员

为什么80%的码农都做不了架构师&#xff1f;>>> 招聘SEO外链实习生&#xff0c;在广州&#xff0c;有兴趣的朋友想尝试也欢迎&#xff0c;我们不是要你能力多强&#xff0c;只要肯学不怕苦&#xff01;可以看下“外链专员所需要的基本要求”。 要求&#xff1a; 1…

Nginx的使用(一)Nginx+IIS实现一个网站绑定多个https域名

使用nginx最初的目的是为了解决iis7下无法配置多个443端口的问题&#xff0c;iis7下不同的域名无法同时绑定443端口&#xff0c;据说iis8是可以的&#xff0c;但是iis8的话需要安装windows server2012&#xff0c;成本太高&#xff0c;不考虑。 Nginx是一款轻量级的Web 服务器/…

【经验分享】响应式网站项目实操过程中的那些事儿

本次网站改版升级是我来到新公司的第一个项目&#xff0c;需求之初并没有提及要做响应式&#xff0c;在首次评审时领导和研发均认为响应式处理与我们网站相对契合&#xff0c;就这样我开始了我职场生涯中第一个响应式网站设计。下面就跟大家分享响应式网站设计中的那些事儿。因…

当网站遭遇DDOS***的解决方案及展望

当网站遭遇DDOS***的解决方案及展望一、事件发生春节长假刚过完&#xff0c;WEB就出现故障&#xff0c;下午1点吃完回来&#xff0c;立即将桌面解锁并习惯性的检查了Web服务器。通过Web服务器性能监视软件图像显示的向下滑行的红色曲线看到WEB出现问题了。根据上述的问题&#…

一些颜色工具网站

原文地址&#xff1a;http://www.ruanyifeng.com/blog/2008/07/color_tools.html作者&#xff1a; 阮一峰 日期&#xff1a; 2008年7月23日 下面是一组颜色工具网站&#xff0c;非常有用。 理论部分&#xff0c;可以参考我前几天做的颜色理论笔记。 1. ColorSchemer Gallery 网…

为 Asp.net 网站新增发送手机短信功能

为 Asp.net 网站新增发送手机短信功能本文旨在帮助那些为网站发送手机短信正在寻求解决方案还未最终找到解决方案的朋友提供参考。 适合人群 须满足一下条件之一&#xff0c;如果以下3个条件您都不满足&#xff0c;为节约您宝贵的时间&#xff0c;请终止阅读本篇文章。 条件如下…

电脑技术吧_永磁技术装备事业部电脑端网站正式上线啦!!!

为适应沈阳研究院永磁技术装备事业部发展的需要&#xff0c;树立沈阳研究院永磁技术装备事业部的形象&#xff0c;满足客户通过网络了解沈阳研究院永磁技术装备事业部产品&#xff0c;给客户提供一个更好的在线服务,沈阳研究院永磁技术装备事业部全新电脑端网站于2020年3月20日…

apache的网站配置目录_网站后台getshell的方法总结

方法一&#xff1a;直接上传getshell以dedecms为例&#xff0c;后台可以直接上传脚本文件&#xff0c;从而getshell&#xff0c;具体方法如下&#xff1a;即可成功上传大马&#xff0c;并成功执行&#xff0c;从而拿下webshell。坑&#xff1a;通常由于权限限制&#xff0c;导致…

百度地图ip地址_柯桥区百度SEO优化是什么,关键词霸屏_万推霸屏

首页 > 新闻中心发布时间&#xff1a;2020-11-12 16:12:09 导读&#xff1a;万推霸屏为您提供柯桥区百度SEO优化是什么,关键词霸屏的相关知识与详情&#xff1a; 无论是企业网站的优化取决于网页或列页面&#xff0c;什么是列页面上的竞争力的关键字这两个词是指竞争力的关键…

Slog27_支配vue框架初阶项目之博客网站-样式居中

ArthurSlogSLog-27Year1GuangzhouChinaJuly 30th 2018GitHub掘金主页简书主页segmentfault没有写够足够的代码量&#xff0c;想成为高手是不可能的&#xff0c;只能纸上谈兵&#xff0c;但写够了代码量&#xff0c;纸上谈兵的也是大有人在 开发环境MacOS(High Sierra 10.13.5) …

刷新你三观!这些堪比软件的神网站你知多少

【PConline 应用】在很多人的固有印象当中&#xff0c;网站的作用无非就是让你看看文字看看图片看看视频&#xff0c;真正要干活&#xff0c;还是得依赖电脑上安装的软件。不过&#xff0c;很多朋友都不知道&#xff0c;实际上很多网站的功能之强大&#xff0c;完全不输本地安装…

seo优化源码_网站关键词SEO优化要点 - 蜘蛛池

最蜘蛛池&#xff0c;快速提高网站收录&#xff0c;百度蜘蛛池、搜狗蜘蛛池、360蜘蛛池、神马蜘蛛池、繁殖池、权重池&#xff0c;欢迎使用。许多企业认为&#xff0c;只要网站建设公司为我们完成网站&#xff0c; 就可以在互联网上建立品牌&#xff0c;最蜘蛛池小编整理发布。…

java 企业 网站源码 模版 屏幕自适应 有前后台 springmvc SSM 生成静态化

博文来源&#xff1a;http://www.fhadmin.org/webnewsdetail3.html前台&#xff1a; 支持五套模版&#xff0c; 可以在后台切换系统介绍&#xff1a;1.网站后台采用主流的 SSM 框架 jsp JSTL&#xff0c;网站后台采用freemaker静态化模版引擎生成html2.因为是生成的html&#x…

google搜索引擎优化指南_什么是SEO?如何优化Google等搜索引擎?

SEO&#xff08;搜索引擎优化&#xff09;是通过搜索引擎的自然搜索结果优化要发现的内容的实践。好处是显而易见的&#xff1a;即网站能获得源源不断的免费自然流量。但是&#xff0c;如何优化SEO的内容&#xff0c;以及“排名因素”实际上重要的是什么&#xff1f;要回答这个…

实时视频网站架构

原文地址&#xff1a;http://www.csdn.net/article/2012-12-10/2812183-JustinTV_real-time_architecture摘要&#xff1a;实时的定义应该是延迟小于250ms&#xff0c;按照这个标准&#xff0c;实时的成功应用立马成了凤毛麟角。本文详细阐述Justin.TV实时系统的技术细节&#…

说说大型高并发高负载网站的系统架构

【IT168 技术文档】 我在CERNET做过拨号接入平台的搭建&#xff0c;而后在Yahoo&3721从事过搜索引擎前端开发&#xff0c;又在MOP处理过大型社区猫扑大杂烩的架构升级等工作&#xff0c;同时自己接触和开发过不少大中型网站的模块&#xff0c;因此在大型网站应对高负载…

已在页面完全加载前强制排版_完全免费、审美过得去、国内访问快的自助建站(个人网站)傻瓜平台推荐...

起因&#xff1a;这周在准备简历的投递&#xff0c;后来觉得没有比有一个网站更容易让别人了解你了&#xff0c;苦于现在在老家&#xff0c;家里电脑较慢且没有一些设计软件&#xff0c;故我的想法就是快速傻瓜的搭建一个网站&#xff0c;且希望能真正完全免费。结果开始在知乎…

奥巴马筹款网站的制作过程

原文地址&#xff1a;http://www.csdn.net/article/2012-12-17/2812909-BarackObama摘要&#xff1a;在美国大选期间&#xff0c;奥巴马网站BarackObama.com创造了2.5亿美元的捐款&#xff0c;对于一个网站来说&#xff0c;它是如何做到的&#xff1f;奥巴马官网 1.Kyle Rush是…

域名解析到域名_网站域名解析图文教程详解

任务&#xff1a;进入域名解析控制面板&#xff0c;对域名进行解析操作域名解析一般在站点(空间)绑定域名之后&#xff0c;进行设置的比如宝塔站点绑定了这2个域名&#xff1a;xxx.com和www.xxx.com所以解析的时候就要解析这2个域名登录官网账号&#xff0c;点击域名管理(第一个…

【198期推荐】医院门户网站服务器选择问题应该三思而后行

本周头条&#xff1a; 请教高手&#xff1a;我院现要建设门户网站&#xff0c;想请教一下&#xff0c;是租用移动公司的服务器好&#xff08;本地移动公司承建网站建设&#xff09;&#xff0c;还是自己建设服务器好。&#xff08;我考虑的是自己建立服务器&#xff0c;为网站预…