歷史的痕跡

當你在撰寫一隻程式的時候,你腦中會有與該程式相關的背景知識,這是你透過瞭解這隻程式的過程中獲取而來的寶貴資料。當你要讓這隻程式產生變化之時,你得要從另外一個角度來觀看,從一個陌生人的角度,觀察這隻程式產生的變化,對這個陌生人而言有什麼意義!

例如你想要依照不同的資料做不同的處理,而你深刻的理解這兩種狀態的差異性,但!對這陌生人可不然~所以你需要留下可被追尋的痕跡,因為你在創造歷史,而你得告訴後人,為何要做這樣的決策,你可以試著用各種方式給予暗示。

註解,變數名稱,函式名稱~等等,這些可以具有意義的紀錄點~在這些地方留下深刻的印記。


<form><input type="text" name="name" /></form>

//type 1

if( $name == 'apple' || $name == 'orange') {
$db->insert('fruit', array('name', $name));
}
else if( $name == 'dog' || $name == 'cat') {
$db->insert('animal', array('name', $name));
}

//type 2

if( $name == 'apple' || $name == 'orange') {
   $type = 'fruit';
}
else if( $name == 'dog' || $name == 'cat') {
   $type = 'animal'
}
$db->insert($type, array('name', $name));

透過多命名一個稱為 $type 的變數,讓未來看見這隻程式的人,可以清楚的知道,name 有分成兩種 type ……是吧?!。。。

夢一場

今天做了一場大冒險的夢…

夢中我是一個作家,寫了很多著名的書,好像許多都跟文學有關~

有一天有壞人想要把我毀了,類似言論自由的箝制,想要把我的書全部毀掉,並且把我抓去關還是殺掉~

他就找到我家裡來,而我提早收到這個資訊,早就在家裡做好準備,把我的著作都藏起來,

夢中的家是三四樓的獨棟透天,此時我躲在頂樓的廁所裡面,而頂樓的樓上有一個密閉的小閣樓,

我將書本都藏在那裡,正常人應該不會輕易的發現,而我就躲在廁所裡面裝死…

接著我家被數十黑衣人士闖入大肆搜尋,而我躲的廁所被開關幾次,我假裝是其他人在大便也躲過了幾次搜尋~

但最後他們已經不耐煩,又找到廁所來…此時我發現紙已經包不住火…我就馬上往閣樓跑,抱著我最愛的幾本著作,

此時黑衣人已發現接衝入閣樓內,而我緊急之下,於頂樓閣樓內沿著窗戶爬出外牆,開始沿著牆壁邊緣快速的往下奔逃…

此時外面已經下起了傾盆大雨…,而我抱著書不斷的奔跑著,想著家裡的父母與姐姐…

由於雨勢之大,黑衣人也無法繼續追過來了,而我抱著已經濕透連書上的字都好像化開的紙們,

到了一個舊式的三合院,這附近的建築都是很古老的紅磚砌成的排樓,看起來也不太像有人居住,

我順勢跳入一間平房內,找到一間很擁擠看似只有一坪呈長方形廢棄的小廁所,躲藏了起來…

全身濕透了我開始把衣服拖掉晾乾,並且試著把小房間能遮蔽的窗與門都關閉好…

雖然簡陋但是有個棲身之處,那就決定在這先過夜再說吧,時間也不早了…

並看著我那濕透的著作們…不自覺哀傷了起來…

隔天起床雨已經停了,並且發現這間三合院有美麗的庭院,還種滿了許多種類的花,

正可以透過穿戶看出去,但是開始聽到有小孩嬉鬧的聲音…

翻翻乾掉的衣服與書,整理一下,並利用廁所的水清洗一下,想知道時間但是出門卻忘記帶手機…

阿…帶電話說不定會被追蹤…還是這樣安全…

突然間有個小孩探出頭來,詢問「欸,你是誰阿?」

我驚訝的想要解釋…但是他卻跑走去跟家裡大人告狀了…

我趕快將身上整理好,假裝是路人,走了出去,馬上看到一位婦人在我躲藏房間的牆外,

看起來像是坐在搖椅上,觀賞花園,我馬上主動解釋,「嗨,請問這裡是哪裡,我不小心進到這裡來,要怎麼出去呢」

此時我手上還提著鞋子…看起來就很不尋常…

最後我奔跑出三合院中…但聽到母親與姊姊討論我的事情的聲音…彷如時空錯置…

最終我被發現並且被槍射殺…或許是我捨不得的回去躲在三合院的小廁所中,享受那短暫棲身的寂寞…

