2012/02/29

Tornado web framework + HTTPS

官網得知 Tornado web framework 原本就有支援SSL協定
HTTPServer can serve SSL traffic with Python 2.6+ and OpenSSL. To make this server serve SSL traffic, send the ssl_options dictionary argument with the arguments required for the ssl.wrap_socket method, including “certfile” and “keyfile”:
    HTTPServer(applicaton, ssl_options={
        "certfile": os.path.join(data_dir, "mydomain.crt"),
        "keyfile": os.path.join(data_dir, "mydomain.key"),
    })

SSL Sample
import os
from tornado.httpserver import HTTPServer
from tornado.web import Application, RequestHandler
from tornado.ioloop import IOLoop

class MainHandler(RequestHandler):
    def get(self):
        self.write("Hello world!")

def main():
    application = Application([
        (r"/", MainHandler), 
    ])  

    http_server = HTTPServer(application,  
        ssl_options={
            "certfile": os.path.join(os.path.abspath("."), "test.crt"), 
            "keyfile": os.path.join(os.path.abspath("."), "test.key"), 
        }   
    )

    http_server.listen(8080)
    IOLoop.instance().start()

if __name__ == "__main__":
    main()

過程中需要ssl certificate 與 private key,可以用openssl產生,不過過程很繁雜,建議可以利用online tool:Create self-signed SSL certificates online

測試
開啓 http://localhost:8080 遇到錯誤:
ERROR:root:Exception in I/O handler for fd 3 Traceback (most recent call last): File "/opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/tornado-2.0-py2.6.egg/tornado/ioloop.py", line 287, in start self._handlers[fd](fd, events) File "/opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/tornado-2.0-py2.6.egg/tornado/stack_context.py", line 159, in wrapped callback(*args, **kwargs) File "/opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/tornado-2.0-py2.6.egg/tornado/httpserver.py", line 294, in _handle_events except ssl.SSLError, err: AttributeError: 'module' object has no attribute 'SSLError' 

少了甚麼module嗎?
重裝openssl 0.9.8t -> 不行


安裝ssl package
# pip install ssl
ValueError: This extension should not be used with Python 2.6 or later (already built in), and has not been tested with Python 2.3.4 or earlier.
python 2.6以後的版本已經內建了


安裝pyopenssl package
# pip install pyopenssl
安裝成功,但結果還是一樣。看起來該有的都有了阿!


最後把deploy系統從mac os換到centos 5,一模一樣的步驟就...成功了!上面的問題至今未解...


如果看到這個warning,表示client的request是用http不是https,並不是server的問題唷!
WARNING:root:SSL Error on 7: [Errno 1] _ssl.c:490: error:1407609C:SSL routines:SSL23_GET_CLIENT_HELLO:http request

2012/02/27

SSH tunnel + socks proxy 穿透防火牆

情境
1. 無論是想從家裡連回公司的serve去做事


2. 或是想從公司逃離MIS的掌控 (有些公司會禁止使用MSN或是禁止上facebook)

SSH tunnel + socks proxy都可以幫你解決

2012/02/26

Nginx 基本設定教學

下載與安裝:http://wiki.nginx.org/Install
若 make 的時候出現下面錯誤
make -f objs/Makefile
make[1]: Entering directory `/home/user/src/server/nginx-1.0.14'
cd /usr/lib \
        && if [ -f Makefile ]; then make distclean; fi \
        && CC="gcc" CFLAGS="-O2 -fomit-frame-pointer -pipe " \
        ./configure --disable-shared
/bin/sh: line 2: ./configure: No such file or directory
make[1]: *** [/usr/lib/Makefile] Error 127
make[1]: Leaving directory `/home/user/src/server/nginx-1.0.14'
make: *** [build] Error 2
解決方式:
在 configure 時 --with-pcre 指向 pcre 的 source tree
$ ./configure --with-pcre=~/pcre-8.30
$ make 


基本指令

# 啟動
/usr/local/nginx/sbin/nginx

# 停止
/usr/local/nginx/sbin/nginx -s stop

# Reload
/usr/local/nginx/sbin/nginx -s reload

# 編輯設定檔
vim /usr/local/nginx/conf/nginx.conf

# 檢查設定檔
/usr/local/nginx/sbin/nginx -t


下面列出幾種常用的模式:

2012/02/20

Hosting the js and css resource file

使用google blog時,額外載入的javascript、css檔該放在哪裡?
<link href='http://host/test.css' rel='stylesheet' type='text/css'/>
<script src='http://host/test.js' type='text/javascript'/>

下面提供幾種方法讓各位參考:


Google sites (協作平台)
1. 建立一個協作平台
2. 新增頁面,類型選擇『檔案櫃』
3. 設定共用權限為『公開在網路上,所有人皆可尋找和檢視』
4. 複製下載連結 Ex:
https://sites.google.com/site/blog-resource/file-cabinet/test.js?attredirects=0&d=1
去掉http(s),以及?後面的字眼,最後變成:
http://sites.google.com/site/blog-resource/file-cabinet/test.js

*限制:只限blogspot.com結尾的網域去load,像我在blog額外加自己的網址 01-labro.com 則會下載不到,如果是其他網域就更不用說了


Google project hosting
1. 進入後選擇『Create a new project』
2. 填完基本資料後就可以開始上載檔案

3. 最後複製檔案連結,大概是長這樣
http://blog-resource.googlecode.com/files/test.js

*限制:不限網域,但我的css一直載不進來,js則ok。


Dropbox
這是最簡單的方式,把檔案放到dropbox的public folder,然後copy link就可以拿到URL了。



不論速度還是穩定度,應該都是google的最佳!


2012/02/18

申請新網域 www.01-labor.com

一時衝動就申請了新的網域 www.01-labor.com,一年US$10。



誰叫google的服務和GoDaddy.com整合這麼好,從後台設定進去填兩個表格就申請好了,而且馬上可以使用,順便也幫你啓用Google Apps,看來要好好來經營一下部落格了 :)


但突然發現,原本hosting在google協作平台的javascript檔都load不進來了
Ex: http://sites.google.com/site/hosting/file/extension.css
原本點了連結應該是直接連接到那個檔案,但現在卻變成


推測應該是google會檢查http referer,應該用google app新申請一個自已網域的協作平台,再把檔案轉移過去就可以了。
見下一篇:Hosting the js and css resource file

使用jquery跨網域存取json資料

jQuery的$.getJSON()能夠跨網域存取資料,是base在browser可以load不同網域的js檔的方式去包裝的。
<script src="http://www.example.com/test.js"></script>

範例

Client端
$.getJSON("http://www.example.com/getMessage.php?jsoncallback=?",
    function(data) {
        alert(data.message);
    });
Request發出時,jsoncallback後面的?會被取代成特定string,server回應的訊息必需包含此string才會被接受。而回傳的data會被轉成object。


Server端
$data = '{"message" : "hello world"}';
echo $_GET['jsoncallback'] . '(' . $data . ')';


參考資料