nginx常用配置

server {
    listen 80;
    server_name afreelyrics.com www.afreelyrics.com;
    #host跳转到主域名
    if ($host != "afreelyrics.com") {
        rewrite ^(.*) http://afreelyrics.com$1 permanent;
    }
    access_log /var/log/nginx/afreelyrics.com/access.log;
    error_log /var/log/nginx/afreelyrics.com/error.log;
    root /srv/www_root/afreelyrics.com/web;

    #优先读取static目录下的静态页
    if (-f "${document_root}/static${uri}") {
        rewrite ^/(.*)$ /static/$uri break;
    }

    #lyrics detail,must befor artist detail
    rewrite ^/([^/]+)/([^/]+)\.html$ /index.php/lyrics/lyrics/$1/$2 break;

    #artist detail
    rewrite ^/([^/]+)\.html$ /index.php/artist/artist/$1 break;

    #search
    rewrite ^/s/([^/]*)/?$  /index.php/search/index/$1 break;
    rewrite ^/s-lyrics/([^/]+)(/|/(\d+)\.html?)?$ /index.php/search/lyrics/$1/$3 break;
    rewrite ^/s-artist/([^/]+)(/|/(\d+)\.html?)?$ /index.php/search/artist/$1/$3 break;

    #php
    if (!-e $request_filename) {
        rewrite ^/(.*)$ /index.php/$1 break;
    }

    location ~* \.(js|css|gif|jpeg|jpg|png|ico|bmp)$ {
        expires 3d;
        break;
    }
	
    include /etc/nginx/php.conf;
}

server {
    listen 80;
    server_name *.afreelyrics.com;
    return 404;
}

#php.conf
location ~* \.php($|/) {
    include /etc/nginx/fastcgi_params;
    fastcgi_pass 127.0.0.1:9000;
    fastcgi_param SCRIPT_FILENAME   $document_root$fastcgi_script_name;
    fastcgi_param SERVER_NAME       $server_name;
    fastcgi_param PATH_INFO         $fastcgi_script_name;
}

 

Cygwin安装nginx启用cgi并转为daemon模式

Cygwin安装nginx就不多说了,需要PCRE和zlib,我这安装的1.2.6版本,因为是windows环境,需要修改主配置worker_connections到64以下,超过64会报错,可以用如下方式解决。

  • 把ngx_select_module事件处理模块去掉,通过在执行configure时指定参数—without-select_module。
  • 修改nginx的配置文件(c:\nginx\conf\nginx.conf),把这个文件第13行的1024改为64(worker_connections指令的值)。
  • 在执行configure时指定额外的编译选项(--with-cc-opt=”-D FD_SETSIZE=2048”),这同样也可以解决上面的问题。

关键在于如何加载cgi,老外有个安装php-fpm的文章将的比较详细,也有翻译过来的,那个需要修改多个源码文件,文章具体地址我就懒的再找了,自己搜。这里不用php-fpm,php-cgi.exe就可以实现类似的功能,测试环境性能完全可以忽略了,php-cgi -b :9000 -c D:\Program Files\php-5.3.10-Win32-VC9-x86\php.ini 监听9000端口。 继续阅读

nginx try_files 判断文件存在

现在有这样一个需求,网站根目录下有静态文件,static目录下也有静态文件,static目录下的静态文件是程序批量生成的,我想让nginx在地址不变的前提下优先使用static目录里面的文件,如果不存在再使用根目录下的静态文件,比如访问首页http://example.com/index.html则nginx返回/static/index.html,如果不存在返回/index.html。

继续阅读

nginx %2F(/)自动解码问题

nginx 会对uri中的字符进行解码然后传递给fastCGI,一般情况下也无妨,偏偏我的搜索词中含有反斜杠,编码后的地址

/search/Madmanfoo%2fLovesong/

nginx传递给php的地址就变成了,我用的PATHINFO所以无法得到正确的结果

/search/Madmanfoo/Lovesong/

把nginx官网找了个遍也没找到阻止自动解码的配置,实在不想二次编码,从http://stackoverflow.com/questions/8264239/nginx-unescapes-2f-to-a-forward-slash-how-can-i-stop-it找到了一个类似的帖子,看样只能二次编码了,据说官方就是这么建议的。为了保持地址的美观只对影响PATHINFO的反斜杠进行了二次编码。

$keyword=urlencode($keyword);
$keyword=str_replace(array('%2F','%2f'),'%252F',$keyword);

如果有更好的解决办法欢迎指正。

通过http头设置http缓存

通过nginx可以设置http缓存

location ~* \.(js|css|gif|jpeg|jpg|png|ico|bmp)$ {
 expires 7d;
 access_log off;
 break;
}

用Chrome浏览器测试确实有缓存了,但是F5刷新接收到304之后还是会下载内容(和Ctrl+F5不同,Ctrl+F5会强制清除缓存并获取新内容,因为F5会发送If-Modified-Since和Ctrl+F5不会发送),用火狐浏览器测试接收到304之后并不下载实际文件内容(firebug时间线里面接收数据的部分所用时间是零),看样是浏览器之间的差异了。另外这样配置nginx的话在Chrome中图片缓存还是有问题,就下面这个截图我重新上传了之后(图片url和之前的图片一样)只有通过Ctrl+F5才会更新,Chrome对待js和img的方式不同。

通过PHP产生的JS也可以缓存

$content="var url={ base:'{$url['base']}',css:'{$url['css']}',js:'{$url['js']}',img:'{$url['img']}',image:'{$url['image']}',current:window.location};";
$expire=604800;
header('Content-type: application/x-javascript');
header('Cache-Control: max-age='.$expire);//1 month
//$now=gmmktime();
//header('Last-Modified: '.gmdate('D, d M Y H:i:s',$now-$expire).' GMT');
//header('Expires: '.gmdate('D, d M Y H:i:s', $now+$expire).' GMT');
header('Accept-Ranges: bytes');
header('Content-Length: '.strlen($content));
echo $content;

Accept-Ranges 和 Content-Length 也需要加上,头信息中如果不存在Content-Length 服务器端就会发送Tansfer-Encoding:chunked ,这个头信息的的意思是response的内容会被分成一块一块的发送,客户端不会等到内容都传输完毕了才解析其中的内容。如果指定了Content-Length 客户端会在接受完Content-Length长度的数据之后开始解析,这样就可以被缓存。

RFC上说Last-Modified和Expires 在这里被Cache-Control覆盖掉了,因为没仔细研究HTTP协议所以先放这。具体见撰写本文时的最新RFC2616直接搜索 Page 126 就看到了。