最新文章專題視頻專題問答1問答10問答100問答1000問答2000關(guān)鍵字專題1關(guān)鍵字專題50關(guān)鍵字專題500關(guān)鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關(guān)鍵字專題關(guān)鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
當(dāng)前位置: 首頁 - 科技 - 知識百科 - 正文

python部署web開發(fā)的方法介紹

來源:懂視網(wǎng) 責(zé)編:小OO 時間:2020-11-27 14:24:21
文檔

python部署web開發(fā)的方法介紹

1、fastcgi ,通過flup模塊來支持,在nginx里對應(yīng)的配置指令是 fastcgi_pass。2、http,nginx使用proxy_pass轉(zhuǎn)發(fā),這個要求后端appplication必須內(nèi)置一個能處理高并發(fā)的http server,在python的web框架當(dāng)中,只能選擇tornado。3、uwsgi,包括4部分組成。uwsgi協(xié)議;web server內(nèi)置支持協(xié)議模塊。application服務(wù)器協(xié)議支持模塊。進(jìn)程控制程序;nginx從0.8.4開始內(nèi)置支持uwsgi協(xié)議,uwsgi協(xié)議非常簡單,一個4個字節(jié)header+一個body,body可以是很多協(xié)議的包,比如說http,cgi等(通過header里面字段標(biāo)示)。
推薦度:
導(dǎo)讀1、fastcgi ,通過flup模塊來支持,在nginx里對應(yīng)的配置指令是 fastcgi_pass。2、http,nginx使用proxy_pass轉(zhuǎn)發(fā),這個要求后端appplication必須內(nèi)置一個能處理高并發(fā)的http server,在python的web框架當(dāng)中,只能選擇tornado。3、uwsgi,包括4部分組成。uwsgi協(xié)議;web server內(nèi)置支持協(xié)議模塊。application服務(wù)器協(xié)議支持模塊。進(jìn)程控制程序;nginx從0.8.4開始內(nèi)置支持uwsgi協(xié)議,uwsgi協(xié)議非常簡單,一個4個字節(jié)header+一個body,body可以是很多協(xié)議的包,比如說http,cgi等(通過header里面字段標(biāo)示)。

本篇文章主要介紹了Python部署web開發(fā)程序的幾種方法,具有很好的參考價值。下面跟著小編一起來看下吧

1、fastcgi ,通過flup模塊來支持,在nginx里對應(yīng)的配置指令是 fastcgi_pass

2、http,nginx使用proxy_pass轉(zhuǎn)發(fā),這個要求后端appplication必須內(nèi)置一個能處理高并發(fā)的http server,在python的web框架當(dāng)中,只能選擇tornado.

