Heim  >  Artikel  >  Backend-Entwicklung  >  Einführung in die Methode zur Bereitstellung der Webentwicklung in Python

Einführung in die Methode zur Bereitstellung der Webentwicklung in Python

Y2J
Y2JOriginal
2017-05-13 14:03:291504Durchsuche

In diesem Artikel werden hauptsächlich verschiedene Methoden zur Bereitstellung von Webentwicklungsprogrammen in Python vorgestellt, die einen guten Referenzwert haben. Schauen wir uns das mit dem Editor unten an

1. fastcgi wird durch das flup-Modul unterstützt. Die entsprechende Konfigurationsanweisung in nginx ist fastcgi_pass

2 Es ist erforderlich, dass die Back-End-Anwendung über einen integrierten HTTP-Server verfügt, der eine hohe Parallelität verarbeiten kann. Im Python-Web-Framework können Sie nur Tornado auswählen.

3, uwsgi, einschließlich 4 TeileGruppe in:

  • uwsgi-Protokoll

  • integrierte Webserver-Unterstützung Protokollmodul

  • Anwendungsserverprotokoll-Unterstützungsmodul

  • Prozesssteuerungsprogramm

nginx hat gebaut- zur Unterstützung des uwsgi-Protokolls und des uwsgi-Protokolls ab 0.8.4. Sehr einfach, ein 4-Byte-Header + ein Body. Der Body kann ein Paket aus vielen Protokollen wie http, cgi usw. sein (markiert durch Felder im Header). ).

Das Merkmal von uwsgi ist ein eigenes Prozesssteuerungsprogramm, das in der Sprache C geschrieben ist und die Natvie-Funktion verwendet. Es ähnelt tatsächlich spawn-fcgi/php-fpm. Daher kann uwsgi eine Vielzahl von Anwendungsframeworks unterstützen, darunter (Python, Lua, Ruby, Erlang, Go) usw.

4. mod_python, dies ist ein integriertes Modul von Apache, das stark darauf angewiesen ist auf der von mod_python kompilierten Python-Version, wird mit Apache verwendet, nicht empfohlen

5. CGI, dies ist zu alt, nicht empfohlen und Nginx unterstützt den CGI-Modus nicht, Sie können nur lighttpd oder Apache verwenden

6. spawn-fcgi, dies ist ein Fastcgi-Multiprozess-Verwaltungsprogramm, das im Lighttpd--Installationspaket enthalten ist. Es hat den gleichen Effekt wie flup. Der Unterschied besteht darin, dass flup eingeführt wird die Python-Codeebene und spawn-fcgi ist ein externes Programm. spawn-fcgi ist sehr vielseitig und kann Code unterstützen, der in jeder Sprache wie PHP, Python, Perl entwickelt wurde. Solange Ihr Code die Fastcgi-Schnittstelle implementiert, kann es Ihnen bei der Verwaltung helfen Ihr Prozess.

7. scgi, der vollständige Name ist Simple Common Gateway Interface, ist auch eine alternative Version von cgi. Das scgi-Protokoll ist meiner Meinung nach sehr einfach Der entsprechende Konfigurationsbefehl von nginx ist scgi_pass. Sie können ihn verwenden, wenn Sie möchten. Flup unterstützt ihn auch.

8. Gunicorn, ein uwsgi-ähnliches Tool, wird vom Rails-Deployment-Tool (Unicorn) übertragen. Das verwendete Protokoll ist jedoch WSGI, der vollständige Name ist Python Web Server Gateway Interface, der in Python 2.5 definierte offizielle Standard (PEP 333). Es hat gute Wurzeln und ist relativ einfach bereitzustellen. Es gibt detaillierte Tutorials zu Gunicorn .org/

9. mod_wsgi, ein Modul von Apache, unterstützt auch das WSGI-Protokoll, code.google.com/p/modwsgi/

uwsgi

Uwsgi installieren

pip install uwsgi

uwsgi konfigurieren

uwsgi verfügt über mehrere Konfigurationen:


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

Konfigurationsbeispiel


$ 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
$

Detaillierte Erklärung der Konfigurationsparameter:

Gemeinsame Optionen:

Socket: Adresse und Portnummer, zum Beispiel: socket = 127.0.0.1:50000

Prozesse: Die Anzahl der gestarteten Prozesse

Arbeiter: Die Anzahl der gestarteten Prozesse entspricht den Prozessen (Auf der offiziellen Website heißt es, dass die angegebene Anzahl von Workern/Prozessen erzeugt wird.)

chdir: Geben Sie das laufende Verzeichnis an (chdir wird vor dem Laden der Apps in das angegebene Verzeichnis verschoben)

wsgi-Datei: Wsgi-Datei laden (.wsgi-Datei laden)

Statistik: At Öffnen Sie an der angegebenen Adresse den StatusDienst (aktivieren Sie den Statistikserver an der angegebenen Adresse)

Threads: Threads werden ausgeführt. Aufgrund der Existenz von GIL halte ich dies für wirklich nutzlos. (Führen Sie jeden Worker im Prethread-Modus mit der angegebenen Anzahl von Threads aus.)

Master: Erlaube den Master-Prozess zu existieren (Master-Prozess aktivieren)

daemonize: bewirkt, dass der Prozess im Hintergrund ausgeführt wird und sich in der angegebenen Protokolldatei oder dem UDP-Server protokolliert (dämonisiert uWSGI). Tatsächlich besteht die am häufigsten verwendete Methode darin, die laufenden Datensätze in eine lokale Datei auszugeben.

log-maxsize :以固定的文件大小(单位KB),切割日志文件。 例如:log-maxsize = 50000000  就是50M一个日志文件。

pidfile : 指定pid文件的位置,记录主进程的pid号。

vacuum : 当服务器退出的时候自动清理环境,删除unix socket文件和pid文件(try to remove all of the generated file/sockets)

disable-logging : 不记录请求信息的日志。只记录错误以及uWSGI内部消息到日志中。如果不开启这项,那么你的日志中会大量出现这种记录:

[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对应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()

生产环境示例


#!/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):
  # 运行服务
  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协议和http协议在代码部署中的的优劣对比

  • fastcgi虽然是二进制协议,相对于http协议,并不节省资源。二进制协议,只能节省数字的表达,比如 1234567,用字符串表示需要7个Byte,用数字就是4个Byte,而字符串到哪里都一样

  • fastcgi在传输数据的时候,为了兼容cgi协议,还要带上一堆cgi的环境变量,所以和http协议相比,用fastcgi传输数据并不省,反而多一些

  • fastcgi 唯一的优点是,它是长连接的,用户并发1000个request,fastcgi可能就用10个 链接转发给后端的appplication,如果用http协议,那来多少给多少,会向后端appplication 发起1000个请求

  • http代理转发方式,在面对超高并发的情况下会出问题,因为,tcp协议栈当中,port是int16整型 你本地新建一个connect,需要消耗一个端口,最多能到65536。外部并发几十万个请求,port池耗干,你的服务器只能拒绝响应了

CGI, FCGI, SCGI, WSGI 区别

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

顾名思义,它是一种接口规范。该规范详细定义了Web服务器中运行的服务器代理程序,怎样获取及返回网页生成过程中,服务器环境上下文和HTTP协议中的参数名称,如大家所熟知的:REQUEST_METHOD,QUERY_STRING,CONTENT_TYPE等等。绝大部分的Web服务器程序,是以脚本的形式代理接受并处理HTTP请求,返回HTTP页面或响应。这些脚本程序,就是大家所熟知的PHP、ASPJSP等等。

FCGI = Fast CGI

Es handelt sich tatsächlich um eine Variante von CGI in einer spezifischen Implementierung. Die Designidee besteht darin, das ultimative Ziel der Verbesserung der Webdienstleistung zu erreichen, indem der Kommunikationsaufwand zwischen dem CGI-Agentenprogramm und dem Webhost-Dienstprogramm reduziert wird. Es ist ersichtlich, dass sich FCGI hinsichtlich der Spezifikationen nicht von CGI unterscheidet, es jedoch Verbesserungen bei der spezifischen Implementierungsmethode gibt: Der Ansatz von CGI besteht darin, dass das Webhost-Dienstprogramm für jede HTTP-Anfrage einen neuen Prozess zum Aufrufen des Serverskripts erstellt. Dementsprechend besteht der Ansatz von FCGI darin, einen unabhängigen FCGI-Dienstprogrammprozess für die Kommunikation mit dem Webhost-Dienstprogrammprozess einzurichten. Sobald der FCGI-Dienstprozess gestartet ist, weist er Ressourcen zu, erstellt Threads zur Beantwortung von HTTP-Anfragen und bestimmt seinen eigenen Lebenszyklus , wodurch der Ressourcenaufwand, den das System für die Erstellung von Prozessen verursacht, erheblich reduziert wird. Moderne beliebte Webserverprogramme wie PHP und ASP.Net sind im Grunde Implementierungen von FCGI.

SCGI = Simple CGI

Es ist das Produkt von FCGI nach der Optimierung des Datenprotokolls und des Antwortprozesses. Sein Designzweck besteht darin, sich an die zunehmende Anzahl von HTTP-Anfragen basierend auf AJAX oder REST anzupassen und schnellere und prägnantere Antworten zu geben. Und SCGI stimmt zu, dass die HTTP-Verbindung sofort geschlossen wird, wenn der Server eine Antwort auf eine HTTP-Protokollanforderung zurückgibt. Daher ist es nicht schwer zu erkennen, dass SCGI im Allgemeinen besser für das von SOA befürwortete „Request-Forget“-Kommunikationsmodell geeignet ist.

WSGI = Web Server Gateway Interface

Dieses Protokoll ist von der Python-Sprache patentiert. Es definiert eine Reihe universell anwendbarer Schnittstellen für die Kommunikation zwischen Webdienst-Hostprogrammen und HTTP-Antwortbrokern. Es entstand, weil Python-Programmierer bemerkten, dass es eine ernsthafte Kopplung zwischen Web-Frameworks und Web-Hosting-Serverprogrammen gab. Einige Frameworks wurden beispielsweise für Apaches mod_python entwickelt. Daher definiert WSGI eine Reihe von Schnittstellen auf sehr niedriger Ebene. Gängige Python-Web-Frameworks implementieren dieses Protokoll: wie CherryPy, Django, web.py, web2py, TurboGears, Tornado, Pylons, BlueBream, Google App Engine [zweifelhaft – diskutieren], Trac, Flask, Pyramid usw .

Das obige ist der detaillierte Inhalt vonEinführung in die Methode zur Bereitstellung der Webentwicklung in Python. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn