<?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>夜行人 &#187; Nginx</title>
	<atom:link href="http://www.187299.com/archives/tag/nginx/feed" rel="self" type="application/rss+xml" />
	<link>http://www.187299.com</link>
	<description>寻觅生命中的那一片浅草......</description>
	<lastBuildDate>Wed, 16 Nov 2011 11:25:49 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Nginx递归限制访问同名目录</title>
		<link>http://www.187299.com/archives/1815</link>
		<comments>http://www.187299.com/archives/1815#comments</comments>
		<pubDate>Fri, 25 Mar 2011 13:30:38 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Nginx]]></category>

		<guid isPermaLink="false">http://www.187299.com/?p=1815</guid>
		<description><![CDATA[Nginx根目录是/opt/www 假如 /opt/www/a/x /opt/www/a/d/x /opt/www/b/x 如果配置可以禁止访问所有的x目录？ 找到了 location ~ ^(.*)\/\x\/{ deny all;... ]]></description>
			<content:encoded><![CDATA[<p>Nginx根目录是/opt/www</p>
<p>假如<br />
/opt/www/a/x<br />
/opt/www/a/d/x<br />
/opt/www/b/x<br />
如果配置可以禁止访问所有的x目录？</p>
<p>找到了<br />
location ~ ^(.*)\/\x\/{ deny all;}</p>
]]></content:encoded>
			<wfw:commentRss>http://www.187299.com/archives/1815/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>php.ini里session.save_path引起的错误</title>
		<link>http://www.187299.com/archives/1446</link>
		<comments>http://www.187299.com/archives/1446#comments</comments>
		<pubDate>Mon, 25 Jan 2010 02:28:59 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Nginx]]></category>

		<guid isPermaLink="false">http://www.187299.com/archives/1446</guid>
		<description><![CDATA[Failed to initialize storage module: memcache (path: /tmp) 今天重启服务器后，登录页面出现以上的错误提示 最后发现是php.ini被修改了 ;session.save_path = "/tmp" 由于所有的session都交给memcached处理了 所以session.s... ]]></description>
			<content:encoded><![CDATA[<p>Failed to initialize storage module: memcache (path: /tmp)</p>
<p>今天重启服务器后，登录页面出现以上的错误提示<br />
最后发现是php.ini被修改了<br />
;session.save_path = "/tmp"</p>
<p>由于所有的session都交给memcached处理了<br />
所以session.save_path = "/tmp"应该要被注释掉<br />
但不知道谁把它开起来了<br />
session.save_path = "/tmp"</p>
<p>因为之前一直都没重启，所以一直都没有问题</p>
]]></content:encoded>
			<wfw:commentRss>http://www.187299.com/archives/1446/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Nginx的403 Forbidden</title>
		<link>http://www.187299.com/archives/1428</link>
		<comments>http://www.187299.com/archives/1428#comments</comments>
		<pubDate>Sun, 27 Dec 2009 06:37:15 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Nginx]]></category>

		<guid isPermaLink="false">http://www.187299.com/?p=1428</guid>
		<description><![CDATA[我遇到的，多数是虚拟主机的域名错误引起的 今天遇到一特例， 直接访问www.example.com 报403 Forbidden 但www.example.com/index.php是正常的 是因为server_name www.example.com后少了个分号 正确的应该是 server_n... ]]></description>
			<content:encoded><![CDATA[<p>我遇到的，多数是虚拟主机的域名错误引起的<br />
今天遇到一特例，<br />
直接访问www.example.com<br />
报403 Forbidden<br />
但www.example.com/index.php是正常的<br />
是因为server_name www.example.com后少了个分号<br />
正确的应该是<br />
server_name www.example.com ;<br />
奇怪nginx -t并不报错</p>
]]></content:encoded>
			<wfw:commentRss>http://www.187299.com/archives/1428/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Nginx的No input file specified错误</title>
		<link>http://www.187299.com/archives/1426</link>
		<comments>http://www.187299.com/archives/1426#comments</comments>
		<pubDate>Sun, 27 Dec 2009 05:41:27 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Nginx]]></category>

		<guid isPermaLink="false">http://www.187299.com/?p=1426</guid>
		<description><![CDATA[访问www.example.com/install.php 提示“No input file specified” 网上找到很多原因 但我遇到的不是那样 是因为include/hosts/vhost.conf行少了一个分号 正确的应该是 include/hosts/vhost.conf... ]]></description>
			<content:encoded><![CDATA[<p>访问www.example.com/install.php<br />
提示“No input file specified”<br />
网上找到很多原因<br />
但我遇到的不是那样<br />
是因为include/hosts/vhost.conf行少了一个分号<br />
正确的应该是<br />
include/hosts/vhost.conf;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.187299.com/archives/1426/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>傻瓜式搭建Nginx+PHP+Mysql服务器</title>
		<link>http://www.187299.com/archives/1341</link>
		<comments>http://www.187299.com/archives/1341#comments</comments>
		<pubDate>Tue, 17 Nov 2009 01:16:58 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Nginx]]></category>

		<guid isPermaLink="false">http://www.187299.com/?p=1341</guid>
		<description><![CDATA[1.下载 一键安装包LNMP wget http://licess.googlecode.com/files/LNMP.zip 2. 64位机器 yum -y install libjpeg-devel yum -y install libpng-devel 3. unzip LNMP.zip cd LNMP chmod +x install.sh down.sh ./down.sh ./install.sh 4.安装Google的TCMalloc... ]]></description>
			<content:encoded><![CDATA[<p>1.下载 一键安装包LNMP</p>
<p>wget <a href="http://licess.googlecode.com/files/LNMP.zip" target="_blank">http://licess.googlecode.com/files/LNMP.zip</a></p>
<p>2. 64位机器</p>
<p>yum -y install libjpeg-devel</p>
<p>yum -y install libpng-devel</p>
<p>3.</p>
<p>unzip LNMP.zip</p>
<p>cd LNMP</p>
<p>chmod +x install.sh down.sh</p>
<p>./down.sh<br />
./install.sh</p>
<p>4.安装Google的TCMalloc库<br />
64位系统安装libunwind库</p>
<p>wget <a href="http://download.savannah.gnu.org/releases/libunwind/libunwind-0.99-alpha.tar.gz" target="_blank">http://download.savannah.gnu.org ... d-0.99-alpha.tar.gz</a><br />
tar zxvf libunwind-0.99-alpha.tar.gz<br />
cd libunwind-0.99-alpha/<br />
CFLAGS=-fPIC ./configure<br />
make CFLAGS=-fPIC<br />
make CFLAGS=-fPIC install</p>
<p>wget <a href="http://google-perftools.googlecode.com/files/google-perftools-1.1.tar.gz" target="_blank">http://google-perftools.googleco ... erftools-1.1.tar.gz</a><br />
tar zxvf google-perftools-1.1.tar.gz<br />
cd google-perftools-1.1/<br />
./configure<br />
make &amp;&amp; make install</p>
<p>echo “/usr/local/lib” &gt; /etc/ld.so.conf.d/usr_local_lib.conf<br />
/sbin/ldconfig</p>
<p>vi /usr/local/mysql/bin/mysqld_safe</p>
<p>在# executing mysqld_safe的下一行，加上：</p>
<p>代码:</p>
<p>export LD_PRELOAD=/usr/local/lib/libtcmalloc.so</p>
<p>保存后退出，然后重启MySQL服务器。</p>
<p>/etc/init.d/mysql restart</p>
<p>使用lsof命令查看tcmalloc是否起效：<br />
代码:</p>
<p>/usr/sbin/lsof -n | grep tcmalloc</p>
<p>如果发现以下信息，说明tcmalloc已经起效：</p>
<p>mysqld 6074 mysql mem REG 8,3 1650572 11506841 /usr/local/lib/libtcmalloc.so.0.0.0</p>
<p>程序安装路径：<br />
MySQL : /usr/local/mysql<br />
PHP : /usr/local/php<br />
Nginx : /usr/local/nginx<br />
PHPMyAdmin /web/www/phpmyadmin<br />
Web目录 /web/www</p>
<p>让Nginx开机后手动执行 /root/run.sh 后Nginx会运行 ，开机自动运行可以运行 LNMP目录下面的 startup.sh 文件即可。</p>
<p>转载自：http://www.mghost.cn/redirect.php?tid=1743&amp;goto=lastpost</p>
]]></content:encoded>
			<wfw:commentRss>http://www.187299.com/archives/1341/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>HTTP请求流程（二）----Telnet模拟HTTP请求</title>
		<link>http://www.187299.com/archives/1259</link>
		<comments>http://www.187299.com/archives/1259#comments</comments>
		<pubDate>Sun, 11 Oct 2009 03:03:41 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Apache]]></category>
		<category><![CDATA[Network]]></category>
		<category><![CDATA[Nginx]]></category>

		<guid isPermaLink="false">http://www.187299.com/archives/1259</guid>
		<description><![CDATA[上一部分"流程简介"， 我们大致了解了下HTTP请求的流程，这一篇我向大家介绍下如何利用Telnet来模拟Http请求---访问百度。 我们直接开始吧！ 1、打开"运行"-&#62;cmd进入命令环境； 2、输入"telnet ... ]]></description>
			<content:encoded><![CDATA[<p>上一部分"<span style="font-family: Verdana;"><a href="http://www.cnblogs.com/stg609/archive/2008/07/06/1236966.html"><span style="font-family: Verdana;">流程简介</span></a>"， 我们大致了解了下HTTP请求的流程，这一篇我向大家介绍下如何利用Telnet来模拟Http请求---访问百度。<br />
我们直接开始吧！<br />
1、打开"运行"-&gt;cmd进入命令环境；<br />
2、输入"telnet www.baidu.com 80"，回车后 ,屏幕为全黑，此时我们利用快捷键"Ctrl+](右中括号)"来打开本地回显功能，这样我们就可以看见我们所打的东西了，如图：（注本阶段执行过程和以 下的过程均要求操作时间尽可能短，因为时间一长，便会被认为断开连接。）</p>
<div><img src="http://images.cnblogs.com/cnblogs_com/stg609/telnethttp1.jpg" border="0" alt="" width="261" height="125" /></div>
<p>3、单击回车，进行编辑状态。<br />
4、输入："<span style="font-family: Verdana;">GET / HTTP/1.1"后回车,在第二段接着输入："HOST:"然后按回车，这样一个简单的HTTP请求就完成了，接着我人只要再按下回车，便向服务器递交 这个请求了。如图：（我们来看一下这个是什么意思：GET表示请求方式，/表示请求的根目录下的文件，HTTP/1.1表示HTTP协议版本，HOST就 是一个消息头，据某些朋友说1.1的版本一定要加一个"HOST:"可是我实验后发现"HOST :"不加仍旧可以正常发送请求，但是GET HTTP这个必须大写，否则就该请求无法发送）<br />
</span></p>
<div><img style="width: 168px; height: 89px;" src="http://images.cnblogs.com/cnblogs_com/stg609/telnethttp2.jpg" border="0" alt="" width="168" height="89" /></div>
<p>5、接收服务器返回，这步其实不需要我们来做，因为当我们发送请求后，只需几秒钟，我们便会收到来自服务器反应.</p>
<div><img src="http://images.cnblogs.com/cnblogs_com/stg609/telnethttp3.jpg" border="0" alt="" /></div>
<div>6、这样,请求就算完成了。下面我们在百度中搜一下"1",浏览器中的地址应该是:<span style="font-family: Verdana;">http://www.baidu.com/s?wd=1.</span>看看请求是怎么样的</p>
<div><img src="http://images.cnblogs.com/cnblogs_com/stg609/telnethttp4.jpg" border="0" alt="" /></div>
</div>
<p>怎么样，大家会了吗？以上只是用GET方式进行请求，当然还可以用POST方式进行请求，只是POST我这不方便做实验，所以就不写了。大概的格式给大家参考下：<br />
POST /localhost/login.aspx HTTP/1.1<br />
HOST:<br />
Content-Type:application/x-www-form-urlencoded<br />
Content-Length:10</p>
<p>uid=xxxxxx</p>
<p><span style="font-family: Verdana;"><span style="color: #000000;">参考：<br />
</span>1.张孝祥老师的HTTP协议详解<br />
2.关于HTTP的请求头可以参考：<a href="http://hi.baidu.com/%C3%8A%C2%AB%C3%95%C2%B9/blog/item/13c2e3ddb3a133ee77c638cd.html">http://hi.baidu.com/Ê«Õ¹/blog/item/13c2e3ddb3a133ee77c638cd.html</a></span></span></p>
]]></content:encoded>
			<wfw:commentRss>http://www.187299.com/archives/1259/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Nginx下perl(fastcgi)配置</title>
		<link>http://www.187299.com/archives/1247</link>
		<comments>http://www.187299.com/archives/1247#comments</comments>
		<pubDate>Mon, 21 Sep 2009 16:22:06 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Nginx]]></category>

		<guid isPermaLink="false">http://www.187299.com/?p=1247</guid>
		<description><![CDATA[wget http://www.cpan.org/modules/by-module/FCGI/FCGI-0.67.tar.gz tar xzf FCGI-0.67.tar.gz cd FCGI-0.67 perl Makefile.PL make make install wget http://www.cpan.org/modules/by-module/FCGI/FCGI-ProcManager-0.18.tar.gz tar zxf FCGI-ProcManager-0.18.tar.gz cd... ]]></description>
			<content:encoded><![CDATA[<p>wget http://www.cpan.org/modules/by-module/FCGI/FCGI-0.67.tar.gz<br />
tar xzf FCGI-0.67.tar.gz<br />
cd FCGI-0.67<br />
perl Makefile.PL<br />
make<br />
make install</p>
<p>wget http://www.cpan.org/modules/by-module/FCGI/FCGI-ProcManager-0.18.tar.gz<br />
tar zxf FCGI-ProcManager-0.18.tar.gz<br />
cd FCGI-ProcManager-0.18<br />
perl Makefile.PL<br />
make &amp;&amp; make install</p>
<p>配置Perl的FastCGI脚本（从网上找到的，未找到原始出处）：<br />
#vi /etc/init.d/perl-fast</p>
<p>****************************************</p>
<p>#!/usr/bin/perl -w</p>
<p>use FCGI;</p>
<p>use Socket;</p>
<p>use FCGI::ProcManager;</p>
<p>sub shutdown { FCGI::CloseSocket($socket); exit; }</p>
<p>sub restart { FCGI::CloseSocket($socket); &amp;main; }</p>
<p>use sigtrap 'handler', \&amp;shutdown, 'normal-signals';</p>
<p>use sigtrap 'handler', \&amp;restart, 'HUP';</p>
<p>require 'syscall.ph';</p>
<p>use POSIX qw(setsid);</p>
<p>#export FCGI_SOCKET_PATH="/tmp/perl-fastcgi.sock"</p>
<p>#export FCGI_NPROCESSES=4</p>
<p>#&amp;daemonize; we don't daemonize when running under runsv</p>
<p>#this keeps the program alive or something after exec'ing perl scripts</p>
<p>END() { }</p>
<p>BEGIN() { }</p>
<p>{</p>
<p>no warnings;</p>
<p>*CORE::GLOBAL::exit = sub { die "fakeexit\nrc=" . shift() . "\n"; };</p>
<p>};</p>
<p>eval q{exit};</p>
<p>if ($@) {</p>
<p>exit unless $@ =~ /^fakeexit/;</p>
<p>}</p>
<p>&amp;main;</p>
<p>sub daemonize() {</p>
<p>chdir '/' or die "Can't chdir to /: $!";</p>
<p>defined( my $pid = fork ) or die "Can't fork: $!";</p>
<p>exit if $pid;</p>
<p>setsid() or die "Can't start a new session: $!";</p>
<p>umask 0;</p>
<p>}</p>
<p>sub main {</p>
<p>#.... IP sockets</p>
<p>#$socket = FCGI::OpenSocket( "127.0.0.1:8999", 10 );</p>
<p>#.... UNIX sockets</p>
<p>#$socket = FCGI::OpenSocket( "/temp/perl-fastcgi.sock", 10 );</p>
<p>#foreach $item (keys %ENV) { delete $ENV{$item}; }</p>
<p>#..fastcgi........</p>
<p>my $n_processes = $ENV{FCGI_NPROCESSES} || 4;</p>
<p>$proc_manager = FCGI::ProcManager-&gt;new( {n_processes =&gt; $n_processes} );</p>
<p>#..unix socket</p>
<p>$socket = FCGI::OpenSocket( "$ENV{FCGI_SOCKET_PATH}", 10 );</p>
<p>#..Socket..</p>
<p>chmod 0777, $ENV{FCGI_SOCKET_PATH};</p>
<p>; #use UNIX sockets - user running this script must have w access to the 'nginx' folder!!</p>
<p>$request =</p>
<p>FCGI::Request( \*STDIN, \*STDOUT, \*STDERR, \%req_params, $socket,</p>
<p>&amp;FCGI::FAIL_ACCEPT_ON_INTR );</p>
<p>$proc_manager-&gt;pm_manage();</p>
<p>if ($request) { request_loop() }</p>
<p>FCGI::CloseSocket($socket);</p>
<p>}</p>
<p>sub request_loop {</p>
<p>while ( $request-&gt;Accept() &gt;= 0 ) {</p>
<p>$proc_manager-&gt;pm_pre_dispatch();</p>
<p>#processing any STDIN input from WebServer (for CGI-POST actions)</p>
<p>$stdin_passthrough = '';</p>
<p>{ no warnings; $req_len = 0 + $req_params{'CONTENT_LENGTH'}; };</p>
<p>if ( ( $req_params{'REQUEST_METHOD'} eq 'POST' ) &amp;&amp; ( $req_len != 0 ) )</p>
<p>{</p>
<p>my $bytes_read = 0;</p>
<p>while ( $bytes_read &lt; $req_len ) {</p>
<p>my $data = '';</p>
<p>my $bytes = read( STDIN, $data, ( $req_len - $bytes_read ) );</p>
<p>last if ( $bytes == 0 || !defined($bytes) );</p>
<p>$stdin_passthrough .= $data;</p>
<p>$bytes_read += $bytes;</p>
<p>}</p>
<p>}</p>
<p>#running the cgi app</p>
<p>if (</p>
<p>( -x $req_params{SCRIPT_FILENAME} ) &amp;&amp; #can I execute this?</p>
<p>( -s $req_params{SCRIPT_FILENAME} ) &amp;&amp; #Is this file empty?</p>
<p>( -r $req_params{SCRIPT_FILENAME} ) #can I read this file?</p>
<p>)</p>
<p>{</p>
<p>pipe( CHILD_RD, PARENT_WR );</p>
<p>pipe( PARENT_ERR, CHILD_ERR );</p>
<p>my $pid = open( CHILD_O, "-|" );</p>
<p>unless ( defined($pid) ) {</p>
<p>print("Content-type: text/plain\r\n\r\n");</p>
<p>print</p>
<p>"Error: CGI app returned no output - Executing $req_params{SCRIPT_FILENAME} failed !\n";</p>
<p>next;</p>
<p>}</p>
<p>$oldfh = select(PARENT_ERR);</p>
<p>$| = 1;</p>
<p>select(CHILD_O);</p>
<p>$| = 1;</p>
<p>select($oldfh);</p>
<p>if ( $pid &gt; 0 ) {</p>
<p>close(CHILD_RD);</p>
<p>close(CHILD_ERR);</p>
<p>print PARENT_WR $stdin_passthrough;</p>
<p>close(PARENT_WR);</p>
<p>$rin = $rout = $ein = $eout = '';</p>
<p>vec( $rin, fileno(CHILD_O), 1 ) = 1;</p>
<p>vec( $rin, fileno(PARENT_ERR), 1 ) = 1;</p>
<p>$ein = $rin;</p>
<p>$nfound = 0;</p>
<p>while ( $nfound =</p>
<p>select( $rout = $rin, undef, $ein = $eout, 10 ) )</p>
<p>{</p>
<p>die "$!" unless $nfound != -1;</p>
<p>$r1 = vec( $rout, fileno(PARENT_ERR), 1 ) == 1;</p>
<p>$r2 = vec( $rout, fileno(CHILD_O), 1 ) == 1;</p>
<p>$e1 = vec( $eout, fileno(PARENT_ERR), 1 ) == 1;</p>
<p>$e2 = vec( $eout, fileno(CHILD_O), 1 ) == 1;</p>
<p>if ($r1) {</p>
<p>while ( $bytes = read( PARENT_ERR, $errbytes, 4096 ) ) {</p>
<p>print STDERR $errbytes;</p>
<p>}</p>
<p>if ($!) {</p>
<p>$err = $!;</p>
<p>die $!;</p>
<p>vec( $rin, fileno(PARENT_ERR), 1 ) = 0</p>
<p>unless ( $err == EINTR or $err == EAGAIN );</p>
<p>}</p>
<p>}</p>
<p>if ($r2) {</p>
<p>while ( $bytes = read( CHILD_O, $s, 4096 ) ) {</p>
<p>print $s;</p>
<p>}</p>
<p>if ( !defined($bytes) ) {</p>
<p>$err = $!;</p>
<p>die $!;</p>
<p>vec( $rin, fileno(CHILD_O), 1 ) = 0</p>
<p>unless ( $err == EINTR or $err == EAGAIN );</p>
<p>}</p>
<p>}</p>
<p>last if ( $e1 || $e2 );</p>
<p>}</p>
<p>close CHILD_RD;</p>
<p>close PARENT_ERR;</p>
<p>waitpid( $pid, 0 );</p>
<p>} else {</p>
<p>foreach $key ( keys %req_params ) {</p>
<p>$ENV{$key} = $req_params{$key};</p>
<p>}</p>
<p># cd to the script's local directory</p>
<p>if ( $req_params{SCRIPT_FILENAME} =~ /^(.*)\/[^\/]+$/ ) {</p>
<p>chdir $1;</p>
<p>}</p>
<p>close(PARENT_WR);</p>
<p>#close(PARENT_ERR);</p>
<p>close(STDIN);</p>
<p>close(STDERR);</p>
<p>#fcntl(CHILD_RD, F_DUPFD, 0);</p>
<p>syscall( &amp;SYS_dup2, fileno(CHILD_RD), 0 );</p>
<p>syscall( &amp;SYS_dup2, fileno(CHILD_ERR), 2 );</p>
<p>#open(STDIN, "&lt;&amp;CHILD_RD");</p>
<p>exec( $req_params{SCRIPT_FILENAME} );</p>
<p>die("exec failed");</p>
<p>}</p>
<p>} else {</p>
<p>print("Content-type: text/plain\r\n\r\n");</p>
<p>print</p>
<p>"Error: No such CGI app - $req_params{SCRIPT_FILENAME} may not exist or is not executable by this process.\n";</p>
<p>}</p>
<p>}</p>
<p>}</p>
<p>****************************************************************************</p>
<p>#chmod +x  /etc/init.d/perl-fast</p>
<p>#vi /etc/profile</p>
<p>添加以下内容</p>
<p>export FCGI_SOCKET_PATH="/tmp/perl-fastcgi.sock"</p>
<p>export FCGI_NPROCESSES=4</p>
<p>#source /etc/profile</p>
<p>#/etc/init.d/perl-fast&amp;</p>
<p>为Nginx添加FastCGI的Perl支持<br />
server {</p>
<p>listen       80;</p>
<p>server_name  mail.test5.com;</p>
<p>charset gb2312;</p>
<p>access_log  logs/access.log  main;</p>
<p>location / {</p>
<p>root   /share/htdocs;</p>
<p>index  index.php index.html;</p>
<p>}</p>
<p>location ~* .*\.pl$ {</p>
<p>root  /share/htdocs;</p>
<p>include perl.conf;</p>
<p>}</p>
<p>}</p>
<p>#vi perl.conf</p>
<p>--------------------------------------------------------------</p>
<p>fastcgi_pass  unix:/tmp/perl-fastcgi.sock;</p>
<p>fastcgi_index openwebmail.pl;</p>
<p>fastcgi_param SCRIPT_FILENAME  $document_root$fastcgi_script_name;</p>
<p>fastcgi_param QUERY_STRING     $query_string;</p>
<p>fastcgi_param REQUEST_METHOD   $request_method;</p>
<p>fastcgi_param CONTENT_TYPE     $content_type;</p>
<p>fastcgi_param CONTENT_LENGTH   $content_length;</p>
<p>fastcgi_param GATEWAY_INTERFACE  CGI/1.1;</p>
<p>fastcgi_param SERVER_SOFTWARE    nginx;</p>
<p>fastcgi_param SCRIPT_NAME        $fastcgi_script_name;</p>
<p>fastcgi_param REQUEST_URI        $request_uri;</p>
<p>fastcgi_param DOCUMENT_URI       $document_uri;</p>
<p>fastcgi_param DOCUMENT_ROOT      $document_root;</p>
<p>fastcgi_param SERVER_PROTOCOL    $server_protocol;</p>
<p>fastcgi_param REMOTE_ADDR        $remote_addr;</p>
<p>fastcgi_param REMOTE_PORT        $remote_port;</p>
<p>fastcgi_param SERVER_ADDR        $server_addr;</p>
<p>fastcgi_param SERVER_PORT        $server_port;</p>
<p>fastcgi_param SERVER_NAME        $server_name;</p>
<p>fastcgi_read_timeout 60;</p>
<p>--------------------------------------------------------------------<br />
重启nginx</p>
<p>#Kill -HUP `cat /var/run/nginx.pid`</p>
<p>参考：<a href="http://blog.chinaunix.net/u/14353/showart_1668580.html" target="_blank">http://blog.chinaunix.net/u/14353/showart_1668580.html</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.187299.com/archives/1247/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>nginx缓存cache的5种方案</title>
		<link>http://www.187299.com/archives/1208</link>
		<comments>http://www.187299.com/archives/1208#comments</comments>
		<pubDate>Wed, 16 Sep 2009 15:24:15 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Nginx]]></category>

		<guid isPermaLink="false">http://www.187299.com/?p=1208</guid>
		<description><![CDATA[http://server.jzxue.com/fuwuqijiqunyuanquan/200907/04-2316.html 貌似从来没有写过nginx的缓存功能，都是只看不分享，这是不好之习惯啊。 1、传统缓存之一（404） 这个办法是把nginx的404错误定向到后端，然后... ]]></description>
			<content:encoded><![CDATA[<p><a href="http://server.jzxue.com/fuwuqijiqunyuanquan/200907/04-2316.html" target="_blank">http://server.jzxue.com/fuwuqijiqunyuanquan/200907/04-2316.html</a><br />
貌似从来没有写过<a href="http://www.jzxue.com/tag/nginx/" target="_blank">nginx</a>的缓存功能，都是只看不分享，这是不好之习惯啊。</p>
<p>1、传统缓存之一（404）</p>
<p>这个办法是把nginx的404错误定向到后端，然后用proxy_store把后端返回的页面保存。</p>
<p>配置：</p>
<p>location / {<br />
root /home/html/;#主目录<br />
expires 1d;#网页的过期时间<br />
error_page 404 =200 /fetch$request_uri;#404定向到/fetch目录下<br />
}</p>
<p>location /fetch/ {#404定向到这里<br />
internal;#指明这个目录不能在外部直接访问到<br />
expires 1d;#网页的过期时间<br />
alias /home/html/;#虚拟目录文件系统地址要和locaion /一致，proxy_store会将文件保存到这目录下<br />
proxy_pass <a href="http://www.sudone.com/;#" target="_blank">http://www.sudone.com/;#</a>后端upstream地址，/fetch同时是一个代理<br />
proxy_set_header Accept-Encoding '';#让后端不要返回压缩（<a href="http://www.jzxue.com/tag/gzip/" target="_blank">gzip</a>或deflate）的内容，保存压缩后的内容会引发乱子。<br />
proxy_store on;#指定nginx将代理返回的文件保存<br />
proxy_temp_path /home/tmp;#临时目录，这个目录要和/home/html在同一个硬盘分区内<br />
}</p>
<p>使用的时候还有要注意是nginx要有权限往/home/tmp和/home/html下有写入文件的权限，在<a href="http://server.jzxue.com/linux/" target="_blank">linux</a>下nginx一般会配置成nobody用户运行，这样这两个目录就要chown nobody，设成nobody用户专用，当然也可以chmod 777，不过所有有经验的系统管理员都会建议不要随便使用777。</p>
<p>2、传统缓存之二（!-e）</p>
<p>原理和404跳转基本一致，但更简洁一些：</p>
<p>location / {<br />
root /home/html/;<br />
proxy_store on;<br />
proxy_set_header Accept-Encoding '';<br />
proxy_temp_path /home/tmp;<br />
if ( !-f $request_filename )<br />
{<br />
proxy_pass <a href="http://www.sudone.com/" target="_blank">http://www.sudone.com/</a>;<br />
}<br />
}</p>
<p>可以看到这个配置比404节约了不少代码，它是用!-f来判断请求的文件在文件系统上存不存在，不存在就proxy_pass到后端，返回同样是用proxy_store保存。</p>
<p>两种传统缓存都有着基本一样的优点和缺点：<br />
缺点1：不支持带参数的动态链接，比如read.php?id=1，因为nginx只保存文件 名，所以这个链接只在文件系统下保存为read.php，这样用户访问read.php?id=2时会返回不正确的结果。同时不支持 <a href="http://www.sudone.com/" target="_blank">http://www.sudone.com/</a>这种形式的首页和二级目录<a href="http://www.sudone.com/download/" target="_blank">http://www.sudone.com/download/</a>，因为 nginx非常老实，会将这样的请求照链接写入文件系统，而这个链接显然是一个目录，所以保存失败。这些情况都需要写rewrite才能正确保存。<br />
缺点2：nginx内部没有缓存过期和清理的任何机制，这些缓存的文件会永久性地保存在机器上，如果要缓存的东西非常多，那就会撑暴整个硬盘空间。为此可以使用一个shell脚本定期清理，同时可以撰写php等动态程序来做实时更新。<br />
缺点3：只能缓存200状态码，因此后端返回301/302/404等状态码都不会缓存，假如恰好有一个访问量很大的伪静态链接被删除，那就会不停穿透导致后端承载不小压力。<br />
缺点4：nginx不会自动选择内存或硬盘作为存储介质，一切由配置决定，当然在当前的操作系统里都会有操作系统级的文件缓存机制，所以存在硬盘上也不需要过分担心大并发读取造成的io性能问题。</p>
<p>nginx传统缓存的缺点也是它和squid等缓存软件的不同之特色，所以也可看作其优点。在生产应用中它常常用作和squid的搭档，squid 对于带?的链接往往无法阻挡，而nginx能将其访问拦住，例如：<a href="http://sudone.com/?" target="_blank">http://sudone.com/?</a>和<a href="http://sudone.com/%E5%9C%A8" target="_blank">http://sudone.com/在</a> squid上会被当做两个链接，所以会造成两次穿透；而nginx只会保存一次，无论链接变成<a href="http://sudone.com/?1" target="_blank">http://sudone.com/?1</a>还是http: //<a href="http://sudone.com/?123" target="_blank">sudone.com/?123</a>，均不能透过nginx缓存，从而有效地保护了后端主机。</p>
<p>nginx会非常老实地将链接形式保存到文件系统中，这样对于一个链接，可以很方便地查阅它在缓存机器上的缓存状态和内容，也可以很方便地和别的文件管理器如rsync等配合使用，它完完全全就是一个文件系统结构。</p>
<p>这两种传统缓存都可以在linux下将文件保存到/dev/shm里，一般我也是这么做的，这样可以利用系统内存来做缓存，利用内存的话，清理过期 内容速度就会快得多。使用/dev/shm/时除了要把tmp目录也指向到/dev/shm这个分区外，如果有大量小文件和目录，还要修改一下这个内存分 区的inode数量和最大容量：</p>
<p>mount -o size=2500M -o nr_inodes=480000 -o noatime,nodiratime -o remount /dev/shm</p>
<p>上面的命令在一台有3G内存的机器上使用，因为/dev/shm默认最大内存是系统内存的一半就是1500M，这条命令将其调大成2500M，同时 shm系统inode数量默认情况下可能是不够用的，但有趣的是它可以随意调节，这里调节为480000保守了点，但也基本够用了。</p>
<p>3、基于mem<a href="http://www.jzxue.com/tag/cache/" target="_blank">cache</a>d的缓存</p>
<p>nginx对<a href="http://www.jzxue.com/tag/memcache/" target="_blank">memcached</a>有所支持，但是功能并不是特别之强，性能上还是非常之优秀。</p>
<p>location /mem/ {<br />
if ( $uri ~ "^/mem/([0-9A-Za-z_]*)$" )<br />
{<br />
set $memcached_key "$1";<br />
memcached_pass     <a href="http://192.168.1.2:11211/" target="_blank">192.168.1.2:11211</a>;<br />
}<br />
expires 70;<br />
}</p>
<p>这个配置会将<a href="http://sudone.com/mem/abc" target="_blank">http://sudone.com/mem/abc</a>指明到memcached的abc这个key去取数据。</p>
<p>nginx目前没有写入memcached的任何机制，所以要往memcached里写入数据得用后台的动态语言完成，可以利用404定向到后端去写入数据。</p>
<p>4、基于第三方插件ncache</p>
<p>ncache是新浪兄弟开发的一个不错的项目，它利用nginx和memcached实现了一部分类似squid缓存的功能，我并没有使用这个插件的经验，可以参考：</p>
<p><a href="http://code.google.com/p/ncache/" target="_blank">http://code.google.com/p/ncache/</a></p>
<p>5、nginx新开发的proxy_cache功能</p>
<p>从nginx-0.7.44版开始，nginx支持了类似squid较为正规的cache功能，目前还处于开发阶段，支持相当有限，这个缓存是把链接用md5编码hash后保存，所以它可以支持任意链接，同时也支持404/301/302这样的非200状态。</p>
<p>配置：</p>
<p>首先配置一个cache空间：</p>
<p>proxy_cache_path /path/to/cache levels=1:2 keys_zone=NAME:10m inactive=5m max_size=2m clean_time=1m;</p>
<p>注意这个配置是在server标签外，levels指定该缓存空间有两层hash目录，第一层目录是1个字母，第二层为2个字母，保存的文件名就会 类似/path/to/cache/c/29/b7f54b2df7773722d382f4809d65029c；keys_zone为这个空间起个名 字，10m指空间大小为10MB；inactive的5m指缓存默认时长5分钟；max_size的2m是指单个文件超过2m的就不缓 存；clean_time指定一分钟清理一次缓存。</p>
<p>location / {<br />
proxy_pass <a href="http://www.sudone.com/" target="_blank">http://www.sudone.com/</a>;</p>
<p>proxy_cache NAME;#使用NAME这个keys_zone</p>
<p>proxy_cache_valid 200 302 1h;#200和302状态码保存1小时<br />
proxy_cache_valid 301 1d;#301状态码保存一天<br />
proxy_cache_valid any 1m;#其它的保存一分钟<br />
}</p>
<p>ps：支持cache的0.7.44到0.7.51这几个版本的稳定性均有问题，访问有些链接会出现错误，所以这几个版本最好不要在生产环境中使 用。nginx-0.7下目前所知较为稳定的版本是0.7.39。稳定版0.6.36版也是近期更新，如果在配置里没有使用到0.7的一些新标签新功能， 也可以使用0.6.36版。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.187299.com/archives/1208/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>一个简单的nginx加多个fastcgi的负载均衡配置过程</title>
		<link>http://www.187299.com/archives/1172</link>
		<comments>http://www.187299.com/archives/1172#comments</comments>
		<pubDate>Sat, 05 Sep 2009 01:16:59 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Nginx]]></category>

		<guid isPermaLink="false">http://www.187299.com/?p=1172</guid>
		<description><![CDATA[一台服务器（xeon 3210 ，4G内存），采用nginx+php(fpm)+xcache+mysql 的架构，运行一个纯动态的php+mysql的网站，经过不懈的优化，在160万pv下运行的很稳定，负载很平稳。但随着访问量的增长，cpu终于... ]]></description>
			<content:encoded><![CDATA[<p>一台服务器（xeon 3210 ，4G内存），采用nginx+php(fpm)+xcache+mysql 的架构，运行一个纯动态的php+mysql的网站，经过不懈的优化，在160万pv下运行的很稳定，负载很平稳。但随着访问量的增长，cpu终于还是在 250万pv的时候被大量的php-cgi进程给吃光了。由于网站的特性导致不能使用varnish等cache server。为了解决cpu不够用的问题，又不能把网站停掉，临时决定把一台闲置的服务器用上，做了个简单的负载均衡。把过程写下来备忘。<br />
服务器A(在用的服务器)：内网地址 192.168.0.1 运行 nginx mysql php(fpm) xcache<br />
服务器B：内网地址 192.168.0.2 运行 php(fpm) xcache</p>
<p>一。修改服务器B上的php(fpm)的访问权限<br />
默认情况下 php(fpm)监听在 127.0.0.1:9000 并且只允许来自 127.0.0.1的连接。为了能让内网其它机器访问，需要修改服务器B上的 php-fpm.conf中的两行配置。修改后的这两行如下：<br />
&lt;value name="listen_address"&gt;192.168.0.2:9000&lt;/value&gt;<br />
&lt;value name="allowed_clients"&gt;192.168.0.2&lt;/value&gt;<br />
然后重启服务器B上的php-fpm</p>
<p>二。修改服务器A上的mysql访问权限<br />
原来mysql只允许localhost连接的。为了让内网其它机器能够访问，需要修改mysql权限表中的相应用户的host字段，把localhost改成 %<br />
这里还有一个问题，默认的时候mysql启动时是不使用 skip-name-resolve选项的，这样的话，从服务器B上的连接会比较慢，因为mysql会对 192.168.0.2这个ip做dns反向查询，导致大量的从服务器B上的连接处于 login状态.....解决这个问题有两个办法，一是加入 skip-name-resolve参数重启mysql，二是在 /etc/hosts中加入一句 192.168.0.2 server2</p>
<p>三。把程序文件copy一份到服务器B，程序放置的路径，权限等要一致</p>
<p>四。接下来配置最关键的nginx.conf<br />
很简单<br />
原来对php的请求是直接交给 127.0.0.1:9000处理，现在要定义两台<br />
先在http段中加入下面一段<br />
upstream fastcgi {<br />
server 127.0.0.1:9000 weight=1;<br />
server 192.168.0.2:9000 weight=2;<br />
}<br />
然后把原来的 fastcgi_pass 127.0.0.1:9000;<br />
改为 fastcgi_pass fastcgi;<br />
重启nginx，看看服务器B的状态，cpu的使用率马上就上来了，而服务器A的cpu使用率和负载都下降了不少。</p>
<p>做这样的负载均衡，不需要什么复杂的配置，不影响原站点的访问。速度快，工作量少。还是有些可取之处的。</p>
<p>转载自：<a href="http://www.admin99.net/read.php/365.htm" target="_blank">http://www.admin99.net/read.php/365.htm</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.187299.com/archives/1172/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>有关nginx upstream的几种分配方式</title>
		<link>http://www.187299.com/archives/1169</link>
		<comments>http://www.187299.com/archives/1169#comments</comments>
		<pubDate>Sat, 05 Sep 2009 01:09:29 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Nginx]]></category>

		<guid isPermaLink="false">http://www.187299.com/?p=1169</guid>
		<description><![CDATA[nginx的upstream目前支持4种方式的分配 1、轮询（默认） 每个请求按时间顺序逐一分配到不同的后端服务器，如果后端服务器down掉，能自动剔除。 2、weight 指定轮询几率，weight和访问比率成正比... ]]></description>
			<content:encoded><![CDATA[<p>nginx的upstream目前支持4种方式的分配</p>
<p>1、轮询（默认）<br />
每个请求按时间顺序逐一分配到不同的后端服务器，如果后端服务器down掉，能自动剔除。<br />
2、weight<br />
指定轮询几率，weight和访问比率成正比，用于后端服务器性能不均的情况。<br />
3、ip_hash<br />
每个请求按访问ip的hash结果分配，这样每个访客固定访问一个后端服务器，可以解决session的问题。</p>
<p>4、fair（第三方）<br />
按后端服务器的响应时间来分配请求，响应时间短的优先分配。<br />
5、url_hash（第三方）<br />
按访问url的hash结果来分配请求，使每个url定向到同一个后端服务器，后端服务器为缓存时比较有效。</p>
<p>转载自：<a href="http://www.admin99.net/read.php/366.htm" target="_blank">http://www.admin99.net/read.php/366.htm</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.187299.com/archives/1169/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

