File: deployment.html

package info (click to toggle)
okasha 0.3.0-1
  • links: PTS, VCS
  • area: non-free
  • in suites: bookworm
  • size: 784 kB
  • sloc: python: 1,024; sh: 30; makefile: 7; javascript: 2
file content (302 lines) | stat: -rw-r--r-- 18,934 bytes parent folder | download | duplicates (5)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ar"
 lang="ar" dir="rtl">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>وثائق عكاشة</title>
<link rel="stylesheet" media="all" type="text/css" href="all.css" />
<link rel="stylesheet" media="screen" type="text/css" href="screen.css" />
<link rel="stylesheet" media="print" type="text/css" href="print.css" />
</head>
<body>
<div class="dokuwiki export">
<!-- TOC START -->
<div class="toc">
<div class="tocheader toctoggle" id="toc__header">جدول المحتويات</div>
<div id="toc__inside">

<ul class="toc">
<li class="level1"><div class="li"><span class="li"><a href="#طرق_النشر" class="toc">طرق النشر</a></span></div>
<ul class="toc">
<li class="level2"><div class="li"><span class="li"><a href="#طريقة_cgi_البائدة_وما_يشبهها" class="toc">طريقة CGI البائدة وما يشبهها</a></span></div></li>
<li class="level2"><div class="li"><span class="li"><a href="#عبر_خادم_python-paste_المنضدد" class="toc">عبر خادم python-paste المنضدد</a></span></div></li>
<li class="level2"><div class="li"><span class="li"><a href="#عبر_mod_proxy_في_apache" class="toc">عبر mod_proxy في apache</a></span></div></li>
<li class="level2"><div class="li"><span class="li"><a href="#عبر_google_app_engine" class="toc">عبر google app engine</a></span></div></li>
<li class="level2"><div class="li"><span class="li"><a href="#عبر_mod_python_في_خادم_apache" class="toc">عبر mod_python في خادم apache</a></span></div></li>
<li class="level2"><div class="li"><span class="li"><a href="#عبر_mod_wsgi_في_خادم_apache" class="toc">عبر mod_wsgi في خادم apache</a></span></div>
<ul class="toc">
<li class="level3"><div class="li"><span class="li"><a href="#طريقة_توزيع_الملفات" class="toc">طريقة توزيع الملفات</a></span></div></li>
<li class="level3"><div class="li"><span class="li"><a href="#إعداد_apache" class="toc">إعداد apache</a></span></div></li>
</ul>
</li>
<li class="level2"><div class="li"><span class="li"><a href="#عبر_fast_cgi" class="toc">عبر Fast CGI</a></span></div></li>
<li class="level2"><div class="li"><span class="li"><a href="#خوادم_أخرى" class="toc">خوادم أخرى</a></span></div></li>
<li class="level2"><div class="li"><span class="li"><a href="#تقييم_خوادم_wsgi" class="toc">تقييم خوادم WSGI</a></span></div></li>
</ul>
</li>
</div>
</div>
<!-- TOC END -->

<h1 class="sectionedit1"><a name="طرق_النشر" id="طرق_النشر">طرق النشر</a></h1>
<div class="level1">

<p>
إن هناك عشرات الطرق لإطلاق تطبيقات عكاشة شأنه في ذلك شان تطبيقات WSGI حيث أنها معايير كتابة تطبيقات الويب في بايثون. ومن هذه الطرق
</p>

<p>
الطريقة التي ننصح بها هي mod_wsgi بشكل رسمي وعبر python-paste للاختبار والتطوير
</p>

</div>
<!-- EDIT1 SECTION "طرق النشر" [1-395] -->
<h2 class="sectionedit2"><a name="طريقة_cgi_البائدة_وما_يشبهها" id="طريقة_cgi_البائدة_وما_يشبهها">طريقة CGI البائدة وما يشبهها</a></h2>
<div class="level2">

<p>
استخدم دالة <a target="_blank" href="http://www.python.org/dev/peps/pep-0333/#the-server-gateway-side" class="urlextern" title="http://www.python.org/dev/peps/pep-0333/#the-server-gateway-side"  rel="nofollow">run_with_cgi</a> الموجودة في برنامج  الصغير المرفق مع PEP 0333 هذه الدالة تستلم كائن تطبيق الويب.
</p>

