• 06 六 2009 /  互联网技术

    首先,探索新鲜事物是有风险的;一个下午时间,工作用的SVN库内容被我搞乱了一点,我本机的代码被误删,这些血的代价换回的是一个整合的开发体验。我将我在开发中用到的几乎所有的内容都整合到Eclipse中了,有点爽。

    先介绍我开发时会用什么,php、python、actionscript、javascript是最近常用的几种语言,用SVN做代码库,Trac进行文档编写和bug管理以及任务分配。因为主要是Web应用,所以nginx做为web server通过fastcgi连接php和python,基本上调试是在开发服务器上完成的,本机也可,但是我的确比较烦windows下这些环境的配置。所以时不时要通过ssh来传送文件到远程的开发服务器上。

    再来讲讲Eclipse,这厮也不是什么新鲜东西了,n年前就听说几大巨头共同投资开发了这样的一个开源的集成开发环境(IDE),当年初次体验时没有什么感觉,那时候还主要用于java或者C/C++的开发,附带的插件还很少。也许Java的fans追捧的比较多。我长时间开始使用Eclipse是因为做一些Flex的项目,Flex Builder本身就是一个Eclipse的变种,被Adobe公司优化后,在那个时候相比直接下载的Eclipse来讲,好用很多,毕竟这个东西是卖钱的,不好用能行嘛。Flex项目完成后对Eclipse的感觉也加深了,总想将php开发的环境也迁移过来,我印象中触动我的新闻消息是Zend Studio也做了Eclipse的版本。但是直到今天前,我还觉得整合不是很完善,也许是没有踏实下来用,也许是插件发展还没有跟上我的要求。

    于是今天,我再次弄了一下这个东西,发现最近一段时间它的插件跟进速度很快,基本上可以满足我上述所有的要求,当然也许是我终于踏实下来研究了一下。下面是配置的一些流程以及一些配置注意项,正常情况下,如果没有什么异常,Eclipse配置好后就可以在windows、linux、mac下完成主流语言的开发、调试工作,并且可以将项目代码通过SVN来共享,并且可以管理自己的Todo list以及Trac上的ticket。怎么样,听起来是不是很爽?ok,如果你不想在试验体验时有血的代价,听好我的流程和注意项,Let’s go!

    访问http://www.eclipse.org/downloads/下载Java Developers版本,这个版本相对比较小一点,预装的东西少一点,后续按需自己安装插件嘛。一开始我选择了Classic版本,也没有什么问题,但是因为增加了所有功能的源代码以及Eclipse开发文档、插件开发库等东西,导致这个软件包比较大,大的坏处是下载很慢并且程序启动的时候因为加载很多无谓的东西导致很慢。所以一切你自己需要来选择初始版本。

    下载后解压到你希望它存在的目录就可以了,然后进入目录,运行eclipse.exe,如果你是其它操作系统的,就照着类似的方法安装启动就可以了。第一次启动会让你选择默认的项目工作目录(workspace),你可以每次都选择来切换不同的工作目录,也可以默认死一个,一个工作目录可以包含多个项目。这里要注意的是未来工作目录下的项目目录是会在建立或者导入项目时清空目录中的内容的,所以未来设置项目路径或者选择工作目录都要小心,我的文件就是这么被误删的,呜呜~~~~

    启动界面如图,默认是一个欢迎界面

    eclipse welcome windows

    可以关闭这个欢迎界面,以后要再想看的话,在目录help->welcome中激活,先不要研究这个,直接切入主题。我们先安装php的开发插件。

    访问这个地址http://www.phpeclipse.com/wiki/Installation,选择你所需要的update源,复制地址,例如我选择的是http://update.phpeclipse.net/update/stable/1.2.x,然后回到Eclipse中,选择目录help->Software Updates,如下图所示将update源地址添加进入更新列表中,然后就可以在列表中选择新安装或者更新的软件包了。

    eclipse add update site

    点击列表左侧每一项前面的加号,就可以展开看到可以安装的软件包,勾选你需要的,对于php来讲,选择全部,然后选择右面的install按钮,等待一会儿会再跟你确认是新装还是update,再次确认后就开始实际的下载安装了。这里我没有考虑网络太慢的原因,如果你实在受不了的话,可以找个地方先下载好软件包,然后还是在这个add site的地方加入,只是选择右面的local按钮选择本地文件罢了。

    好,在建议下重启eclipse以后,你会发现多了一些小东西,首先可以new php的project了,如果你在菜单file->new下无法看到默认的php project不要紧张,直接选择new project也可以,这时候创建项目的向导程序可以允许你选PHP目录下的php project,接下来的事情跟着向导程序一步步走就可以了,你就可以轻松建立一个php的项目了。

    php项目会进入php视图,如果没有的话,可以在菜单windows->open perspective->other里面选到,选好以后应该能发现菜单下多了一排小图标。这里用到的是一个开发环境简化安装的项目XAMPP。phpeclipse可以和xampp联动,做到在开发界面中重启例如apache、mysql等相关的服务,十分方便。不过,我不用XAMPP所以暂时没有研究它怎么调用我自己配置的开发环境。

    同样道理,我们参考上面的流程来安装python的开发插件。我选择的是PyDev,访问http://pydev.sourceforge.net/download.html页面来选择合适的update节点地址,拷贝下来还是到添加站点的地方添加,并且选择安装软件包,稍等片刻后就会安装好。重启后需要做一个配置来映射系统的python解析器,访问菜单Windows->Perferences->Pydev->Interpreter下,如图所示:

    eclipse config pydev

    选择右上角new一个新的python interpreter,起一个名字并且指定python.exe所在的路径,确认后就和上面的截图效果一样,会配置好所有的python库的路径,如果你要添加额外的库,也可以在下面这个框里面添加。至此pydev的设置也都ok了,创建项目和php的那个流程一样。我想其它语言你只要能找到它的插件,按照这个流程安装都应该可以支持。下面我们来说一些辅助的功能,eclipse与svn结合。

    Eclipse默认只有CVS的支持,svn毕竟是一个新东西,但是它的确比cvs好用,所以一直期待这个插件,这次我能完美的安装并使用这个插件了,安装流程和上述的流程都是一样的,非常简单,只是有一个概念要搞清楚。eclipse网站展示的只是svn插件的部分,让它顺利运行还需要安装一个第三方的svn connector接口以及选择一个connector实现。下面两个连接分别是插件和connector的update地址。

    http://download.eclipse.org/technology/subversive/0.7/update-site/

    http://community.polarion.com/projects/subversive/download/eclipse/2.0/update-site/

    安装好重启后可以在新建项目的时候选择Project from svn,这样就可以从svn直接checkout出来一个项目来开发程序了。需要特别注意的是,如果你不选择默认项目work space,你一定要自己制定项目的子目录,如果你选择了一个workspace但并没有选择子目录的话,它会在建立项目时将选择的目录内的所有内容都删除了!我就被删了我所有的开发代码。

    还有要注意的是,如果你直接将你现在的项目import到svn,它会将你当前项目当做目录import进去,所以不要而外再起一个svn的子目录名字了,不然就会多了一层,很乱。

    Eclipse默认还安装了 Mylyn的模块,它基本上是一个开发时的任务管理器,它可以和代码相关,比如你在代码注释里填写TODO:xxxx,它就会自动提取这个把它变成一个todolist。更加增强的是,如果你选择安装mylyn的trac插件,你还可以随时调用trac里面的ticket来做bug或者任务管理。因为目前跟trac 0.11.3的配合还不是太好,需要下载一些patch才能work,所以这部分我打算日后单独写一篇文档来描述,下面只是列出Mylyn的trac插件update地址。

    http://download.eclipse.org/tools/mylyn/update/extras

    总结:Eclipse是名副其实的综合IDE工具,因为它开源的特性导致会有更多的人提供基于它的开发工具特性,它也就会支持更多的开发语言或者开发领域。熟悉这个工具非常值得,因此希望大家玩得开心,happy coding!

    Tags: , , , ,

  • 19 二 2009 /  互联网技术

    最近做一个项目需要很高的并发长连接,apache下做了一个测试,连接数不多的情况下,负载已经开始冒头了,并且worker模式下php不是很稳定,于是乎转向尝试Nginx+FastCGI+PHP的组合方案。

    网上已经有很多关于这个组合的安装文档了,在这里我不重复,只是提一些我自认为比较迷惑的,网上文章没有唠叨的问题点。假设你们熟悉apache+php的组合,计划从那个平台迁移到Nginx下。Ok, Let’s go!

    • php源码包中的文档描述道,有关FastCGI模式,建议使用./php-cgi -b 127.0.0.1:9000的独立模式来接受web服务器转发过来的请求。既然是推荐模式,我就运行一把,结果这个程序一没有多进程模式,二不支持进程异常退出后的重新启动。并发请求上不去,稍微给一点压力,php-cgi崩溃或者异常退出了,系统就没有php解析服务了。于是乎转到lighttpd里的一个小工具spawn-fcgi。这个工具支持设定同时打开多个php-cgi来服务,并且任何子进程终止都会新建一个补上,可以说算是比较稳定的方案了。网上还有一个php-fpm,有空我看看怎么玩的。
    • 修改了php.ini配置信息,问题来了,如何重新启动这么多php-cgi呢?本以为spawn-fcgi是一个独立的进程,kill掉它就可以干掉其它呢,结果在进程列表中找不到spawn-fcgi,它隐身成php-cgi这个名字,并且是所有其他php-cgi的父进程。得,killall php-cgi,直接就杀掉所有的php-cgi包括那个父进程。重新启动spawn-fcgi,这时候就是新的配置信息了。有一点很不错的是,这时候Nginx没有重新启动,在没有php-cgi的时候,Nginx会显示一个界面友好的提示用户暂时无法访问。并且其它静态文件访问都是正常的。
    • 我测试的web项目要使用rewrite,正好研究一下如何切换rewrite代码,研究半天才发现有如下需要注意的点:
      1、Nginx不支持.htaccess文件,配置rewrite需要在nginx.conf里面写。
      2、apache中的RewriteRule需要改写成rewrite
      3、规则需要使用双引号引起来
      4、apache中[R] 要改写成redirect
      5、因为没有地方设置RewriteBase,所以所有的规则都要从/开始,跳转的程序地址也要从/开始
      6、RewriteCond用if代替
    • 调试上面的rewrite非常累人的kill掉nginx再重启,后来发现可以给nginx master一个信号kill -HUP xxx(nginx master的pid),这样服务没有停,就更新的配置。为了保证服务顺畅,执行这个之前要先执行nginx -t来测试配置文件是否有效

    使用ab压了一下,在压力下,访问网页响应速度还是不错的,并且太大的压力nginx会屏蔽请求,等待系统负载降下来了才会继续接受服务请求。这样不至于将服务器搞死。

    陆续我还会将测试发现的问题列在这里,对待新鲜事物总是会有这么几天不顺利,但是过去了以后自然就变成自己的经验,就不会有很恼人的问题了。坚持!

     

    后续使用nginx的心得,不开新的文章了,直接在这里添加内容

    1、日志翻滚:nginx不支持cronlog那样的管道模式,但是可以用kill -USR1 [pid]来给nginx信号来进行日志文件的刷新。将现有的日志文件改名后,给一下USR1信号,新的日志就产生了。

    2、一个站点下如果开多个虚拟主机,最好是单独写server {}这个配置块,不要在里面加不同的alias,否则很多跳转都会默认跳转到第一个站点的域名下,就算你访问的是它的别名站点也没用。网上有另外一个办法是做一个rewrite的规则,让这种跳转找到自己访问的源域名再跳转,感觉rewrite方案类似凑合事儿,因此还是用直接配置多个server的解决方案。多server配置时要加一个参数在http{}中 server_names_hash_bucket_size 128;否则服务器启动会有报错。

    3、spawn-fcgi -C的参数是代表开多少个后台的fcgi守候程序,一个程序同时只能服务一个请求,我的项目中有长连接的状态,所以这个参数开小了很容易导致因为后台没有足够的空闲fcgi而nginx停止响应。所以如果连接时间比较长,并发比较大的话,这里要开大点,开个几百个没有什么问题。

    4、怎么不暂停服务扩充spawn-fcgi的数量呢?先用spawn-fcgi启动另外一个新的端口例如9001服务,这个服务中fcgi的数量是要扩充到的数量,然后改nginx.conf里面的端口号到9001,然后kill -HUP [pid]更新nginx的配置,这会儿就使用新的spawn出来的fcgi了。然后将旧的spawn-fcgi的进程都杀掉释放资源就好了。

    5、上传文件大小在nginx的配置里也有体现,client_max_body_size 250m;可以将上传限制扩充到250M,加到http {}配置中或者server{}中都可以

    6、每个location属性都可以单独设定某些请求文件条件下的特殊属性,但要注意,设定必须包含root参数指定所请求资源的物理路径,否则回报404错误。

    7、可以使用expires 365d;属性来设定某些文件的缓存时间。

    Tags: , , ,