python web 網關API/httpserver學習之 uWSGI學習,實現ajax json與python py程序之間的數據交互

uWSGI:

    uWSGI:是python的http server服務,也叫做python網關API,主要作用是接收html發送過來的數據並傳遞給web後臺邏輯,實現數據庫的交互

    python web中,大多數都在討論flask等框架,個人而言,更喜歡討論一些server實現而不是現場框架,所以自己寫的網站後端處理邏輯也是用的python,
    但是並沒有用任何的python框架,自寫邏輯,這裏就要一個httpserver服務把我的html中ajax請求轉發給我的處理邏輯。所以用到了uwsgi;
    uWSGI:是python已經寫好的httpserver,鑑於個人能力有限,暫時沒有時間學習,以後學的更多後會嘗試自己寫一下httpserver實現數據轉發。


    uWSGI 安裝:
    uWSGI是基於python的一個存python寫的模塊,直接pip install即可安裝;

    啓動:
        啓動前需準備配置文件,用現成封裝的軟件大多數都是有目的性的,所以根據默認的設置是不能達到自身需求
        這時候就需要自定義相關設置,而配置文件則是自定義設置的具體規則;

        配置文件格式:
            uWSGI的配置文件可以是多種文本格式,比如json、ini、xml、yaml等,所以可以新建配置文件文本例如:
            config.json、config.ini、config.xml等,目前主流喜歡用ini等格式,所以我新建一個config.ini作爲配置文件文檔

        
        配置文件:

            一個樣例uWSGI INI配置:

            [uwsgi]
            socket = /tmp/uwsgi.sock
            socket = 127.0.0.1:8000
            workers = 3
            master = true
            默認情況下,uWSGI使用 [uwsgi] 段,但是你可以在使用 filename:section 語法加載INI文件的時候指定另一個段名,也就是:

            uwsgi --ini myconf.ini:app1
            作爲選擇,你可以通過省略文件名並只指定段名來從相同的文件中加載另一個段。注意,技術上來講,這會從上個加載的.ini文件中加載命名段,而不是從當前的文件中加載,因此,當包含其他文件的時候,小心爲上。

            [uwsgi]
            # This will load the app1 section below
            ini = :app1
            # This will load the defaults.ini file
            ini = defaults.ini
            # This will load the app2 section from the defaults.ini file!
            ini = :app2

            [app1]
            plugin = rack

            [app2]
            plugin = php

        配置文件舉例:

            master = true 
            #啓動主進程,來管理其他進程,其它的uwsgi進程都是這個master進程的子進程,如果kill這個master進程,
            相當於重啓所有的uwsgi進程。

            chdir = /web/www/mysite 
            #在app加載前切換到當前目錄, 指定運行目錄

            module = mysite.wsgi 
            # 加載一個WSGI模塊,這裏加載mysite/wsgi.py這個模塊

            py-autoreload=1  
            #監控python模塊mtime來觸發重載 (只在開發時使用)

            lazy-apps=true  
            #在每個worker而不是master中加載應用

            socket = /test/myapp.sock
            --socket <path/address> 
            #指定socket文件,也可以指定爲127.0.0.1:9000,這樣就會監聽到網絡套接字,監控端口

            processes = 2 
            #啓動2個工作進程,生成指定數目的worker/進程

            buffer-size = 32768 
            #設置用於uwsgi包解析的內部緩存區大小爲64k。默認是4k。

            daemonize = /var/log/myapp_uwsgi.log 
            # 使進程在後臺運行,並將日誌打到指定的日誌文件或者udp服務器

            log-maxsize = 5000000 
            #設置最大日誌文件大小

            disable-logging = true 
            #禁用請求日誌記錄

            vacuum = true 
            #當服務器退出的時候自動刪除unix socket文件和pid文件。

            listen = 120 
            #設置socket的監聽隊列大小(默認:100)每一個socket都有一個相關聯的隊列,請求會被放入其中等待進程來處理。
            #當這個隊列慢的時候,新來的請求就會被拒絕。隊列大小的最大值依賴於系統內核。

            pidfile = /var/run/uwsgi.pid
            #指定pid文件

            enable-threads = true 
            #允許用內嵌的語言啓動線程。這將允許你在app程序中產生一個子線程

            reload-mercy = 8 
            #設置在平滑的重啓(直到接收到的請求處理完才重啓)一個工作子進程中,等待這個工作結束的最長秒數。
            #這個配置會使在平滑地重啓工作子進程中,如果工作進程結束時間超過了8秒就會被強行結束(忽略之前已經接收到的請求而直接結束)

            max-requests = 5000 
            #爲每個工作進程設置請求數的上限。當一個工作進程處理的請求數達到這個值,那麼該工作進程就會被回收重用(重啓)。
            #你可以使用這個選項來默默地對抗內存泄漏

            limit-as = 256 
            #通過使用POSIX/UNIX的setrlimit()函數來限制每個uWSGI進程的虛擬內存使用數。
            #這個配置會限制uWSGI的進程佔用虛擬內存不超過256M。
            #如果虛擬內存已經達到256M,並繼續申請虛擬內存則會使程序報內存錯誤,本次的http請求將返回500錯誤。

            harakiri = 60 
            #一個請求花費的時間超過了這個harakiri超時時間,那麼這個請求都會被丟棄,
            #並且當前處理這個請求的工作進程會被回收再利用(即重啓)


        啓動:

            nohup uwsgi --ini uwsgi/uwsgi.ini &


        其他參數參考地址:

            https://www.cnblogs.com/zhouej/archive/2012/03/25/2379646.html
            https://uwsgi-docs-zh.readthedocs.io/zh_CN/latest/Configuration.html

    如何使用:

        舉例:

            1、新建一個hello world輸出的test.py文件,即可當作是python腳本文件,內容如下:
            def application(environ, start_response):
            status = '200 OK'
            output = 'Hello World!'

            response_headers = [('Content-type', 'text/plain'),
                                ('Content-Length', str(len(output)))]
            start_response(status, response_headers)

            return [output]


            2、啓動uwsgi,監聽一個端口,模擬網頁http請求到該端口,測試網頁訪問該端口,後端的python腳本能否執行輸出
               啓動:uwsgi --http :9090 --wsgi-file test.py
               --注意需要在test.py文件夾下執行,否則需要指定該文件路徑,這裏啓動的是http監聽,nginx測試需要改成socket

            3、通過瀏覽器訪問該機器的IP+9090端口,返回hello world即代表瀏覽器請求成功,python後端程序能收到數據並返回數據,uwsgi
               代理配置成功

            由於我是服務器直接測試,所以不是本地127IP,測試結果一樣;

        
        uWSGI對端口監聽有兩種方式,1、http監聽,針對網頁直接的http請求監聽端口處理,這裏功能類似與NGINX;
        2、socket監聽,用來配合代理服務的監聽方式,上游對接nginx 阿帕奇等服務。如果上有傳過來的數據是nginx發送的,需要使用socket監聽;


本次測驗解決了python web後端如何處理網頁請求的問題,加深了網關api的理解和http server服務的理解;由於網頁http請求和https請求
是有一些差異的,https的uwsgi可能需要額外配置,不過我自己是通過nginx代理跳轉到uwsgi,所以在nginx轉發的時候統一轉換成了http請求,
因此沒有做https請求實驗;


衍生問題:

    現在使用框架的API開發,大多數都是在這個http server服務下,裏面添加方法判斷數據再轉發給後續程序,那麼產生一個新的疑問,當http
    server掛掉,如何保障整體的運行,能否啓用集羣模式、是否會有衝突等需後續解決 ;

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