reverse proxy

reverse proxy ,proxy 伺服器,可以將外部連線導入到內部網路的 web 伺服器,搭配 nat 可以隱藏內部網站,如果 load blancer 效果~
只是效能可能會卡在入口站的 網路 或 效能~

apache

<VirtualHost *:80>
     ServerName apple.tw
     ProxyRequests Off
     ProxyPreserveHost On
     ProxyPass / http://192.168.8.10/
     ProxyPassReverse / http://192.168.8.10/
 </VirtualHost>

nginx

   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;
    proxy_max_temp_file_size 0;

    proxy_connect_timeout      90;
    proxy_send_timeout         90;
    proxy_read_timeout         90;

    proxy_buffer_size          4k;
    proxy_buffers              4 32k;
    proxy_busy_buffers_size    64k;
    proxy_temp_file_write_size 64k;

    server {
        listen  80;
        server_name apple.tw;
        location / {
          proxy_pass http://192.168.8.10/;
        }
    }

用 ab 實際測試 apache 跟 nginx 的差異 ,在我的環境下都超慢的,感覺是虛擬機的設定有問題,

只是在近端網路測就比較正常了,且在 -c Number of multiple requests to make 越高的情況下, nginx 的表現竟然反而比較好,在低的情況下就都差不多。

好像是 catch 設定的問題..每次測都有點不一樣。

nginx and django

nginx (Engine X ) 是比 Apache 小巧快速的網頁伺服器,設定上相對沒有那麼強大與複雜。

Apache 是採用行程池運作比較消耗資源,而 nginx 則是 event based,不會依照 request 生成 process or thread。

下載網址:http://nginx.org/en/download.html

只是操作起來比較不熟悉,跟 apache 用 service 的方式比較不同,所以比較不親和一點…但是相對來說設定的細節都比較容易

設定檔在 /etc/nginx.conf

nginx 當初是為了 reverse porxy 所設計的,所以在 r-proxy 上理當應該比 apache 為更適當的選擇[1]


$ nginx # 啟動

$ nginx -t # 檢查設定檔格式是否正確

$ nginx -s [stop|reload|...] # 送訊號給正在執行的 nginx

可以用 fastcgi 搭配 django 運作,

可以額外 include 一個 django 的設定檔,內容如下:

server {
        listen  80;
        server_name server.com;
        location / {
            fastcgi_pass unix:/home/www/server.sock;
#           fastcgi_pass 127.0.0.1:8000;
            include     fastcgi.conf;
            access_log  /var/log/nginx_django.log;
        }
}

然後用 django 內建的 server 跑 fastcgi 模式,就能讓 django 跟 nginx 接起來囉。

$ kill `cat /home/www/server.pid`
$ python ./manage.py runfcgi method=threaded \
          socket=/home/www/server.sock pidfile=/home/www/server.pid

這邊指定用 thread 的方式跑,然後把 socket 建在該檔案位置,用在重開的時候要用,這個 socket 位置對應到上面的 nginx 設定的 socket 位置,
也可以跑在某個 port 上面去對應,只是用檔案的方式好像比較安全?!..我也不太懂=_=
另外 django 內的 fastcgi.conf 內要注意一點:

fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;
fastcgi_param  QUERY_STRING       $query_string;
fastcgi_param  REQUEST_METHOD     $request_method;
fastcgi_param  CONTENT_TYPE       $content_type;
fastcgi_param  CONTENT_LENGTH     $content_length;

<strong>fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;</strong>
fastcgi_param  REQUEST_URI        $request_uri;
fastcgi_param  DOCUMENT_URI       $document_uri;
fastcgi_param  DOCUMENT_ROOT      $document_root;
fastcgi_param  SERVER_PROTOCOL    $server_protocol;

fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;
fastcgi_param  SERVER_SOFTWARE    nginx/$nginx_version;

fastcgi_param  REMOTE_ADDR        $remote_addr;
fastcgi_param  REMOTE_PORT        $remote_port;
fastcgi_param  SERVER_ADDR        $server_addr;
fastcgi_param  SERVER_PORT        $server_port;
fastcgi_param  SERVER_NAME        $server_name;

<strong>fastcgi_param  PATH_INFO          $fastcgi_script_name;</strong>

粗體的設定是 django url 在 route 會用來判斷的變數要設定對。
然後在專案內的 setting.py 的裡面加上 FORCE_SCRIPT_NAME=”/”
原因跟上面 route 路由規則有關,否則網址倒頁的時候會出問題。 參考資源: