• 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: , , ,