文章标签 ‘nginx’

关于nginx rewrtie的四种flag

2012年1月9日 没有评论

利用nginx的rewrite的指令,可以实现url的转向,对于rewrtie有四种不同的flag,分别是redirect、permanent、break和last。其中前两种是跳转型的flag,后两种是代理型。跳转型是指有客户端浏览器重新对新地址进行请求,代理型是在WEB服务器内部实现跳转的。

  • redirect:302跳转到rewrtie后面的地址。
  • permanent:301永久调整到rewrtie后面的地址,即当前地址已经永久迁移到新地址,一般是为了对搜索引擎友好。
  • last:将rewrite后的地址重新在server标签执行。
  • break:将rewrite后地址重新在当前的location标签执行。

使用root或proxy_pass指定源,last,break都可以,但是结果可能会有差别,后面用例子说明;使用alias指定源,必须使用last。假如有如下配置:

	location / {
	    root   /var/www/html;
	    index  index.html index.htm;
	    rewrite "/x/t.html" /y/t.html break;
	}

	location /y/ {
	    root  /var/www/html/other;
	}

当请求/x/t.html,符合rewrite规则,所以进行调整,调整的地址为/y/t.html,由于使用的flag是break,所以在“location /”中进行跳转,结果是/var/www/html/y/t.html。但如果flag为last,那么/y/t.html将在server标签中重新执行,由于存在一个“location /y/”,所以跳转被重新指定到“location /y/”标签,所以这个时候的结果为/var/www/html/other/y/t.html。

注意:使用last,如果配置不当,可能引起死循环。例如:

	location /x/ {
	    proxy_pass http://my_proxy;
	    rewrite "^/x/(.*)\.html$" /x/1.html last;
	}
分类: Linux, nginx 标签: , ,

nginx+tomcat配置负载均衡

2011年10月31日 没有评论

使用nginx做为前端服务器,tomcat作为后端服务器,通过一些简单的配置就可以达到tomcat集群的目的。一般情况下,只需要在nginx的配置文件nginx.conf进行如下配置即可。

http {
    upstream  tomcat-host{
        server 192.168.1.201:8080 weight=3;
        server 192.168.1.202:8080;
        ip_hash;
    }  

    server {
        listen 80;
        server_name www.domain.com;  

        location / {
            proxy_pass              http://tomcat-host;
            proxy_set_header        X-Real-IP $remote_addr;
            proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header        Host $http_host;
        }
    }
}

其中upstream是配置后端服务器列表、load balance的权重,ip_hash能够把来自同一个客户端的多次请求指派到某个固定的后端服务器,能一定程度的解决session问题,如果完美的解决集群后session问题,可以采用memcached的方式来处理。在server段配置中,主要就是proxy_pass,prxoy_pass目标地址就是上述设置的upstream名字,注意,不能缺少“http://”,proxy_set_header处理客户端的IP信息,由于前端是nginx,在tomcat的java应用中用request.getRemoteAddr(),得到的ip信息不再是客户端的ip,而是nginx服务器的ip,解决办法是需要修改java应用,大致可以使用如下代码:

String ip = request.getHeader("x-forwarded-for");

if (ip == null || "".equals(ip.trim())) {
	ip = request.getRemoteAddr();
} else {
	String[] ars = ip.split(",");
	ip = ars[ars.length-1].trim();
}

nginx+php上传大文件失败

2011年9月8日 没有评论

默认情况下,nginx允许客户端请求的最大的单个文件字节数为1M,就是说如果上传的文件超过1M就上传不了。可以人为修改这个参数,例如把下面代码放在http段,这样就可以上传10M以下的文件

client_max_body_size 10m;

另外限制上传文件大小配置在php.ini也有配置,默认是

post_max_size = 8M
upload_max_filesize = 2M

如果要上传大文件,可能也要相应调整这两个配置项。

nginx下wordpress的伪静态配置

2011年8月31日 没有评论

本来起初自己在nginx来配置转发规则,但有些连接转发有问题,后来在网上查了一下,原来借助nginx的try_files指令,只需要一行配置就可以搞定伪静态配置了。代码如下:

try_files $uri $uri/ /index.php?q=$uri&$args;

更多关于try_files的知识,参看:http://wiki.nginx.org/NginxHttpCoreModule#try_files

分类: Linux 标签: , ,

