Nginx apache 純靜態僞靜態原理與實現方案

防盜鏈

http://blog.csdn.NET/pestd/article/details/6554410

ob緩衝機制深入理解

http://www.jb51.Net/article/70477.htm

僞靜態

http://www.phpstudy.net/a.PHP/165.html

真靜態實現的4中方法

http://www.jb51.net/article/74342.htm

nginx配置pathinfo的方法

http://blog.csdn.net/pangchengyong0724/article/details/51433440

大文件刪除

http://www.jb51.net/LINUXjishu/405027.html

http://www.jb51.net/LINUXjishu/405042.html

http://www.jb51.net/article/46496.htm

 

針對這個問題我們從三方面來分析

1.它是什麼

2.它能幹什麼

3.   它怎麼用

 

 

僞靜態

1.      僞靜態是什麼?

 

a.僞靜態是相對於真靜態而言的,就是把一些asp,php等結尾url通過apche或nginx的重寫規則,變成以html一類的靜態頁面形式。

b.僞靜態不是真正的靜態,它和動態地址一樣要讀取數據庫

僞靜態

1.      僞靜態能幹什麼?

a.僞靜態最主要的作用就是利於seo,百度蜘蛛喜歡抓取靜態頁面。?容易使百度spider陷入死循環

b.但是併發量高的時候會加大服務器的壓力,所以用的時候要注意。

 僞靜態

 

3.僞靜態怎麼用?

僞靜態就是利用apche,nginx重寫規則,對url地址重寫實現的

實現原理

a.打開apache的重寫模( mod_rewrite.so)

b.Nginx默認支持僞靜態

配置方式有兩種

a.在配置虛擬主機的時候設置

b.在項目的根目錄下建一個.htaccess文件在裏面配置

真靜態

1.真靜態是什麼?

網站設計中,純粹HTML標準通用標記語言下的一個應用)格式的網頁通常被稱爲靜態網頁,靜態網頁是標準的HTML文件,它的文件擴展名是.htm.html,可以包含文本、圖像、聲音、FLASH動畫、客戶端腳本和ActiveX控件及JAVA小程序等。靜態網頁是網站建設的基礎,早期的網站一般都是由靜態網頁製作的。靜態網頁是相對於動態網頁而言,是指沒有後臺數據庫、不含程序和不可交互的網頁。靜態網頁相對更新起來比較麻煩,適用於一般更新較少的展示型網站。容易誤解的是靜態頁面都是htm這類頁面,實際上靜態也不是完全靜態,他也可以出現各種動態的效果,如GIF格式的動畫、FLASH、滾動字幕等

真靜態

2.真靜態能幹什麼?

大型的項目優化中經常會考慮到,在訪問量大的時候,可以減少cpu的壓力,但是會生成大量的文件佔用網站的磁盤空間,可以寫個php的腳本或用Linux的計劃任務進行刪除。在用真靜態的時候有的時候需要用到局部的動態化。

真靜態

3.真靜態怎麼用?

原理

a.ob緩衝(output_buffering)

Echo print_f()與之的區別

echo、print_r=>phpoutput_buffering=>webServer buffer=>browser buffer=>browser display

緩衝和緩存的理解。

1.緩存解決cup消耗的問題,2.緩衝解決高速cpu和低速i/O不匹配的問題

b.模板替換(smarty原理實現網頁靜態化)

1、通過URL傳遞一個參數(ID);
2、然後根據此ID查詢數據庫;
3、取得數據後根據需要修改顯示內容;($str=str_replace('{$title}',$title,$str);)

4、顯示模板

頁面靜態化在1之前使用 ob_start() 打開緩衝區,在4之後使用 ob_get_contents() 獲取內存未輸出內容,最後file_put_contents();寫入指定文件

c.局部動態化

Ajax技術,頁面加載請求php頁面

d.定時任務

真靜態

3.真靜態怎麼用?

實現方法:

1.利用PHP模板生成靜態頁面

2.使用PHP文件讀寫功能生成靜態頁面

3.使用PHP輸出控制函數(Output Control)/ob緩存機制生成靜態頁面

 4.使用nosql從內存中讀取內容(其實這個已經不算靜態化了而是緩存);

 memcached是鍵值一一對應,key默認最大不能超過128個字節,value默認大小是1M,因此1M大小滿足大多數網頁大小的存儲。

真靜態和僞靜態的區別?

1.      是不是一個真正靜態頁面

2.      有沒有和數據庫或後臺程序進行交互

3.      它們的應用場景和解決的問題不同

4.      用JavaScript:alert(document.lastModified)來判斷是真靜態還是僞靜態

真靜態在apache和nginx上的區別與否

                     1.真靜態在nginx上的運行速度比apache運行速度快

                      2.nginx處理靜態文件對於apache來說消耗的內存少

 

僞靜態在apache和nginx上的區別與否

1.本質上沒有區別都是根據正則匹配對應的url的重寫,apache和nginx上的僞靜態規則有點不同。寫的時候要注意

2.apache處理僞靜態比nginx更有優勢

 

 

 

 

 

演示

              真靜態,僞靜態apache的實現演示