<p>
ضع ذاك الكود (كود الدالة وإنشاء الكائن ثم استدعاء الدالة مع تمرير التطبيق لها) في ملف ثم ضعه في cgi-bin ثم اسمح بتنفيذه.
</p>

</div>
<!-- EDIT2 SECTION "طريقة CGI البائدة وما يشبهها" [396-911] -->
<h2 class="sectionedit3"><a name="عبر_خادم_python-paste_المنضدد" id="عبر_خادم_python-paste_المنضدد">عبر خادم python-paste المنضدد</a></h2>
<div class="level2">

<p>
انظر صفحة <a href="sample1.html" class="wikilink1" title="okasha:sample1">مثال أولي بسيط</a>
</p>

</div>
<!-- EDIT3 SECTION "عبر خادم python-paste المنضدد" [912-998] -->
<h2 class="sectionedit4"><a name="عبر_mod_proxy_في_apache" id="عبر_mod_proxy_في_apache">عبر mod_proxy في apache</a></h2>
<div class="level2">

<p>
لنفرض أن التطبيق يعمل على خادم paste الضمني على المنفذ 8080 ويستمع فقط للطلبات المحلية على العنوان 127.0.0.1 أي localhost حتى نجعله متوفر عبر خادم apache العام على منفذ 80 يمكننا بكل بساطة أن نضيف ما يلي إلى إعدادات Apache

</p>
<pre class="code">ProxyPass         /myapp  http://localhost:8080/
ProxyPassReverse  /myapp  http://localhost:8080/</pre>

<p>
وفي هذه الحالة ستحال الطلبات القدمة إلى المنفذ 80 إن كانت  تبدأ ب /myapp إلى <a target="_blank" href="http://localhost:8080/" class="urlextern" title="http://localhost:8080/"  rel="nofollow">http://localhost:8080/</a>

</p>
<ul>
<li class="level1"><div class="li"> للمزيد انظر وثائق <a target="_blank" href="http://httpd.apache.org/docs/2.0/mod/mod_proxy.html" class="urlextern" title="http://httpd.apache.org/docs/2.0/mod/mod_proxy.html"  rel="nofollow">mod_proxy</a></div>
</li>
</ul>

</div>
<!-- EDIT4 SECTION "عبر mod_proxy في apache" [999-1776] -->
<h2 class="sectionedit5"><a name="عبر_google_app_engine" id="عبر_google_app_engine">عبر google app engine</a></h2>
<div class="level2">

<p>
لنفرض أن لديك تطبيق ويب اسمه test.py يحتوي على فئة اسمها MyWebApp ونريد تشغيله على غوغل apps engine لذا نعمل ملف الذي يشغله وليكن اسمه apptest.py مثلا هكذا:
</p>
<pre class="code python"><span class="co1">#! /usr/bin/python</span>
<span class="co1"># -*- coding: UTF-8 -*-</span>
<span class="kw1">import</span> <span class="kw3">sys</span>, <span class="kw3">os</span>, <span class="kw3">os</span>.<span class="me1">path</span>
<span class="kw1">from</span> <span class="kw3">test</span> <span class="kw1">import</span> webApp
&nbsp;
<span class="kw1">from</span> google.<span class="me1">appengine</span>.<span class="me1">ext</span> <span class="kw1">import</span> webapp
<span class="kw1">from</span> google.<span class="me1">appengine</span>.<span class="me1">ext</span>.<span class="me1">webapp</span>.<span class="me1">util</span> <span class="kw1">import</span> run_wsgi_app
&nbsp;
d=<span class="kw3">os</span>.<span class="me1">path</span>.<span class="me1">dirname</span><span class="br0">&#40;</span>__file__<span class="br0">&#41;</span>
application=MyWebApp<span class="br0">&#40;</span>
    <span class="kw3">os</span>.<span class="me1">path</span>.<span class="me1">join</span><span class="br0">&#40;</span>d, <span class="st0">'templates'</span><span class="br0">&#41;</span>,
    staticBaseDir=<span class="br0">&#123;</span><span class="st0">'/_files/'</span>:<span class="kw3">os</span>.<span class="me1">path</span>.<span class="me1">join</span><span class="br0">&#40;</span>d, <span class="st0">'files'</span><span class="br0">&#41;</span><span class="br0">&#125;</span>
