[5-30微信墙]使用git管理nodejs+socket.io+redis+mongoose+mongodb+bootstarp+juicer+waterfall+nginx+ubuntu+aws ec2开发sogego.com网站
发布于 2年前 作者 sogego 10258 次浏览 最后一次编辑是 1年前

服务器:aws ec2 Ubuntu 12.04 (64位) web服务器:nginx1.3.5 缓存数据库:redis2.6.13 持久数据库:mongodb2.2.2 nodeJS: 0.10.7 框架:express 3.2.5 模板渲染:bootstrap+juicer + html5 + css3 + jquery 数据交互:websocket and ajax 前端展现:瀑布流

我们使用nodejs来开发一个搜索网站 示例:http://sogego.net 并使用git版本控制工具来管理位于vps上的网站,让我们抛弃ftp工具来上传文件的方式,一键commit到网站目录下。 我们在nodejs服务端render数据到前端,并用juicer来渲染,然后在瀑布流waterfall中使用socket.io来无限制加载数据,用redis做缓存数据库,mongodb做持久数据库。

技术交流加入QQ群:261654896

------------------------------------2013-05-25----------------------------- 新加 微信墙功能,努力完善中。。。。。。。。。。。。。 http://phoneqq.comhttp://phoneqq.net enter image description here =====================2013-05-23======================= 改用bootstrap前端设计,并加入微信公众平台, 欢迎大家使用微信关注,希望快快达到500人的关注。谢谢,请用微信:添加朋友-》扫一扫下面或关注 手机扣扣(微信公众账号:phoneqq ) enter image description here ====================================================

=====================2013-01-12======================= 新加新闻 enter image description here

------------------------------------------------2012-11-29------------------------------------------- 最新修改了约20%的代码,换成了mongodb数据库做持久存储,为了保持新闻与小说 搜索功能 仍然使用redis做缓存,也就是首页和search页查询的时候用的还是redis

-------------------------2012-09-09---------------------------- 说一下supervisor来管理 redis,当redis意外停止后,我们可以用它来自动重启 npm install supervisor 这个比较牛比 ----------------------------2012-10-09----------------------------------------- 添加了搜索引擎的支持,陆续加入google soso sogou bing等 aws ec2上面的instance type的切换,事实上free type的m1.micro也不是完全免费的 因为还有ebs的费用和data tranfer的费用

如果你的m1.micro不够用了,或是不能支持你的网站,ebs太小了,cpu太慢了,内存太小了 尤其是使用redis内存型database,600多M的是不够用的。所以选择m1.medium这个heavy型的 只在白天的时候change为m1.medium到了晚上没有人访问了,就停止对新闻的搜索,change回free的type,

操作方法是:先把你的instance stop,选中点右键,等一会,再右键行选change instance type ,选择m1.medium,这个在东京要每小时$0.184,我可以在白天使用10个多小时 ,大约$2元 change完成后再右键 start,并且一定要把 Elastic IP这一项重新选择一下,要不然无法连接

最近又使用了aws ec2的IAM(Identify and Access Management),download一个google 两步验证的app到android的手机上,当然你的手机最好安装一个二维码扫描如:quicksmark,发现lenovo的 s880不能安装,真垃圾啊联想。这样再登录aws ec2时,再输入完email和密码后,要求你再输入一下六位的数字,这样加密,保证别人不会登录你的账户,如果非要买那个key就没有必要了。

=====================2012-10-24======================== 新加小说搜索功能 enter image description here =========================================================

=====================2012-11-08========================

添加网站的免费CDN,加快了网站的访问 1,把域名放在godaddy上,dns使用国内免费的dnspod,这样可以加快域名解析 2,服务器放在tokyo 3,使用加速乐,jiasule.com 建立服务器IP的cname,比如是:*****.cdn.jiasule.com 4,在dnspod中删除A记录,并添加cname,其指向到上面的CDN 5,切记开发期间,每次commit新代码一定要去jiasule上刷新一下各节点的缓存