1.      真靜態的實現方案ob緩存

 // 新聞詳情頁

  public function sta(){

     // $uri=$this->uri->segment_array();

     $id=$this->input->get('id','');

    // echo $id;die;

     $ob="./app/cache/ob".$id.".html";

     $oldtime=file_exists($ob)?filemtime($ob):0;

     if (file_exists($ob)&&(time()-$oldtime<60)) {

       echo "緩存";

      $ob=file_get_contents($ob);

      echo $ob;

     }else{

 

       echo "數據庫";

     // $pdo=new  PDO('MySQL:host=localhost;dbname=demo01;port=3306','root','root');

     // $pdo->exec("set names utf8");

     // $sql="select* from test4 where id=$id";

     // $res=$pdo->query("$sql")->fetch(PDO::FETCH_ASSOC);

       $res=$this->db->get_where('test4',[id=>$id])->result_array();

     // var_dump($res);die;

     $data['res']=$res;

 

     ob_start();

     $this->load->view('sta.html',$data);

     $str=ob_get_contents();

     // echo $str;die;

     file_put_contents($ob, $str);

    

 

   }

2.      真靜態的實現方案memcache

      function pic(){

 

       

        $pic_statis_content = "content";

        $expr = 3600*24*10;//有效期,十天

        $mem = new Memcache;

 

        $mem->connect('127.0.0.1', 11211);

        $mem_pic_content = $mem->get($pic_statis_content); 

        if($mem_pic_content){

         echo $mem_pic_content;

        // $mem->delete("$pic_statis_content");

        }else{

                echo '非緩存';

            ob_start();

         

 

        $name='世界上最好的編程語言';

        $this->load->view('pic',['name'=>$name]);

         

         $content = ob_get_contents();//把詳情頁內容賦值給$content變量

         $mem->add($pic_statis_content,$content,false, $expr);

          ob_end_flush();//輸出商品詳情頁信息

         

        }

 

 

      }

Apache僞靜態實現地址重寫及防盜鏈技術

 

 #開啓重寫引擎

  #RewriteEngine on

  RewriteRule 1.html  /1.php [L]

  #寫重寫規則

  #RewriteRule   cat_(\d+)t.html   /index.php/user/index/$1 [L,NC]

  RewriteRule   c(\d+)_(.*).html   /index.php?c=user&m=index&id=$1&title=$2[L,NC]

  #RewriteRule   cat_index.html   /index.php/user/index [L,NC]

  RewriteCond %{HTTP_REFERER} !^$ [NC]

  RewriteCond %{HTTP_REFERER} !sta.com [NC]

  RewriteRule .(jpg|gif|png|bmp|swf|jpeg) http://sta.com/app/public/dt/dt.jpg [L,NC,R=301]

 

 

 

真靜態,僞靜態nginx的實現演示

 

1.nginx僞靜態實現地址重寫和防盜鏈

//防盜鏈

             location ~* \.(gif|jpg|png)$ {

          valid_referers none blocked http://sta1.com:81;    //允許訪問的來源

          if ($invalid_referer) {

            rewrite ^/ http://sta1.com:81/c2_.html;

            #return 403;

          }

        }

 

//僞靜態地址重寫

   location / {

 

       rewrite c(\d+)_(.*).html /index.php?c=user&m=index&id=$1&title=$2last;

        root  /usr/share/nginx/html/sta;

         index index.html index.htm  index.php  ;

    }

 

Nginx引入.Htaccess

include /usr/www/.htaccess

 

讓nginx支持pathinfo模式的方式

   location ~ \.php(.*)$ { # 正則匹配.php後的pathinfo部分

       root           html/;

        fastcgi_pass   127.0.0.1:9000;

       fastcgi_index  index.php;

       fastcgi_param SCRIPT_FILENAME /usr/share/nginx/html/stest1/$fastcgi_script_name;

        fastcgi_param PATH_INFO $1; # 把pathinfo部分賦給PATH_INFO變量

       include        fastcgi_params;

    }

 

rsync刪除

1、建立一個空目錄

mkdir -p lpf/tmp/

2、確立需要清空的目標目錄

/lpf/tmp1/

3、使用rsync同步刪除(注意目錄後面的“/”),整體效率會快一個數量級的樣子。

rsync --delete-before -a -H /root/lpf/tmp/ /root/lpf/tmp1/

選項說明:

–delete-before 接收者在傳輸之前進行刪除操作

–progress 在傳輸時顯示傳輸過程

-a 歸檔模式,表示以遞歸方式傳輸文件,並保持所有文件屬性

-H 保持硬連接的文件

-v 詳細輸出模式

-stats 給出某些文件的傳輸狀態

一般我們不需要顯示進度,使用以下命令即可

rsync --delete-before -a -H /root/lpf/tmp/ /root/lpf/tmp1/

把某個文件刪掉

1 建立空文件/tmp1/em.txt

2 rsync --delete-before -a -H -v --progress --stats /root/lpf/tmp//root/lpf/tmp1/ 

3 這樣置爲空後就可以快速刪掉

原理:把文件系統的目錄與書籍的目錄做類比,rm刪除內容時,將目錄的每一個條目逐個刪除(unlink),需要循環重複操作很多次;rsync刪除內容時,建立好新的空目錄,替換掉老目錄,基本沒開銷。

測試大文件刪除

1.生成文件

for i in $(seq 1 500000); do echo test>>$i.txt; done

 10萬文件rm刪除第一次11s左右,第二次9s左右; time rm -f *.txt     rsync測試兩次9s左右

     50萬文件rm刪除報錯;   rsync測試兩次一個5分左右,一個4分左右                                   

 

Ci框架普通模式和pathinfo模式的切換

可以在 application/config/config.php 文件中進行設置。如果你打開 config 文件可以看到如下內容:

$config['enable_query_strings']= FALSE;
$config['controller_trigger']= 'c'; //控制器名
$config['function_trigger']= 'm'; //方法名
$config['directory_trigger']='d';//若控制器在子目錄下,url中需帶有這個參數,指定控制器所在子目錄名稱

如果你將 enable_query_strings更改爲 TRUE ,那麼普通模式就被激活了。此時,你就可以通過關鍵字來調用需要的控制器和方法了:控制器和方法名可以自己定義

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章