<span class="br0">&#41;</span><span class="sy0">;</span>
run_wsgi_app<span class="br0">&#40;</span>application<span class="br0">&#41;</span></pre>

<p>
ونعمل ملف app.yaml نخبره أن يحل كل شيء إلى apptest.py هكذا

</p>
<pre class="file">application: okashaTest
version: 1
runtime: python
api_version: 1

handlers:
- url: .*
  script: apptest.py</pre>

<p>
بعدها قم بتجربته فإن كان كل شيء على خير ما يرام يمكنك نقل تخديم الملفات الساكنة إلى google apps عوضا عن عكاشة بتعديل الملف app.yaml إلى
</p>
<pre class="file">application: okashaTest
version: 1
runtime: python
api_version: 1

handlers:
- url: /_files
  static_dir: files

- url: .*
  script: apptest.py</pre>

<p>
<strong>ملاحظة:</strong> لا تستطيع استخدام قوالب formatTemplate لأنها غير متوفرة في بايثون 2.5 بل 2.6.
</p>

<p>
<strong>ملاحظة:</strong> عليك تعديل سطرين من كود <a target="_blank" href="http://git.ojuba.org/cgit/okasha/tree/okasha/baseWebApp.py" class="urlextern" title="http://git.ojuba.org/cgit/okasha/tree/okasha/baseWebApp.py"  rel="nofollow">baseWebApp.py</a> عكاشة من <code>except webAppBaseException as e</code> إلى صيغة بايثون القديمة <code>except webAppBaseException, e</code>

</p>
<ul>
<li class="level1"><div class="li"> انظر <a target="_blank" href="http://code.google.com/appengine/docs/python/tools/webapp/utilmodule.html#run_wsgi_app" class="urlextern" title="http://code.google.com/appengine/docs/python/tools/webapp/utilmodule.html#run_wsgi_app"  rel="nofollow">google app engine</a></div>
</li>
</ul>

</div>
<!-- EDIT5 SECTION "عبر google app engine" [1777-3582] -->
<h2 class="sectionedit6"><a name="عبر_mod_python_في_خادم_apache" id="عبر_mod_python_في_خادم_apache">عبر mod_python في خادم apache</a></h2>
<div class="level2">

</div>
<!-- EDIT6 SECTION "عبر mod_python في خادم apache" [3583-3634] -->
<h2 class="sectionedit7"><a name="عبر_mod_wsgi_في_خادم_apache" id="عبر_mod_wsgi_في_خادم_apache">عبر mod_wsgi في خادم apache</a></h2>
<div class="level2">

</div>
<!-- EDIT7 SECTION "عبر mod_wsgi في خادم apache" [3635-3683] -->
<h3 class="sectionedit8"><a name="طريقة_توزيع_الملفات" id="طريقة_توزيع_الملفات">طريقة توزيع الملفات</a></h3>
<div class="level3">

<p>
قم بتثبيت إضافة mod_wsgi في خادم أباتشي من مدير الجزم (في أعجوبة اسم الحزم هو mod_wsgi)
</p>

<p>
تأكد من تثبيت الحزم التي قد تلزمك مثل python-kid أو python-elixir (هي لا تلزم عكاشة لكن من المفيد استعمالها)
</p>

