<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Big toy for boy! &#187; rewrite</title>
	<atom:link href="http://bigtoy4boy.com/blog/tag/rewrite/feed/" rel="self" type="application/rss+xml" />
	<link>http://bigtoy4boy.com/blog</link>
	<description>一个有关一些个人兴趣爱好的博客</description>
	<lastBuildDate>Wed, 04 Aug 2010 08:47:43 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Nginx果然名不虚传</title>
		<link>http://bigtoy4boy.com/blog/2009/02/nginx-is-good/</link>
		<comments>http://bigtoy4boy.com/blog/2009/02/nginx-is-good/#comments</comments>
		<pubDate>Thu, 19 Feb 2009 06:29:38 +0000</pubDate>
		<dc:creator>羽高</dc:creator>
				<category><![CDATA[互联网技术]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[nginx]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[rewrite]]></category>

		<guid isPermaLink="false">http://www.bigtoy4boy.com/blog/?p=140</guid>
		<description><![CDATA[最近做一个项目需要很高的并发长连接，apache下做了一个测试，连接数不多的情况下，负载已经开始冒头了，并且worker模式下php不是很稳定，于是乎转向尝试Nginx+FastCGI+PHP的组合方案。 网上已经有很多关于这个组合的安装文档了，在这里我不重复，只是提一些我自认为比较迷惑的，网上文章没有唠叨的问题点。假设你们熟悉apache+php的组合，计划从那个平台迁移到Nginx下。Ok, Let&#8217;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;属性来设定某些文件的缓存时间。]]></description>
			<content:encoded><![CDATA[<p>最近做一个项目需要很高的并发长连接，apache下做了一个测试，连接数不多的情况下，负载已经开始冒头了，并且worker模式下php不是很稳定，于是乎转向尝试Nginx+FastCGI+PHP的组合方案。</p>
<p>网上已经有很多关于这个组合的安装文档了，在这里我不重复，只是提一些我自认为比较迷惑的，网上文章没有唠叨的问题点。假设你们熟悉apache+php的组合，计划从那个平台迁移到Nginx下。Ok, Let&#8217;s go!</p>
<ul>
<li>php源码包中的文档描述道，有关FastCGI模式，建议使用./php-cgi -b 127.0.0.1:9000的独立模式来接受web服务器转发过来的请求。既然是推荐模式，我就运行一把，结果这个程序一没有多进程模式，二不支持进程异常退出后的重新启动。并发请求上不去，稍微给一点压力，php-cgi崩溃或者异常退出了，系统就没有php解析服务了。于是乎转到lighttpd里的一个小工具spawn-fcgi。这个工具支持设定同时打开多个php-cgi来服务，并且任何子进程终止都会新建一个补上，可以说算是比较稳定的方案了。网上还有一个<a href="http://php-fpm.anight.org/" target="_blank">php-fpm</a>，有空我看看怎么玩的。</li>
<li>修改了php.ini配置信息，问题来了，如何重新启动这么多php-cgi呢？本以为spawn-fcgi是一个独立的进程，kill掉它就可以干掉其它呢，结果在进程列表中找不到spawn-fcgi，它隐身成php-cgi这个名字，并且是所有其他php-cgi的父进程。得，killall php-cgi，直接就杀掉所有的php-cgi包括那个父进程。重新启动spawn-fcgi，这时候就是新的配置信息了。有一点很不错的是，这时候Nginx没有重新启动，在没有php-cgi的时候，Nginx会显示一个界面友好的提示用户暂时无法访问。并且其它静态文件访问都是正常的。</li>
<li>我测试的web项目要使用rewrite，正好研究一下如何切换rewrite代码，研究半天才发现有如下需要注意的点：<br />
1、Nginx不支持.htaccess文件，配置rewrite需要在nginx.conf里面写。<br />
2、apache中的RewriteRule需要改写成rewrite<br />
3、规则需要使用双引号引起来<br />
4、apache中[R] 要改写成redirect<br />
5、因为没有地方设置RewriteBase，所以所有的规则都要从/开始，跳转的程序地址也要从/开始<br />
6、RewriteCond用if代替</li>
<li>调试上面的rewrite非常累人的kill掉nginx再重启，后来发现可以给nginx master一个信号kill -HUP xxx(nginx master的pid)，这样服务没有停，就更新的配置。为了保证服务顺畅，执行这个之前要先执行nginx -t来测试配置文件是否有效</li>
</ul>
<p>使用ab压了一下，在压力下，访问网页响应速度还是不错的，并且太大的压力nginx会屏蔽请求，等待系统负载降下来了才会继续接受服务请求。这样不至于将服务器搞死。</p>
<p>陆续我还会将测试发现的问题列在这里，对待新鲜事物总是会有这么几天不顺利，但是过去了以后自然就变成自己的经验，就不会有很恼人的问题了。坚持！</p>
<p> </p>
<p>后续使用nginx的心得，不开新的文章了，直接在这里添加内容</p>
<p>1、日志翻滚：nginx不支持cronlog那样的管道模式，但是可以用kill -USR1 [pid]来给nginx信号来进行日志文件的刷新。将现有的日志文件改名后，给一下USR1信号，新的日志就产生了。</p>
<p>2、一个站点下如果开多个虚拟主机，最好是单独写server {}这个配置块，不要在里面加不同的alias，否则很多跳转都会默认跳转到第一个站点的域名下，就算你访问的是它的别名站点也没用。网上有另外一个办法是做一个rewrite的规则，让这种跳转找到自己访问的源域名再跳转，感觉rewrite方案类似凑合事儿，因此还是用直接配置多个server的解决方案。多server配置时要加一个参数在http{}中 server_names_hash_bucket_size 128;否则服务器启动会有报错。</p>
<p>3、spawn-fcgi -C的参数是代表开多少个后台的fcgi守候程序，一个程序同时只能服务一个请求，我的项目中有长连接的状态，所以这个参数开小了很容易导致因为后台没有足够的空闲fcgi而nginx停止响应。所以如果连接时间比较长，并发比较大的话，这里要开大点，开个几百个没有什么问题。</p>
<p>4、怎么不暂停服务扩充spawn-fcgi的数量呢？先用spawn-fcgi启动另外一个新的端口例如9001服务，这个服务中fcgi的数量是要扩充到的数量，然后改nginx.conf里面的端口号到9001，然后kill -HUP [pid]更新nginx的配置，这会儿就使用新的spawn出来的fcgi了。然后将旧的spawn-fcgi的进程都杀掉释放资源就好了。</p>
<p>5、上传文件大小在nginx的配置里也有体现，client_max_body_size 250m;可以将上传限制扩充到250M，加到http {}配置中或者server{}中都可以</p>
<p>6、每个location属性都可以单独设定某些请求文件条件下的特殊属性，但要注意，设定必须包含root参数指定所请求资源的物理路径，否则回报404错误。</p>
<p>7、可以使用expires 365d;属性来设定某些文件的缓存时间。</p>
]]></content:encoded>
			<wfw:commentRss>http://bigtoy4boy.com/blog/2009/02/nginx-is-good/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
