في الماضي السحيق كانت الطريقة التقليدية هي CGI أي أن تكون المخطوطة/السكربت ملف تنفيذي تنفذ ويمرر لها متغيرات بيئة تحتوي الترويسات الإضافية ثم ظهر mod_python و python server pages وهي طرق تشبه php.

ولأن هذا غير عملي ظهرت طرق تدعم Fast CGI أو FCGI وكل واحدة مما سبق كانت تحتاج كتابة تطبيق الويب بطريقة مختلفة. ثم ظهرت ويزجي WSGI عبر معيار PEP 333 والتي وحدت طرق كود تطبيق الويب بغض النظر عن طرق استضافته وظهرت أطر عمل للويب تحقق هذا المعيار مثل جانغو Django.

الآن لنفرض أنه لدينا تطبيق يحقق WSGI كيف نُخدمه؟ وكيف نستضيفه؟

الطريقة الأسهل هي استخدام خادوم ويب مضمن في بايثون نفسها (دون الحاجة لأي خادم لا أباتشي ولا nginx ولا أي إعدادات) وهذه الطريقة هي المفضلة في مرحلة التطوير وأشهر مثال هو التنفيذ المرجعي Reference implementation لمعيار ويزجي. فإذا افترضنا أن عندك تطبيق ويب اسمه my_app يمكن تشغيل الخادوم على المنفذ 8000 هكذا

https://docs.python.org/2/library/wsgiref.html#module-wsgiref.simple_server

from wsgiref.simple_server import make_server
httpd = make_server('', 8000, my_app)
httpd.serve_forever()

وبما أنها تستخدم خادوم مكتوب ببايثون يمكن تغيير سلوكه ليكون متعدد خيوط المعالجة multithreads عبر ThreadingMixIn أو متعدد العمليات عبر ForkingMixIn من خلال الوراثة المتعددة وما يعرف باسم MixIn (وهي فئة class لا تحتوي دالة إنشاء بل تدخل في الوراثة لتغير سلوك الكائن من خلال تعريف أو تبدل دوال أخرى) وأنا قمت بعمل MixIn يدعم تعدد العمليات والخيوط معا وأيضا يستخدم مبدأ الاستهلال المسبق Prefork مما يعطيه أداء عالي جدا

https://github.com/muayyad-alsadi/python-PooledProcessMixIn/blob/master/demos/wsgi-demo.py

هناك العديد من خوادم تطبيقات ويزجي الأخرى المكتوبة بلغة بايثون الصرفة (دون إضافات) منها ما لا يعتمد على وحدة wsgiref إما لأنه كتب قبل إضافتها في إصدار بايثون 2.5 أو لأنه يريد يدعم إصدارات بايثون الأقدم. من أشهرها خادم Paste ومن صفاته أنه أحداي العمليات متعدد الخيوط (كل طلب في خيط معالجة جديد) لكن يبدو أنهم أضافوا دعم thread pool ويجمعون بين الإثنين يستخدم هكذا

from paste import httpserver
httpserver.serve(my_app, host='127.0.0.1', port='8000')

كذلك يأتي إطار الويب CherryPy مع خادم ويزجي مدمج فيه أيضا وهو يستخدم thread pool ويستخدم هكذا

from cherrypy import wsgiserver
d = wsgiserver.WSGIPathInfoDispatcher({'/': my_app})
server = wsgiserver.CherryPyWSGIServer(('0.0.0.0', 8080), d)
server.start()

هناك بعض الخوادم مكتوبة بلغة سي/سي++ وتستخدم لتشغيل تطبيقات ويزجي. خادوم FAPWS3 يستخدم libev. وهناك uWSGI وتلفظ مايكرو-ويزجي (وهو غير مختص في بايثون وحدها) وهناك bjoern.

هناك خادم ويزجي مضمن داخل أباتشي اسمه mod_wsgi وهو يأخذ العدد الذي تحدده من العمليات الخيوط ويعمل خادم أباتشي على تشغيلها تلقائيا والقيام عليها بينما الخوادم الأخرى عليك تشغيلها بنفسك أو عبر أداة مثل supervisor.

https://code.google.com/p/modwsgi/

http://supervisord.org/

هناك بعض الخوادم تستفيد من ميزة green threads فتكون عبارة عن عملية واحدة و thread حقيقي واحد لكن هناك أكثر من خيط معالجة أخضر green threads مثل مشروع gevent و eventlets و gunicorn

http://www.gevent.org/

http://eventlet.net/doc/modules/wsgi.html

http://gunicorn.org/

وهناك خادم ويزجي يستفيد من ميزة stackless ومزايا JIT في PyPy انظر

https://code.google.com/p/stacklessexamples/wiki/StacklessWSGI

https://code.google.com/p/stacklessexamples/source/browse/trunk/examples/networking/wsgi/stacklesswsgi.py

ولأن تلك الخوادم تعمل على عملية واحدة فقط يمكنك أن تشغل عدد منها كل واحدة على منفذ مختلف مثلا 8000 و 8001 و 8002 و 8003 وتعمل توزيع حمل عليها load balancing من خلال nginx أو haproxy أو varnish. الأداء ليس هو الهدف الوحيد لعمل ذلك بل أيضا لأنها ليست مصممة كي تتصل مع عملاء clients بطيئة فهي يجب أن توضع خلف خوادم ذات buffer.

وهناك أطر عمل للشبكات بشكل عام وليس لويزجي فحسب مثل twisted matrix (مثل بروتوكول الموزة banana protocol) وهو من وجهة نظري مخيب للأمل والإعصار Tornado (المكتوب بلغة بايثون وهو يوفر دعم لأشياء غير ويزجي مثل websockets) وهذا الأخير يتميز باستعمال الأحداث غير المتزامنة async io والإتصالات التي تظل مفتوحة لفترة طويلة وأداؤه مميز مقارنة بالكثير من الخوادم الأخرى.

https://developers.google.com/appengine/docs/python/tools/webapp/running

ولمن ليس أمامه إلا fast cgi (لأن صاحب الخادم لا يسمح لك بتثبيت الطرق الأخرى) يمكنه استعمال flup كما في هذا المثال

http://flask.pocoo.org/docs/deploying/fastcgi/

يمكن استضافة تطبيقات ويزجي على google app engine بشرط أن لا يحترم التطبيق شروط غوغل (لا يحتاج للكتابة القرص مثلا)

انظر

  • http://nichol.as/benchmark-of-python-web-servers

  • https://www.digitalocean.com/community/tutorials/a-comparison-of-web-servers-for-python-based-web-applications

  • http://ojuba.org/wiki/okasha/deployment

  • http://code.mixpanel.com/2012/09/28/how-we-handle-deploys-and-failover-without-disrupting-user-experience/