3、uwsgi,包括4部分組成:

  • uwsgi協(xié)議

  • web server內(nèi)置支持協(xié)議模塊

  • application服務(wù)器協(xié)議支持模塊

  • 進(jìn)程控制程序

  • nginx從0.8.4開始內(nèi)置支持uwsgi協(xié)議,uwsgi協(xié)議非常簡單,一個4個字節(jié)header+一個body,body可以是很多協(xié)議的包,比如說http,cgi等(通過header里面字段標(biāo)示)。

    uwsgi的特點在于自帶的進(jìn)程控制程序.它是用c語言編寫,使用natvie函數(shù),其實和spawn-fcgi/php-fpm類似。所以uwsgi可以支持多種應(yīng)用框架,包括(python,lua,ruby,erlang,go)等等

    4、mod_python,這是apache內(nèi)置的模塊,很嚴(yán)重的依賴于mod_python編譯使用的python版本,和apache配套使用,不推薦

    5、cgi,這個太old,不推薦,而且nginx不支持cgi方式,只能用lighttpd或者apache

    6、spawn-fcgi,這個是fastcgi多進(jìn)程管理程序,lighttpd安裝包附帶的,和 flup效果一樣,區(qū)別是flup是 python代碼級引入,spawn-fcgi是外部程序。spawn-fcgi用途很廣,可以支持任意語言開發(fā)的代碼,php,python,perl,只要你代碼實現(xiàn)了fastcgi接口,它都可以幫你管理你的進(jìn)程

    7、scgi,全名是Simple Common Gateway Interface,也是cgi的替代版本,scgi協(xié)議很簡單,我覺得和fastcgi差不多,只是沒有怎么推廣開來,nginx對應(yīng)的配置指令是scgi_pass,你想用就用,flup也支持。

    8、Gunicorn,和uwsgi類似的工具,從rails的部署工具(Unicorn)移植過來的。但是它使用的協(xié)議是 WSGI,全稱是Python Web Server Gateway Interface ,這是python2.5時定義的官方標(biāo)準(zhǔn)(PEP 333 ),根紅苗正,而且部署比較簡單,gunicorn.org/ 上有詳細(xì)教程

    9、mod_wsgi,apache的一個module,也是支持WSGI協(xié)議,code.google.com/p/modwsgi/

    uwsgi

    安裝uwsgi

    pip install uwsgi

    配置uwsgi

    uwsgi 有多種配置可用:

    1,ini 
    2,xml 
    3,json
    4,yaml

    配置示例

    $ cat etc/uwsgi.ini 
    [uwsgi]
    socket = 127.0.0.1:9005
    chdir = /Users/suoning/python_project/trunk/
    wsgi-file = main.py
    processes = 4
    stats = 127.0.0.1:9000
    daemonize = /tmp/uwsgiServer.log
    pidfile = /tmp/uwsgi.pid
    vacuum = true
    log-maxsize = 50000000
    disable-logging = true
    callable = app
    $

    配置參數(shù)詳解:

    常用選項:

    socket : 地址和端口號,例如:socket = 127.0.0.1:50000

    processes : 開啟的進(jìn)程數(shù)量

    workers : 開啟的進(jìn)程數(shù)量,等同于processes(官網(wǎng)的說法是spawn the specified number of workers / processes)

    chdir : 指定運(yùn)行目錄(chdir to specified directory before apps loading)

    wsgi-file : 載入wsgi-file(load .wsgi file)

    stats : 在指定的地址上,開啟狀態(tài)服務(wù)(enable the stats server on the specified address)

    threads : 運(yùn)行線程。由于GIL的存在,我覺得這個真心沒啥用。(run each worker in prethreaded mode with the specified number of threads)

    master : 允許主進(jìn)程存在(enable master process)

    daemonize : 使進(jìn)程在后臺運(yùn)行,并將日志打到指定的日志文件或者udp服務(wù)器(daemonize uWSGI)。實際上最常用的,還是把運(yùn)行記錄輸出到一個本地文件上。

    log-maxsize :以固定的文件大?。▎挝籏B),切割日志文件。 例如:log-maxsize = 50000000 就是50M一個日志文件。

    pidfile : 指定pid文件的位置,記錄主進(jìn)程的pid號。

    vacuum : 當(dāng)服務(wù)器退出的時候自動清理環(huán)境,刪除unix socket文件和pid文件(try to remove all of the generated file/sockets)

    disable-logging : 不記錄請求信息的日志。只記錄錯誤以及uWSGI內(nèi)部消息到日志中。如果不開啟這項,那么你的日志中會大量出現(xiàn)這種記錄:

    [pid: 347|app: 0|req: 106/367] 117.116.122.172 () {52 vars in 961 bytes} [Thu Jul 7 19:20:56 2016] POST /post => generated 65 bytes in 6 msecs (HTTP/1.1 200) 2 headers in 88 bytes (1 switches on core 0)

    配置nginx

    $ cat etc/nginx/servers/tongbupan.conf
    
    server {
     listen 80;
     server_name localhost;
    
     location / {
     include uwsgi_params;
     uwsgi_pass 127.0.0.1:9005;
     }
    
     location /webstatic/ {
     expires 7d;
     add_header Cache-Control public;
     alias /Users/suoning/probject/python_project/webstatic/trunk/;
     }
    
    }
    
    $ 
    $ nginx -t
    nginx: the configuration file /usr/local/etc/nginx/nginx.conf syntax is ok
    nginx: configuration file /usr/local/etc/nginx/nginx.conf test is successful
    $ 
    $ nginx -s reload
    $

    配置application

    flask 示例

    ...
    app = Flask('pan')
    ...
    
    if name == 'main':
     # app.run(host='0.0.0.0', port=5000)
     app.run()
    
    # 注意:變量app對應(yīng)uwsgi配置文件uwsgi.ini中 callable = app

    啟動uwsgi

    $ 
    $ uwsgi --ini /usr/local/etc/uwsgi.ini
    [uWSGI] getting INI configuration from /usr/local/etc/uwsgi.ini
    $ 
    $ ps -ef|grep uwsgi
    11428 1 0 11:40下午 ?? 0:01.23 uwsgi --ini /usr/local/etc/uwsgi.ini
    11432 11428 0 11:40下午 ?? 0:00.00 uwsgi --ini /usr/local/etc/uwsgi.ini
    11433 11428 0 11:40下午 ?? 0:00.00 uwsgi --ini /usr/local/etc/uwsgi.ini
    11434 11428 0 11:40下午 ?? 0:00.00 uwsgi --ini /usr/local/etc/uwsgi.ini
    11435 11428 0 11:40下午 ?? 0:00.00 uwsgi --ini /usr/local/etc/uwsgi.ini
    11440 69240 0 11:40下午 ttys000 0:00.00 grep uwsgi
    $ 
    $ lsof -i tcp:9000
    COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
    uwsgi 11428 suoning 28u IPv4 0x5583e11534d24e73 0t0 TCP localhost:cslistener (LISTEN)
    $
    $ lsof -i tcp:9005
    COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
    uwsgi 11428 suoning 6u IPv4 0x5583e11535699e73 0t0 TCP localhost:9005 (LISTEN)
    uwsgi 11432 suoning 6u IPv4 0x5583e11535699e73 0t0 TCP localhost:9005 (LISTEN)
    uwsgi 11433 suoning 6u IPv4 0x5583e11535699e73 0t0 TCP localhost:9005 (LISTEN)
    uwsgi 11434 suoning 6u IPv4 0x5583e11535699e73 0t0 TCP localhost:9005 (LISTEN)
    uwsgi 11435 suoning 6u IPv4 0x5583e11535699e73 0t0 TCP localhost:9005 (LISTEN)
    $

    FCGI

    參考:webpy.org/cookbook/fastcgi-nginx

    配置Nginx

    $ cat etc/nginx/servers/pan.conf
    
    server {
     listen 80;
     server_name localhost;
    
     error_page 500 502 503 504 /50x.html;
     location = /50x.html {
     root html;
     }
    
     location / {
     fastcgi_param REQUEST_METHOD $request_method;
     fastcgi_param QUERY_STRING $query_string;
     fastcgi_param CONTENT_TYPE $content_type;
     fastcgi_param CONTENT_LENGTH $content_length;
     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;
     fastcgi_param SERVER_PROTOCOL $server_protocol;
     fastcgi_param SCRIPT_FILENAME $fastcgi_script_name;
     fastcgi_param PATH_INFO $fastcgi_script_name;
     fastcgi_pass 127.0.0.1:9005;
     }
    
     location /webstatic/ {
     expires 7d;
     add_header Cache-Control public;
     alias /Users/suoning/probject/python_project/webstatic/trunk/;
     }
    
    }
    
    $

    配置application

    簡單示例

    from flup.server.fcgi import WSGIServer
    from pan import app
    
    WSGIServer(
     app,
     bindAddress=(host, port),
     maxThreads=threads
    ).run()

    生產(chǎn)環(huán)境示例

    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    author = 'suoning'
    
    
    import sys
    import argparse
    from flup.server.fcgi import WSGIServer
    from lib.daemon import Daemon
    from pan import app
    
    APP_NAME = 'pan_platform'
    APP_INST_NAME = '20170501'
    
    parser = argparse.ArgumentParser(description=u'Run an pan FastCGI server')
    parser.add_argument('command', type=str,
     help=u'command [start|stop|restart]',
     choices=['start', 'stop', 'restart'])
    parser.add_argument('-p', '--port', type=int,
     help=u'port of this server', required=True)
    parser.add_argument('-t', '--threads', type=int, default=50,
     help=u'max number of threads')
    parser.add_argument('-host', '--host', default='0.0.0.0',
     help=u'Listen to the main clause')
    
    
    class panPlatformDaemon(Daemon):
     def run(self):
     # 運(yùn)行服務(wù)
     try:
     WSGIServer(
     app,
     bindAddress=(args.host, args.port),
     maxThreads=args.threads,
     umask=0111
     ).run()
     except:
     sys.stderr.write('oops')
    
    
    def gen_pidfile(port):
     return '/var/run/%s_%s_%d.pid' % (APP_NAME, APP_INST_NAME, port)
    
    
    if name == 'main':
     args = parser.parse_args()
     daemon = panPlatformDaemon(gen_pidfile(args.port))
     if 'start' == args.command:
     daemon.start()
     elif 'stop' == args.command:
     daemon.stop()
     elif 'restart' == args.command:
     daemon.restart()
     else:
     print "Unknown command"
     sys.exit(2)
     sys.exit(0)

    fastcgi協(xié)議和http協(xié)議在代碼部署中的的優(yōu)劣對比

  • fastcgi雖然是二進(jìn)制協(xié)議,相對于http協(xié)議,并不節(jié)省資源。二進(jìn)制協(xié)議,只能節(jié)省數(shù)字的表達(dá),比如 1234567,用字符串表示需要7個Byte,用數(shù)字就是4個Byte,而字符串到哪里都一樣

  • fastcgi在傳輸數(shù)據(jù)的時候,為了兼容cgi協(xié)議,還要帶上一堆cgi的環(huán)境變量,所以和http協(xié)議相比,用fastcgi傳輸數(shù)據(jù)并不省,反而多一些

  • fastcgi 唯一的優(yōu)點是,它是長連接的,用戶并發(fā)1000個request,fastcgi可能就用10個 鏈接轉(zhuǎn)發(fā)給后端的appplication,如果用http協(xié)議,那來多少給多少,會向后端appplication 發(fā)起1000個請求

  • http代理轉(zhuǎn)發(fā)方式,在面對超高并發(fā)的情況下會出問題,因為,tcp協(xié)議棧當(dāng)中,port是int16整型 你本地新建一個connect,需要消耗一個端口,最多能到65536。外部并發(fā)幾十萬個請求,port池耗干,你的服務(wù)器只能拒絕響應(yīng)了

  • CGI, FCGI, SCGI, WSGI 區(qū)別

    WIKI Links:

    CGI - en.wikipedia.org/wiki/Common_Gateway_Interface
    FCGI - en.wikipedia.org/wiki/Fcgi
    SCGI - en.wikipedia.org/wiki/SCGI
    WSGI - en.wikipedia.org/wiki/Wsgi

    Other reference:

    helpful.knobs-dials.com/index.php/CGI%2C_FastCGI%2C_SCGI%2C_WSGI%2C_servlets_and_such#FastCGI_and_SCGI

    CGI = Common Gateway Interface

    顧名思義,它是一種接口規(guī)范。該規(guī)范詳細(xì)定義了Web服務(wù)器中運(yùn)行的服務(wù)器代理程序,怎樣獲取及返回網(wǎng)頁生成過程中,服務(wù)器環(huán)境上下文和HTTP協(xié)議中的參數(shù)名稱,如大家所熟知的:REQUEST_METHOD,QUERY_STRING,CONTENT_TYPE等等。絕大部分的Web服務(wù)器程序,是以腳本的形式代理接受并處理HTTP請求,返回HTTP頁面或響應(yīng)。這些腳本程序,就是大家所熟知的PHP、ASP、JSP等等。

    FCGI = Fast CGI

    它其實是CGI在具體實現(xiàn)中的的一個變種。其設(shè)計思路是,通過減少CGI代理程序和Web宿主服務(wù)程序的通信開銷,從而達(dá)到提高Web服務(wù)性能的最終目的。由此可見,F(xiàn)CGI在規(guī)范上跟CGI并沒有不同,只是具體實現(xiàn)方式上有所改進(jìn):CGI的做法是,對于每個HTTP請求,Web宿主服務(wù)程序都建立新的進(jìn)程以調(diào)用服務(wù)器腳本,相應(yīng)該請求;FCGI的做法是,建立一個獨立的FCGI服務(wù)程序進(jìn)程,和Web宿主服務(wù)程序進(jìn)程通信,F(xiàn)CGI服務(wù)進(jìn)程被一旦啟動后,自己分配資源、創(chuàng)建線程響應(yīng)HTTP請求、并決定自身生命周期,從而大大降低了系統(tǒng)為了創(chuàng)建進(jìn)程而做出的資源開銷?,F(xiàn)代流行的Web服務(wù)器程序,如PHP、ASP.Net,基本都是FCGI的實現(xiàn)。

    SCGI = Simple CGI

    它是FCGI在精簡數(shù)據(jù)協(xié)議和響應(yīng)過程后的產(chǎn)物。其設(shè)計目的是為了適應(yīng)越來越多基于AJAX或REST的HTTP請求,而做出更快更簡潔的應(yīng)答。并且SCGI約定,當(dāng)服務(wù)器返回對一個HTTP協(xié)議請求響應(yīng)后,立刻關(guān)閉該HTTP連接。所以不難看出,SCGI更加適合于普遍意義上SOA所提倡的“請求-忘記”這種通信模式。

    WSGI = Web Server Gateway Interface

    此協(xié)議是Python語言的專利,它定義了一組在Web服務(wù)宿主程序和HTTP響應(yīng)代理程序之間通信的普遍適用的接口。它的產(chǎn)生是因為Python程序員注意到,對于Web框架和Web宿主服務(wù)器程序間,有嚴(yán)重的耦合性,比如說,某些框架是針對Apache的mod_python設(shè)計的。于是,WSGI就定義了一套非常低級別的接口。常見的Python Web框架都實現(xiàn)了這個協(xié)議:如 CherryPy, Django, web.py, web2py, TurboGears, Tornado, Pylons, BlueBream, Google App Engine[dubious – discuss], Trac, Flask, Pyramid,等等.

    聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

    文檔

    python部署web開發(fā)的方法介紹

    1、fastcgi ,通過flup模塊來支持,在nginx里對應(yīng)的配置指令是 fastcgi_pass。2、http,nginx使用proxy_pass轉(zhuǎn)發(fā),這個要求后端appplication必須內(nèi)置一個能處理高并發(fā)的http server,在python的web框架當(dāng)中,只能選擇tornado。3、uwsgi,包括4部分組成。uwsgi協(xié)議;web server內(nèi)置支持協(xié)議模塊。application服務(wù)器協(xié)議支持模塊。進(jìn)程控制程序;nginx從0.8.4開始內(nèi)置支持uwsgi協(xié)議,uwsgi協(xié)議非常簡單,一個4個字節(jié)header+一個body,body可以是很多協(xié)議的包,比如說http,cgi等(通過header里面字段標(biāo)示)。
    推薦度:
    標(biāo)簽: 方法 發(fā)布 方式
    • 熱門焦點

    最新推薦

    猜你喜歡

    熱門推薦

    專題
    Top