=============================================

说一下域名的事,www.west263.com这个域名注册商真是垃圾,域名过户还要收30元,国外注册商直接push了之后,域名信息就改变了。垃圾的国内注册商。

新加了几个关于搜个够的域名方便大家访问: http://happy369.com 星空网 http://sogego.com http://sogego.net http://sogegou.com http://sogegou.net http://sougego.com http://sougego.net http://sougegou.com http://sougegou.net

一、先讲位于日本东京的服务器aws ec2 使用aws ec2,都说位于美国西海岸的ping值低,事实上比较一下美国西海岸、新加坡、日本到中国的距离就知道了,新加坡网络节点还要绕到意大利再回中国,这个地方的VPS根本没法用,慢的要死,事实上速度最快的要数位于日本东京的ec2机房了,建议大家使用这个,其ping值在上海或是宁波、深圳的地方可以低于80ms,而美国西海岸的ping值都大于250ms,日本东京要快得多。

这和你是不是国人,爱不爱国没有关系,因为在上海到日本有一条海底光缆。

先启动一个Instance,我们使用Ubuntu 12.04 aws ec2默认不让ping。你只需要点左侧Security Groups,再点右侧Inbound的All ICMP 确定就可以ping通了 最后说一下Bitvise SSH ,它比Putty可强大多了,而且还带有sftp功能。你不得不用。

二、VPS Ubuntu 的配置 安装一些常用的比如 g++ make git libssl等

最主要的是在这里配置好git服务器,并同时让git server 自动同步到网站目录下,也就是说,比如我在本地机器win7上 commit了代码到了git server,那么访问http://sogego.com它就是最新修改过的,而且是带有版本号的,这样方便以后出现错误做回滚操作,不使用ftp工具,而是使用aws的 pubkey ,用ssh的方式做commit操作,当然也可以使用sftp。

安装Nginx来做负载均衡,让它指向nodejs的地址 比如:http://sogego.net

安装redis来做缓存数据库,以后再详细说明在nodejs中使用redis的操作。

三、程序开发 推荐webstorm开发工具,带有git和nodejs的语法支持,如果你非要用Notepad++,我个人只能说你是个二。

我们在nodejs中使用最新的express 3框架,它与express 2有了一些改变

我们不使用jade这个模板,原因是什么,自己去想吧,个人觉得与html相距太大,不习惯, 而是使用juicer,它是一个极限渲染模板,其写法与速度你自己试了就不会再用其它的 我已和juicer的作者沟通多次解决bug和添加功能,目前版本号是0.6.3.使用完全没有问题

我们安装一个npm install jquery来分析抓取到的网页数据

我们还要安装一个npm install iconv-lite它比iconv要快一些,用来解决非utf8编码,大多的国内网站还在使用gb2312的编码。

我们再来安装一个npm install forever来永久启动你的nodejs程序,它的操作基本是forever start 你的nodejs文件名
forever stop 你的nodejs文件名 forever list

为了开方的方便还来一个npm install node-dev,使用方法node-dev 你的nodejs文件名 这样当我们改变了nodejs,就不用手动重启,尤其是配合webstorm一起使用,因为webstorm不需要按crtl+s来保存,而是它自己即时保存,这样你的程序就会时实重启。

我们在后台使用了redis那就再安装一个npm install redis来连接redis数据库

我们还要使用websocket协议,同时也使用ajax请求。所以再来一个npm install socket.io

2012-11-29今天又加入了mongodb,所以再来一个 npm insall mongoose

最后注意当我们使用nodejs 的Crypto模块时用到了base64,注意base64的 + 问题转为空格

=========在此给出加解密function大家可以直接使用============== 使用方法: var tools = require(‘…/tools’); var sogego_cipher = tools.crypto().cipher(‘你要加密的数据’); var sogego_decipher = tools.crypto().decipher(‘你要解密的数据’);

//加密与解密方法,把下面的function保存在tools.js中,在其它的.js文件中使用上面的方法调用 exports.crypto = function(){ var algorithm = "aes-256-ecb"; var password = "http://sogego.com"; //加密的密匙 var iv = "http://sogego.net"; //对密匙进行加密 实现双保险 var cipher, ciphered, decipher, deciphered; return { cipher: function(data){ // console.log('data = ',data); cipher = crypto.createCipher(algorithm, password,iv); ciphered = cipher.update(data, "utf8", “base64”); ciphered += cipher.final(“base64”); // console.log('加密 = ',ciphered); return ciphered; }, decipher: function(data){ // console.log('data = ',data); decipher = crypto.createDecipher(algorithm, password,iv); deciphered = decipher.update(data, "base64", “utf8”); deciphered += decipher.final(“utf8”); // console.log('解密 = ',deciphered); return deciphered; } }

}

107 回复

怎么没有人回复呢。大家这样的架构与开发,有什么好的建议呢

加入:图片的延迟加载功能 使用的是imgLzayLoading 同时整合到 waterfall中

安装supervisor 自动重启redis 时要用 sudo unlink /var/run/…lock

添加新域名到nginx

加入了IE与webkit分别使用ajax和websockte数据交互的功能。

网站里好多的广告。。

感觉怎么像个垃圾站?

update了 ec2的 m1-medium instances 速度过了不少

无所谓广告不广告,楼主分享自己的实战经验把线上产品放出来无可厚非吧~ 个人感觉应该很多干货,再细点的粒度一块一块分享出来就更好了~ 赞个

速度好慢,先收藏了。

牛x…先收了再说.

感觉UI好乱,还是简单为好!

不错,源码共享吗?

thanks for everybody foucs me

为什么要用nginx来做负载均衡,这的原理我不懂?求教

supervisor 是管理 redis 用的吗?

imgLzayLoading 是什么东西啊,怎么搜不到?

Bitvise SSH 貌似只能在Windows平台啊?

目前正在内测,稍后推出

比如 说,你的image或是css或是js文件 以前要用http://sogego.com/css或是image或js来访问 如果使用nginx可以用 /www/sogego.com来访问,减轻http server的压力

再有就是负载的使用,可以转到其它IP或是域名下来访问,以减轻主服务器的压力

supervisor可以自动重启redis

就好比用forever来自动重启 nodejs一样

是一个当滚动条滚动时,才加载图片,如果不滚动就不加载,试想如果一个page中包括了10屏,我们不能一次把所有的图片连接都显示出来,最好的办法就是滚动一点加载一点,事实上这个我试过了,在waterfall中并不好用。

我在win7上使用bitvise用 public key 来连接aws ec2 没有在linux上试过

@sogego 大概了解了,谢谢^.^

@sogego 请问服务器集群也是这个道理吗?我对服务器集群的概念不是很懂。

@yjj676 这个我也没有用过

啵错,ui再简单点

这个整体架构和我想的差不多,不过比我想的更完善,牛掰,其他……

我觉得如果做完之后,可以写一篇连续的文章来详细介绍……

@sogego

usage: ssh [-1246AaCfgkMNnqsTtVvXxY] [-b bind_address] [-c cipher_spec]
           [-D [bind_address:]port] [-e escape_char] [-F configfile]
           [-i identity_file] [-L [bind_address:]port:host:hostport]
           [-l login_name] [-m mac_spec] [-O ctl_cmd] [-o option] [-p port]
           [-R [bind_address:]port:host:hostport] [-S ctl_path]
           [-w local_tun[:remote_tun]] [user@]hostname [command]

应该是加个-i参数来指定public key吧:ssh -i public_key文件

首页的UI可以稍微修饰一下吧 然后整体感觉还挺好 就是速度上稍微有一点点慢 顶~

目前想了几个目录 比如说:aws ec2上的instance使用, ec2 ebs使用 ec2 各类instance区别

程序部分,以后主要讲一下如何用把nodejs .socket.io redis juicer waterfall结合到一起。估计这个得写出好几章来

目前正在使用ec2上的m1.small instance 这是对网站的测试期,稳定后,会看看到底是哪种的instance适合。

你指的是网站的首页。还是新闻waterfall的那页?

@sogego 首页 就是今日最新和本周关注那个 看着让人会感觉到有点烦 个人感觉而已哈

非常好的架构构想,在摸索中前行吧。

真jb倒霉,被百度K站了,大家有什么好办法恢复。

希望楼主分享能在细一点 让人更加的了解

新加小说搜索功能

UI确实不咋滴

哥,我看你的小说是爬自红袖的,请问抓来的小说文字是放到自己的数据库吗?这样的话,版权什么的问题有吗?我很感兴趣 ^-^

@yjj676 是的,何谓版权,我认为凡是在互联网上的数据,就是共享的,兄弟们,干吧,国外的空间,关它个叼事。

@sogego 哈哈,顶你!挺牛逼的。

终于换上了aws ec2的 东京的 m1.medium 两个ecu处理器,4G内存。吼吼。

sogego.com 另外一个域名 : http://happy369.com 使用了 jiasule.com的免费CDN加速,网站快了不少,在此也推荐其它站长使用,前提是你的域名是有备案号。

jiasule目前不算稳定,但速度够快

学习了,界面在美化一下就更好了

又一构思, 把搜索的功能 用redis来存,并且cache一会儿 新闻和小说还有其它的data 放到mongodb里,目前小说的已经测试完成,搞到ec2上再试试

什么时候能达到楼主这个程度,嘿嘿

你是用 jquery 来处理抓取来的数据吧? 太帅了。

@yjj676 最近又加了zongheng的 吼吼。

是的。其实也就是jsdom

干活比较多, mark下

新增mongodb持久数据库来保存新闻与小说 首页与搜索功能仍然使用redis来缓存

完善了search功能

先收藏了,只是不喜欢前台的UI,其余的倒是喜欢

恩。界面丑了点。

网站出问题了?

更新部分UI

新加图片新闻

新加图片,整合功能

mark,回头看

mark,回头看

首页的index.js写的不好,鼠标多动动就看出来了,建议使用mouseenter,mouseleave

呵呵,收藏了,感觉除了UI,其他功能蛮好的!!!主要还是技术NB

1、探索精神值得称赞,平台技术可以,都是主流的。AWS我也是用东京的; 2、楼主写东西没有条理,建议写成系列文章,每次把一个方面说清楚; 3、你介绍的网站的到底有什么用?除了爬虫搜索、耸人听闻的花边新闻、美女图还有啥?界面美丑就不说了,你用这个玩意建这个站点目的是什么?做的玩儿? 4、标题起的很撮,你这个网站用到git做源代码管理,为啥还罗列那么一大筐用到的库和工具放在标题里面?看着这样的标题就不想看。进来只是吐槽的,没想到你是做的技术分享。

建议楼主把握重点,技术不是纯粹的堆砌就强大。练手不反对。

5、一个月70多美刀的aws费用,不贵但也不便宜,我在想楼主靠啥子盈利; 6、用jsdom/jquery做网页采集的技术细节,期待分享的更详细。jsdom的文档看着XXXX。

网站的目的就是爬各大网站的新闻,新浪,163,21cn,67.com,ifeng.com,yahoo,QQ,eastday.com,cri.com等, 还有hongxiu,zongheng,的小说,是为了让看新闻的朋友以瀑布流的方式,冲击视觉体验,这里有时实的,最新,最全的,容易阅读。

用git管理是为了不用ftp上传,直接用git做commit到网站目录下

罗列的库和工具是为了,让有此一样开发的朋友看到,我是用什么技术开做的

这是一个总结的过程,和每做一个大的更新都上来说明一下,每一个方面说出来都要好几个topic才能说完,这算是一个目录形式的

平时公司的项目不可能会用到这么多,所以把自己认为不错的技术或是框架拿出来实践, 提高一下自己的技术水平

目前网站是以新闻和小说,美图来充载的,网站的最终目的是要做成一个搜索, 对各个搜索出来的结果进行统计和分析,因为baidu,soso,sogo,google,youdao,so.com它们只是把用户的关键词搜索出来,并没有进行分析和统计

网上的标题起为:sogego 搜个够,就是想让用户输入关键词后,得到他想要的数据,而不是像各个搜索网站一下,列表出来,让用户一页页的点,一条条的点,点到自己想要的,就收藏起来,这不是用户想要的,用户想要的是分析,比如某一个词,用户最想知道的是在哪个网站出现过,每个网站有多少条在描述它的搜索词,这是最终目的,当前上线的部分只是为了让用户先留在这个网站,看看新闻或是小说

网站不赢利,每个月信用卡会划走50刀左右,这是一个个人创业的起步,赢利是以后的事。 目前我正在想写一个目录的每一个详细项,但工作也忙,没有时间啊,目前正在构思,前面的回复中也提到了

一个人的时间有限,我得在工作下班之后,孩子睡了,晚上11点开始搞一点,搞到1点,每天就这么点时间,还有公司的项目目前正在搞 appcelerator titanium studio, alloy框架开发跨平台的手机端,这个在 搜个够 来说,以后也会推出,都是新技术,都得学啊,

期待共同分享。

收了,感谢分享!

@sogego 关于 http://www.appcelerator.com/ ,我一个朋友,外行程序员,用这个工具也做了一个跨平台的手机微博应用。js现在是锤子,什么都可以锤两下。

@sogego 看来你很辛苦。有了宝宝更辛苦。

@anuxs 都是一群,苦逼的屌丝

请问nginx配置静态文件后,nodejs反而不能访问css,js文件了,这种问题该怎么写nginx配置文件呢,求教 @sogego

@sogego 楼主你的网站是跑在vps上的,上面跑了好些服务,这需要多大的内存啊

被百度k站是啥意思?

楼主是重庆人?

楼主加油哈,看起来很不错~!

学习了,其实我一直在想,现在的时代创业哪种更有竞争力。是产品还是服务。

打算用上bootstrap

加入微信公众平台。欢迎大家使用微信关注,希望快快达到500人的关注。谢谢

感觉有点慢, 没风格, 不过能搭建起来很不错, 值得顶

新加 微信墙功能,努力完善中。。。。。。。。。。。。。 http://sogego.net/weixinwall

我靠。。功能好屌。。用的soketio吧?微信公众账号好申请吗??

聊天室功能搞定

其实我对waterfall的理解是最好不要超过4列 三列的视觉效果最好 我以前有看到有人在cloudfoundry的比赛中 做了个八卦街 http://baguajie.cloudfoundry.com 也是像你这样弄得 不过那个主要是图片 还比较容易接受 你这种文字的 就没什么阅读欲了 不过楼主已经算是很强大了

楼主,严重辛苦了。 推荐你CHEERIO,更换JSDOM或者JQuery把,速度8X提升(作者的说法)。

为啥里面没有人啊???

真牛逼。关注下微信

楼主,请教一下,有没有办法将express的默认模板引擎从jade改成juicer? 文档里没提这个

var fs = require(‘fs’), juicer = require(‘juicer’); juicer.set('strip’,false); juicer.register('JSON’, JSON);

app.engine('html’, function(path, options, fn){ fs.readFile(path, 'utf8’, function(err, str){ if (err) return fn(err); str = juicer(str, options); fn(null, str); }); }); app.set('view engine’, ‘html’); app.set('view options’, {layout: false});

开始搞易信啦

楼主很牛B ,膜拜中。

有两个问题请教一下。系统是怎么架构的, redis作为缓存数据库,mongoDB作为持久数据库这是怎么做的? 数据先存redsi,让后定时刷新到mongodb吗?

还有一个问题是 nginx和nodeJs是怎么配合的。

您好,我想请问一下,怎么把mongodb中的数据同步到redis中,跪谢啊

回到顶部