nginx中关于页面缓存的配置

2011年8月12日 3 条评论

根据nginx的文档,可以通过使用expires 指令来操作。

该指令会在响应的header信息中增加一个 Expires 和一个 Cache-Control: (如果时间是负数no-cache,反之max-age = * 为您指定时间的秒数)的信息.如果不想缓存某些页面,可以针对某些页面配置以下expires ,可以用 expires -1;使用这样就相当于为指定的资源在响应请求时在header中加了Cache-Control:no-cache 信息.

经过测试,在IE6和8下都能正常工作,即每次通过F5刷新,应答的状态码都为200,但是Firefox3.6、chrome下,F5刷新后看到的应答状态码为304,也就是说依然读取的是缓存信息,没有达到不缓存的目的,使用FireBug(好工具啊)查看响应的header信息中也有Cache-Control:no-cache,这问题让我困扰好一阵,在网上狂找一起,也没有发现到底是为什么。后来无意中在IE8下的httpwatcher5下看到了一个warnning信息,内容为:The ‘no-cache’ directive was used without the ‘no-store’ directive. Using ‘no-store’ ensures that Firefox will always re-fetch HTTP based pages and never use a previous version.从这个里面得到启示,然后再nginx中使用add_header增加一条add_header Cache-Control no-store指令,然后再测试,Firefox,chrome的应答都能不让客户端缓存。进一步测试,发现只要设置了no-store,不要no-cache,甚至 expires 时间为正数时都不会被缓存了。

add_header Cache-Control no-store

另外如果先前页面已经是缓存的,在nginx配置中设置了不缓存(no-store),也重启nginx服务器,在ie下,用F5刷新还是返回304,除非ctrl+F5应答才会是200,当然此后再F5依旧是200。如果要立即生效,最好是修改一下那个页面,让浏览器知道页面已经被更新,好重新获取页面内容。

 

分类: Linux 标签: , , ,

nginx+php-fmp 内存不释放

2011年8月11日 没有评论

由于服务器只有600M的内存,上面跑了一个并发并不是很大的php应用,当运行一段时间后,发现内存不断增长,其中一部分是PageCache的增长, 这个可以通过echo 3 > /proc/sys/vm/drop_caches 命令来进行有效的释放,另外一个应用内存的增长,且无法释放,通过top命名(输入命名后按m键可按进程占用内存大小的排序)查看,发现大部分内存都被 php-fpm 占用,网上查了一下,大概的意思是说,处理每个php请求完成后,php-fpm会回收内存,但不会释放给操作系统,从而导致大量的内存被php-fpm 占用。网上也提到解决方法,就是调整php-fpm.conf中的pm.max_requests值,pm.max_requests的作用是发送多少个 请求后会重启该线程,从而使其释放占用的内存,默认0,即决不重启。在我的应用把该值设置为250,观察一段时间后,发现还是有好几个php-fpm占用 内存的比例是2.8%左右,效果不理想,可能的原因是请求量大,还是无法达到这个阀值,将其设置为10的时候,发现php-fpm是会不断的重启的。个人 感觉这样配置不是太好,所有还是把这个值置为250,同时用一个脚本来进行杀掉php-fpm,从而释放他占用的内存,另外如果系统负载巨大,重启会导致 cpu的使用率飙升。脚本如下:
#!/bin/bash
log=/home/www/scripts/php-fpm.log
echo `date “+%F %H:%M:%S”` >> $log
for PID in `ps aux|grep php-fpm|grep -v grep|awk ‘{if($4>=1)print $2}’`
do
kill -9 $PID
echo $PID >> $log
done

可以把脚本加到crontab中让其定期执行.

另外记录几个长用的命令:
1、按顺序列出内存占用率的进程     ps -A –sort -rss -o comm,pmem,pcpu |uniq -c |head -15
2、指令vmstat可以监控内存使用情况,作为对内存监控,我们比较关心swpd、free、si、so。一般系统不繁忙的状态下,我们看到swpd,so的值不会持续很高,经常为0
3、通过pmap来查看进程占用内存的详细情况,例如,pmap 进程号

本 文参考了:http://blog.csdn.net/zouyongjin/article/details/6642157和http: //www.opsers.org/linux-home/server/php-fpm-on-analysis-of-system-resources.html

分类: Linux 标签: , ,

无觅相关文章插件,快速提升流量