文章列表
 
您正在查看 "server 开发" 分类下的文章

2010年02月26日 18:52

作为一个软件开发者,你一定会对网络应用如何工作有一个完整的层次化的认知,同样这里也包括这些应用所用到的技术:像浏览器,HTTP,HTML,网络服务器,需求处理等等。

本文将更深入的研究当你输入一个网址的时候,后台到底发生了一件件什么样的事~

1. 首先嘛,你得在浏览器里输入要网址:

image

2. 浏览器查找域名的IP地址

image

导航的第一步是通过访问的域名找出其IP地址。DNS查找过程如下:

  • 浏览器缓存 – 浏览器会缓存DNS记录一段时间。 有趣的是,操作系统没有告诉浏览器储存DNS记录的时间,这样不同浏览器会储存个自固定的一个时间(2分钟到30分钟不等)。
  • 系统缓存 – 如果在浏览器缓存里没有找到需要的记录,浏览器会做一个系统调用(windows里是gethostbyname)。这样便可获得系统缓存中的记录。
  • 路由器缓存 – 接着,前面的查询请求发向路由器,它一般会有自己的DNS缓存。
  • ISP DNS 缓存 – 接下来要check的就是ISP缓存DNS的服务器。在这一般都能找到相应的缓存记录。
  • 递归搜索 – 你的ISP的DNS服务器从跟域名服务器开始进行递归搜索,从.com顶级域名服务器到Facebook的域名服务器。一般DNS服务器的缓存中会有.com域名服务器中的域名,所以到顶级服务器的匹配过程不是那么必要了。

DNS递归查找如下图所示:

500px-An_example_of_theoretical_DNS_recursion_svg



DNS有一点令人担忧,这就是像wikipedia.org 或者 facebook.com这样的整个域名看上去只是对应一个单独的IP地址。还好,有几种方法可以消除这个瓶颈:

  • 循环 DNS 是DNS查找时返回多个IP时的解决方案。举例来说,Facebook.com实际上就对应了四个IP地址。
  • 负载平衡器 是以一个特定IP地址进行侦听并将网络请求转发到集群服务器上的硬件设备。 一些大型的站点一般都会使用这种昂贵的高性能负载平衡器。
  • 地理 DNS 根据用户所处的地理位置,通过把域名映射到多个不同的IP地址提高可扩展性。这样不同的服务器不能够更新同步状态,但映射静态内容的话非常好。
  • Anycast 是一个IP地址映射多个物理主机的路由技术。 美中不足,Anycast与TCP协议适应的不是很好,所以很少应用在那些方案中。

大多数DNS服务器使用Anycast来获得高效低延迟的DNS查找。

3. 浏览器给web服务器发送一个HTTP请求

image

因为像Facebook主页这样的动态页面,打开后在浏览器缓存中很快甚至马上就会过期,毫无疑问他们不能从中读取。

所以,浏览器将把一下请求发送到Facebook所在的服务器:

GET http://facebook.com/ HTTP/1.1
Accept: application/x-ms-application, image/jpeg, application/xaml+xml, [...]
User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; [...]
Accept-Encoding: gzip, deflate
Connection: Keep-Alive
Host: facebook.com
Cookie: datr=1265876274-[...]; locale=en_US; lsd=WW[...]; c_user=2101[...]

GET 这个请求定义了要读取的URL: “http://facebook.com/”。 浏览器自身定义 (User-Agent 头), 和它希望接受什么类型的相应 (Accept and Accept-Encoding 头). Connection头要求服务器为了后边的请求不要关闭TCP连接。

请求中也包含浏览器存储的该域名的cookies。可能你已经知道,在不同页面请求当中,cookies是与跟踪一个网站状态相匹配的键值。这样cookies会存储登录用户名,服务器分配的密码和一些用户设置等。Cookies会以文本文档形式存储在客户机里,每次请求时发送给服务器。

用来看原始HTTP请求及其相应的工具很多。作者比较喜欢使用fiddler,当然也有像FireBug这样其他的工具。这些软件在网站优化时会帮上很大忙。

