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 路由規則有關,否則網址倒頁的時候會出問題。 參考資源:

pietty linux 鍵盤設定 home,end,keypad

好像有一天 linux 灌了 ncurses 這個處理文字的視窗 lib 以後, pietty 鍵盤事件的 mapping 就變的怪怪的,

按 home 跟 end 都會跑出 ~ 來,某些按鍵也變的怪怪的,剛開始是把 connection > data > Terminal-typ string 由 xtern 改成 linux 好像就好轉了,

只是顯示的顏色都不一樣了有點不習慣~

而且在 git 要 commit 的時候打中文也會變亂碼,後來發現[1]可以修改 ~/.inputrc 來解決 ,猜測是 ncurses 要監聽更多的鍵盤事件,所以把大部分的鍵盤對應的符號都調整過造成的。

</span>
<pre>"\e[3~": delete-char
# this is actually equivalent to "\C-?": delete-char
# VT
"\e[1~": beginning-of-line
"\e[4~": end-of-line
# kvt
"\e[H":beginning-of-line
"\e[F":end-of-line
# rxvt and konsole (i.e. the KDE-app...)
"\e[7~":beginning-of-line
"\e[8~":end-of-line

另外發現 小鍵盤數字鍵不能打的問題把 Terminal > Feature > Disable application keypad mode 改一下就 ok 了。

一度有改 Terminal > Keyboard > The Home and the End Key 看起來是這個,結果改了以後變成 home 可以 end 不行…而且在 vim 裡面會壞掉。

參考資源:

apache rewrite and VirtualDocumentRoot

參考資源:http://phorum.study-area.org/index.php?topic=17120.0

設定讓每個使用者可以自動對應到某個虛擬伺服器的方式


UseCanonicalName On

VirtualDocumentRoot /home/%1/www/%2

例如

http://mlwmlw.blog.mlwmlw.org/ 對應至 /home/mlwmlw/www/blog

ohmygod.test.mlwmlw.org/ 對應至 /home/ohmygod/www/test

%1 %2 %3 則是按照 dns 名稱的順序對照到實體目錄上

.htaccess rewrite

透過 rewrite 設定將某個網址導到某個資料夾下的 index.php  ,常用於 codeIgniter 的設定,

官方教學的方式如下,感覺只能處理網址是虛擬伺服器的情況,

例如上述的 blog.mlwmlw.org/index.php,才能成功,


RewriteEngine On
RewriteCond %{REQUEST_URI} !^(/index\.php|/img|/js|/css|/robots\.txt|/favicon\.ico)
RewriteRule ^(.*)$ /index.php/$1 [L]

否則都會導頁到根目錄下,例如我用 http://mlwmlw.org/~user/test/index.php,

他則會幫我弄成 http://mlwmlw.org/index.php =__=。

如果想要將網址http://mlwmlw.org/~user/dir/index.php/xxx/yyy

導至 /home/user/www/dir/index.php/xxx/yyy 下,則可以用以下的 rewrite。

透過 REQUEST_FILENAME 會產生完整的要求目錄的原理,

將他與時紀要求的路徑對應去產生群組 %1 %2 變數來使用接在 RewriteRule 內。

感覺 rewrite 實在有點複雜…甚至還有專書在討論

Definitive-Guide-Apache-mod_rewrite

搞了三四個專案的失敗經驗才成功寫出這個規則…否則以往都要依照使用者設定 virtual host ~

但是最上面的那個設好也是可以不用一一指定啦~

其實有一大堆作法…可以用…博大精深的 httpd configuration…

RewriteEngine on
RewriteCond $1 !^(index.php|images|robots.txt|assets|temp)
RewriteCond %{REQUEST_FILENAME} ^/home/(.+)/www/(.+)/(.*)
RewriteRule ^(.*)$ /~%1/%2/index.php/$1 [L]

RewriteRule 對應的正規在比照的是 mlwmlw.org/index.php?abc=123 網址裡面的 /index.php?abc=123
所以如果寫 RewriteRule a http://a.com 則是 index.php?abc=123 裡面有出現 a 這個字就會轉頁,
如果要完整比對整個字串應該是要加上 ^a$ 來指定從開頭對照到結尾

%{REQUEST_FILENAME} 看到的是完整的要路徑 , 例如 /home/mlwmlw/www/project/index.php
%n 代表的是 RewriteCond 正規裡面符合條件的群組順序,例如上面的

RewriteCond %{REQUEST_FILENAME} ^/home/(.+)/www/(.+)/(.*)

對照到 /home/mlwmlw/www/project/index.php 的 /home/(%1)/www/(%2)/index.php 這樣 %1 , %2 就能在 Rule 裡面又拿來當規則,

$n 代表的是 RewriteRule 前半段的正規符合的群組,例如

http://mlwmlw.org/~mlwmlw/project/hello/world 會提取出 /hello/world 來比較,^(.*)$ 則是把整段都拿來 對應到 $1,

就是把參數都往 /~mlwmlw/project/index.php/$1 <- 這裡丟 變成 /~mlwmlw/project/index.php/hello/world

另外一提這裡比較特別與奇怪的用法是一開始的
RewriteCond $1 !^(index.php|images|robots.txt|assets|temp)
由於這裡根本還沒用到 RewriteRule 所以 $1 指的意思好像比較不明,
好像比較少這樣用,但是一樣是指 /hello/world 這一段,
如果有這段是採用 /index.php or /assets .. 等規則開始的話就直接跳掉了。
另外加上一個更完整的情境…與 RewriteCond and 的用法

RewriteEngine on
RewriteCond $1 !^(index.php|images|robots.txt|assets|temp)
RewriteCond %{HTTP_HOST} ^.+\.site\.com$
RewriteCond %{REQUEST_FILENAME} ^/home/(.+)/www/(.+)/(.*)
RewriteRule ^(.*)$ /%2/index.php/$1 [L]

RewriteCond $1 !^(index.php|images|robots.txt|assets|temp)
rewriteCond %{REQUEST_FILENAME} ^/home/(.+)/www/(.+)/(.*)
rewriteRule ^(.*)$ /~%1/%2/index.php/$1 [L]
  
if [^index.php,^images,^robots.txt,^temp] in url and host reg *.site.com :   
  (%1, %2, %3) = filename reg /home/(*)/www/(*)/(*) 
  $1 = url 
  redirect /%2/index.php/$1 
else if [^index.php,^images,^robots.txt,^temp] in url : 
  (%1, %2, %3) = filename reg /home/(*)/www/(*)/(*) 
  $1 = url   redirect /~%1/%2/index.php/$1

網站在 /home/mlwmlw/www/apple/ 設定好網址,
可以用 http://mlwmlw.site.com/apple 進去
也可以用 http://site.com/~mlwmlw/apple 進去

vSphere ESXi shell clone vm instance without vCenter

由於使用的是免費版的 ESXi 在測試,所以沒有 VCenter 的簡便功能可以作很多事,所以要做一些比較複雜的操作就要靠自己了…

我灌的情況比較特別,其實是安裝 ESX  然後輸入 ESXi 的免費序號,不曉得到底是算啥…混合板…= =

有幾種方法可以擴充一些免費版無法做的操作

SDK

SDK 我自己也有抓下來在 windows 的環境跑,要把伺服器上的某個 crt 抓下來設定比較麻煩之外,用起來是蠻容易的,如果要自己整合一些簡單的介面就推薦這種方式囉。他裡面幾乎每個 api 好像都有些 sample 可以直接用。

Vsphere Shell

另外一種是如果 api 不支援,就要登進去灌 vsphere 的主機上,直接用命令對他做操作,大多都是 vm* 開頭的指令,如果是複製 vm 的話可以參考這個網站[1],教你用 Shell vmkfstools 指令去複製 VM,還說明了許多 vm 存放資料概念,

重要的概念是 vmdk 那個檔是存放很多參數,所以複製的時後記得透過 vmkfstools 才不會把內容的名字留下來。

只是複製完了呢?要如何讓 vm client 登入的時候看得到呢?

因為 vsphere 似乎沒辦法直接掃瞄硬碟就察覺有新的 vm 進入,我猜測是是透過內建的資料庫去存放這些資訊,所以除了單純複製資料夾外,就是要對 vsphere 資料庫進行註冊,這就要參考這篇[2]文章了~!,他其實是Scripting-VMware-Power-Tools-Infrastructure 這本書節錄下來的章節,他描述了整個流程,並且寫了幾個不同語言的 script 來做這些事。

  • 新增新的 vm 要存放的資料夾
  • 產生 *.vmx 內容
  • 用 vmkfstools 去複製 *.vmdk , *-flat.vmdk ; vmkfstools -i /vmfs/volumes/Storage1/2003/2003.vmdk -d thin /vmfs/volumes/Storage1/2003c/2003c.vmdk
  • 使用 vmware-cmd -s register *.vmx 去向 vsphere 註冊

而我在作到最後一步的時候發生了 fault.RestrictedVersion.summary 的錯誤,根據[3] 的內容大概推斷是新版本的 ESXi 免費版開始不支援你透過指令去寫 config。

但是由於 vsphere shell 內有很多指令可以用,就另外找到一個[4] 用 vim-cmd 的方式來操作註冊的動作結果就成功了,

[root@esx node] vim-cmd solo/registervm /vmfs/volumes/datastore1/node/node.vmx

但是開機時還是有一些問題,可能是我流程還沒跑完一次,是用複製檔案的方式做的吧~

但是他卡在 95% 時就問我問題…問我說是不是 copy 他的映像檔…進 console 就能回答= =我就回答 我 copy it …就開機了?

只是應該要注意共用實體的問題。

參考資源:

  1. 在ESX中把玩VM的虛擬硬碟 http://vaemon.com/article/910.html
  2. Cloning Virtual Machines Utilizing ESX Shell Scripts http://searchsystemschannel.techtarget.com/feature/Cloning-Virtual-Machines-Utilizing-ESX-Shell-Scripts
  3. http://vmetc.com/2009/03/31/esxi-u4-ends-free-version-read-and-write-access-from-the-rcli/
  4. http://www.virtuallyghetto.com/p/vmware-vimsh_9940.html