新安装了0.7.59,发现了有新的东西:

[root@aslibra ~]# /Data/apps/nginx/sbin/nginx -h
nginx version: nginx/0.7.59
Usage: nginx [-?hvVt] [-s signal] [-c filename] [-p prefix] [-g directives]

Options:
  -?,-h         : this help
  -v            : show version and exit
  -V            : show version and configure options then exit
  -t            : test configuration and exit
  -s signal     : send signal to a master process: stop, quit, reopen, reload
  -p prefix     : set prefix path (default: /Data/apps/nginx/)
  -c filename   : set configuration file (default: conf/nginx.conf)
  -g directives : set global directives out of configuration file


以前没有-h的参数,今天尝试发现了 \(^o^)/~

重载配置可以使用 -s reload 多方便呀~
以前还得 kill -HUP `cat logs/nginx.pid` 麻烦东西
Tags:
记录一下nginx的统计信息的意义

location ~ ^/NginxStatus/ {
  stub_status on; #Nginx 状态监控配置
  access_log off;
}


首先我们定义了一个 location ~ ^/NginxStatus/,这样通过 http://localhost/NginxStatus/ 就可以监控到 Nginx 的运行信息,显示的内容如下:

引用
Active connections: 70
server accepts handled requests
14553819 14553819 19239266
Reading: 0 Writing: 3 Waiting: 67

      
NginxStatus 显示的内容意思如下:

active connections – 当前 Nginx 正处理的活动连接数。
server accepts handled requests -- 总共处理了 14553819 个连接 , 成功创建 14553819 次握手 ( 证明中间没有失败的 ), 总共处理了 19239266 个请求 ( 平均每次握手处理了 1.3 个数据请求 )。
reading -- nginx 读取到客户端的 Header 信息数。
writing -- nginx 返回给客户端的 Header 信息数。
waiting -- 开启 keep-alive 的情况下,这个值等于 active - (reading + writing),意思就是 Nginx 已经处理完正在等候下一次请求指令的驻留连接。

来自:使用 Nginx 提升网站访问速度
Tags:
Nginx有很强的代理功能,作为proxy很有优势,另外还可以把文件缓存到本地,实在是很不错的。
但可惜的是,默认没有文件过期控制,文件作为长期镜像是很不错的。

Nginx代理不需要下载到服务器端再发送,有进程下载完整内容了估计就可以保存到本地了,需要清理的话,下面有介绍简单的方法。Nginx的文件发送性能就不用担心了,很稳定高效。

详情参考:NginxHttpProxyModule

引用
proxy_store
syntax: proxy_store [on | off | path]

default: proxy_store off

context: http, server, location

This directive sets the path in which upstream files are stored. The parameter "on" preserves files in accordance with path specified in directives alias or root. The parameter "off" forbids storing. Furthermore, the name of the path can be clearly assigned with the aid of the line with the variables:

proxy_store   /data/www$original_uri;

The time of modification for the file will be set to the date of "Last-Modified" header in the response. To be able to safe files in this directory it is necessary that the path is under the directory with temporary files, given by directive proxy_temp_path for the data location.


也就是说的是可以缓存文件了,怎么做呢?
可以参考下面的代码片段:

upstream aslibra {
  server 123.45.67.89 ;
  server 123.45.67.8 backup;
}

proxy_store             on;
proxy_store_access      user:rw  group:rw  all:r;
proxy_temp_path /Data/webapps/proxy_tmp;
proxy_redirect off;

proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

server {
  expires       240h;
  server_name  www.aslibra.com;
  root    /Data/webapps/www.aslibra.com;
  location / {
    add_header      X-Cache   HIT;
    error_page           404 = @fetch;
  }

  location @fetch {
    internal;
    proxy_pass                      http://aslibra;
    proxy_next_upstream http_500;
    add_header      X-Cache   MISS;
    root                    /Data/webapps/www.aslibra.com;
  }
}


另外,文件要更新怎么办?那其实有两种方式解决文件过期的情况:
1 定时删除修改时间太旧的文件
2 PURGE方式直接删除

定时删除文件
下面是每2小时删除修改时间超过2天的文件

#clear cache pic
01 */2 * * * root find /Data/webapps/www.aslibra.com/ -type f -mtime +2 -print0 | xargs -0 -r rm >/dev/null 2>&1


PURGE方式删除

如果不是要求实时删除的话,可以有一种思路:
PURGE请求的(或者其它标识)记录日志,然后每10分钟分析日志,删除日志里面的文件,这样效率应该也是不错的~我没有做这个,我还是希望兼容PURGE,那怎么办呢?

那就交给fastcgi处理好了(注意,Nginx不支持cgi),比如:

location / {
  if ($request_method ~ "PURGE"){
    rewrite (.*) /purge.php last;
  }
  add_header      X-Cache   HIT;
  error_page           404 = @fetch;
}
location /purge.php
{
  internal;
  fastcgi_pass   127.0.0.1:9000;
  include        fastcgi_params;
  fastcgi_param  SCRIPT_FILENAME    /Data/www.aslibra.com/fastcgi$fastcgi_script_name;
}


这个就是把请求交给PHP了啦,PHP怎么写呢?
下面有个简单的例子:

<?
header('Cache-Control: max-age=0');
$uri = $_SERVER['REQUEST_URI'];
$doc_root = $_SERVER['DOCUMENT_ROOT'];

$file = $doc_root.$uri;
echo $file."\n";
if(is_file($file)){
  echo "File Clear...";
  @unlink($file);
}else{
  echo "File Not Found...";
}
?>


以上方式就兼容squid的PURGE方式了,很方便的~

另外说一下Ncache:

Ncache也是不错的项目,是新浪的公司项目。
测试过32位的版本,有不满意的地方:
1 文件缓存有不完整的情况
2 proxy_pass就触发此功能,不能使用proxy_store了,以上说的功能不兼容
3 发现多次 kill -HUP 导致死掉服务

与开发的负责人闲聊一些,听闻64位现在是主要维护对象,文件不完整情况应该做了改善,有兴趣的朋友可以试试
不过阿权没有64位的机器来测试了,我的都是32位的老机器啊,可怜~~
Tags: , , ,
最近尝试启用Nginx作为替代lighttpd的备选,尝试了服务的切换,但让我有点抓狂,location指令太扯了。

启用Nginx替代lighttpd有两个简单的理由:
1 lighttpd重启服务有中断,不管这是1秒还是半秒,这都会让正在连接的服务中断
2 lighttpd还没法支持日志里面记录cookie,很遗憾

其它方面,我觉得两者都差不多,但Nginx有主进程,理论上也比lighttpd要稳定些,记录cookie的方法见之前的文档《Nginx日志记录cookie》。

在转换lighttpd的服务的过程中,先看一下lighttpd的写法:

fastcgi.server = ( ".php" =>
      (( "host" => "127.0.0.1",
         "port" => 9000,
      ))
)
$HTTP["host"] == "www.aslibra.com" {
        server.document-root = "/Data/webapps/www.aslibra.com"
        url.rewrite-once = (
                "^/a" => "/script_a.php",
                "^/b" => "/script_b.php",
        )
        $HTTP["url"] =~ "^\/script_a" {
                accesslog.filename = "|/Data/apps/cronolog/sbin/cronolog /Data/weblog/%Y/%m/%d/a.%m%d%H"
        }
        $HTTP["url"] =~ "^\/script_b" {
                accesslog.filename = "|/Data/apps/cronolog/sbin/cronolog /Data/weblog/%Y/%m/%d/b.%m%d%H"
        }
}


前面是设置fastcgi服务器,后面是rewrite和分开记录日志,当然,rewrite可以简洁些的,这不改了

这一段改写为nginx的配置可以大概这么写:

server {
  listen       88;
  server_name www.aslibra.com;
  root   /Data/webapps/www.aslibra.com/;

  rewrite  ^/(a|b)  /script_$1.php;

  location ~* ^/script_a.php {
    fastcgi_pass  127.0.0.1:9000;
    access_log  /Data/log/nginx/sub.log  log_psc;
  }
  location ~* ^/script_b.php {
    fastcgi_pass  127.0.0.1:9000;
    access_log  /Data/log/nginx/start.log  log_psc;
  }
  location ~* .*\.php?$ {
    fastcgi_pass  127.0.0.1:9000;
  }
}


这里当然忽略了fastcgi的更多配置,那些可以在http段就设置好,这样在这里就不用设置了
使用nginx,要注意的是,很多指令是规定了在哪个指令里面的:

引用
rewrite
syntax: rewrite regex replacement flag
default: none
context: server, location, if


比如,rewrite是必须在server、location和if语句里面,在http里面无法编写默认的rewrite

令我抓狂的不是rewrite而是location,本来想着匹配顺序的,先把这些请求rewrite,然后分开记录日志,然后设置php的解析
结果居然没有运行php,直接返回php文件内容了。弄了很久才清楚,location只能匹配一个,所以上面location设置了日志后,下面正则处理php的就无效了,所以得在每个location里面都要完成所有的处理,麻烦啊

引用
To summarize, the order in which directives are checked is as follows:
1 Directives with the = prefix that match the query exactly. If found, searching stops.
2 All remaining directives with conventional strings. If this match used the ^~ prefix, searching stops.
3 Regular expressions, in the order they are defined in the configuration file.
4 If #3 yielded a match, that result is used. Otherwise, the match from #2 is used.


也就是说,找到一个最佳的location段的设置后,停止匹配,就是只会进入一个location段了。

上面的fastcgi_pass只能在 “location, if in location” 里面,所以这里必然要使用location段,只能每个location单独处理了。
access_log的设置只能在 http, server, location 里面,要分地址记录日志,那肯定得用location,if语句都不行,出错。另外,还不支持正则匹配出结果,要明文写好,不过好像也可以支持的,wiki有介绍,不过有一些限制。

在lighttpd里面,很多可以默认设置的内容在这里似乎还不太好处理,有点陌生的感觉,包含server的定义都不太好匹配,都是只是选择其中一个的,没有默认server,后面修改特殊定义的道理。
Nginx的配置就好像做程序一样,其实很好玩。

笔记一下:
server {
  listen       80;
  server_name  www.aslibra.com;
  set $aslibra_auth "";
  if ( $http_cookie ~* "aslibra_auth=(.+)(?:;|$)" ){
    set $aslibra_auth $1;
  }

  log_format main      '$proxy_add_x_forwarded_for - $remote_user [$time_local] '
           '"$request" $status $bytes_sent '
           '"$http_referer" "$http_user_agent" $aslibra_auth ';
  access_log  /Data/log/nginx-access.log  main;

  location / {
    root   /Data/webapps/www.aslibra.com/;
    index  index.html index.htm;
  }

  error_page   500 502 503 504  /50x.html;
  location = /50x.html {
      root   html;
  }

}


参考分割日志的脚本:

#!/bin/bash
log_dir="/Data/log"
time=`date +%Y%m%d`  
/bin/mv  ${log_dir}/nginx-access.log ${log_dir}/nginx-access.$time.log
kill -USR1 `cat  /var/run/nginx.pid`


Tags: ,
分页: 4/5 第一页 上页 1 2 3 4 5 下页 最后页 [ 显示模式: 摘要 | 列表 ]

阅读推荐

服务器相关推荐

开发相关推荐

应用软件推荐