<p>
بعد ذلك قم بإعادة توزيع الملفات بحيث تناسب الخادم فإن كان حسابك على الخادم يعطيك وصول إلى مجلد البيت وكنت تضع ملفاتك هناك ضعها خارج مجلد public_html. كذلك خصص مجلد لتضع فيه ما قد يلزمك من مكتبات بايثون بما فيها وحدة تطبيق الويب الخاص بك مثلا /home/ahmad/pyapps/ ثم اعمل ملف بايثون مهمته الوحيدة تعريف كائن اسمه application من صنف تطبيق الويب الخاص بك. سم ذاك الملف myapp.wsgi
</p>
<pre class="code python"><span class="co1"># -*- coding: UTF-8 -*-</span>
<span class="kw1">import</span> <span class="kw3">sys</span>, <span class="kw3">os</span>, <span class="kw3">os</span>.<span class="me1">path</span>
prefix=<span class="kw3">os</span>.<span class="me1">path</span>.<span class="me1">expanduser</span><span class="br0">&#40;</span><span class="st0">'~/myapp-files/'</span><span class="br0">&#41;</span>
pyprefix=<span class="kw3">os</span>.<span class="me1">path</span>.<span class="me1">expanduser</span><span class="br0">&#40;</span><span class="st0">'~/pyapps/'</span><span class="br0">&#41;</span>
<span class="kw3">sys</span>.<span class="me1">path</span>.<span class="me1">insert</span><span class="br0">&#40;</span><span class="nu0">0</span>, pyprefix<span class="br0">&#41;</span>
<span class="kw1">from</span> myapp <span class="kw1">import</span> MyApp
application=MyApp<span class="br0">&#40;</span>
  <span class="kw3">os</span>.<span class="me1">path</span>.<span class="me1">join</span><span class="br0">&#40;</span>prefix,<span class="st0">'templates'</span><span class="br0">&#41;</span>,
  staticBaseDir=<span class="br0">&#123;</span><span class="st0">'/media/'</span>:<span class="kw3">os</span>.<span class="me1">path</span>.<span class="me1">join</span><span class="br0">&#40;</span>prefix,<span class="st0">'static-files'</span><span class="br0">&#41;</span><span class="br0">&#125;</span>
  <span class="br0">&#41;</span><span class="sy0">;</span></pre>

<p>
هذا الملف يحدد /home/ahmad/pyapps/ كمجلد للبحث عن مكتبات بايثون والتي من بينها myapp.py كذلك يحدد المجلد /home/ahmad/myapp-files/ كي يحتوي على القوالب والملفات الساكنة.
</p>

</div>
<!-- EDIT8 SECTION "طريقة توزيع الملفات" [3684-5278] -->
<h3 class="sectionedit9"><a name="إعداد_apache" id="إعداد_apache">إعداد apache</a></h3>
<div class="level3">

<p>
لنفرض أن لديك خادم وتريد تشغيل التطبيق فيه على جذر نطاق فرعي  sub-domain اسمه myapp.myhost.org عندها تكون الإعدادات كما يلي:

</p>
<pre class="code xml"><span class="sc3"><span class="re1">&lt;VirtualHost</span> *:80<span class="re2">&gt;</span></span>
  ServerName myapp.myhost.org
&nbsp;
    WSGIDaemonProcess myapp.myhost.org processes=1 threads=15 display-name=myapp user=ahmad group=ahmadgroup
    WSGIProcessGroup myapp.myhost.org
&nbsp;
    WSGIScriptAlias / /home/ahmad/pyapps/myapp.wsgi
&nbsp;
<span class="sc3"><span class="re1">&lt;/VirtualHost<span class="re2">&gt;</span></span></span></pre>

<p>
يمكنك أيضا إلقاء عبئ تحميل الملفات الساكنة على خادم الويب وليس على عكاشة وذلك بإضافة المقطع التالي داخل السابق
</p>
<pre class="code xml">    DocumentRoot /home/ahmad/myapp-files/static-files/
    Alias /favicon.ico /home/ahmad/myapp-files/static-files/favicon.ico
&nbsp;
    Alias /media/ /home/ahmad/myapp-files/static-files/
&nbsp;
    <span class="sc3"><span class="re1">&lt;Directory</span> /home/ahmad/myapp-files/static-files<span class="re2">&gt;</span></span>
    Order allow,deny
    Allow from all
    <span class="sc3"><span class="re1">&lt;/Directory<span class="re2">&gt;</span></span></span></pre>

</div>
<!-- EDIT9 SECTION "إعداد apache" [5279-6313] -->
<h2 class="sectionedit10"><a name="عبر_fast_cgi" id="عبر_fast_cgi">عبر Fast CGI</a></h2>
<div class="level2">

<p>
توفر flup دعم fast cgi تطليقات wsgi مثل عكاشة كل ما عليك هو عمل ملف يشبه الملف أدناه وتسميته myapp.fcgi وحفظه في مكان يراه خادم apache
</p>
<pre class="code python"><span class="co1">#! /usr/bin/python</span>
<span class="co1"># -*- coding: UTF-8 -*-</span>
&nbsp;
<span class="kw3">sys</span>.<span class="me1">path</span>.<span class="me1">insert</span><span class="br0">&#40;</span><span class="nu0">0</span>, <span class="kw3">os</span>.<span class="me1">path</span>.<span class="me1">expanduser</span><span class="br0">&#40;</span><span class="st0">'~/projects/'</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
<span class="kw1">from</span> flup.<span class="me1">server</span>.<span class="me1">fcgi</span> <span class="kw1">import</span> WSGIServer
<span class="kw1">from</span> myapp <span class="kw1">import</span> MyApp
application=MyApp<span class="br0">&#40;</span>
  <span class="kw3">os</span>.<span class="me1">path</span>.<span class="me1">join</span><span class="br0">&#40;</span>prefix,<span class="st0">'templates'</span><span class="br0">&#41;</span>,
  staticBaseDir=<span class="br0">&#123;</span><span class="st0">'/media/'</span>:<span class="kw3">os</span>.<span class="me1">path</span>.<span class="me1">join</span><span class="br0">&#40;</span>prefix,<span class="st0">'static-files'</span><span class="br0">&#41;</span><span class="br0">&#125;</span>
  <span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
<span class="kw1">if</span> __name__ == <span class="st0">'__main__'</span>:
  WSGIServer<span class="br0">&#40;</span>application<span class="br0">&#41;</span>.<span class="me1">run</span><span class="br0">&#40;</span><span class="br0">&#41;</span></pre>

<p>
انظر
</p>
<ul>
<li class="level1"><div class="li"> <a target="_blank" href="http://trac.saddi.com/flup/wiki/FlupServers" class="urlextern" title="http://trac.saddi.com/flup/wiki/FlupServers"  rel="nofollow">http://trac.saddi.com/flup/wiki/FlupServers</a></div>
</li>
<li class="level1"><div class="li"> <a target="_blank" href="http://flask.pocoo.org/docs/deploying/fastcgi/" class="urlextern" title="http://flask.pocoo.org/docs/deploying/fastcgi/"  rel="nofollow">http://flask.pocoo.org/docs/deploying/fastcgi/</a></div>
</li>
</ul>

</div>
<!-- EDIT10 SECTION "عبر Fast CGI" [6314-7034] -->
<h2 class="sectionedit11"><a name="خوادم_أخرى" id="خوادم_أخرى">خوادم أخرى</a></h2>
<div class="level2">

<p>
من أفضل خوادم WSGI أداءً وتوفيرا في الذاكرة وسرعة الاستجابة

</p>
<ul>
<li class="level1"><div class="li"> <a target="_blank" href="http://projects.unbit.it/uwsgi/" class="urlextern" title="http://projects.unbit.it/uwsgi/"  rel="nofollow">uWSGI</a></div>
</li>
<li class="level1"><div class="li"> <a target="_blank" href="http://www.gevent.org/" class="urlextern" title="http://www.gevent.org/"  rel="nofollow">gEvent</a></div>
</li>
<li class="level1"><div class="li"> <a target="_blank" href="http://wiki.github.com/william-os4y/fapws3/" class="urlextern" title="http://wiki.github.com/william-os4y/fapws3/"  rel="nofollow">FAPWS3</a></div>
</li>
<li class="level1"><div class="li"> <a href="https://github.com/jonashaag/bjoern" class="urlextern" title="https://github.com/jonashaag/bjoern"  rel="nofollow">https://github.com/jonashaag/bjoern</a></div>
</li>
</ul>

</div>
<!-- EDIT11 SECTION "خوادم أخرى" [7035-7356] -->
<h2 class="sectionedit12"><a name="تقييم_خوادم_wsgi" id="تقييم_خوادم_wsgi">تقييم خوادم WSGI</a></h2>
<div class="level2">

<p>
بعكس ما تتوقع فإن أداء twisted و tornado  كان سئيا جدا في اختبارات الأداء.

</p>
<ul>
<li class="level1"><div class="li"> <a target="_blank" href="http://nichol.as/benchmark-of-python-web-servers" class="urlextern" title="http://nichol.as/benchmark-of-python-web-servers"  rel="nofollow">http://nichol.as/benchmark-of-python-web-servers</a></div>
</li>
</ul>

</div>
<!-- EDIT12 SECTION "تقييم خوادم WSGI" [7357-] --></div>
</body>
</html>