<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Skynet

    ---------- ---------- 我的新 blog : liukaiyi.cublog.cn ---------- ----------

      BlogJava :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
      112 Posts :: 1 Stories :: 49 Comments :: 0 Trackbacks

    2009年12月7日 #


    作者:NetSeek  http://www.linuxtone.org (IT運維專家網(wǎng)|集群架構(gòu)|性能調(diào)優(yōu))
    歡迎轉(zhuǎn)載,轉(zhuǎn)載時請務(wù)必以超鏈接形式標(biāo)明文章原始出處和作者信息及本聲明.
    首發(fā)時間: 2008-11-25     更新時間:2009-1-14

    目 錄
    一、        Nginx 基礎(chǔ)知識
    二、        Nginx 安裝及調(diào)試
    三、        Nginx Rewrite
    四、        Nginx Redirect
    五、        Nginx 目錄自動加斜線:
    六、        Nginx Location
    七、        Nginx expires
    八、        Nginx 防盜鏈
    九、        Nginx 訪問控制
    十、        Nginx日志處理
    十一、     Nginx Cache
    十二、     Nginx負(fù)載均衡
    十三、       Nginx簡單優(yōu)化      
    十四、        如何構(gòu)建高性能的LEMP環(huán)境
    十五、        Nginx服務(wù)監(jiān)控
    十六、        常見問題與錯誤處理.
    十七、        相關(guān)資源下載

    【前言】:
    編寫此技術(shù)指南在于推廣普及NGINX在國內(nèi)的使用,更方便的幫助大家了解和掌握NGINX的一些使用技巧。本指南很多技巧來自于網(wǎng)絡(luò)和工作中或網(wǎng)絡(luò)上朋友們問我的問題.在此對網(wǎng)絡(luò)上愿意分享的朋友們表示感謝和致意!歡迎大家和我一起豐富本技術(shù)指南提出更好的建議!請朋友們關(guān)注: http://www.linuxtone.org 技術(shù)分享社區(qū)! 互想學(xué)習(xí)共同進(jìn)步!

    一、 Nginx 基礎(chǔ)知識
    1、簡介
       Nginx ("engine x") 是一個高性能的 HTTP 和 反向代理 服務(wù)器,也是一個 IMAP/POP3/SMTP 代理服務(wù)器。 Nginx 是由 Igor Sysoev 為俄羅斯訪問量第二的 Rambler.ru 站點開發(fā)的,它已經(jīng)在該站點運行超過兩年半了。Igor 將源代碼以類BSD許可證的形式發(fā)布。盡管還是測試版,但是,Nginx 已經(jīng)因為它的穩(wěn)定性、豐富的功能集、示例配置文件和低系統(tǒng)資源的消耗而聞名了。
    更多的請見官方wiki: http://wiki.codemongers.com/

    2、 Nginx的優(yōu)點
    nginx做為HTTP服務(wù)器,有以下幾項基本特性:
    1)        處理靜態(tài)文件,索引文件以及自動索引;打開文件描述符緩沖.
    2)        無緩存的反向代理加速,簡單的負(fù)載均衡和容錯.
    3)        FastCGI,簡單的負(fù)載均衡和容錯.
    4)        模塊化的結(jié)構(gòu)。包括gzipping, byte ranges, chunked responses, 以及 SSI-filter等filter。如果由FastCGI或其它代理服務(wù)器處理單頁中存在的多個SSI,則這項處理可以并行運行,而不需要相互等待。
    5)        支持SSL 和 TLS SNI

    Nginx專為性能優(yōu)化而開發(fā),性能是其最重要的考量, 實現(xiàn)上非常注重效率 。它支持內(nèi)核Poll模型,能經(jīng)受高負(fù)載的考驗, 有報告表明能支持高達(dá) 50,000 個并發(fā)連接數(shù)。
    Nginx具有很高的穩(wěn)定性。其它HTTP服務(wù)器,當(dāng)遇到訪問的峰值,或者有人惡意發(fā)起慢速連接時,也很可能會導(dǎo)致服務(wù)器物理內(nèi)存耗盡頻繁交換,失去響應(yīng),只能重啟服務(wù)器。例如當(dāng)前apache一旦上到200個以上進(jìn)程,web響 應(yīng)速度就明顯非常緩慢了。而Nginx采取了分階段資源分配技術(shù),使得它的CPU與內(nèi)存占用率非常低。nginx官方表示保持10,000個沒有活動的連 接,它只占2.5M內(nèi)存,所以類似DOS這樣的攻擊對nginx來說基本上是毫無用處的。就穩(wěn)定性而言, nginx比lighthttpd更勝一籌。
    Nginx支持熱部署。它的啟動特別容易, 并且?guī)缀蹩梢宰龅?*24不間斷運行,即使運行數(shù)個月也不需要重新啟動。你還能夠在不間斷服務(wù)的情況下,對軟件版本進(jìn)行進(jìn)行升級。
    Nginx采用master-slave模型, 能夠充分利用SMP的優(yōu)勢,且能夠減少工作進(jìn)程在磁盤I/O的阻塞延遲。當(dāng)采用select()/poll()調(diào)用時,還可以限制每個進(jìn)程的連接數(shù)。
    Nginx 代碼質(zhì)量非常高,代碼很規(guī)范, 手法成熟, 模塊擴(kuò)展也很容易。特別值得一提的是強(qiáng)大的Upstream與Filter鏈。 Upstream為諸如reverse proxy, 與其他服務(wù)器通信模塊的編寫奠定了很好的基礎(chǔ)。而Filter鏈最酷的部分就是各個filter不必等待前一個filter執(zhí)行完畢。它可以把前一個 filter的輸出做為當(dāng)前filter的輸入,這有點像Unix的管線。這意味著,一個模塊可以開始壓縮從后端服務(wù)器發(fā)送過來的請求,且可以在模塊接收 完后端服務(wù)器的整個請求之前把壓縮流轉(zhuǎn)向客戶端。
    Nginx采用了一些os提供的最新特性如對sendfile (Linux 2.2+),accept-filter (FreeBSD 4.1+),TCP_DEFER_ACCEPT (Linux 2.4+) 的支持,從而大大提高了性能

    二、 Nginx 安裝及調(diào)試
    1、Pcre 安裝

    1. ./configure
    2.   make && make install
    3.   cd ../
    復(fù)制代碼

    2.        nginx 編譯安裝

    1. ./configure --user=www --group=www --prefix=/usr/local/nginx/ --with-http_stub_status_module --with-openssl=/usr/local/openssl
    2. make && make install
    復(fù)制代碼

    更詳細(xì)的模塊定制與安裝請參照官方wiki.

    3、Nginx 配置文件測試:

    1. # /usr/local/nginx/sbin/nginx -t  //Debug 配置文件的關(guān)鍵命令需要重點撐握.
    2. 2008/12/16 09:08:35 [info] 28412#0: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
    3. 2008/12/16 09:08:35 [info] 28412#0: the configuration file /usr/local/nginx/conf/nginx.conf was tested successfully
    復(fù)制代碼

    3、Nginx 啟動:

    1. # /usr/local/nginx/sbin/nginx
    復(fù)制代碼

    4、Nginx 配置文件修改重新加載:

    1. # kill -HUP `cat /usr/local/nginx/logs/nginx.pid
    復(fù)制代碼

    `
    三、Nginx Rewrite

    1.  Nginx Rewrite 基本標(biāo)記(flags)
    last - 基本上都用這個Flag。
    ※相當(dāng)于Apache里的[L]標(biāo)記,表示完成rewrite,不再匹配后面的規(guī)則
    break - 中止Rewirte,不再繼續(xù)匹配
    redirect - 返回臨時重定向的HTTP狀態(tài)302
    permanent - 返回永久重定向的HTTP狀態(tài)301
          ※原有的url支持正則  重寫的url不支持正則

    2.  正則表達(dá)式匹配,其中:
        * ~         為區(qū)分大小寫匹配
        * ~*       為不區(qū)分大小寫匹配
        * !~和!~*   分別為區(qū)分大小寫不匹配及不區(qū)分大小寫不匹配

    3. 文件及目錄匹配,其中:
       * -f和!-f用來判斷是否存在文件
        * -d和!-d用來判斷是否存在目錄
        * -e和!-e用來判斷是否存在文件或目錄
        * -x和!-x用來判斷文件是否可執(zhí)行


    3.  Nginx 的一些可用的全局變量,可用做條件判斷:

    1. $args
    2. $content_length
    3. $content_type
    4. $document_root
    5. $document_uri
    6. $host
    7. $http_user_agent
    8. $http_cookie
    9. $limit_rate
    10. $request_body_file
    11. $request_method
    12. $remote_addr
    13. $remote_port
    14. $remote_user
    15. $request_filename
    16. $request_uri
    17. $query_string
    18. $scheme
    19. $server_protocol
    20. $server_addr
    21. $server_name
    22. $server_port
    23. $uri
    復(fù)制代碼

    四、 Nginx Redirect
    將所有l(wèi)inuxtone.org與netseek.linuxtone.org域名全部自跳轉(zhuǎn)到http://www.linuxtone.org

    1. server
    2. {
    3. listen 80;
    4. server_name linuxtone.org netseek.linuxtone.org;
    5. index index.html index.php;
    6. root /data/www/wwwroot;
    7. if ($host !~ "^www.linxtone.org$") {
    8. rewrite ^(.*) http://www.linuxtone.org$1 redirect;
    9. }
    10. ........................
    11. }
    復(fù)制代碼

    五、 Nginx 目錄自動加斜線:

    1. if (-d $request_filename){
    2.            rewrite ^/(.*)([^/])$ http://$host/$1$2/ permanent;
    3.      }
    復(fù)制代碼

    六  Nginx Location

    1.基本語法:[和上面rewrite正則匹配語法基本一致]
    location [=|~|~*|^~] /uri/ { … }
        * ~  為區(qū)分大小寫匹配
        * ~* 為不區(qū)分大小寫匹配
        * !~和!~*分別為區(qū)分大小寫不匹配及不區(qū)分大小寫不匹配

    示例1:
    location = / {
    # matches the query / only.
    # 只匹配 / 查詢。
    }
    匹配任何查詢,因為所有請求都已 / 開頭。但是正則表達(dá)式規(guī)則和長的塊規(guī)則將被優(yōu)先和查詢匹配

    示例2:
    location ^~ /images/ {
    # matches any query beginning with /images/ and halts searching,
    # so regular expressions will not be checked.
    # 匹配任何已 /images/ 開頭的任何查詢并且停止搜索。任何正則表達(dá)式將不會被測試。

    示例3:
    location ~* .(gif|jpg|jpeg)$ {
    # matches any request ending in gif, jpg, or jpeg. However, all
    # requests to the /images/ directory will be handled by
    }
    # 匹配任何已 gif、jpg 或 jpeg 結(jié)尾的請求。


    七、 Nginx expires

    1.根據(jù)文件類型expires

    1. # Add expires header for static content
    2. location ~* .(js|css|jpg|jpeg|gif|png|swf)$ {
    3.     if (-f $request_filename) {
    4.        root /data/www/wwwroot/bbs;
    5.        expires      1d;
    6.        break;
    7.     }
    8. }
    復(fù)制代碼

    2、根據(jù)判斷某個目錄

    1. # serve static files
    2. location ~ ^/(images|javascript|js|css|flash|media|static)/  {
    3. root    /data/www/wwwroot/down;
    4.         expires 30d;
    5.   }
    復(fù)制代碼

    八、  Nginx 防盜鏈

    1.        針對不同的文件類型

    1. #Preventing hot linking of images and other file types
    2. location ~* ^.+.(gif|jpg|png|swf|flv|rar|zip)$ {
    3.         valid_referers none blocked server_names *.linuxtone.org linuxtone.org http://localhost baidu.com;
    4. if ($invalid_referer) {
    5.       rewrite   ^/   ;
    6.      # return   403;
    7.       }
    8. }
    復(fù)制代碼

    2.        針對不同的目錄

    1. location /img/ {
    2.     root /data/www/wwwroot/bbs/img/;
    3.     valid_referers none blocked server_names *.linuxtone.org http://localhost baidu.com;
    4.     if ($invalid_referer) {
    5.                    rewrite  ^/  ;
    6.                    #return   403;
    7.     }
    8. }
    復(fù)制代碼

    3.        同實現(xiàn)防盜鏈和expires的方法

    1. #Preventing hot linking of images and other file types
    2. location ~* ^.+.(gif|jpg|png|swf|flv|rar|zip)$ {
    3.         valid_referers none blocked server_names *.linuxtone.org linuxtone.org http://localhost ;
    4. if ($invalid_referer) {
    5.       rewrite   ^/   ;
    6.                      }
    7.      access_log off;
    8.      root /data/www/wwwroot/bbs;
    9. expires 1d;
    10.      break;
    11. }
    復(fù)制代碼

    九、 Nginx 訪問控制

    1.        Nginx 身份證驗證

    1. #cd /usr/local/nginx/conf
    2. #mkdir htpasswd
    3. /usr/local/apache2/bin/htpasswd -c /usr/local/nginx/conf/htpasswd/tongji linuxtone
    4. #添加用戶名為linuxtone
    5. New password:   (此處輸入你的密碼)
    6. Re-type new password:   (再次輸入你的密碼)
    7. Adding password for user
    8. http://count.linuxtone.org/tongji/data/index.html(目錄存在/data/www/wwwroot/tongji/data/目錄下)
    9. 將下段配置放到虛擬主機(jī)目錄,當(dāng)訪問http://count.linuxtone/tongji/即提示要密驗證:
    10. location ~ ^/(tongji)/  {
    11.                 root    /data/www/wwwroot/count;
    12.                         auth_basic              "LT-COUNT-TongJi";
    13.                         auth_basic_user_file  /usr/local/nginx/conf/htpasswd/tongji;
    14.                 }
    復(fù)制代碼

    2.        Nginx 禁止訪問某類型的文件.
    如,Nginx下禁止訪問*.txt文件,配置方法如下.

    1. location ~* .(txt|doc)$ {
    2.    if (-f $request_filename) {
    3.    root /data/www/wwwroot/linuxtone/test;
    4.    #rewrite …..可以重定向到某個URL
    5.    break;
    6.    }
    7. }
    復(fù)制代碼

    方法2:

    1. location ~* .(txt|doc)${
    2.         root /data/www/wwwroot/linuxtone/test;
    3.         deny all;
    4. }
    復(fù)制代碼

    實例:
    禁止訪問某個目錄

    1. location ~ ^/(WEB-INF)/ {
    2.             deny all;
    3. }  
    復(fù)制代碼

    3.        使用ngx_http_access_module限制ip訪問

    1. location / {
    2.     deny    192.168.1.1;
    3.     allow   192.168.1.0/24;
    4.     allow   10.1.1.0/16;
    5.     deny    all;
    6. }
    復(fù)制代碼

    詳細(xì)參見wiki: http://wiki.codemongers.com/NginxHttpAccessModule#allow

    4.        Nginx 下載限制并發(fā)和速率

    1. limit_zone   linuxtone  $binary_remote_addr  10m;
    2. server
    3.        {
    4.                listen       80;
    5.                server_name  down.linuxotne.org;
    6.                index index.html index.htm index.php;
    7.                root   /data/www/wwwroot/down;
    8.                #Zone limit
    9.                location / {
    10.                    limit_conn   linuxtone  1;
    11.                    limit_rate  20k;
    12.                }
    13. ..........
    14.        }
    復(fù)制代碼

    只允許客房端一個線程,每個線程20k.
    【注】limit_zone   linuxtone  $binary_remote_addr  10m; 這個可以定義在主的


    5.        Nginx 實現(xiàn)Apache一樣目錄列表

    1. location  /  {
    2.     autoindex  on;
    3. }
    復(fù)制代碼

    6.        上文件大小限制
    主配置文件里加入如下,具體大小根據(jù)你自己的業(yè)務(wù)做調(diào)整。
    client_max_body_size 10m;                                                         

    十、        Nginx 日志處理

    1.Nginx 日志切割
    #contab -e
    59 23 * * * /usr/local/sbin/logcron.sh /dev/null 2>&1
    [root@count ~]# cat /usr/local/sbin/logcron.sh

    1. #!/bin/bash
    2. log_dir="/data/logs"
    3. time=`date +%Y%m%d`  
    4. /bin/mv  ${log_dir}/access_linuxtone.org.log ${log_dir}/access_count.linuxtone.org.$time.log
    5. kill -USR1 `cat  /var/run/nginx.pid`
    復(fù)制代碼

    更多的日志分析與處理就關(guān)注(同時歡迎你參加討論):http://bbs.linuxtone.org/forum-8-1.html

    2.利用AWSTATS分析NGINX日志
      設(shè)置好Nginx日志格式,仍后利用awstats進(jìn)行分析.
    請參考: http://bbs.linuxtone.org/thread-56-1-1.html

    3.        Nginx 如何不記錄部分日志
    日志太多,每天好幾個G,少記錄一些,下面的配置寫到server{}段中就可以了
    location ~ .*.(js|jpg|JPG|jpeg|JPEG|css|bmp|gif|GIF)$
    {
         access_log off;
    }

    十一、Nginx Cache服務(wù)配置

    如果需要將文件緩存到本地,則需要增加如下幾個子參數(shù):

    1. proxy_store on;
    2. proxy_store_access user:rw group:rw all:rw;
    3. proxy_temp_path 緩存目錄;
    復(fù)制代碼

    其中,
    proxy_store on用來啟用緩存到本地的功能,
    proxy_temp_path用來指定緩存在哪個目錄下,如:proxy_temp_path html;

    在經(jīng)過上一步配置之后,雖然文件被緩存到了本地磁盤上,但每次請求仍會向遠(yuǎn)端拉取文件,為了避免去遠(yuǎn)端拉取文件,必須修改

    1. proxy_pass:
    2. if ( !-e $request_filename) {
    3.     proxy_pass  http://mysvr;
    4. }
    復(fù)制代碼

    即改成有條件地去執(zhí)行proxy_pass,這個條件就是當(dāng)請求的文件在本地的proxy_temp_path指定的目錄下不存在時,再向后端拉取。

       
    更多更高級的應(yīng)用可以研究ncache,詳細(xì)請參照http://bbs.linuxtone.org 里ncache相關(guān)的貼子.

    十二、Nginx 負(fù)載均衡
    1. Nginx 負(fù)載均衡基礎(chǔ)知識
    nginx的upstream目前支持4種方式的分配
    1)、輪詢(默認(rèn))
    每個請求按時間順序逐一分配到不同的后端服務(wù)器,如果后端服務(wù)器down掉,能自動剔除。
    2)、weight
    指定輪詢幾率,weight和訪問比率成正比,用于后端服務(wù)器性能不均的情況。
    2)、ip_hash
    每個請求按訪問ip的hash結(jié)果分配,這樣每個訪客固定訪問一個后端服務(wù)器,可以解決session的問題。
    3)、fair(第三方)
    按后端服務(wù)器的響應(yīng)時間來分配請求,響應(yīng)時間短的優(yōu)先分配。
    4)、url_hash(第三方)

    2.        Nginx 負(fù)載均衡實例1

    1. upstream bbs.linuxtone.org {#定義負(fù)載均衡設(shè)備的Ip及設(shè)備狀態(tài)
    2.     server 127.0.0.1:9090 down;
    3.     server 127.0.0.1:8080 weight=2;
    4.     server 127.0.0.1:6060;
    5.     server 127.0.0.1:7070 backup;
    6. }
    復(fù)制代碼

    在需要使用負(fù)載均衡的server中增加
    proxy_pass http://bbs.linuxtone.org/;

    每個設(shè)備的狀態(tài)設(shè)置為:
    a)        down 表示單前的server暫時不參與負(fù)載
    b)        weight 默認(rèn)為1.weight越大,負(fù)載的權(quán)重就越大。
    c)        max_fails :允許請求失敗的次數(shù)默認(rèn)為1.當(dāng)超過最大次數(shù)時,返回proxy_next_upstream 模塊定義的錯誤
    d)        fail_timeout:max_fails次失敗后,暫停的時間。
    e)        backup: 其它所有的非backup機(jī)器down或者忙的時候,請求backup機(jī)器。所以這臺機(jī)器壓力會最輕。

    nginx支持同時設(shè)置多組的負(fù)載均衡,用來給不用的server來使用。

    client_body_in_file_only 設(shè)置為On 可以講client post過來的數(shù)據(jù)記錄到文件中用來做debug
    client_body_temp_path 設(shè)置記錄文件的目錄 可以設(shè)置最多3層目錄
    location 對URL進(jìn)行匹配.可以進(jìn)行重定向或者進(jìn)行新的代理 負(fù)載均衡


    3.        Nginx 負(fù)載均衡實例 2
    按訪問url的hash結(jié)果來分配請求,使每個url定向到同一個后端服務(wù)器,后端服務(wù)器為緩存時比較有效,也可以用作提高Squid緩存命中率.

    簡單的負(fù)載均等實例:
    #vi nginx.conf  //nginx主配置文件核心配置

    1. ……….
    2. #loadblance my.linuxtone.org
    3.        upstream  my.linuxtone.org  {
    4.        ip_hash;
    5.        server   127.0.0.1:8080;
    6.        server   192.168.169.136:8080;
    7.        server   219.101.75.138:8080;
    8.        server   192.168.169.117;
    9.        server   192.168.169.118;
    10.        server   192.168.169.119;
    11.      }
    12. …………..
    13. include          vhosts/linuxtone_lb.conf;
    14. ………
    15. # vi proxy.conf
    16. proxy_redirect off;
    17. proxy_set_header Host $host;
    18. proxy_set_header X-Real-IP $remote_addr;
    19. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    20. client_max_body_size 50m;
    21. client_body_buffer_size 256k;
    22. proxy_connect_timeout 30;
    23. proxy_send_timeout 30;
    24. proxy_read_timeout 60;
    25. proxy_buffer_size 4k;
    26. proxy_buffers 4 32k;
    27. proxy_busy_buffers_size 64k;
    28. proxy_temp_file_write_size 64k;
    29. proxy_next_upstream error timeout invalid_header http_500 http_503 http_404;
    30. proxy_max_temp_file_size 128m;
    31. proxy_store on;
    32. proxy_store_access   user:rw  group:rw  all:r;
    33. #nginx cache               
    34. #client_body_temp_path  /data/nginx_cache/client_body 1 2;
    35. proxy_temp_path /data/nginx_cache/proxy_temp 1 2;
    復(fù)制代碼

    #vi  linuxtone_lb.conf

    1. server
    2.     {
    3.         listen  80;
    4.         server_name my.linuxtone.org;
    5.         index index.php;
    6.         root /data/www/wwwroot/mylinuxtone;
    7.         if (-f $request_filename) {
    8.             break;
    9.            }
    10.         if (-f $request_filename/index.php) {
    11.           rewrite (.*) $1/index.php break;
    12.         }
    13.         error_page 403 http://my.linuxtone.org/member.php?m=user&a=login;
    14.         location / {
    15.            if ( !-e $request_filename) {
    16.                proxy_pass http://my.linuxtone.org;
    17.                break;
    18.            }
    19.            include /usr/local/nginx/conf/proxy.conf;
    20.         }
    21. }
    復(fù)制代碼



    十三、Nginx簡單優(yōu)化


    1.        減小nginx編譯后的文件大小 (Reduce file size of nginx)
    默認(rèn)的nginx編譯選項里居然是用debug模式(-g)的(debug模式會插入很多跟蹤和ASSERT之類),編譯以后一個nginx有好幾兆。去掉nginx的debug模式編譯,編譯以后只有幾百K
    在 auto/cc/gcc,最后幾行有:
    # debug

    1. CFLAGS=”$CFLAGS -g”
    復(fù)制代碼

    注釋掉或刪掉這幾行,重新編譯即可。

    2.        修改Nginx的header偽裝服務(wù)器
    1)        修改nginx.h

    1. #vi nginx-0.7.30/src/core/nginx.h
    2. #define NGINX_VERSION      "1.8"
    3. #define NGINX_VER          "LTWS/" NGINX_VERSION
    4. #define NGINX_VAR          "NGINX"
    5. #define NGX_OLDPID_EXT     ".oldbin"
    復(fù)制代碼

    2) 修改nginx_http_header_filter_module
    #vi nginx-0.7.30/src/http/ngx_http_header_filter_module.c
    將如下

    1. static char ngx_http_server_string[] = "Server: nginx" CRLF;
    復(fù)制代碼

    修改為

    1. static char ngx_http_server_string[] = "Server: LTWS" CRLF;
    復(fù)制代碼

    a)        修改nginx_http_header_filter_module
    #vi nginx-0.7.30/src/http/ngx_http_special_response.c
    將如下:

    1. static u_char ngx_http_error_full_tail[] =
    2. "<hr><center>" NGINX_VER "</center>" CRLF
    3. "</body>" CRLF
    4. "</html>" CRLF
    5. ;
    復(fù)制代碼
    1. static u_char ngx_http_error_tail[] =
    2. "<hr><center>nginx</center>" CRLF
    3. "</body>" CRLF
    4. "</html>" CRLF
    5. ;
    復(fù)制代碼

    修改為:

    1. static u_char ngx_http_error_full_tail[] =
    2. "<center> "NGINX_VER" </center>" CRLF
    3. "<hr><center>http://www.linuxtone.org</center>" CRLF
    4. "</body>" CRLF
    5. "</html>" CRLF
    6. ;
    7. static u_char ngx_http_error_tail[] =
    8. "<hr><center>LTWS</center>" CRLF
    9. "</body>" CRLF
    10. "</html>" CRLF
    11. ;
    復(fù)制代碼

    修改后重新編譯一下環(huán)境,
    404錯誤的時候顯示效果圖(如果沒有指定錯誤頁的話):
    404.png

    利用curl命令查看服務(wù)器header
    curl.png



     

    3.為特定的CPU指定CPU類型編譯優(yōu)化.
    默認(rèn)nginx使用的GCC編譯參數(shù)是-O
    需要更加優(yōu)化可以使用以下兩個參數(shù)
    --with-cc-opt='-O3'
    --with-cpu-opt=opteron
    使得編譯針對特定CPU以及增加GCC的優(yōu)化.
    此方法僅對性能有所改善并不會有很大的性能提升,供朋友們參考.
    CPUD類型確定: # cat /proc/cpuinfo | grep "model name"
    編譯優(yōu)化參數(shù)參考:http://en.gentoo-wiki.com/wiki/Safe_Cflags


    4.Tcmalloc優(yōu)化Nginx 性能

    1. # wget http://download.savannah.gnu.org/releases/libunwind/libunwind-0.99-alpha.tar.gz
    2. # tar zxvf libunwind-0.99-alpha.tar.gz
    3. # cd libunwind-0.99-alpha/
    4. # CFLAGS=-fPIC ./configure
    5. # make CFLAGS=-fPIC
    6. # make CFLAGS=-fPIC install
    7. # wget http://google-perftools.googlecode.com/files/google-perftools-0.98.tar.gz
    8. # tar zxvf google-perftools-0.98.tar.gz
    9. # cd google-perftools-0.98/
    10. # ./configure
    11. # make && make install
    12. # echo "/usr/local/lib" > /etc/ld.so.conf.d/usr_local_lib.conf
    13. # ldconfig
    14. # lsof -n | grep tcmalloc
    復(fù)制代碼

    編譯nginx 加載google_perftools_module:
    ./configure --with-google_perftools_module
    在主配置文件加入nginx.conf 添加:
    google_perftools_profiles /path/to/profile;

    5.內(nèi)核參數(shù)優(yōu)化
    # vi /etc/sysctl.conf   #在末尾增加以下內(nèi)容:

    1. net.ipv4.tcp_fin_timeout = 30
    2. net.ipv4.tcp_keepalive_time = 300
    3. net.ipv4.tcp_syncookies = 1
    4. net.ipv4.tcp_tw_reuse = 1
    5. net.ipv4.tcp_tw_recycle = 1
    6. net.ipv4.ip_local_port_range = 5000 65000
    復(fù)制代碼

    #使配置立即生效
    /sbin/sysctl -p

    十四、如何構(gòu)建高性的LEMP
    請參見: http://www.linuxtone.org/lemp/lemp.pdf
    1、提供完整的配置腳本下載:http://www.linuxtone.org/lemp/scripts.tar.gz
    2、提供NGINX常見配置范例含(虛擬主機(jī),防盜鏈,Rewrite,訪問控制,負(fù)載均衡
    Discuz相關(guān)程序靜態(tài)化及等等),你只要稍稍修改即可線上應(yīng)用。 3、將原版的xcache替換成EA,并提供相關(guān)簡單調(diào)優(yōu)腳本及配置文件。
    更多的及更新資料請關(guān)注: http://www.linuxtone.org

    十五、Nginx監(jiān)控
    1、        RRDTOOL+Perl腳本畫圖監(jiān)控
    先安裝好rrdtool ,關(guān)于rrdtool本文不作介紹,具體安裝請參照linuxtone監(jiān)控版塊.
    #cd /usr/local/sbnin
    #wget http://blog.kovyrin.net/files/mrtg/rrd_nginx.pl.txt
    #mv rrd_nginx.pl.txt rrd_nginx.pl
    #chmod a+x rrd_nginx.pl

    #vi rrd_nginx.pl   //配置腳本文件設(shè)置好路徑
    #!/usr/bin/perl
    use RRDs;
    use LWP::UserAgent;

    # define location of rrdtool databases
    my $rrd = '/data/www/wwwroot/nginx/rrd';
    # define location of images
    my $img = '/data/www/wwwroot/nginx/html';
    # define your nginx stats URL
    my $URL = "http://219.232.244.13/nginx_status";
    …………
    【注】根據(jù)自己具體的狀況修改相應(yīng)的路徑.
    #crontab –e //加入如下
    * * * * * /usr/local/sbin/rrd_nginx.pl
    重啟crond后,通過配置nginx虛擬主機(jī)指到/data/www/wwwroot/nginx/html目錄,通過crond自動執(zhí)行perl腳本會生成很多圖片.
    http://xxx/connections-day.png即可看到服務(wù)器狀態(tài)圖。

    2、        官方Nginx-rrd 監(jiān)控服務(wù)(多虛擬主機(jī))(推薦)
    網(wǎng)址:http://www.nginx.eu/nginx-rrd.html
    此解決方案其實是基于上述監(jiān)控方案的一個改進(jìn)和增強(qiáng),同樣先安裝好rrdtool這個畫圖工具和相應(yīng)的perl模塊再做如下操作:
    # yum install perl-HTML*
    先建立好生成的庫存和圖片存放錄

    1. #mkdir -p /data/www/wwwroot/nginx/{rrd,html}
    2. #cd /usr/local/sbin
    3. #wget http://www.nginx.eu/nginx-rrd/nginx-rrd-0.1.4.tgz
    4. #tar zxvf nginx-rrd-0.1.4.tgz
    5. #cd nginx-rrd-0.1.4
    6. #cd etc/
    7. #cp nginx-rrd.conf /etc
    8. #cd etc/cron.d
    9. #cp nginx-rrd.cron /etc/cron.d
    10. #cd /usr/local/src/nginx-rrd-0.1.4/html
    11. # cp index.php /data/www/wwwroot/nginx/html/
    12. #cd /usr/local/src/nginx-rrd-0.1.4/usr/sbin
    13. #cp * /usr/sbin/
    復(fù)制代碼

    #vi /etc/nginx-rrd.conf

    1. #####################################################
    2. #
    3. # dir where rrd databases are stored
    4. RRD_DIR="/data/www/wwwroot/nginx/rrd";
    5. # dir where png images are presented
    6. WWW_DIR="/data/www/wwwroot/nginx/html";
    7. # process nice level
    8. NICE_LEVEL="-19";
    9. # bin dir
    10. BIN_DIR="/usr/sbin";
    11. # servers to test
    12. # server_utl;server_name
    13. SERVERS_URL="http://219.32.205.13/nginx_status;219.32.205.13  http://www.linuxtone.org/nginx_status;www.linuxtone.org""
    復(fù)制代碼

    //根據(jù)你的具體情況做調(diào)整.
    SEVERS_URL 格式 http://domain1/nginx_status;domain1 http://domain2/nginx_status;domain2
    這種格式監(jiān)控多虛擬主機(jī)連接狀態(tài):
    重點啟crond服務(wù),仍后通過http://219.32.205.13/nginx/html/ 即可訪問。配置過程很簡單!

    3、        CACTI模板監(jiān)控Nginx
    利用Nginx_status狀態(tài)來畫圖實現(xiàn)CACTI監(jiān)控
    nginx編譯時允許http_stub_status_module

    # vi /usr/local/nginx/conf/nginx.conf

    1. location /nginx_status {
    2. stub_status on;
    3. access_log off;
    4. allow 192.168.1.37;
    5. deny all;
    6. }
    復(fù)制代碼
    1. # kill -HUP `cat /usr/local/nginx/logs/nginx.pid`
    2. # wget http://forums.cacti.net/download.php?id=12676
    3. # tar xvfz cacti-nginx.tar.gz
    4. # cp cacti-nginx/get_nginx_socket_status.pl /data/cacti/scripts/
    5. # cp cacti-nginx/get_nginx_clients_status.pl /data/cacti/scripts/
    6. # chmod 755 /data/cacti/scripts/get_nginx*
    復(fù)制代碼

    檢測插件

    1. # /data/cacti/scripts/get_nginx_clients_status.pl http://192.168.1.37/nginx_status
    復(fù)制代碼

    在cacti管理面板導(dǎo)入
    cacti_graph_template_nginx_clients_stat.xml
    cacti_graph_template_nginx_sockets_stat.xml

    十六、常見問題與錯誤處理
    1、400 bad request錯誤的原因和解決辦法
    配置nginx.conf相關(guān)設(shè)置如下.
    client_header_buffer_size 16k;
    large_client_header_buffers 4 64k;
    根據(jù)具體情況調(diào)整,一般適當(dāng)調(diào)整值就可以。

    2、Nginx 502 Bad Gateway錯誤
    proxy_next_upstream error timeout invalid_header http_500 http_503;
    或者嘗試設(shè)置:
    large_client_header_buffers 4 32k;


    3、Nginx出現(xiàn)的413 Request Entity Too Large錯誤
    這個錯誤一般在上傳文件的時候會出現(xiàn),
    編輯Nginx主配置文件Nginx.conf,找到http{}段,添加
    client_max_body_size 10m; //設(shè)置多大根據(jù)自己的需求作調(diào)整.
    如果運行php的話這個大小client_max_body_size要和php.ini中的如下值的最大值一致或者稍大,這樣就不會因為提交數(shù)據(jù)大小不一致出現(xiàn)的錯誤。
    post_max_size = 10M
    upload_max_filesize = 2M

    4、解決504 Gateway Time-out(nginx)
    遇到這個問題是在升級discuz論壇的時候遇到的
    一般看來, 這種情況可能是由于nginx默認(rèn)的fastcgi進(jìn)程響應(yīng)的緩沖區(qū)太小造成的, 這將導(dǎo)致fastcgi進(jìn)程被掛起, 如果你的fastcgi服務(wù)對這個掛起處理的不好, 那么最后就極有可能導(dǎo)致504 Gateway Time-out
    現(xiàn)在的網(wǎng)站, 尤其某些論壇有大量的回復(fù)和很多內(nèi)容的, 一個頁面甚至有幾百K。
    默認(rèn)的fastcgi進(jìn)程響應(yīng)的緩沖區(qū)是8K, 我們可以設(shè)置大點
    在nginx.conf里, 加入: fastcgi_buffers 8 128k
    這表示設(shè)置fastcgi緩沖區(qū)為8×128k
    當(dāng)然如果您在進(jìn)行某一項即時的操作, 可能需要nginx的超時參數(shù)調(diào)大點,例如設(shè)置成60秒:send_timeout 60;
    只是調(diào)整了這兩個參數(shù), 結(jié)果就是沒有再顯示那個超時, 可以說效果不錯, 但是也可能是由于其他的原因, 目前關(guān)于nginx的資料不是很多, 很多事情都需要長期的經(jīng)驗累計才有結(jié)果, 期待您的發(fā)現(xiàn)哈!

    5、如何使用Nginx Proxy
    朋友一臺服務(wù)器運行tomcat 為8080端口,IP:192.168.1.2:8080,另一臺機(jī)器IP:192.168.1.8. 朋友想通過訪問http://192.168.1.8即可訪問tomcat服務(wù).配置如下:
    在192.168.1.8的nginx.conf上配置如下:

    1. server {
    2. listen 80;
    3. server_name java.linuxtone.org
    4. location / {
    5. proxy_pass http://192.168.1.2:8080;
    6. include /usr/local/nginx/conf/proxy.conf;
    7. }
    8. }
    復(fù)制代碼

    6、如何關(guān)閉Nginx的LOG
    access_log /dev/null; error_log /dev/null;

    十七、相關(guān)資源下載

    1.nginx配置示例及腳本下載:
    # wget http://www.linuxtone.org/lemp/scripts.tar.gz #此腳本范例定期更新.


    相關(guān)話題 (查看更多知識庫搜索

    其中以下這項挺值得留意的。
    Tcmalloc 不單可用于 Mysql 的優(yōu)化,還能應(yīng)用于 Nginx
    雖說 Nginx 本身的性能跟系統(tǒng)占用已經(jīng)做到很優(yōu)秀。

    4.Tcmalloc優(yōu)化Nginx 性能

    1. # wget http://download.savannah.gnu.org/releases/libunwind/libunwind-0.99-alpha.tar.gz
    2. # tar zxvf libunwind-0.99-alpha.tar.gz
    3. # cd libunwind-0.99-alpha/
    4. # CFLAGS=-fPIC ./configure
    5. # make CFLAGS=-fPIC
    6. # make CFLAGS=-fPIC install
    7. # wget http://google-perftools.googlecode.com/files/google-perftools-0.98.tar.gz
    8. # tar zxvf google-perftools-0.98.tar.gz
    9. # cd google-perftools-0.98/
    10. # ./configure
    11. # make && make install
    12. # echo "/usr/local/lib" > /etc/ld.so.conf.d/usr_local_lib.conf
    13. # ldconfig
    14. # lsof -n | grep tcmalloc




    posted @ 2010-01-31 23:08 劉凱毅 閱讀(1058) | 評論 (0)編輯 收藏

         摘要: tabBar.vim 這個插件實現(xiàn)了類似UltraEdit中的標(biāo)簽頁的功能,而且能通過Alt-<n>來切換, 安裝: 拷貝文件到[你的gvim的安裝目錄]"vimfiles"plugin"中即可! 下載: http://www.vim.org/scripts/script.php?script_id=1338 C:/Program Files/Vim/_v...  閱讀全文
    posted @ 2010-01-18 13:45 劉凱毅 閱讀(1963) | 評論 (0)編輯 收藏


    學(xué)習(xí):
    http://blog.chinaunix.net/u1/59571/showart_2077664.html

    個人對上面文章做的 筆記共享出來 和大家分享!


    posted @ 2010-01-05 11:21 劉凱毅 閱讀(2162) | 評論 (0)編輯 收藏

    python easy_install moin 或 下載 moin-1.9.0 編譯
    設(shè)置 path 中有 moin.py
    #我這 參考
    path = $PATH:/Python25/moin-1.9.0/MoinMoin/script

    # wikiconfig.py 下面我點下 參數(shù) ,大家看代碼 就知道了
    vi  /Python25/moin-1.9.0/wiki/config/wikiconfig.py
    #instance_dir = '/where/ever/your/instance/is'
    instance_dir = wikiconfig_dir+'/../'

    # Where your own wiki pages are (make regular backups of this directory):
    data_dir = os.path.join(instance_dir, 'data-1'''# path with trailing /


    navi_bar 
    = [
            
    # If you want to show your page_front_page here:
            #u'%(page_front_page)s',
            u'標(biāo)題',
            u
    'FindPage',
            u
    'HelpContents',
        ]

    language_default 
    = 'zh'

    在修改linux 時不起作用 :
    修改/root/tools/moin-1.9.0/MoinMoin/script/server/standalone.py 全局先


    運行:
    $>moin  server standalone --config-dir=/root/wiki/mywiki/config/ --hostname=192.168.102.207 --port=18081
    命令是可調(diào)參數(shù):
    #/root/tools/moin-1.9.0/MoinMoin/script/server/standalone.py
    class PluginScript(MoinScript):
        
    def __init__(self, argv, def_values):
            MoinScript.
    __init__(self, argv, def_values)
            self.parser.add_option(
                
    "--docs", dest="docs",
                help
    ="Set the documents directory. Default: use builtin MoinMoin/web/static/htdocs"
            )
            self.parser.add_option(
                
    "--user", dest="user",
                help
    ="Set the user to change to. UNIX only. Default: Don't change"
            )
            self.parser.add_option(
                
    "--group", dest="group",
                help
    ="Set the group to change to. UNIX only. Default: Don't change"
            )
            self.parser.add_option(
                
    "--port", dest="port", type="int",
                help
    ="Set the port to listen on. Default: 8080"
            )
            self.parser.add_option(
                
    "--hostname""--interface", dest="hostname",
                help
    ="Set the ip/hostname to listen on. Use \"\" for all interfaces. Default: localhost"
            )
            self.parser.add_option(
                
    "--start", dest="start", action="store_true",
                help
    ="Start server in background."
            )
            self.parser.add_option(
                
    "--stop", dest="stop", action="store_true",
                help
    ="Stop server in background."
            )
            self.parser.add_option(
                
    "--pidfile", dest="pidfile",
                help
    ="Set file to store pid of moin daemon in. Default: moin.pid"
            )
            self.parser.add_option(
                
    "--debug", dest="debug",
                help
    ="Debug mode of server. off: no debugging (default), web: for browser based debugging, external: for using an external debugger."
            )


    #成功運行 后
    2009-12-20 23:31:31,796 WARNING MoinMoin.log:139 using logging configuration read from built-in fallback in MoinMoin.log module!

    2009-12-20 23:31:32,515 INFO werkzeug:106  * Running on http://192.168.1.100:8080/


    一些簡單的語法介紹『其中 HelpOnDrawings 的功能 有“驚艷”的效果!!呵呵,自己搭建個自己的wiki 出來 看吧』






    posted @ 2009-12-20 23:34 劉凱毅 閱讀(2204) | 評論 (0)編輯 收藏



    定義:
    灰羊群   (無主見的用戶群體)
    黑羊   ( 對自己需要什么有明確的認(rèn)識,我們一般稱為專家用戶。  )


    1. 區(qū)分 灰(無主見) 黑 羊群

    2.
    user session 關(guān)聯(lián) #當(dāng) 關(guān)聯(lián)關(guān)系維護(hù)使用 用戶的會話ID(用戶不同心情,起始在數(shù)據(jù)中就應(yīng)該是不同分類的)
    user 推薦         # 而推薦出產(chǎn)品 還是 跟 用戶唯一編號有關(guān)
    #在推薦中需要描述  用戶的多角度 問題

    3.
    蠻力推薦( 全數(shù)據(jù) ;描述初期清洗后的數(shù)據(jù) ) 適合 產(chǎn)品關(guān)聯(lián) 
    清洗后期的數(shù)據(jù)(包含用戶多維度描述) 適合   用戶關(guān)聯(lián)


    4.
    專家跟隨推薦
    描述:
      用戶分類 找到黑綿羊  
      找到 一群灰綿羊 和 一只黑綿羊的關(guān)聯(lián)關(guān)系
      讓 一群灰綿羊 可以看 黑綿羊 動作



    posted @ 2009-12-11 16:20 劉凱毅 閱讀(410) | 評論 (2)編輯 收藏




    1,負(fù)重深蹲,仰臥起坐,慢跑,主要練習(xí)心肺功能(腿部鍛煉很重要,如果深蹲完了沒體力,慢跑可以改成慢走放松)

    2,臥推,仰臥飛鳥,站立飛鳥,仰臥起坐,慢跑,主要練習(xí)胸部和肩部(飛鳥就是側(cè)舉,仰臥的時候用的是胸的力量,站立時用的是肩)

    3,引體向上,劃船,曲臂,主要練習(xí)背部和胳膊,最后加上固定的項目:仰臥起坐和慢跑放松


    1的消耗最大,要自己狀態(tài)最好的時候去
    2主要是練習(xí)和“推,舉”相關(guān)的肌群
    3是“拉,收”相關(guān)的肌群

    而且有個原則,就是先練大項目,再練小項目。


     深蹲、臥推、引體向上,這3個是最基本的,別的其實都可有可無
    另外,適當(dāng)慢跑也是必要的,是很好的放松和有氧運動,促進(jìn)代謝。當(dāng)然,如果有條件可以去戶外跑,寧可跑馬路,也別在健身房里跑,空氣不理想

    做動作也是要循序漸進(jìn),每次從很輕的重量開始,逐步加大負(fù)荷



    posted @ 2009-12-11 11:52 劉凱毅 閱讀(352) | 評論 (0)編輯 收藏

    下面介紹的排序都為:非比較排序法

    這里個人認(rèn)為在某些特定的地方非比較排序的速度非常明顯;
    比如 : 對待排數(shù)據(jù)中有順序分類,使用鴿巢總體分類,然后對不同類別的待排小數(shù)據(jù)集合采用 插入,快排等排序方式


    Counting sort :計數(shù)排序
    描述:迭代待排序數(shù)組出元素x,確定小于此元素[z]個數(shù),然后把x放到它在的最終輸出數(shù)組[z]上。
    特性:與待排值有關(guān);穩(wěn)定的排序算法;待排序數(shù)據(jù)要求過于嚴(yán)格,無實際用處;
    算法的步驟如下:
       1. 找出待排序的數(shù)組中最大和最小的元素
       2. 統(tǒng)計數(shù)組中每個值為i的元素出現(xiàn)的次數(shù),存入數(shù)組C的第i項
       3. 對所有的計數(shù)累加(從C中的第一個元素開始,每一項和前一項相加)
       4. 反向填充目標(biāo)數(shù)組:將每個元素i放在新數(shù)組的第C(i)項,每放一個元素就將C(i)減去1


    Radix sort:基數(shù)排序
    描述:將所有待比較數(shù)值(正整數(shù))統(tǒng)一為同樣的數(shù)位長度,數(shù)位較短的數(shù)前面補(bǔ)零. 然后, 從最低位開始, 依次進(jìn)行一次排序.這樣從最低位排序一直到最高位排序完成以后, 數(shù)列就變成一個有序序列.
    排序方式:LSD 由右向左排;MSD 由左向右排
    特性:非比較排序;待排數(shù)據(jù)需要統(tǒng)一格式;
    假設(shè)需排序數(shù)列的取值范圍從1...k,我們于是建一個K+1元的數(shù)組 a[],并賦初值為0,然后便開始排序工作:
    算法的步驟如下:
       1. 按輸入順序讀入數(shù)列,如果所讀的元素為i(1<=i<=k),我們就將a[i]的值加一,這樣直到讀完所有的元素。
       2. 讀出元素并排序:我們遍歷整個數(shù)組,如果a[i]=j(j>=0),我們就輸出j次i(表示元素i在原先數(shù)列中出現(xiàn)了j次),這樣輸出的序列就是已排序的。
       3. 由于一般排序算法涉及到元素之間的比較,如果化成比較樹可以知道,這樣的排序算法復(fù)雜度的下限是O(N*lnN),而計數(shù)排序沒有比較元素,所以所需排序時間就少了,我們可以看到計數(shù)排序的復(fù)雜度為O(n*k),其中k(k的定義同上)為合并排列所需的時間,是個常數(shù)。
       4. 此算法適合所需排列的元素取值范圍不大的情況下,否則會造成空間的消耗,比如,一共100個元素,其取值范圍從1-100000,顯然這個時候用基數(shù)排序是不合適的。



    Bucket sort:桶排序
    描述:工作的原理是將陣列分到有限數(shù)量的桶子里。每個桶子再個別排序(有可能再使用別的排序算法或是以遞回方式繼續(xù)使用桶排序進(jìn)行排序)。
    桶排序以下列程序進(jìn)行:
       1. 設(shè)置一個定量的陣列當(dāng)作空桶子。
       2. 尋訪序列,并且把項目一個一個放到對應(yīng)的桶子去。
       3. 對每個不是空的桶子進(jìn)行排序。
       4. 從不是空的桶子里把項目再放回原來的序列中。



    Pigeonhole sort:鴿巢排序
    描述:是一種時間復(fù)雜度為O(n)且在不可避免遍歷每一個元素并且排序的情況下效率最好的一種排序算法. 但它只有在差值(或者可被映射在差值)很小的范圍內(nèi)的數(shù)值排序的情況下實用.
    算法的步驟如下:與桶排同



    posted @ 2009-12-08 14:21 劉凱毅 閱讀(1771) | 評論 (1)編輯 收藏


    date demo:
    實例:
    $
    >date
    Mon Dec  
    7 15:43:39 CST 2009

    #格式化輸出
    $> date +"%Y-%m-%d"
    2009-12-07

    #時間游走 當(dāng)前時間 2009-12-07
    # year , month , day ,hour , minute,second  - ago
    #昨天輸出

    $> date  -"1 day ago" +"%Y-%m-%d"
    2009-12-06

    #2秒后輸出
    $> date  -"2 second" +"%Y-%m-%d %H:%M.%S"
    2009-12-07 15:50.04

    #傳說中的 1234567890 秒
    $>date -"1970-01-01  1234567890 seconds"  +"%Y-%m-%d %H:%m:%S"
    2009-02-13 23:02:30

    #其他格式的轉(zhuǎn)換
    date -"$(echo "03/Nov/2009 11:04:28" |perl -ne 'print "$2 $1 $3 $4\n" if /(.*?)"/(.*?)"/(.*?) (.*)/;') " +%Y-%m-%d
    2009-11-03

    #普通 轉(zhuǎn)格式
    $> date -"2009-12-12" +"%Y/%m/%d %H:%M.%S"
    2009/12/12 00:00.00

    #apache 格式轉(zhuǎn)換
    $>date  -"Dec 5, 2009 12:00:37 AM" +"%Y-%m-%d %H:%M.%S"
    2009-12-05 00:00.37

    #格式轉(zhuǎn)換 后時間 游走
    $>date  -"Dec 5, 2009 12:00:37 AM 2 year ago" +"%Y-%m-%d %H:%M.%S"
    2007-12-05 00:00.37


    #時間差
    #一小時 3600
    #一天 86400 秒

    $>st=$(date  -"Dec 5, 2009 12:00:37 AM 1 day ago 1 hour ago " +"%s")
    $
    >et=$(date  -"Dec 5, 2009 12:00:37 AM" +"%s")
    $
    >echo "時間差$[($et-$st)/86400]天,$[($et-$st)/3600%24]小時"
    時間差1天,1小時





    date --help
    Usage: date [OPTION] [+FORMAT]
      or
    :  date [-u|--utc|--universal] [MMDDhhmm[[CC]YY][.ss]]
    Display the current 
    time in the given FORMAT, or set the system date.

      
    -d, --date=STRING         display time described by STRING, not `now'
      -f, --file=DATEFILE       like --date once for each line of DATEFILE
      -r, --reference=FILE      display the last modification time of FILE
      -R, --rfc-2822            output date and time in RFC 2822 format
          --rfc-3339=TIMESPEC   output date and time in RFC 3339 format.
                                TIMESPEC=`date
    ', `seconds', or `ns' for
                                date and 
    time to the indicated precision.
      
    -s, --set=STRING          set time described by STRING
      
    -u, --utc, --universal    print or set Coordinated Universal Time
          
    --help     display this help and exit
          
    --version  output version information and exit














    posted @ 2009-12-07 16:14 劉凱毅 閱讀(2439) | 評論 (0)編輯 收藏



    工具為  dist/myImg.exe


    工具使用:
    在 dist 中
    myImg.exe Ratio  c:/需要等比壓縮圖片/*.jpg  d:/等比后路徑   等比款width  等比高h(yuǎn)eight
    myImg.exe Watermark c:/水印圖片/x.png  c:/需要加水印圖片/*.jpg  d:/添加水印后圖片   加水印width處  加水印height處

    等比壓縮實例:
    myImg.exe Ratio  
        "C:"Documents and Settings"lky"My Documents"My Dropbox"tools"img"src"python"dist"test"img"*.jpg"
        "C:"Documents and Settings"lky"My Documents"MyDropbox"tools"img"src"python"dist"test"toimg2"
        600 400
    結(jié)果在  ../dist"test"toimg  目錄下 生成 等比圖片 testratio_600_400.jpg


    水印添加實例:
    myImg.exe Watermark
        "C:"Documents and Settings"lky"My Documents"My Dropbox"tools"img"src"python"dist"test"img"logo.png"   
        "C:"Documents and Settings"lky"My Documents"My Dropbox"tools"img"src"python"dist"test"toimg2"*.jpg"
        "C:"Documents and Settings"lky"My Documents"My Dropbox"tools"img"src"python"dist"test"toimg3"
        100 220
    結(jié)果在  ../dist"test"toimg3  目錄下 生成 等比圖片 test_ratio_600_400_watermark_100_220.jpg



    安裝 python PIL 包
    和安裝 python py2exe

    工具腳本 py


    工具編譯過程:
    python setup.py py2exe



    import sys

    def imgRatio(imgpath,tpath='.',width=600,height=400):
        
    import Image,os
        im 
    = Image.open( imgpath )
        im.thumbnail( (width,height) )
        imgpath 
    = os.path.split(imgpath)[1]
        
    if not os.path.exists(tpath) : os.makedirs(tpath)
        im.save( tpath
    +'/'+imgpath.split('.')[0]+'_ratio_'+str(width)+'_'+str(height)+'.jpg' )


    def imgWatermark(imgwate,imgpath,sw=100,sh=50,tpath='.'):
        
    import Image,os
        baseim 
    = Image.open( imgpath )
        floatim 
    = Image.open( imgwate )
        baseim.paste( floatim, (sw,sh ) )
        imgpath 
    = os.path.split(imgpath)[1]
        
    if not os.path.exists(tpath) : os.makedirs(tpath)
        baseim.save( tpath
    +'/'+imgpath.split('.')[0]+'_watermark_'+str(sw)+'_'+str(sh)+'.jpg' )
        

    args 
    = sys.argv
    import glob,os

    # Ratio  /path/*.jpg  /tpath   width  height  
    if args[1== 'Ratio' :
        
    for img in glob.glob(args[2]) :
            imgRatio(os.path.abspath(img),args[
    3],int(args[4]),int(args[5]))
    # Watermark /path/x.png  /path/*.jpg  /tpath   width  height 
    if args[1== 'Watermark' :
        
    for img in glob.glob(args[3]) :
            imgWatermark(args[
    2],img,int(args[5]),int(args[6]),args[4])




    py2exe
    #!/usr/bin/python
    #
     -*- coding: utf-8 -*-
    #
      py2exe file
    #
     1.install py2exe application
    #
     2.python setup.py py2exe
    from distutils.core import setup
    import py2exe
    setup(console
    =['myImg.py'])


    posted @ 2009-12-07 15:12 劉凱毅 閱讀(671) | 評論 (0)編輯 收藏

    主站蜘蛛池模板: 亚洲中文字幕无码中文| 亚洲综合一区二区| 亚洲丁香色婷婷综合欲色啪| 亚洲高清无在码在线电影不卡| 亚洲人成人77777在线播放| 亚洲色成人WWW永久在线观看| 另类小说亚洲色图| 中文字幕不卡免费视频| 16女性下面扒开无遮挡免费| 天天摸天天碰成人免费视频| 亚洲免费日韩无码系列| 亚洲成AV人片一区二区密柚| 亚洲午夜精品在线| 国产亚洲人成在线影院| 青柠影视在线观看免费高清| av无码免费一区二区三区| 国产伦精品一区二区三区免费下载 | 亚洲精品美女网站| 男女男精品网站免费观看 | 无码av免费一区二区三区| 在线精品一卡乱码免费| 亚洲国产精品一区二区第四页| 亚洲人成在线播放网站岛国| 亚洲色成人四虎在线观看| 99久久精品毛片免费播放| 国产1024精品视频专区免费| 亚洲男人天堂2020| 亚洲电影在线播放| 一级一看免费完整版毛片| 精品熟女少妇av免费久久| 国产又粗又长又硬免费视频| 18亚洲男同志videos网站| 国产成人精品亚洲| 6080午夜一级毛片免费看 | 中国china体内裑精亚洲日本| 美女被免费网站91色| 成人毛片免费播放| 亚洲av无码一区二区三区乱子伦| 亚洲日韩国产二区无码| 国产激情免费视频在线观看| 国产成人无码免费视频97 |