除了获取请求,还有一种是发送请求,它常在提交表单用到。发送请求通过URL传递其参数(e.g.: http://robozzle.com/puzzle.aspx?id=85)。发送请求在请求正文头之后发送其参数。

像 “http://facebook.com/”中的斜杠是至关重要的。这种情况下,浏览器能安全的添加斜杠。而像“http://example.com /folderOrFile”这样的地址,因为浏览器不清楚folderOrFile到底是文件夹还是文件,所以不能自动添加斜杠。这时,浏览器就不加斜 杠直接访问地址,服务器会响应一个重定向,结果造成一次不必要的握手。

4. facebook服务的永久重定向响应

image

图中所示为Facebook服务器发回给浏览器的响应:

HTTP/1.1 301 Moved Permanently
Cache-Control: private, no-store, no-cache, must-revalidate, post-check=0,
pre-check=0
Expires: Sat, 01 Jan 2000 00:00:00 GMT
Location: http://www.facebook.com/
P3P: CP="DSP LAW"
Pragma: no-cache
Set-Cookie: made_write_conn=deleted; expires=Thu, 12-Feb-2009 05:09:50 GMT;
path=/; domain=.facebook.com; httponly
Content-Type: text/html; charset=utf-8
X-Cnection: close
Date: Fri, 12 Feb 2010 05:09:51 GMT
Content-Length: 0

服务器给浏览器响应一个301永久重定向响应,这样浏览器就会访问“http://www.facebook.com/” 而非“http://facebook.com/”。

为什么服务器一定要重定向而不是直接发会用户想看的网页内容呢?这个问题有好多有意思的答案。

其中一个原因跟搜索引擎排名有关。你看,如果一个页面有两个地址,就像 http://www.igoro.com/ 和http://igoro.com/,搜索引擎会认为它们是两个网站,结果造成每一个的搜索链接都减少从而降低排名。而搜索引擎知道301永久重定向是 什么意思,这样就会把访问带www的和不带www的地址归到同一个网站排名下。

还有一个是用不同的地址会造成缓存友好性变差。当一个页面有好几个名字时,它可能会在缓存里出现好几次。

5. 浏览器跟踪重定向地址

image

现在,浏览器知道了“http://www.facebook.com/”才是要访问的正确地址,所以它会发送另一个获取请求:

GET http://www.facebook.com/ HTTP/1.1
Accept: application/x-ms-application, image/jpeg, application/xaml+xml, [...]
Accept-Language: en-US
User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; [...]
Accept-Encoding: gzip, deflate
Connection: Keep-Alive
Cookie: lsd=XW[...]; c_user=21[...]; x-referer=[...]
Host: www.facebook.com

头信息以之前请求中的意义相同。

6. 服务器“处理”请求

image

服务器接收到获取请求,然后处理并返回一个响应。

这表面上看起来是一个顺向的任务,但其实这中间发生了很多有意思的东西- 就像作者博客这样简单的网站,何况像facebook那样访问量大的网站呢!

  • Web 服务器软件
    web服务器软件(像IIS和阿帕奇)接收到HTTP请求,然后确定执行什么请求处理来处理它。请求处理就是一个能够读懂请求并且能生成HTML来进行响应的程序(像ASP.NET,PHP,RUBY...)。

    举个最简单的例子,需求处理可以以映射网站地址结构的文件层次存储。像http://example.com/folder1 /page1.aspx这个地址会映射/httpdocs/folder1/page1.aspx这个文件。web服务器软件可以设置成为地址人工的对应 请求处理,这样page1.aspx的发布地址就可以是http://example.com/folder1/page1。

  • 请求处理
    请求处理阅读请求及它的参数和cookies。它会读取也可能更新一些数据,并讲数据存储在服务器上。然后,需求处理会生成一个HTML响应。

所有动态网站都面临一个有意思的难点 -如何存储数据。小网站一半都会有一个SQL数据库来存储数据,存储大量数据和/或访问量大的网站不得不找一些办法把数据库分配到多台机器上。解决方案 有:sharding (基于主键值讲数据表分散到多个数据库中),复制,利用弱语义一致性的简化数据库。

委托工作给批处理是一个廉价保持数据更新的技术。举例来讲,Fackbook得及时更新新闻feed,但数据支持下的“你可能认识的人”功 能只需要每晚更新(作者猜测是这样的,改功能如何完善不得而知)。批处理作业更新会导致一些不太重要的数据陈旧,但能使数据更新耕作更快更简洁。

7. 服务器发回一个HTML响应

image

图中为服务器生成并返回的响应:

HTTP/1.1 200 OK
Cache-Control: private, no-store, no-cache, must-revalidate, post-check=0,
pre-check=0
Expires: Sat, 01 Jan 2000 00:00:00 GMT
P3P: CP="DSP LAW"
Pragma: no-cache
Content-Encoding: gzip
Content-Type: text/html; charset=utf-8
X-Cnection: close
Transfer-Encoding: chunked
Date: Fri, 12 Feb 2010 09:05:55 GMT

2b3��������T�n�@����[...]

整个响应大小为35kB,其中大部分在整理后以blob类型传输。

内容编码头告诉浏览器整个响应体用gzip算法进行压缩。解压blob块后,你可以看到如下期望的HTML:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"    
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"
lang="en" id="facebook" class=" no_js">
<head>
<meta http-equiv="Content-type" content="text/html; charset=utf-8" />
<meta http-equiv="Content-language" content="en" />
...

关于压缩,头信息说明了是否缓存这个页面,如果缓存的话如何去做,有什么cookies要去设置(前面这个响应里没有这点)和隐私信息等等。

请注意报头中把Content-type设置为“text/html”。报头让浏览器将该响应内容以HTML形式呈现,而不是以文件形式下载它。浏览器会根据报头信息决定如何解释该响应,不过同时也会考虑像URL扩展内容等其他因素。

8. 浏览器开始显示HTML

在浏览器没有完整接受全部HTML文档时,它就已经开始显示这个页面了:

image

9. 浏览器发送获取嵌入在HTML中的对象

image

在浏览器显示HTML时,它会注意到需要获取其他地址内容的标签。这时,浏览器会发送一个获取请求来重新获得这些文件。

下面是几个我们访问facebook.com时需要重获取的几个URL:

  • 图片
    http://static.ak.fbcdn.net/rsrc.php/z12E0/hash/8q2anwu7.gif
    http://static.ak.fbcdn.net/rsrc.php/zBS5C/hash/7hwy7at6.gif
  • CSS 式样表
    http://static.ak.fbcdn.net/rsrc.php/z448Z/hash/2plh8s4n.css
    http://static.ak.fbcdn.net/rsrc.php/zANE1/hash/cvtutcee.css
  • JavaScript 文件
    http://static.ak.fbcdn.net/rsrc.php/zEMOA/hash/c8yzb6ub.js
    http://static.ak.fbcdn.net/rsrc.php/z6R9L/hash/cq2lgbs8.js

这些地址都要经历一个和HTML读取类似的过程。所以浏览器会在DNS中查找这些域名,发送请求,重定向等等..

但不像动态页面那样,静态文件会允许浏览器对其进行缓存。有的文件可能会不需要与服务器通讯,而从缓存中直接读取。服务器的响应中包含了静 态文件保存的期限信息,所以浏览器知道要把它们缓存多长时间。还有,每个响应都可能包含像版本号一样工作的ETag头(被请求变量的实体值),如果浏览器 观察到文件的版本ETag信息已经存在,就马上停止这个文件的传输。

试着猜猜看“fbcdn.net”在地址中代表什么?聪明的答案是"Facebook内容分发网络"。Facebook利用内容分发网络(CDN)分发像图片,CSS表和JavaScript文件这些静态文件。所以,这些文件会在全球很多CDN的数据中心中留下备份。

静态内容往往代表站点的带宽大小,也能通过CDN轻松的复制。通常网站会使用第三方的CDN。例如,Facebook的静态文件由最大的CDN提供商Akamai来托管。

举例来讲,当你试着ping static.ak.fbcdn.net的时候,可能会从某个akamai.net服务器上获得响应。有意思的是,当你同样再ping一次的时候,响应的服务器可能就不一样,这说明幕后的负载平衡开始起作用了。

10. 浏览器发送异步(AJAX)请求

image

在Web 2.0伟大精神的指引下,页面显示完成后客户端仍与服务器端保持着联系。

以Facebook聊天功能为例,它会持续与服务器保持联系来及时更新你那些亮亮灰灰的好友状态。为了更新这些头像亮着的好友状态,在浏览 器中执行的JavaScript代码会给服务器发送异步请求。这个异步请求发送给特定的地址,它是一个按照程式构造的获取或发送请求。还是在 Facebook这个例子中,客户端发送给http://www.facebook.com/ajax/chat/buddy_list.php一个发布 请求来获取你好友里哪个在线的状态信息

提起这个模式,就必须要讲讲"AJAX"-- “异步JavaScript 和 XML”,虽然服务器为什么用XML格式来进行响应也没有个一清二白的原因。再举个例子吧,对于异步请求,Facebook会返回一些JavaScript的代码片段。

除了其他,fiddler这个工具能够让你看到浏览器发送的异步请求。事实上,你不仅可以被动的做为这些请求的看客,还能主动出击修改和重新发送它们。AJAX请求这么容易被蒙,可着实让那些计分的在线游戏开发者们郁闷的了。(当然,可别那样骗人家~)

Facebook聊天功能提供了关于AJAX一个有意思的问题案例:把数据从服务器端推送到客户端。因为HTTP是一个请求-响应协议,所以聊天服务器不能把新消息发给客户。取而代之的是客户端不得不隔几秒就轮询下服务器端看自己有没有新消息。

这些情况发生时长轮询是个减轻服务器负载挺有趣的技术。如果当被轮询时服务器没有新消息,它就不理这个客户端。而当尚未超时的情况下收到了该客户的新消息,服务器就会找到未完成的请求,把新消息做为响应返回给客户端。

总结一下

希望看了本文,你能明白不同的网络模块是如何协同工作的

 
2009年11月22日 21:06

在VERYCD上找到了点好东西,才想起还没有装驴子。看论坛上mldonkey呼声很高,大有盖过amule的势头,忍不住也装了个。

search了一下源,有mldonkey-server和mldonkey-gui,前端和后端是分开的。不用GUI也可以在后台运行,很方便。有个界面还是直观点,于是也装上了。

sudo apt-get install mldonkey-server mldonkey-gui

装完后启动了GUI,还真是简单得可怜,一些高级配置还是需要去改配置文件,不好用。换个GUI去,Google一下,找到sancho

http://sancho.awardspace.com/

默认下载目录还是只能在配置文件里改:gedit downloads.ini

  {     dirname = "incoming/files"
strategy = incoming_files
priority = 0
};
{     dirname = "incoming/directories"
strategy = incoming_directories
priority = 0
};

默认的下载目录是 ~/.mldonkey/incoming

下载安装运行,很不错,有了这个,基本不用命令行和修改配置文件了。换成中文界面,优化了下网络参数,作了个ED2K-port的端口映射。重启,HighID~~~

据说这个驴子速度超快。期待,晚上回来再使唤它干活~~

 
2009年11月22日 21:04
主页: http://mldonkey.sourceforge.net/Main_Page
图形界面sancho主页: http://sancho-gui.sourceforge.net/

优点:实在太强大了,支持各种下载协议,包括ed2k、bittorrent、http、ftp……,而且在继续扩充。
我主要说一下ed2k功能,它有一个最最奇特的地方就是,可以同时连接任意多个emule服务器,而不像其他我所用过的emule-mod那样只 能连一个。因此,其速度可以快好几倍(可以很容易的达到带宽上限哦,是我所用过的最快的电驴)。另外,他还有众多图形界面(其本身只是一个命令行的东 西),可以用浏览器控制(推荐),甚至telnet。而sancho是所有图形界面中最优秀的一个(基于java,功能最复杂,你一定有眩晕的感觉)。

缺点:那就是设置有些复杂,而且都是英文的,但有一个比较好的设计就是,把鼠标移到每个选项上会有英文提示。

安装:
1. sancho:
图形界面sancho地址:
http://sancho-gui.sourceforge.net/files ... tk-java.sh
这个是需要系统安装java的,推荐,速度快。如果你不装java,那么请下载另外一个自带java的版本。
下载的sancho是一个脚本,请不要用编辑器打开!先右键单击他,找到属性-权限部分,钩上“可执行”,然后双击他并选择用终端运行。

2. mldonkey:
代码:
sudo apt-get install mldonkey-server

然后运行sancho文件夹下的sancho(鼠标双击选择运行或者命令行下./sancho),刚开始会有配置向导,照做即可。其实在 sancho里面可以设置mlnet的运行路径,在首选项->sancho:主要->可选的可执行core 那里填上你的mlnet路径。这样以后就可以直接启动sancho了,不必分两步进行。

在适当设置过之后,所有的server都可以是high id,我这里是通过端口设置实现的(adsl路由上网)。如果你有windows下的emule,最好把他们的端口(tcp的)设成一样。有些路由器有记忆功能,导致windows下的端口在重启后仍然保留。

设置:这里以网页界面为例。
1. 注意,这些选项并非都在同一个页面,请自己找。
ED2K-force_client_high_id:true。
ED2K-max_connected_servers:50(这个随便了,虽然最后只会稳定在几个而已)。
ED2K-port:不一定非要设置,但有些路由器需要端口映射,那么就需要修改这个了。
client_name:也许你想设置成[CHN][VeryCD]xxx之类的,虽然我从没觉得有用过。
max_hard_download_rate:按你的带宽修改,单位是KB/s。
max_hard_upload_rate:20应该够了吧。
max_indirect_connections:这个范围是30-70,如果你想要更多的连接,可以修改高一点。
max_opened_connections:这个最大可以到924,理由同上。
temp_directory:放临时文件的地方,比如/media/disk/downloads/temp。下面的方法也可以改。

修改下载路径:如果你需要修改下载目录和temp目录的话,修改~/.mldonkey/downloads.ini,找到“section: path”,然后修改成如:
引用:
{ dirname = "/media/disk/downloads"
strategy = incoming_files
priority = 0
};
请改成你要的下载路径。

修改downloads.ini:找到web_infos,把server.met换成你要的,比如 http://www.emule.org.cn/server.met,删除 guarding.p2p", 96, "http://www.bluetack.co.uk/config/level1.gz,这个东西会封掉很多有用的尤其是国内的server。

2. 安装firefox扩展,以关联ed2k、bt等(见附件)。解压后的mldoneky-distrib-xxx/ed2k_mozilla/文件夹下有 个mldonkey_protocol_handler-xx.xpi,把它拖到fx窗口选择安装。重启后就可以双击MLdonkey Protocal Handler这个扩展设置关联了,顺便说一下,这个扩展也可以关联到amule等。

具体使用方法(像如何导入emule下载的文件等)还请参见他们的主页文档(英文),自己瞎摸索当然也是可以的。 :D

p.s. 你也可以用浏览器管理mldonkey,地址是 http://localhost:4080/
其实我现在比较推崇用这个,不占额外资源(不必一直开着客户端,毕竟java的东西会占不少内存和cpu),设置一样方便甚至更强——前提是你懂基本英文,不懂的可以查stardict。

如果想用中文界面的sancho,我汉化了一个(如果是最近从官方下载的sancho,那么就已经包含了我的汉化文件),请参见: http://forum.ubuntu.org.cn/viewtopic.php?t=46105
 
2009年10月21日 20:01
图片服务通常数据容量较大,而且访问也频繁,鉴于此,图片服务就会有两种问题,一是存储问题,二是访问量问题。

存储问题就是硬盘容量问题,花钱买硬盘就可以了,看似简单,但着实也是最苦的问题。按目前探索来看,最好的方式是:在任何时刻遇到硬盘空间不够 时,买颗硬盘插上,最多改改配置,就能立刻利用;另外,硬盘要能充分利用,不然图片存储量大再加上备份,很恐怖,最好是每颗硬盘都用上100%的空间。

访问量也是个大问题,如果服务不允许防盗链,那么访问量会引起带宽、服务器压力等问题,有钱的话直接扔CDN,没钱或者有更多的钱,就自己做吧。 根据垣古不变的真理“越老的图,访问量也相对较少”这一点,分成两大部分,一边处理最新的图片,一边处理老旧的图片。最新的图片访问量大,但存储量较少; 老图片访问量低,但存储量大。
大概分析完了,开始制定方案。

一、拟定一个存储目录规则:
在现有的/a/b/abcde.jpg这样的hash方式下多加一个日期的目录变成:/200810/16/a/b/abcde.jpg或者/2008/10/16/a/b/abcde.jpg。按日期制定这个目录规则后,就可以按年月来拆机器了。

二、分机器,分硬盘
按之前的计划,分成两个组,一组服务器用lvs做负载均衡负责新图片;另一组服务器做旧图片访问和备份。新图机器找几台好点的服务器,SCSI硬 盘;旧图机器没太大要求,PC机就行,找够硬盘就可以,现在IDE的1T硬盘也不太贵,最好再搭个raid就省事了,最主要是这些机器要多。

说明一下:

1、图片服务通过lvs作为入口,处理能力上还是有保障的。

2、利用nginx直接对外服务,不必用squid。

3、图中的红线是指主nginx会将/2006和/2007年的图片分别代理到两台存档服务器,如果发现主nginx的cpu占用比较大,那么可以考虑使用nginx的proxy_store将图片存到主服务器上,定期清理。

4、图中有一台存储分配服务器,作为图片服务更新图片的统一入口,有新图片或者修改图片的话,由这台服务器负责将图片放到正确的服务器上去。

5、旧图片服务器当前用年份来划分,每年增加两台服务器,亦可是加两块硬盘,注意,不要相信raid,一定要有两台机器,地理上分在两个城市则更好。

6、因为旧数据2006和2007年的数据基本上是没有变化的,所以假如硬盘够大,那么可以把两年的数据合并在一起。

7、如果细心定制,那么旧图片服务器的硬盘100%塞满是可以的,旧数据的容量基本上不会大幅增长,小小预留1-2G空间就可以了。

使用这个架构的话,到了2009年,我会把2008年的数据想办法迁到旧图服务器上,硬盘不够的话,加硬盘就可以了。如果图片量实在太大,主服务 器连一年的数据都装不下,那可以用启用月份来划分;如果一个月都装不下了,那也太夸张了,那就启用日期吧;如果一天的数据都装不下,那就◎#¥%……※。
 
2009年09月17日 20:50
一直在寻找Microsoft Project这个项目管理工具的替代品,因为Microsoft Project虽然功能强大但只能本地使用无法共享项目计划,虽然配合Project Server可以实现通过局域网共享项目计划但一个是配置复杂,最主要是这两个都是需要收费,对于中小型企业来说成本太高,而且易用性也不是很好,在如今 互联网时代,应该有更好的基于互联网的项目管理工具,虽然这方面有一些商业产品如Jira,但都是收费的,就算有破解的,也是朝不保夕,因为这些产品的版 本一直在变,破解却未必跟得上。还好,现在也有了一些开源的基于Web的项目管理工具,虽然功能没有商业的强,但已经足够一般企业的使用了,下面是几个比 较著名的开源项目管理系统,都是基于Web的。

 Trac
这个是用Python开发的一个项目管理系统,具有wiki,Ticket管理(在Trac中Ticket可以是任务,可以是缺陷),并且可以和Subversion集成,其带的Wiki功能比较完善,缺点是安装十分麻烦,需要安装很多Python相关工具

dotProject
PHP开发的一个基于Web的项目管理工具,也比较有名,但主要缺点是对中文支持不好,虽然网上有人提供了一些解决方案,但毕竟不是官方发布的,有的可以,有的不可以。

RedMine
这个是今天重点介绍也是目前我在使用的项目管理工具,采用Ruby On Rails开发,功能比较完善,Trac具有的功能基本上都有,而且还有日历和甘特图,并支持导出为PDF,并且还支持RSS订阅,详细的功能介绍可以到 其官网了解。本文主要介绍Redmine的安装和配置过程,Redmine是采用RoR编写,所以具有跨平台,这里主要介绍Windows平台下的安装配 置,本文用的是Windows Server 2008 DataCenter版本。

Remine的安装

1.首先下载InstantRails并解压,以下假设加压到C:\
InstantRails是一个Rails应用的集成包包括了Ruby运行时,Rails框架,PhpMyAdmin,Apache,MySql等,这样 就不需要分别下载需要的东西。其中Apache是用的1.3版本,主要用于运行phpMyAdmin(MySql的管理工具),Redmine本身内置了 一个Ruby写的Http服务器:WEBrick 因此并不需要Apache。
2.下载Redmine并解压缩,将解压缩后的文件夹直接复制到InstantRails目录的rails_apps目录下
3. 启动InstantRails(在C:\InstantRails\下有个InstantRails.exe直接运行即可)会出现一个界面(见下图)上面 可以控制Apache和MySql的停止和启动,请确保这两个都启动了。如果你的电脑上安装了IIS,可能需要在httpd.conf中修改Apache 的监听端口,默认是80


4.使用phpMyAdmin在MySql中创建数据库,脚本如下:create database redmine character set utf8;
5.将C:\InstantRails\rails_apps\redmine-0.8.0\config 目录下的database.yml.example更名为database.yml
6.进入C:\InstantRails\rails_apps\redmine-0.8.0目录,在其下执行:rake db:migrat RAILS_ENV="production",用来创建数据库,完成后应该创建43个表
7.再执行:rake redmine:load_default_data RAILS_ENV="production",指明当前项目运行环境为production,中间会提示选择语言,我们选择zh。
8.最后在C:\InstantRails\rails_apps\redmine-0.8.0目录下执行ruby script/server -e production,启动Redmine
9.通过浏览器访问http://localHost:3000即可,缺省管理员用户名是admin,密码也是admin

配置Redmine为Windows服务


按照上面介绍的步骤就可以使用Redmine,但当机器重启后都需要手工启动InstantRails和执行第8步来启动Redmine,比较麻烦,下面就介绍将Redmine安装成Windows服务,只要系统启动无需登录也跟着启动。
在上述步骤中,MySql只是做为一个普通程序被InstantRails.exe启动,而Redmine又依赖于MySql,因此需要将MySql安装 为Windows服务,进入到C:\InstantRails\mysql\bin目录下执行:Mysqld -Install即可将MySql安装为服务,在服务管理器中将其设为自动启动。

Ruby提供一个安装Ruby程序为服务的包:mongrel_service。安装其实很简单,在C:\InstantRails\ruby\bin目录下运行:gem install mongrel_service,此过程中会下载一些其他必须的包

然后使用mongrel_service将Redmine安装为服务:

 


mongrel_rails service::install -N RedMine -c C:\InstantRails\rails_apps\redmine-0.8.0 -p 3000 –e production

 


其中C:\InstantRails\rails_apps\redmine-0.8.0是Redmine所在目录 3000是监听端口,然后修改启动方式为自动即可。

如果想要移除Redmine服务,可执行如下命令:

mongrel_rails service::remove -N RedMine


配置邮件通知

Redmin可以为一些操作提供邮件通知如主题改变,新增问题等,这样可以让开发人员及时知道变化。在使用此功能前需要先配置邮件服务器,将 C:\InstantRails\rails_apps\redmine-0.8.0\config目录下的email.yml.example更名为 email.yml,然后用文本编辑器打开此文件,将内容改为如下:

# Outgoing email settings
production:
delivery_method: :smtp
smtp_settings:
address: "smtp.163.com"
port: 25
domain: "163.com"
authentication: :login
user_name: "PM@163.com"
password: "123456"

development:
delivery_method: :smtp
smtp_settings:
address: "smtp.163.com"
port: 25
domain: "163.com"
authentication: :login
user_name: "PM@163.com"
password: "123456"

这里我采用的是163的Smtp服务器来发送邮件,其中特别需要注意的是address,domain,user_name,password中的值都要加上双引号,否则会报错。

然后就可以在Redmine的界面中启用邮件通知,设置一下发件人地址和签名即可。

集成SubVersion

 集成SubVersion就很简单了,在版本库页面选择Subersion,然后填写SVN仓库的url和登录Subversion的用户名,密码即可通过Redmine查看svn仓库中的文件并可比较差异。如下图:


Redmine的WIKI

Redmine的Wiki功能比较简单,使用wiki时一定要注意在标记的前后都要留有空格,否则会无效如变粗字体:*Ning* 其中第一个 * 的前面要留有一个空格,而第二个*后面也要留有一个空格,其他标记类似。

在Redmine中可以自定义工作流程,工作流程是指某一个角色针对某一类问题(如功能,缺陷和支持)的状态迁移规则,此时该类问题就被跟踪(此时该类问题也称之为Tracker),状态迁移规则决定了某类问题是否可以从一个状态迁移到另外一个状态

 
   
 
 
文章存档
 
     
 
最新文章评论
  

很及时,谢谢!
 

回复leader20:没有
 

这个跟django版本有关系吗?
 

装了n回,才找到这个
 

你爱的我也爱
   
帮助中心 | 空间客服 | 投诉中心 | 空间协议
©2012 Baidu