文章標簽 ‘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 標簽: , ,

無覓相關文章插件,快速提升流量

30选5怎么中奖