<?xml version="1.0"?>
<rss version="2.0"><channel><title>DevOps: Apache</title><link>https://academy.hsoub.com/devops/servers/web/apache/?d=4</link><description>DevOps: Apache</description><language>ar</language><item><title>[&#x641;&#x64A;&#x62F;&#x64A;&#x648;] &#x62A;&#x62B;&#x628;&#x64A;&#x62A; &#x648;&#x636;&#x628;&#x637; &#x62E;&#x627;&#x62F;&#x645; Apache</title><link>https://academy.hsoub.com/devops/servers/web/apache/%D9%81%D9%8A%D8%AF%D9%8A%D9%88-%D8%AA%D8%AB%D8%A8%D9%8A%D8%AA-%D9%88%D8%B6%D8%A8%D8%B7-%D8%AE%D8%A7%D8%AF%D9%85-apache-r407/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2019_04/Apache-thumbnail.png.963b1c01af2b0e6a6b7f874ef485d8c1.png" /></p>

<p>
	<iframe allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen="" frameborder="0" height="400" src="https://www.youtube.com/embed/W7jHWtMPmUw" width="560"></iframe>
</p>

<p>
	نشرح طريقة تثبيت وإعداد خادم Apache أباتشي على توزيعة أوبنتو، وسنستعمله لتخديم صفحات HTML الخاصة بنا.
</p>

<p>
	لتثبيت خادم Nginx راجع <a href="https://academy.hsoub.com/devops/servers/web/nginx/%D9%81%D9%8A%D8%AF%D9%8A%D9%88-%D8%AA%D8%AB%D8%A8%D9%8A%D8%AA-%D9%88%D8%B6%D8%A8%D8%B7-%D8%AE%D8%A7%D8%AF%D9%85-nginx-r401/" rel="">فيديو تثبيت وضبط خادم Nginx</a> في أكاديمية حسوب.
</p>

<p>
	قسم <a href="https://academy.hsoub.com/devops/servers/web/" rel="">خوادم الويب</a> في أكاديمية حسوب غني بالمقالات المفيدة للتعامل معها.
</p>
]]></description><guid isPermaLink="false">407</guid><pubDate>Wed, 17 Apr 2019 09:23:04 +0000</pubDate></item><item><title>&#x643;&#x64A;&#x641; &#x62A;&#x633;&#x62A;&#x62E;&#x62F;&#x645; Apache &#x644;&#x64A;&#x639;&#x645;&#x644; &#x648;&#x633;&#x64A;&#x637;&#x64B;&#x627; &#x639;&#x643;&#x633;&#x64A;&#x651;&#x64B;&#x627; Reverse Proxy &#x639;&#x644;&#x649; Ubuntu 16.04</title><link>https://academy.hsoub.com/devops/servers/web/apache/%D9%83%D9%8A%D9%81-%D8%AA%D8%B3%D8%AA%D8%AE%D8%AF%D9%85-apache-%D9%84%D9%8A%D8%B9%D9%85%D9%84-%D9%88%D8%B3%D9%8A%D8%B7%D9%8B%D8%A7-%D8%B9%D9%83%D8%B3%D9%8A%D9%91%D9%8B%D8%A7-reverse-proxy-%D8%B9%D9%84%D9%89-ubuntu-1604-r339/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2017_08/599807de63439_main(11).png.a44a0e152075a364f633f515b363550a.png" /></p>

<p id="مقدمة">
	الوسيط العكسي عبارة عن نوع من الخواديم الوسيطة Proxy servers تستقبل طلبات HTTP(S) وتوزّعها بصورة شفّافة على خادوم خلفيّ Backend server واحد أو أكثر. الوسيط العكسي مُفيد لأنّ مُعظم تطبيقات الويب في أيّامنا هذه تستعمل خواديم لم تكن قد صُمّمت لأخذ الطّلبات مُباشرة من المُستخدم وفي العادة لا تدعم إلّا ميزات HTTP بدائيّة.
</p>

<p>
	يُمكنك استخدام وسيط عكسيّ لتجنّب وصول المستخدم إلى الخواديم الخلفيّة مُباشرة. يُمكن استخدامها كذلك <a href="https://academy.hsoub.com/devops/servers/%D9%85%D9%82%D8%AF%D9%91%D9%85%D8%A9-%D8%A5%D9%84%D9%89-haproxy-%D9%88%D9%85%D8%A8%D8%A7%D8%AF%D8%A6-%D9%85%D9%88%D8%A7%D8%B2%D9%86%D8%A9-%D8%A7%D9%84%D8%AD%D9%85%D9%84-load-balancing-r41/" rel="">لتوزيع الحمل</a> Load balancing من الطّلبات على عدّة خواديم، ما يُحسّن الأداء ويُوفّر حماية من تعطّل التّطبيق. يُمكها كذلك أن تمنحك ميزات لا تمنحها خواديم التّطبيقات مثل التّخبئة Caching، ضغط الملفّات Compression، وحتى تشفير <abbr title="Secure Socket Layer | طبقة المنافذ الآمنة">SSL</abbr>.
</p>

<p>
	سنضبُط في هذا الدّرس Apache ليعمل على وسيطًا عكسيًّا بسيطًا باستخدام وحدة <code>mod_proxy</code> لإعادة توجيه الطّلبات القادمة إلى خادوم خلفيّ أو أكثر من خادوم يعمل على نفس الشّبكة. سنستعمل في هذا الدّرس واجهة خلفيّة بسيطة مكتوبة بإطار العمل <a href="https://academy.hsoub.com/tags/flask%20101/" rel="">Flask</a>، لكنّك تستطيع استعمال أي خادوم خلفيّ تُريده وأي لغة برمجيّة مُناسبة لك.
</p>

<p>
	<strong>مُلاحظة:</strong> أبدِل <code>your_server_ip</code> في عناوين URL التي تجدها في هذا الدّرس بعنوان IP الخاصّ بخادومك.
</p>

<h1 id="المتطلبات">
	المُتطلّبات
</h1>

<p>
	لاتّباع هذا الدّرس، ستحتاج إلى:
</p>

<ul>
<li>
		<p>
			خادوم أوبونتو 16.04 مضبوط باتّباع الخطوات في <a href="https://academy.hsoub.com/devops/servers/%D8%A7%D9%84%D8%A5%D8%B9%D8%AF%D8%A7%D8%AF-%D8%A7%D9%84%D8%A7%D8%A8%D8%AA%D8%AF%D8%A7%D8%A6%D9%8A-%D9%84%D8%AE%D8%A7%D8%AF%D9%88%D9%85-%D8%A3%D9%88%D8%A8%D9%86%D8%AA%D9%88-1404-r4/" rel="">هذا الدّرس</a>، وذلك يشمل مُستخدما ذا صلاحيّات <code>sudo</code> مع ضبط مُسبق لتمكينه من تنفيذ مهام إداريّة، غير المستخدم الجذر root، بالإضافة إلى <a href="https://academy.hsoub.com/devops/security/firewalls/%D9%83%D9%8A%D9%81-%D8%AA%D8%B6%D8%A8%D8%B7-%D8%AC%D8%AF%D8%A7%D8%B1%D8%A7-%D9%86%D8%A7%D8%B1%D9%8A%D8%A7-%D9%81%D9%8A-%D8%A3%D9%88%D8%A8%D9%86%D8%AA%D9%88-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-ufw-r120/" rel="">جدار ناري</a>.
		</p>
	</li>
	<li>
		<p>
			Apache 2 مُنصّب على خادومك باتّباع الخطوة الأولى من <a href="https://academy.hsoub.com/devops/servers/%D9%83%D9%8A%D9%81-%D8%AA%D8%AB%D8%A8%D8%AA-%D8%AD%D8%B2%D9%85-mysql-%D8%8Capache-%D8%8Clinux-lamp-%D9%88-php-%D8%B9%D9%84%D9%89-%D8%A3%D9%88%D8%A8%D9%86%D8%AA%D9%88-1404-r27/" rel="">هذا الدّرس</a>.
		</p>
	</li>
</ul>
<h2 id="الخطوة-الأولى-تفعيل-وحدات-apache-اللازمة">
	الخطوة الأولى – تفعيل وحدات Apache اللازمة
</h2>

<p>
	يمتلك Apache الكثير من الوحدات المبنيّة مُسبقا لكنّها لا تكون مُفعّلة عند التّنصيب. لذا سيتوجّب علينا تفعيل الوحدات التي سنستخدمها في هذا الدّرس.
</p>

<p>
	الوحدات التّي نحتاج إليها هي <code>mod_proxy</code> وبضعة إضافات خاصّة بها للحصول على بضعة ميزات أخرى لدعم <a href="https://academy.hsoub.com/devops/servers/%D9%88%D8%A7%D8%AC%D9%87%D8%A7%D8%AA-%D8%B4%D8%A8%D9%83%D8%A9-%D8%A7%D9%84%D8%A5%D9%86%D8%AA%D8%B1%D9%86%D8%AA-%D9%88%D8%A8%D8%B1%D9%88%D8%AA%D9%88%D9%83%D9%88%D9%84%D8%A7%D8%AA%D9%87%D8%A7-%D8%A7%D9%84%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D9%91%D8%A9-r64/" rel="">بروتوكولات شبكيّة</a> مُتعدّدة. سنستعمل ما يلي بالتّحديد:
</p>

<ul>
<li>
		<code>mod_proxy</code>، الوحدة الرّئيسيّة لإعادة توجيه الطّلبات، وتُمكّننا من تحويل Apache إلى بوابّة لخواديم التّطبيقات المُعتمدة.
	</li>
	<li>
		وحدة <code>mod_proxy_http</code> لتمكيننا من توسيط اتّصالات HTTP.
	</li>
	<li>
		وحدتا <code>mod_proxy_balancer</code> و<code>mod_lbmethod_byrequests</code> لإضافة ميّزات مُوازنة الحمل على عدّة خواديم.
	</li>
</ul>
<p>
	لتفعيل الوحدات الأربع، نفّذ الأوامر التّاليّة:
</p>

<pre class="ipsCode" id="ips_uid_8387_7">
sudo a2enmod proxy
sudo a2enmod proxy_http
sudo a2enmod proxy_balancer
sudo a2enmod lbmethod_byrequests</pre>

<p>
	لتطبيق التّغييرات، أعد تشغيل Apache:
</p>

<pre class="ipsCode" id="ips_uid_8387_9">
sudo systemctl restart apache2
</pre>

<p>
	يُمكن الآن استخدام Apache ليعمل وسيطًا عكسيًّا لطلبات HTTP. في الخطوة – الاختياريّة - التّاليّة، سننشئ خادومين خلفيّين بسيطين. ما سيُخوّلنا التّحقّق من أنّ الإعدادات تعمل جيّدا، لكن إن كانت لديك تطبيقات تعمل في الواجهة الخلفيّة، يُمكنك تخطي الخطوة التّاليّة والانتقال مُباشرة إلى الخطوة الثّالثة.
</p>

<h2 id="الخطوة-الثانية-إعداد-خواديم-خلفية-backend-servers-للاختبار">
	الخطوة الثّانيّة – إعداد خواديم خلفيّة Backend Servers للاختبار
</h2>

<p>
	إنشاء خواديم خلفيّة بسيطة طريقة سهلة لاختبار ما إذا كانت إعدادات Apache الخاصّة بك تعمل جيّدًا أو لا. في هذه الفقرة، سنعدّ خادومين يجيبان على طلبات HTTP بمقطع نصّي صغير. أحد الخادومين سيُجيب بالمقطع <code>Hello world!</code> والآخر بالمقطع <code>Howdy world!</code>.
</p>

<p>
	<strong>مُلاحظة:</strong> في الحالات غير الاختباريّة، عادة ما يجب على الخواديم أن تُجيب بنفس الإجابة. لكن بالنّسبة لهذا الاختبار، فامتلاك إجابتين مُختلفتين يُمكّننا من التّأكّد من أنّ خاصيّة مُوازنة الحمل تستخدم كلا الخادومين.
</p>

<p>
	Flask إطار عمل مُصغّر مبني بلغة بايثون لبناء تطبيقات الويب. استعملنا Flask لإنشاء خادوميْ الاختبار لأنّ تطبيقا بسيطا باستخدامه لا يتطلّب سوى بضعة أسطر برمجيّة. ليس من الضّروري أن تكون لديك معرفة بلغة بايثون لإعداد الخادومين، لكن إن أردت تعلّمها، فيُمكنك الاطّلاع على <a href="https://academy.hsoub.com/programming/python/" rel="">هذه الدّروس</a>.
</p>

<p>
	أولا، حدّث قائمة الحزم:
</p>

<pre class="ipsCode" id="ips_uid_8387_7">
<code class="hljs bash"><span class="hljs-built_in"><span class="pln">sudo</span></span><span class="pln"> apt</span><span class="pun">-</span><span class="kwd">get</span><span class="pln"> update</span></code></pre>

<p>
	بعدها، نصّب أداة <code>pip</code> لإدارة حزم لغة بايثون:
</p>

<pre class="ipsCode" id="ips_uid_8387_7">
<code class="hljs lasso"><span class="pln">sudo apt</span><span class="hljs-attribute"><span class="pun">-</span><span class="kwd">get</span></span><span class="pln"> </span><span class="hljs-attribute"><span class="pun">-</span><span class="pln">y</span></span><span class="pln"> install python3</span><span class="hljs-attribute"><span class="pun">-</span><span class="pln">pip</span></span></code></pre>

<p>
	استخدام <code>pip</code> لتنصيب أداة Flask:
</p>

<pre class="ipsCode" id="ips_uid_8387_7">
<code class="hljs bash"><span class="hljs-built_in"><span class="pln">sudo</span></span><span class="pln"> pip3 install flask</span></code></pre>

<p>
	بعد تنصيب المُكوّنات المطلوبة، ابدأ بإنشاء ملفّ جديد ليحتوي على شفرة الخادوم الأول في المُجلّد الشخصي للمستخدم الحاليّ:
</p>

<pre class="ipsCode" id="ips_uid_8387_7">
<code class="hljs avrasm"><span class="pln">nano </span><span class="pun">~/</span><span class="pln">backend1</span><span class="hljs-preprocessor"><span class="pun">.</span><span class="pln">py</span></span></code></pre>

<p>
	انسخ ما يلي إلى الملفّ ثمّ احفظه وأغلقه:
</p>

<pre class="ipsCode" id="ips_uid_8387_7">
<code class="hljs python"><span class="hljs-keyword"><span class="kwd">from</span></span><span class="pln"> flask </span><span class="hljs-keyword"><span class="kwd">import</span></span><span class="pln"> </span><span class="typ">Flask</span><span class="pln">
app </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Flask</span><span class="pun">(</span><span class="pln">__name__</span><span class="pun">)</span><span class="pln">

</span><span class="hljs-decorator"><span class="lit">@app</span><span class="pun">.</span><span class="pln">route</span><span class="pun">(</span><span class="str">'/'</span><span class="pun">)</span></span><span class="pln">
</span><span class="hljs-function"><span class="hljs-keyword"><span class="kwd">def</span></span><span class="pln"> </span><span class="hljs-title"><span class="pln">home</span></span><span class="hljs-params"><span class="pun">()</span></span><span class="pun">:</span></span><span class="pln">
    </span><span class="hljs-keyword"><span class="kwd">return</span></span><span class="pln"> </span><span class="hljs-string"><span class="str">'Hello world!'</span></span></code></pre>

<p>
	السّطران الأول والثّاني عبارة عن تهيئة لإطار العمل Flask. لدينا دالّة واحدة باسم <code>home()</code> تُرجع النّص <code>Hello world!</code>. السّطر <code>@app.route('/')</code> المتواجد فوق الدّالة <code>home()</code> يُخبر Flask بالإجابة على أي طلب يصل إلى العنوان الجذر <code>/</code> بما تُرجعه الدّالّة.<br>
	الخادوم الثّاني مُشابه للأول، الاختلاف الوحيد أنّ الجواب مُختلف قليلا. لذا انسخ الملفّ الأول:
</p>

<pre class="ipsCode" id="ips_uid_8387_7">
<code class="hljs avrasm"><span class="hljs-keyword"><span class="pln">cp</span></span><span class="pln"> </span><span class="pun">~</span><span class="str">/backend1</span><span class="hljs-preprocessor"><span class="str">.py</span></span><span class="str"> ~/</span><span class="pln">backend2</span><span class="hljs-preprocessor"><span class="pun">.</span><span class="pln">py</span></span></code></pre>

<p>
	عدّل الملفّ الجديد:
</p>

<pre class="ipsCode" id="ips_uid_8387_7">
<code class="hljs avrasm"><span class="pln">nano </span><span class="pun">~/</span><span class="pln">backend2</span><span class="hljs-preprocessor"><span class="pun">.</span><span class="pln">py</span></span></code></pre>

<p>
	عدّل ما تُرجعه الدّالة من <code>Hello world!</code> إلى <code>Howdy world!</code> ثمّ احفظ وأغلق الملفّ.
</p>

<pre class="ipsCode" id="ips_uid_8387_7">
<code class="hljs python"><span class="hljs-keyword"><span class="kwd">from</span></span><span class="pln"> flask </span><span class="hljs-keyword"><span class="kwd">import</span></span><span class="pln"> </span><span class="typ">Flask</span><span class="pln">
app </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Flask</span><span class="pun">(</span><span class="pln">__name__</span><span class="pun">)</span><span class="pln">

</span><span class="hljs-decorator"><span class="lit">@app</span><span class="pun">.</span><span class="pln">route</span><span class="pun">(</span><span class="str">'/'</span><span class="pun">)</span></span><span class="pln">
</span><span class="hljs-function"><span class="hljs-keyword"><span class="kwd">def</span></span><span class="pln"> </span><span class="hljs-title"><span class="pln">home</span></span><span class="hljs-params"><span class="pun">()</span></span><span class="pun">:</span></span><span class="pln">
    </span><span class="hljs-keyword"><span class="kwd">return</span></span><span class="pln"> </span><span class="hljs-string"><span class="str">'Howdy world!'</span></span></code></pre>

<p>
	استخدم الأمر التّالي لتشغيل الخادوم الأول على المنفذ رقم <code>8080</code>. سيقوم هذا الأمر بتحويل المخرجات إلى <code>/dev/null</code> كذلك لتفادي مُقاطعة المُخرج للطّرفيّة.
</p>

<pre class="ipsCode" id="ips_uid_8387_7">
<code class="hljs javascript"><span class="pln">FLASK_APP</span><span class="pun">=~</span><span class="hljs-regexp"><span class="str">/backend1.py flask run --port=8080 &gt;/</span></span><span class="pln">dev</span><span class="pun">/</span><span class="hljs-literal"><span class="kwd">null</span></span><span class="pln"> </span><span class="hljs-number"><span class="lit">2</span></span><span class="pun">&gt;&amp;</span><span class="hljs-number"><span class="lit">1</span></span><span class="pln"> </span><span class="pun">&amp;</span></code></pre>

<p>
	في السّطر أعلاه، عرّفنا مُتغيّر البيئة <code>FLASK_APP</code> ثمّ نفّذنا الأمر <code>flask</code> لتشغيل الخادوم في نفس السّطر. <a href="https://academy.hsoub.com/questions/123-%D9%85%D8%A7%D8%B0%D8%A7-%D9%8A%D8%B9%D9%86%D9%8A-%D9%85%D8%AA%D8%BA%D9%8A%D8%B1-%D8%A7%D9%84%D9%86%D8%B8%D8%A7%D9%85-path%D8%9F/" rel="">مُتغيّرات البيئة</a> طريقة سهلة لتمرير المعلومات إلى العمليّات المبدوءة على الطّرفيّة.
</p>

<p>
	في هذه الحالة، باستعمال <a href="https://academy.hsoub.com/devops/linux/%D8%A7%D9%84%D9%85%D8%AA%D8%BA%D9%8A%D8%B1%D8%A7%D8%AA-%D9%88%D8%A7%D9%84%D8%AB%D9%88%D8%A7%D8%A8%D8%AA-%D9%88%D8%AA%D8%B9%D9%88%D9%8A%D8%B6-%D8%A7%D9%84%D8%A3%D9%88%D8%A7%D9%85%D8%B1-%D9%81%D9%8A-%D8%B3%D9%83%D8%B1%D8%A8%D8%AA%D8%A7%D8%AA-%D8%A7%D9%84%D8%B5%D8%AF%D9%81%D8%A9-shell-scripts-r256/#%D9%85%D8%AA%D8%BA%D9%8A%D8%B1%D8%A7%D8%AA-%D8%A7%D9%84%D8%A8%D9%8A%D8%A6%D8%A9-environment-variables" rel="">مُتغيّرات البيئة</a> فإنّنا نتأكّد من أنّ الإعداد يُطبّق على الأمر الذي سيكون قيد التّشغيل فقط ولن يكون مُتوفّرا بعد ذلك، وهذا مُناسب لنا لأنّنا سنمرّر اسم ملفّ آخر بنفس الطّريقة لإخبار <code>flask</code> بتشغيل الخادوم الثّاني.
</p>

<p>
	استعمل الأمر التّالي لتشغيل الخادوم الثّاني على المنفذ <code>8081</code> بطريقة مُشابهة لما سبق. لاحظ بأنّ قيمة مُتغيّر البيئة <code>FLASK_APP</code> مُختلفة في هذه الحالة:
</p>

<pre class="ipsCode" id="ips_uid_8387_7">
<code class="hljs javascript"><span class="pln">FLASK_APP</span><span class="pun">=~</span><span class="hljs-regexp"><span class="str">/backend2.py flask run --port=8081 &gt;/</span></span><span class="pln">dev</span><span class="pun">/</span><span class="hljs-literal"><span class="kwd">null</span></span><span class="pln"> </span><span class="hljs-number"><span class="lit">2</span></span><span class="pun">&gt;&amp;</span><span class="hljs-number"><span class="lit">1</span></span><span class="pln"> </span><span class="pun">&amp;</span></code></pre>

<p>
	يُمكنك اختبار عمل الخادومين باستخدام أداة <code>curl</code>.
</p>

<p>
	اختبار الخادوم الأول:
</p>

<pre class="ipsCode" id="ips_uid_8387_7">
<code class="hljs cs"><span class="pln">curl http</span><span class="pun">:</span><span class="hljs-comment"><span class="com">//127.0.0.1:8080/</span></span></code></pre>

<p>
	يجب على المُخرج أن يساوي <code>Hello world!</code>. الخادوم الثّاني:
</p>

<pre class="ipsCode" id="ips_uid_8387_11">
curl http://127.0.0.1:8081/</pre>

<p>
	يجب على المُخرج أن يكون <code>Howdy world!</code>.
</p>

<p>
	<strong>مُلاحظة:</strong> لإغلاق كلا الخادومين بعد أن تنتهي من استخدامهما، عند إنهائك لهذا الدّرس مثلا، فيُمكنك تنفيذ الأمر <code>killall flask</code>.
</p>

<p>
	في الخطوة التّاليّة، سنعدّل ملفّ إعدادات Apache لتمكيننا من استخدامه وسيطًا عكسيًّا.
</p>

<h2 id="الخطوة-الثالثة-تعديل-الإعدادات-المبدئية-لجعل-apache-يعمل-وسيطا-عكسيا">
	الخطوة الثّالثة – تعديل الإعدادات المبدئيّة لجعل Apache يعمل وسيطًا عكسيًّا
</h2>

<p>
	سنعدّ في هذه الفقرة <a href="https://academy.hsoub.com/devops/servers/web/apache/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%B6%D8%A8%D8%B7-%D8%A7%D9%84%D9%85%D8%B3%D8%AA%D8%B6%D9%8A%D9%81%D8%A7%D8%AA-%D8%A7%D9%84%D8%A7%D9%81%D8%AA%D8%B1%D8%A7%D8%B6%D9%8A%D8%A9-%D9%81%D9%8A-%D8%AE%D8%A7%D8%AF%D9%88%D9%85-%D9%88%D9%8A%D8%A8-apache-%D8%B9%D9%84%D9%89-%D8%A3%D9%88%D8%A8%D9%86%D8%AA%D9%88-1404-r10/" rel="">مُضيفًا افتراضيًّا Virtual host</a> على Apache للعمل وسيطًا عكسيًّا لخادوم خلفي واحد أو عدّة خواديم موزونة الحمل.
</p>

<p>
	<strong>مُلاحظة:</strong> سنُطبّق الإعدادات في هذا الدّرس على مُستوى المُضيف الافتراضي. يوجد في الإعداد المبدئي لـApache مُضيف افتراضي واحد مُفعّل. لكنّك تستطيع استعمال جميع أجزاء هذه الإعدادات على أي مُضيف افتراضي آخر.
</p>

<p>
	إن كان خادوم Apache الخاص بك يجيب على طلبات HTTP و HTTPS، فسيتوجّب عليك وضع إعدادات الوسيط العكسي في كلا المُضيفَين الافتراضيّيْن لـHTTP وHTTPS.
</p>

<p>
	افتح ملفّ إعدادات Apache المبدئي باستخدام <code>nano</code> أو أي مُحرّر مُفضّل لديك:
</p>

<pre class="ipsCode" id="ips_uid_8387_7">
<code class="hljs haskell"><span class="hljs-title"><span class="pln">sudo</span></span><span class="pln"> nano </span><span class="pun">/</span><span class="pln">etc</span><span class="pun">/</span><span class="pln">apache2</span><span class="pun">/</span><span class="pln">sites</span><span class="pun">-</span><span class="pln">available</span><span class="pun">/</span><span class="hljs-number"><span class="lit">000</span></span><span class="pun">-</span><span class="hljs-default"><span class="hljs-keyword"><span class="kwd">default</span></span><span class="pun">.</span><span class="pln">conf</span></span></code></pre>

<p>
	ستجد داخل هذا الملفّ الجزء <code>&lt;VirtualHost *:80&gt;</code> بدءا من السّطر الأول. يشرح المثال الأول أسفله كيفيّة ضبط هذا الجزء لإعداد وسيط عكسي لخادوم واحد، وفي المثال الثّاني سنضبط وسيطا عكسيّا يوازن الحمل على أكثر من خادوم.
</p>

<h2 id="المثال-الأول-إعداد-وسيط-عكسي-لخادوم-خلفي-واحد">
	المثال الأول – إعداد وسيط عكسي لخادوم خلفيّ واحد
</h2>

<p>
	أبدل جميع المُحتويات داخل الوسم <code>VirtualHost</code> بما يلي ليصير ملفّ الإعدادات الخاصّ بك كما يلي:
</p>

<pre class="ipsCode" id="ips_uid_8387_7">
<code class="hljs apache"><span class="hljs-tag"><span class="tag">&lt;VirtualHost</span><span class="pln"> *:80</span><span class="tag">&gt;</span></span><span class="pln">
    </span><span class="hljs-keyword"><span class="pln">ProxyPreserveHost</span></span><span class="pln"> </span><span class="hljs-literal"><span class="pln">On</span></span><span class="pln">

    </span><span class="hljs-keyword"><span class="pln">ProxyPass</span></span><span class="pln"> / http://127.0.0.1:8080/
    </span><span class="hljs-keyword"><span class="pln">ProxyPassReverse</span></span><span class="pln"> / http://127.0.0.1:8080/
</span><span class="hljs-tag"><span class="tag">&lt;/VirtualHost&gt;</span></span></code></pre>

<p>
	إن تابعت الأمثلة في الخطوة الثّانيّة أعلاه، فاستخدم العنوان <code>127.0.0.1:8080</code> كما هو مكتوب أعلاه. إن كان لديك تطبيق ويب خاصّ بك، فاستعمل عنوان التّطبيق عوضا عمّا فعلنا.
</p>

<p>
	لدينا ثلاثة تعليمات في هذا الإعداد:
</p>

<ul>
<li>
		<code>ProxyPreserveHost</code> مسؤولة عن جعل Apache يُمرّر الترويسة Header المسمَّاة <code>Host</code> الأصليّة إلى الخادوم الخلفيّ. هذا الأمر مُفيد لأنّه يُخبر الخادوم بالعنوان المُستخدَم للوصول إلى التّطبيق.
	</li>
	<li>
		<code>ProxyPass</code> عبارة عن تعليمة الإعداد الرّئيسيّة للوسيط. في هذه الحالة، نحدّد كلّ شيء تحت عنوان URL الجذر <code>/</code> ليُربط مع الخادوم الخلفيّ المرتبط بالعنوان المُعطى. على سبيل المثال، إن استقبل Apache طلبا للموجّه <code>/example</code>، فسيقوم بالاتّصال بالعنوان <code>http://your_backend_server/example</code> وإرجاع الإجابة إلى العميل.
	</li>
	<li>
		ينبغي على <code>ProxyPassReverse</code> أن يحمل نفس الإعداد الذي يحمله <code>ProxyPass</code>. ويُخبر Apache بتعديل ترويسة الجواب من طرف الخادوم الخلفيّ. بهذه الطّريقة سنتأكّد من إعادة توجيه العميل إلى عنوان الوسيط وليس الخادوم الخلفيّ في حالة وُجدت ترويسة إعادة توجيه في جواب الخادوم لتجنّب أخطاء إعادة التّوجيه.
	</li>
</ul>
<p>
	لتطبيق هذه التّغييرات، أعد تشغيل Apache:
</p>

<pre class="ipsCode" id="ips_uid_8387_7">
<code class="hljs bash"><span class="hljs-built_in"><span class="pln">sudo</span></span><span class="pln"> systemctl restart apache2</span></code></pre>

<p>
	إن حاولت الآن الوصول إلى <code>http://your_server_ip</code> في مُتصفّح ويب، ستجد جواب الخادوم الخلفيّ عوضا عن رسالة ترحيب Apache المألوفة. إن تابعت الخطوة الثّانيّة، فهذا يعني بأنّ النّتيجة ستكون <code>Hello world!</code>.
</p>

<h2 id="المثال-الثاني-موازنة-الحمل-على-عدة-خواديم-خلفية">
	المثال الثّاني – موازنة الحمل على عدّة خواديم خلفيّة
</h2>

<p>
	إن كان لديك أكثر من خادوم خلفيّ واحد، فاستخدام ميزة مُوازنة الحمل في <code>mod_proxy</code> طريقة جيّدة لتوزيع الطّلبات على الخواديم.
</p>

<p>
	استبدل جميع مُحتويات الجزء <code>VirtualHost</code> بما يلي ليبدو ملفّ الإعدادات كما يلي:
</p>

<pre class="ipsCode" id="ips_uid_8387_7">
<code class="hljs lasso"><span class="hljs-subst"><span class="tag">&lt;</span></span><span class="tag">VirtualHost</span><span class="pln"> </span><span class="hljs-subst"><span class="pln">*</span></span><span class="pln">:</span><span class="hljs-number"><span class="pln">80</span></span><span class="hljs-subst"><span class="tag">&gt;</span></span><span class="pln">
</span><span class="hljs-subst"><span class="tag">&lt;</span></span><span class="tag">Proxy</span><span class="pln"> </span><span class="atn">balancer</span><span class="pln">:</span><span class="hljs-comment"><span class="pun">//</span><span class="atn">mycluster</span><span class="tag">&gt;</span></span><span class="pln">
    BalancerMember http:</span><span class="hljs-comment"><span class="pln">//127.0.0.1:8080</span></span><span class="pln">
    BalancerMember http:</span><span class="hljs-comment"><span class="pln">//127.0.0.1:8081</span></span><span class="pln">
</span><span class="hljs-subst"><span class="tag">&lt;</span></span><span class="tag">/Proxy</span><span class="hljs-subst"><span class="tag">&gt;</span></span><span class="pln">

    ProxyPreserveHost </span><span class="hljs-keyword"><span class="pln">On</span></span><span class="pln">

    ProxyPass </span><span class="hljs-subst"><span class="pln">/</span></span><span class="pln"> balancer:</span><span class="hljs-comment"><span class="pln">//mycluster/</span></span><span class="pln">
    ProxyPassReverse </span><span class="hljs-subst"><span class="pln">/</span></span><span class="pln"> balancer:</span><span class="hljs-comment"><span class="pln">//mycluster/</span></span><span class="pln">
</span><span class="hljs-subst"><span class="tag">&lt;</span></span><span class="tag">/VirtualHost</span><span class="hljs-subst"><span class="tag">&gt;</span></span></code></pre>

<p>
	الإعدادات هنا مُشابهة لما سبق، لكن عوضا عن تخصيص خادوم واحد مُباشرة، استعملنا وسم <code>Proxy</code> إضافيّا لتعيين خواديم مُتعدّدة.سمّينا الوسم بـ<code>balancer://mycluster</code> (يُمكنك تغيير الاسم إن شئت) ليحتوي على أكثر من تعليمة <code>BalancerMember</code>، والذي يُحدّد عناوين الخواديم الخلفيّة. هكذا تستعمل التّعليمتان <code>ProxyPass</code> و<code>ProxyPassReverse</code> مجموعة موازنة الحمل المُسمّاة <code>mycluster</code> عوضا عن خادم مُحدّد.
</p>

<p>
	إن تابعت الخطوة الثّانيّة من هذا الدّرس، فاستعمل العنوانين <code>127.0.0.1:8080</code> و<code>127.0.0.1:8081</code> للتّعليمة <code>BalancerMember</code> كما هو مُبيّن في الإعدادات أعلاه. أمّا إن كانت لديك خواديم خاصّة بك فاستعمل عناوينها.
</p>

<p>
	لتطبيق هذه التّغييرات، أعد تشغيل Apache:
</p>

<pre class="ipsCode" id="ips_uid_8387_7">
<code class="hljs bash"><span class="hljs-built_in"><span class="pln">sudo</span></span><span class="pln"> systemctl restart apache2</span></code></pre>

<p>
	إن حاولت الآن الوصول إلى <code>http://your_server_ip</code> في مُتصفّح ويب، ستجد جواب الخواديم الخلفيّة عوضا عن رسالة ترحيب Apache المألوفة. إن تابعت الخطوة الثّانيّة، فعند إعادة تحميل الصّفحة عدّة مرّات، ستُلاحظ بأنّ النّتيجة ستكون إمّا <code>Hello world!</code> أو <code>Howdy world!</code>، ما يعني بأنّ الوسيط العكسي يعمل على مُوازنة الحمل بين الخادومين.
</p>

<h2 id="خاتمة">
	خاتمة
</h2>

<p>
	لديك الآن معرفة بكيفيّة إعداد خادوم Apache ليعمل وسيطًا عكسيًّا لخادوم تطبيق أو أكثر. يُمكن استعمال <code>mod_proxy</code> لضبط وسيط عكسي لخواديم تطبيقات مكتوبة بلغات مثل Python مع Django أو Ruby مع Ruby on Rails.<br>
	يُمكن كذلك استخدامها لموازنة الحمل على عدّة خواديم للتّطبيقات التي تستقبل العديد من الزّوار، بالإضافة إلى إمكانيّة استخدامه لتوفير حماية <abbr title="Secure Socket Layer | طبقة المنافذ الآمنة">SSL</abbr> للخواديم الخلفيّة التي لا تدعم <abbr title="Secure Socket Layer | طبقة المنافذ الآمنة">SSL</abbr>.
</p>

<p>
	رغم أنّ <code>mod_proxy</code> و<code>mod_proxy_http</code> أكثر تركيب يتمّ استخدامه، إلّا أنّ هناك العديد من الوحدات الأخرى التّي تدعم بروتوكولات اتّصال أخرى. إليك بعضا من الوحدات الشّهيرة التي لم نستخدمها في هذا الدّرس:
</p>

<ul>
<li>
		<code>mod_proxy_ftp</code> لبروتوكول FTP.
	</li>
	<li>
		<code>mod_proxy_connect</code> لإعداد أنفاق <abbr title="Secure Socket Layer | طبقة المنافذ الآمنة">SSL</abbr>.
	</li>
	<li>
		<code>mod_proxy_ajp</code> لبروتوكول AJP (Apache JServ Protocol) لخواديم خلفيّة مبنيّة على Tomcat.
	</li>
	<li>
		<code>mod_proxy_ftp</code> لمقابس الويب Web sockets.
	</li>
</ul>
<p>
	يُمكنك قراءة <a href="http://httpd.apache.org/docs/current/mod/mod_proxy.html" rel="external nofollow">التّوثيق الرّسمي</a> للاستزادة حول <code>mod_proxy</code>.
</p>

<p>
	ترجمة – بتصرّف - للمقال <a href="https://www.digitalocean.com/community/tutorials/how-to-use-apache-as-a-reverse-proxy-with-mod_proxy-on-ubuntu-16-04" rel="external nofollow">How To Use Apache as a Reverse Proxy with mod_proxy on Ubuntu 16.04</a> لكاتبه Mateusz Papiernik.
</p>
]]></description><guid isPermaLink="false">339</guid><pubDate>Sat, 19 Aug 2017 09:44:00 +0000</pubDate></item><item><title>&#x623;&#x633;&#x627;&#x633;&#x64A;&#x651;&#x627;&#x62A; &#x639;&#x645;&#x644; mod_rewrite &#x644;&#x625;&#x639;&#x627;&#x62F;&#x629; &#x643;&#x62A;&#x627;&#x628;&#x629; &#x627;&#x644;&#x631;&#x648;&#x627;&#x628;&#x637; &#x639;&#x644;&#x649; &#x62E;&#x627;&#x62F;&#x648;&#x645; Apache</title><link>https://academy.hsoub.com/devops/servers/web/apache/%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D9%91%D8%A7%D8%AA-%D8%B9%D9%85%D9%84-mod_rewrite-%D9%84%D8%A5%D8%B9%D8%A7%D8%AF%D8%A9-%D9%83%D8%AA%D8%A7%D8%A8%D8%A9-%D8%A7%D9%84%D8%B1%D9%88%D8%A7%D8%A8%D8%B7-%D8%B9%D9%84%D9%89-%D8%AE%D8%A7%D8%AF%D9%88%D9%85-apache-r338/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2017_08/5993ff73ae665_main(8).png.4e379117bdbfcc5ba5a9e128958b97de.png" /></p>

<p>
	تعرفنا في درس سابق على كيفية تفعيل وحدة <code>mod_rewrite</code> وضبطها لإعادة كتابة عناوين URL في خادوم Apache.ا سنعتمد في هذا الشرح على ما تعلمناه سابقًا ونتوسّع - مع مثاليْن عمليّيْن - في شرحٍ بعض من أكثر التّعليمات استخداما في ضبط <code>mod_rewrite</code>.
</p>

<h2 id="المثال-الأول-تبسيط-نصوص-الاستعلام-query-strings-باستخدام-rewriterule">
	المثال الأول – تبسيط نصوص الاستعلام Query strings باستخدام RewriteRule
</h2>

<p>
	تستعمل تطبيقات الوِب في العادة نصوص الاستعلام التي يُمكن إضافتها إلى عنوان URL باستخدام علامة استفهام (<code>?</code>) بعد العنوان. تُمرَّر المُعاملات المُختلفة باستخدام علامة <code>&amp;</code>. يُمكن استخدام نصوص الاستعلام لتمرير معلومات إضافيّة بين صفحات تطبيق الوِب.
</p>

<p>
	على سبيل المثال، يُمكن لصفحة نتائج بحث مكتوبة بلغة PHP أن تستعمل عنوانا مثل <code><a href="http://example.com/results.php?item=shirt&amp;season=summer" ipsnoembed="false" rel="external nofollow">http://example.com/results.php?item=shirt&amp;season=summer</a></code>. في هذا المثال، هناك مُعاملان إضافيّان، المُعامل <code>item</code> مع القيمة <code>shirt</code>، والمُعامل <code>season</code> ذو القيمة <code>summer</code>. سيستعمل التّطبيق هذه المعلومات لتقديم أكثر نتيجة مناسبة للمُستخدم.
</p>

<p>
	تُكتب قواعد إعادة الكتابة في Apache عادة لتبسيط روابط طويلة مثل التي أعلاه إلى عناوين URL بسيطة سهلة القراءة والفهم. في هذا المثال، نريد تبسيط ما سبق ليكون على شكل <code><a href="http://example.com/shirt/summer" ipsnoembed="false" rel="external nofollow">http://example.com/shirt/summer</a></code>. كما تُلاحظ، فالقيمتان <code>shirt</code> و <code>summer</code> لا تزالان مُتواجدتيْن داخل العنوان، لكن دون نصّ استعلام واسم ملفّ PHP.
</p>

<p>
	إليك قاعدة لتحقيق مُرادنا:
</p>

<pre class="ipsCode" id="ips_uid_9682_7">
RewriteRule ^shirt/summer$ results.php?item=shirt&amp;season=summer [QSA]</pre>

<p>
	المقطع <code>shirt/summer</code> واضح وقد أخبرنا Apache بتوجيه أي طلبات مطابقة إلى العنوان <code>results.php?item=shirt&amp;season=summer</code>.<br>
	تُستخدم الخيارات <code>[QSA]</code> عادة في قواعد إعادة الكتابة. وتُخبر Apache بإضافة أي نصّ استعلام إضافي إلى عنوان URL المُقدَّم، لذا لو كتب زائر <code><a href="http://example.com/shirt/summer?page=2" ipsnoembed="false" rel="external nofollow">http://example.com/shirt/summer?page=2</a></code> فسيجيب الخادوم بـ <code>results.php?item=shirt&amp;season=summer&amp;page=2</code>. إن لم تُضف هذه الخيارات فسيُتجاهل نصّ الاستعلام الإضافي.
</p>

<p>
	رغم أنّ هذه الطّريقة تُحقّق هدفنا، إلّا أنّنا كتبنا القيمتين بصراحة داخل الملفّ. لذا فالقاعدة لن تعمل لأي قيم أخرى مثل <code>pants</code> و<code>winter</code>.
</p>

<p>
	لجعل القاعدة عامّة أكثر، يُمكننا استخدام <a href="https://academy.hsoub.com/devops/linux/%D9%85%D9%82%D8%AF%D9%85%D8%A9-%D9%81%D9%8A-%D8%A7%D9%84%D8%AA%D8%B9%D8%A7%D8%A8%D9%8A%D8%B1-%D8%A7%D9%84%D9%86%D9%85%D8%B7%D9%8A%D8%A9-regular-expressions-r63/" rel="">التّعابير النّمطيّة</a> لمُطابقة أجزاء من العنوان الأصلي واستعمالها في مقطع بدل نمطي. بحيث تكون القاعدة المُعدّلة كما يلي:
</p>

<pre class="ipsCode" id="ips_uid_9682_7">
<code class="hljs apache"><span class="hljs-keyword"><span class="hljs-common"><span class="typ">RewriteRule</span></span></span><span class="pln"> </span><span class="pun">^([</span><span class="pln">A</span><span class="pun">-</span><span class="typ">Za</span><span class="pun">-</span><span class="pln">z0</span><span class="pun">-</span><span class="lit">9</span><span class="pun">]+)/(</span><span class="pln">summer</span><span class="pun">|</span><span class="pln">winter</span><span class="pun">|</span><span class="pln">fall</span><span class="pun">|</span><span class="pln">spring</span><span class="pun">)</span><span class="pln"> results</span><span class="pun">.</span><span class="pln">php</span><span class="pun">?</span><span class="pln">item</span><span class="pun">=</span><span class="hljs-number"><span class="pln">$1</span></span><span class="pun">&amp;</span><span class="pln">season</span><span class="pun">=</span><span class="hljs-number"><span class="pln">$2</span></span><span class="hljs-sqbracket"><span class="pln"> </span><span class="pun">[</span><span class="pln">QSA</span><span class="pun">]</span></span></code></pre>

<p>
	التّعبير النمطي الأول داخل القوسين يُطابق أي مقطع نصّ مكوّن من أحرف وأرقام مثل <code>shirt</code> و <code>pants</code> ويحفظ المقطع المُطابق في المُتغيّر <code>$1</code>. التّعبير النمطي الذي يتبعه يُطابق حرفيًّا كلّا من <code>summer</code>، <code>winter</code>، <code>fall</code> و <code>spring</code>، ويحفظ أي مُطابق في المُتغيّر <code>$2</code>.
</p>

<p>
	تُستعمل المقاطع المُطابقة بعدها في عنوان URL النّاتج لتمريرها إلى كل من المُعاملين <code>item</code> و<code>season</code> عوضا عن كتابة القيمتين على نحو صريح كما فعلنا سابقا.
</p>

<p>
	القاعدة أعلاه ستستبدل على سبيل المثال العنوان <code><a href="http://example.com/pants/summer" ipsnoembed="false" rel="external nofollow">http://example.com/pants/summer</a></code> إلى <code><a href="http://example.com/results.php?item=pants&amp;season=summer" ipsnoembed="false" rel="external nofollow">http://example.com/results.php?item=pants&amp;season=summer</a></code>. هذا المثال قابل للتماشي مع التّطويرات المُستقبليّة كذلك، بحيث يُمكن إعادة كتابة العناوين لعدّة قيم باستخدام قاعدة واحدة فقط.
</p>

<h2 id="المثال-الثاني-إضافة-شروط-منطقية-باستخدام-rewriteconds">
	المثال الثّاني – إضافة شروط منطقيّة باستخدام RewriteConds
</h2>

<p>
	قواعد إعادة الكتابة ليست محصورة في قواعد تُترجم واحدة تلو الأخرى دون أية قيود. تُمكّننا تعليمة <code>RewriteCond</code> من إضافة شروط لقواعد إعادة الكتابة للتحكم في وقت ترجمة القواعد. تتّبع <code>RewriteCond</code> التّنسيق التّالي:
</p>

<pre class="ipsCode" id="ips_uid_9682_7">
<code class="hljs apache"><span class="hljs-keyword"><span class="hljs-common"><span class="typ">RewriteCond</span></span></span><span class="pln"> </span><span class="typ">TestString</span><span class="pln"> </span><span class="typ">Condition</span><span class="hljs-sqbracket"><span class="pln"> </span><span class="pun">[</span><span class="typ">Flags</span><span class="pun">]</span></span></code></pre>

<ul>
<li>
		<code>RewriteCond</code>: تعليمة الشرط.
	</li>
	<li>
		<code>TestString</code> النّص الذي سيُجرى عليه الاختبار.
	</li>
	<li>
		<code>Condition</code> نمط أو شرط للاختبار به.
	</li>
	<li>
		<code>Flags</code> عبارة عن مُعاملات إضافيّة يُمكن لها تعديل الشّرط وقواعد التّحويل.
	</li>
</ul>
<p>
	إذا أرجع شرط في <code>RewriteCond</code> القيمة المنطقيّة <code>true</code> (أي أنّ الشرط قد تحقّق)، فستُنفَّذ قاعدة <code>RewriteRule</code> التي تلي الشرط مُباشرة. إن لم يتحقّق الشّرط فتُتجاهل القاعدة. يُمكن استخدام أكثر من شرط. يجب مبدئيًّا على جميع الشّروط أن تتحقّق لتطبيق القاعدة التي تليها.
</p>

<p>
	على سبيل المثال، لنفترض بأنّك تريد إعادة توجيه جميع الطّلبات المُوجّهة إلى ملفّات أو مُجلّدات غير موجودة إلى الصّفحة الرّئيسيّة عوضا عن عرض صفحة الخطأ 404. يُمكن تحقيق هذا الهدف بالشّروط التّاليّة:
</p>

<pre class="ipsCode" id="ips_uid_9682_7">
<code class="hljs apache"><span class="hljs-keyword"><span class="hljs-common"><span class="typ">RewriteCond</span></span></span><span class="pln"> </span><span class="hljs-cbracket"><span class="pun">%{</span><span class="pln">REQUEST_FILENAME</span><span class="pun">}</span></span><span class="pln"> </span><span class="pun">!-</span><span class="pln">f
</span><span class="hljs-keyword"><span class="hljs-common"><span class="typ">RewriteCond</span></span></span><span class="pln"> </span><span class="hljs-cbracket"><span class="pun">%{</span><span class="pln">REQUEST_FILENAME</span><span class="pun">}</span></span><span class="pln"> </span><span class="pun">!-</span><span class="pln">d
</span><span class="hljs-keyword"><span class="hljs-common"><span class="typ">RewriteRule</span></span></span><span class="pln"> </span><span class="pun">.</span><span class="pln"> </span><span class="pun">/</span></code></pre>

<p>
	في المثال أعلاه:
</p>

<ul>
<li>
		<code>%{REQUEST_FILENAME}</code> يُمثّل النصّ المُختبَر. في هذه الحالة، القيمة ستكون عبارة عن اسم الملفّ الذي طلبه المُستخدم وهو مُتغيّر نظام خاص يتوفّر في كل طلب.
	</li>
	<li>
		<code>f-</code> شرط متوفّر مُسبقا في وحدة <code>mod_rewrite</code> للتّحقّق من أنّ الاسم الذي طلبه المُستخدم مُتواجد على القرص وبأنّه ملفّ فعلا. أمّا <code>!</code> فهي علامة نفي. بجمعهما، فـ<code>f-!</code> تتحقّق من أنّ الاسم الذي طلبه الاستعلام غير مُتواجد أو أنّه ليس ملفّا.
	</li>
	<li>
		<code>d-!</code> يعمل بطريقة مُشابهة ولكن بالنسبة للمجلّدات، إذ يُساوي القيمة <code>true</code> فقط إن كان الاسم المطلوب غير موجود أو أنّه ليس مجلّدا.
	</li>
</ul>
<p>
	ستُنفَّذ قاعدة <code>RewriteRule</code> الموجودة في السطر الأخير <strong>فقط</strong> إن تلقى الخادوم طلبا لملفّ أو مُجلّد غير موجود. القاعدة بسيطة وكلّ ما تفعله هو إعادة توجيه الطّلب إلى موجّه الجذر <code>/</code> في الموقع (والذي يكون عادة صفحة رئيسيّة).
</p>

<h2 id="خاتمة">
	خاتمة
</h2>

<p>
	<code>mod_rewrite</code> وحدة مُفيدة جدّا في Apache يُمكن استخدامها لتوفير عناوين URL سهلة القراءة. في هذا الدّرس، تعلّمتَ كيفيّة استخدام تعليمة <code>RewriteRule</code> لإعادة توجيه المُستخدمين حتى ولو كانت تتضمّن نصوص استعلام. تعلّمت كذلك كيفيّة إعادة التّوجيه حسب شروط باستعمال التّعليمة <code>RewriteCond</code>.<br>
	للتّعرف أكثر على <code>mod_rewrite</code>، ألق نظرة على <a href="http://httpd.apache.org/docs/current/rewrite/intro.html" rel="external nofollow">هذه الصّفحة</a> و<a href="http://httpd.apache.org/docs/current/mod/mod_rewrite.html" rel="external nofollow">التّوثيق الرّسمي لـ<code>mod_rewrite</code> من Apache</a>.
</p>

<p>
	ترجمة – بتصرّف - للمقال <a href="https://www.digitalocean.com/community/tutorials/how-to-rewrite-urls-with-mod_rewrite-for-apache-on-ubuntu-16-04" rel="external nofollow">How To Rewrite URLs with mod_rewrite for Apache on Ubuntu 16.04 </a> لكاتبه Mateusz Papiernik.
</p>
]]></description><guid isPermaLink="false">338</guid><pubDate>Wed, 16 Aug 2017 08:17:32 +0000</pubDate></item><item><title>&#x62A;&#x641;&#x639;&#x64A;&#x644; mod_rewrite &#x648;&#x636;&#x628;&#x637;&#x647; &#x644;&#x625;&#x639;&#x627;&#x62F;&#x629; &#x643;&#x62A;&#x627;&#x628;&#x629; &#x639;&#x646;&#x627;&#x648;&#x64A;&#x646; URL &#x644;&#x62E;&#x627;&#x62F;&#x648;&#x645; Apache &#x639;&#x644;&#x649; Ubuntu 16.04</title><link>https://academy.hsoub.com/devops/servers/web/apache/%D8%AA%D9%81%D8%B9%D9%8A%D9%84-mod_rewrite-%D9%88%D8%B6%D8%A8%D8%B7%D9%87-%D9%84%D8%A5%D8%B9%D8%A7%D8%AF%D8%A9-%D9%83%D8%AA%D8%A7%D8%A8%D8%A9-%D8%B9%D9%86%D8%A7%D9%88%D9%8A%D9%86-url-%D9%84%D8%AE%D8%A7%D8%AF%D9%88%D9%85-apache-%D8%B9%D9%84%D9%89-ubuntu-1604-r337/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2017_08/598f0adddc9f2_main(1).png.397c95cfc8bd6ca155f306fa51f92f9a.png" /></p>

<h2 id="مقدمة">
	مُقدّمة
</h2>

<p>
	سنتعرّف في هذا الدّرس على كيفيّة إعادة كتابة عناوين URL باستخدام وحدة <code>mod_rewrite</code> الخاصّة بـApache 2. تمنحنا هذه الوحدة حريّة إعادة كتابة روابط URL لتكون أكثر نظافة وتنسيقا عبر ترجمة مسارات قابلة للقراءة إلى استعلامات مُوجّهة لتطبيق الوِب أو إعادة توجيه المُستخدم حسب شروط إضافيّة.
</p>

<p>
	هذا الدّرس مُقسّم إلى جزأين. بحيث نجهّز في الجزء الأول موقعا إلكترونيا بسيطا مع مثال بسيط لإعادة كتابة عنوان URL. يُغطّي الجزء الثّاني مثالين مُعمّقين لأكثر قواعد إعادة الكتابة شيوعا.
</p>

<h2 id="المتطلبات">
	المُتطلّبات
</h2>

<p>
	لاتّباع هذا الدّرس، ستحتاج إلى:
</p>

<ul>
<li>
		<p>
			خادوم أوبونتو 16.04 مضبوط باتّباع الخطوات الواردة في درس <a href="https://academy.hsoub.com/devops/servers/%D8%A7%D9%84%D8%A5%D8%B9%D8%AF%D8%A7%D8%AF-%D8%A7%D9%84%D8%A7%D8%A8%D8%AA%D8%AF%D8%A7%D8%A6%D9%8A-%D9%84%D8%AE%D8%A7%D8%AF%D9%88%D9%85-%D8%A3%D9%88%D8%A8%D9%86%D8%AA%D9%88-1404-r4/" rel="">الإعداد الابتدائي لخادوم أوبونتو</a>، وذلك يشمل مُستخدما ذا صلاحيّات <code>sudo</code> مع ضبط مُسبق لتمكينه من تنفيذ مهام إداريّة، غير المستخدم الجذر root، بالإضافة إلى جدار ناري.
		</p>
	</li>
	<li>
		<p>
			Apache 2 مُنصّب على خادومك باتّباع الخطوة الأولى من درس <a href="https://academy.hsoub.com/devops/servers/%D8%A7%D9%84%D8%A5%D8%B9%D8%AF%D8%A7%D8%AF-%D8%A7%D9%84%D8%A7%D8%A8%D8%AA%D8%AF%D8%A7%D8%A6%D9%8A-%D9%84%D8%AE%D8%A7%D8%AF%D9%88%D9%85-%D8%A3%D9%88%D8%A8%D9%86%D8%AA%D9%88-1404-r4/" rel="">تثبيت حزم LAMP على أوبونتو</a>.
		</p>
	</li>
</ul>
<h2 id="الخطوة-1-تفعيل-modrewrite">
	الخطوة 1 – تفعيل mod_rewrite
</h2>

<p>
	أولا، نحتاج إلى تفعيل <code>mod_rewrite</code>. مبدئيًّا، الوحدة متوفّرة لكنّها غير مُفعّلة عند تنصيب Apache 2.
</p>

<pre class="ipsCode" id="ips_uid_7270_7">
sudo a2enmod rewrite</pre>

<p>
	سيقوم هذا الأمر بتفعيل الوحدة أو إخبارك بأنّ الوحدة قد سبق تفعيلها. لتطبيق التّغييرات، أعد تشغيل Apache:
</p>

<pre class="ipsCode" id="ips_uid_7270_7">
<code class="hljs bash"><span class="hljs-built_in"><span class="pln">sudo</span></span><span class="pln"> systemctl restart apache2</span></code></pre>

<p>
	وحدة <code>mod_rewrite</code> مُفعّلة الآن. سنضبُط في الخطوة التّاليّة ملفّ <code>.htaccess</code> لاستخدامه لتحديد قواعد إعادة الكتابة لإعادات التّوجيه Redirects.
</p>

<h2 id="الخطوة-2-ضبط-htaccess">
	الخطوة 2 – ضبط htaccess.
</h2>

<p>
	يسمح لنا ملفّ <code>.htaccess</code>بتعديل قواعد إعادة الكتابة دون الحاجة إلى الوصول إلى ملفّات إعدادات الخادوم. لهذا السّبب، فملفّ <code>.htaccess</code> مُهمّ جدّا لحماية تطبيق الوِب الخاصّ بك. النّقطة في أول الاسم تُشير إلى أنّ الملفّ مخفي.
</p>

<p>
	<strong>مُلاحظة:</strong> يُمكن لأي قواعد تضعها داخل ملفّ <code>.htaccess</code> أن توضع كذلك داخل ملفّات إعدادات الخادوم، في الحقيقة، ينصح التوثيق الرّسمي لـApache ينصح باستعمال ملفات إعدادات الخادوم عوضا عن ملفّ <code>.htaccess</code> لقدرة Apache على مُعالجتها بسرعة أعلى.
</p>

<p>
	مع ذلك، في مثالنا البسيط، الفرق في الأداء لن يكون ملحوظا. بالإضافة إلى أنّ وضع القواعد داخل ملفّ <code>.htaccess</code> مُريح أكثر، خاصّة إن كان لديك <a href="https://academy.hsoub.com/devops/servers/web/apache/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%B6%D8%A8%D8%B7-%D8%A7%D9%84%D9%85%D8%B3%D8%AA%D8%B6%D9%8A%D9%81%D8%A7%D8%AA-%D8%A7%D9%84%D8%A7%D9%81%D8%AA%D8%B1%D8%A7%D8%B6%D9%8A%D8%A9-%D9%81%D9%8A-%D8%AE%D8%A7%D8%AF%D9%88%D9%85-%D9%88%D9%8A%D8%A8-apache-%D8%B9%D9%84%D9%89-%D8%A3%D9%88%D8%A8%D9%86%D8%AA%D9%88-1404-r10/" rel="">الكثير من المواقع الإلكترونيّة</a> في خادوم واحد. إذ لا تتطلّب التّغييرات إعادة تشغيل الخادوم ولا تحتاج إلى صلاحيّات المُستخدم الجذر Root لتعديل الملفّ، ما يُسهّل إجراء التّغييرات بحساب مُستخدم عاديّ. بعض البرمجيّات مفتوحة المصدر مثل جوملا ، <a href="https://academy.hsoub.com/apps/web/wordpress/" rel="">ووردبريس</a> و<a href="https://academy.hsoub.com/programming/php/laravel/" rel="">لارافل</a> تعتمد على ملفّ <code>.htaccess</code> لإجراء التّعديلات وإضافة قواعد إضافيّة حسب الطّلب.
</p>

<p>
	سنحتاج إلى ضبط وتأمين بعض الإعدادات قبل أن نبدأ.
</p>

<p>
	يمنع Apache مبدئيًّا استخدام ملفّ <code>.htaccess</code> لقواعد إعادة كتابة روابط URL، لذا سيتوجّب عليك أولا تفعيل إمكانيّة استخدام الملفّ. افتح ملفّ إعدادات Apache المبدئية باستخدام <code>nano</code> أو مُحرّرك المفضّل.
</p>

<pre class="ipsCode" id="ips_uid_7270_7">
<code class="hljs haskell"><span class="hljs-title"><span class="pln">sudo</span></span><span class="pln"> nano </span><span class="pun">/</span><span class="pln">etc</span><span class="pun">/</span><span class="pln">apache2</span><span class="pun">/</span><span class="pln">sites</span><span class="pun">-</span><span class="pln">available</span><span class="pun">/</span><span class="hljs-number"><span class="lit">000</span></span><span class="pun">-</span><span class="hljs-default"><span class="hljs-keyword"><span class="kwd">default</span></span><span class="pun">.</span><span class="pln">conf</span></span></code></pre>

<p>
	ستجد داخل هذا الملفّ الجزء <code>&lt;VirtualHost *:80&gt;</code> في أول سطر. داخل هذا الجزء، أضف الجزء التّالي مباشرة بعد السطر الذي يبدأ بـ<code>DocumentRoot</code>:
</p>

<pre class="ipsCode" id="ips_uid_7270_7">
<code class="hljs apache"><span class="pln">    </span><span class="hljs-tag"><span class="tag">&lt;Directory</span><span class="pln"> </span><span class="pun">/</span><span class="atn">var</span><span class="pun">/</span><span class="atn">www</span><span class="pun">/</span><span class="atn">html</span><span class="tag">&gt;</span></span><span class="pln">
        </span><span class="hljs-keyword"><span class="hljs-common"><span class="pln">Options</span></span></span><span class="pln"> Indexes FollowSymLinks MultiViews
        </span><span class="hljs-keyword"><span class="pln">AllowOverride</span></span><span class="pln"> </span><span class="hljs-literal"><span class="pln">All</span></span><span class="pln">
        </span><span class="hljs-keyword"><span class="pln">Require</span></span><span class="pln"> </span><span class="hljs-literal"><span class="pln">all</span></span><span class="pln"> granted
    </span><span class="hljs-tag"><span class="tag">&lt;/Directory&gt;</span></span></code></pre>

<p>
	ليُصبح ملفّ الإعدادات كما يلي (حذفنا - للاختصار - التعليقات، وهي الأسطر التي تبدأ بـ<code>#</code> من المُقتَطع أدناه). تأكّد من أنّ الإزاحة صحيحة:
</p>

<pre class="ipsCode" id="ips_uid_7270_7">
<code class="hljs apache"><span class="hljs-tag"><span class="tag">&lt;VirtualHost</span><span class="pln"> *:80</span><span class="tag">&gt;</span></span><span class="pln">
        </span><span class="hljs-keyword"><span class="pln">ServerAdmin</span></span><span class="pln"> webmaster@localhost
        </span><span class="hljs-keyword"><span class="hljs-common"><span class="pln">DocumentRoot</span></span></span><span class="pln"> /var/www/html
        </span><span class="hljs-tag"><span class="tag">&lt;Directory</span><span class="pln"> </span><span class="pun">/</span><span class="atn">var</span><span class="pun">/</span><span class="atn">www</span><span class="pun">/</span><span class="atn">html</span><span class="tag">&gt;</span></span><span class="pln">
            </span><span class="hljs-keyword"><span class="hljs-common"><span class="pln">Options</span></span></span><span class="pln"> Indexes FollowSymLinks MultiViews
            </span><span class="hljs-keyword"><span class="pln">AllowOverride</span></span><span class="pln"> </span><span class="hljs-literal"><span class="pln">All</span></span><span class="pln">
            </span><span class="hljs-keyword"><span class="pln">Require</span></span><span class="pln"> </span><span class="hljs-literal"><span class="pln">all</span></span><span class="pln"> granted
        </span><span class="hljs-tag"><span class="tag">&lt;/Directory&gt;</span></span><span class="pln">


        </span><span class="hljs-keyword"><span class="pln">ErrorLog</span></span><span class="pln"> </span><span class="hljs-cbracket"><span class="pln">${APACHE_LOG_DIR}</span></span><span class="pln">/error.log
        </span><span class="hljs-keyword"><span class="pln">CustomLog</span></span><span class="pln"> </span><span class="hljs-cbracket"><span class="pln">${APACHE_LOG_DIR}</span></span><span class="pln">/access.log combined
</span><span class="hljs-tag"><span class="tag">&lt;/VirtualHost&gt;</span></span></code></pre>

<p>
	احفظ وأغلق الملفّ.
</p>

<p>
	<strong>ملحوظة:</strong> يفترض هذا الدليل وجودَ موقع واحد على خادومك، في هذه الحالة يكفي التعديل على ملف المضيف الافتراضي Virtual host المبدئي (<code>000-default.conf</code>) بالطريقة أعلاه لتفعيل إمكانيّة إعادة التوجيه. إن كان لديك أكثر من موقع فستحتاج لإجراء التعديل أعلاه على ملفّ المضيف الافتراضي الخاصّ بالموقع الذي تريد. توجد ملفات <a href="https://academy.hsoub.com/devops/servers/web/apache/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%B6%D8%A8%D8%B7-%D8%A7%D9%84%D9%85%D8%B3%D8%AA%D8%B6%D9%8A%D9%81%D8%A7%D8%AA-%D8%A7%D9%84%D8%A7%D9%81%D8%AA%D8%B1%D8%A7%D8%B6%D9%8A%D8%A9-%D9%81%D9%8A-%D8%AE%D8%A7%D8%AF%D9%88%D9%85-%D9%88%D9%8A%D8%A8-apache-%D8%B9%D9%84%D9%89-%D8%A3%D9%88%D8%A8%D9%86%D8%AA%D9%88-1404-r10/" rel="">المضيفات الافتراضية</a> على المسار <code>/etc/apache2/sites-available/</code>.
</p>

<p>
	لتطبيق التّغييرات، أعد تشغيل خادوم Apache:
</p>

<pre class="ipsCode" id="ips_uid_7270_7">
<code class="hljs bash"><span class="hljs-built_in"><span class="pln">sudo</span></span><span class="pln"> systemctl restart apache2</span></code></pre>

<p>
	الآن، أنشئ ملفّ <code>.htaccess</code> داخل مجلّد الوب الجذر:
</p>

<pre class="ipsCode" id="ips_uid_7270_7">
<code class="hljs bash"><span class="hljs-built_in"><span class="pln">sudo</span></span><span class="pln"> nano </span><span class="pun">/</span><span class="kwd">var</span><span class="pun">/</span><span class="pln">www</span><span class="pun">/</span><span class="pln">html</span><span class="pun">/.</span><span class="pln">htaccess</span></code></pre>

<p>
	أضف السّطر التّالي إلى أعلى الملفّ لتفعيل مُحرّك إعادة الكتابة Rewrite engine:
</p>

<pre class="ipsCode" id="ips_uid_7270_7">
<code class="hljs livecodeserver"><span class="typ">RewriteEngine</span><span class="pln"> </span><span class="hljs-command"><span class="hljs-keyword"><span class="pln">on</span></span></span></code></pre>

<p>
	احفظ وأغلق الملفّ.
</p>

<p>
	يُمكنك الآن استعمال الملفّ <code>.htaccess</code> للتّحكم بقواعد المُوجّهات في تطبيق الوِب الخاصّ بك.
</p>

<h2 id="الخطوة-3-ضبط-إعادات-كتابة-روابط-url">
	الخطوة 3 – ضبط إعادات كتابة روابط URL
</h2>

<p>
	سنعدّ في هذه الفقرة إعادة كتابة بسيطة لرابط URL، بحيث نستطيع تحويل عناوين URL جميلة إلى مسارات يُمكن للشفرة فهمها. سنسمح بالخصوص للمُستخدمين بالوصول إلى العنوان <code>http://your_server_ip/about</code>.
</p>

<p>
	لنبدأ بإنشاء ملفّ باسم <code>about.php</code> داخل مُجلّد الوب:
</p>

<pre class="ipsCode" id="ips_uid_7270_7">
<code class="hljs bash"><span class="hljs-built_in"><span class="pln">sudo</span></span><span class="pln"> nano </span><span class="pun">/</span><span class="kwd">var</span><span class="pun">/</span><span class="pln">www</span><span class="pun">/</span><span class="pln">html</span><span class="pun">/</span><span class="pln">about</span><span class="pun">.</span><span class="pln">php</span></code></pre>

<p>
	انسخ شفرة HTML التّاليّة إلى الملفّ واحفظه ثمّ أغلقه:
</p>

<pre class="ipsCode" id="ips_uid_7270_7">
<code class="hljs xml"><span class="hljs-tag"><span class="tag">&lt;</span><span class="hljs-title"><span class="tag">html</span></span><span class="tag">&gt;</span></span><span class="pln">
    </span><span class="hljs-tag"><span class="tag">&lt;</span><span class="hljs-title"><span class="tag">head</span></span><span class="tag">&gt;</span></span><span class="pln">
        </span><span class="hljs-tag"><span class="tag">&lt;</span><span class="hljs-title"><span class="tag">title</span></span><span class="tag">&gt;</span></span><span class="pln">About Us</span><span class="hljs-tag"><span class="tag">&lt;/</span><span class="hljs-title"><span class="tag">title</span></span><span class="tag">&gt;</span></span><span class="pln">
    </span><span class="hljs-tag"><span class="tag">&lt;/</span><span class="hljs-title"><span class="tag">head</span></span><span class="tag">&gt;</span></span><span class="pln">
    </span><span class="hljs-tag"><span class="tag">&lt;</span><span class="hljs-title"><span class="tag">body</span></span><span class="tag">&gt;</span></span><span class="pln">
        </span><span class="hljs-tag"><span class="tag">&lt;</span><span class="hljs-title"><span class="tag">h1</span></span><span class="tag">&gt;</span></span><span class="pln">About Us</span><span class="hljs-tag"><span class="tag">&lt;/</span><span class="hljs-title"><span class="tag">h1</span></span><span class="tag">&gt;</span></span><span class="pln">
    </span><span class="hljs-tag"><span class="tag">&lt;/</span><span class="hljs-title"><span class="tag">body</span></span><span class="tag">&gt;</span></span><span class="pln">
</span><span class="hljs-tag"><span class="tag">&lt;/</span><span class="hljs-title"><span class="tag">html</span></span><span class="tag">&gt;</span></span></code></pre>

<p>
	<strong>ملحوظة:</strong> تأكّد من أن خادوم الوِب لديه صلاحيات الوصول إلى الملف الذي أنشأته للتو. مثلا، بإعطاء <a href="https://academy.hsoub.com/devops/linux/%D8%B4%D8%B1%D8%AD-%D8%A3%D8%B0%D9%88%D9%86%D8%A7%D8%AA-%D8%A7%D9%84%D9%85%D9%84%D9%81%D8%A7%D8%AA-file-permissions-%D8%B9%D9%84%D9%89-%D9%84%D9%8A%D9%86%D9%83%D8%B3-%D9%88%D9%8A%D9%88%D9%86%D9%83%D8%B3-r240/" rel="">الأذون</a> <code>755</code>على مجلد الوِب:
</p>

<pre class="ipsCode" id="ips_uid_7270_9">
sudo chmod -R 755 /var/www</pre>

<p>
	يُمكنك الوصول إلى هذه الصّفحة على العنوان <code>http://your_server_ip/about.html</code>، لكن لو حاولت الوصول إلى العنوان <code>http://your_server_ip/about</code>، فستُلاحظ خطأ <code>404 Not Found</code>، إن أردت تمكين مُستخدميك من استعمال هذا العنوان عوضا عن العنوان السّابق (أي دون الجزء <code>.html</code>) فقواعد إعادة الكتابة كفيلة بتوفير هذه الوظيفة.
</p>

<p>
	تتّبع جميع قواعد الكتابة التّنسيق التّالي:
</p>

<pre class="ipsCode" id="ips_uid_7270_7">
<code class="hljs apache"><span class="hljs-keyword"><span class="hljs-common"><span class="typ">RewriteRule</span></span></span><span class="pln"> pattern substitution</span><span class="hljs-sqbracket"><span class="pln"> </span><span class="pun">[</span><span class="pln">flags</span><span class="pun">]</span></span></code></pre>

<p>
	بحيثُ:
</p>

<ul>
<li>
		<code>RewriteRule</code> يُحدّد التّعليمة.
	</li>
	<li>
		<code>pattern</code> <a href="https://academy.hsoub.com/devops/linux/%D9%85%D9%82%D8%AF%D9%85%D8%A9-%D9%81%D9%8A-%D8%A7%D9%84%D8%AA%D8%B9%D8%A7%D8%A8%D9%8A%D8%B1-%D8%A7%D9%84%D9%86%D9%85%D8%B7%D9%8A%D8%A9-regular-expressions-r63/" rel="">تعبير نمطي</a> Regular Expression يُحدّد عنوان URL المرغوب به، هذا هو ما سيكتبه المُستخدم في شريط عنوان URL.
	</li>
	<li>
		<code>substitution</code>: البدل، وهو مسار عنوان URL الأصلي، (مسار الملفّ الذي يقوم Apache بتقديمه).
	</li>
	<li>
		<code>flags</code> عبارة عن مُعاملات اختياريّة لتعديل آليّة عمل القاعدة.<br>
		افتح ملفّ <code>.htaccess</code>:
	</li>
</ul>
<pre class="ipsCode" id="ips_uid_7270_7">
<code class="hljs bash"><span class="hljs-built_in"><span class="pln">sudo</span></span><span class="pln"> nano </span><span class="pun">/</span><span class="kwd">var</span><span class="pun">/</span><span class="pln">www</span><span class="pun">/</span><span class="pln">html</span><span class="pun">/.</span><span class="pln">htaccess</span></code></pre>

<p>
	بعد السّطر الأول، أضف السّطر الثّاني ممّا يلي:
</p>

<pre class="ipsCode" id="ips_uid_7270_7">
<code class="hljs apache"><span class="hljs-keyword"><span class="hljs-common"><span class="typ">RewriteEngine</span></span></span><span class="pln"> </span><span class="hljs-literal"><span class="pln">on</span></span><span class="pln">
</span><span class="hljs-keyword"><span class="hljs-common"><span class="typ">RewriteRule</span></span></span><span class="pln"> </span><span class="pun">^</span><span class="pln">about$ about</span><span class="pun">.</span><span class="pln">html</span><span class="hljs-sqbracket"><span class="pln"> </span><span class="pun">[</span><span class="pln">NC</span><span class="pun">]</span></span></code></pre>

<p>
	في هذه الحالة، المقطع <code>^about$</code> هو التّعبير النّمطي، <code>about.html</code> يُعبّر عن البدل، و <code>[NC]</code> هي المُعاملات. استخدمنا في هذا المثال عدّة محارف تحمل معان خاصّة:
</p>

<ul>
<li>
		<code>^</code> يُشير إلى بداية العنوان بعد المقطع <code>your_server_ip/</code>.
	</li>
	<li>
		<code>$</code> يُشير إلى نهاية عنوان URL.
	</li>
	<li>
		<code>about</code> المقطع الذي يجب على التّعبير النّمطي مُطابقته.
	</li>
	<li>
		<code>about.html</code> اسم الملفّ الأصلي الذي يصل إليه المُستخدم
	</li>
	<li>
		<code>[NC]</code> خيار لجعل القاعدة تتجاهل حالة الأحرف Case insensitive.
	</li>
</ul>
<p>
	ينبغي الآن أن تستطيع الوصول إلى العنوان <code>http://your_server_ip/about</code> في مُتصّفح الويب الخاصّ بك. في الحقيقة، بالقاعدة التي كتبناها أعلاه، فالعناوين التّاليّة ستؤدّي جميعها إلى الملفّ <code>about.html</code>:
</p>

<ul>
<li>
		<code>http://your_server_ip/about</code>، بسبب تعريفنا للقاعدة.
	</li>
	<li>
		<code>http://your_server_ip/About</code>، لأنّ القاعدة تتجاهل حالة الأحرف.
	</li>
	<li>
		<code>http://your_server_ip/about.html</code>، لأنّ اسم الملفّ الأصلي سيعمل دائما.
	</li>
</ul>
<p>
	العناوين التّاليّة لن تعمل:
</p>

<ul>
<li>
		<code>http://your_server_ip/about/</code>، لأنّ القاعدة تنصّ بوضوح بأنّه لا يجوز على أي شيء أن يكون بعد <code>about</code> باستخدام المحرف <code>$</code>.
	</li>
	<li>
		<code>http://your_server_ip/contact</code>، لأنّ العنوان لن يُطابق المقطع <code>about</code>.
	</li>
</ul>
<p>
	تمتلك الآن ملفّ <code>.htaccess</code> مع قاعدة بسيطة، يُمكنك الآن تعديله وتوسيعه حسب حاجاتك. سنتعرّف في الجزء الثاني من هذا الدرس على أمثلة إضافية لإعادة كتابة الروابط والتعليمات الأكثر استخداما مع <code>mod_rewrite</code>.
</p>

<p>
	ترجمة – بتصرّف - للمقال <a href="https://www.digitalocean.com/community/tutorials/how-to-rewrite-urls-with-mod_rewrite-for-apache-on-ubuntu-16-04" rel="external nofollow">How To Rewrite URLs with mod_rewrite for Apache on Ubuntu 16.04 </a> لكاتبه Mateusz Papiernik.
</p>
]]></description><guid isPermaLink="false">337</guid><pubDate>Sat, 12 Aug 2017 14:04:28 +0000</pubDate></item><item><title>&#x643;&#x64A;&#x641; &#x62A;&#x646;&#x634;&#x626; &#x634;&#x647;&#x627;&#x62F;&#x629; SSL &#x645;&#x648;&#x651;&#x64E;&#x642;&#x639;&#x629; &#x630;&#x627;&#x62A;&#x64A;&#x651;&#x64B;&#x627; &#x644;&#x627;&#x633;&#x62A;&#x62E;&#x62F;&#x627;&#x645;&#x647;&#x627; &#x645;&#x639; &#x62E;&#x627;&#x62F;&#x648;&#x645; &#x627;&#x644;&#x648;&#x650;&#x628; Apache &#x639;&#x644;&#x649; &#x623;&#x648;&#x628;&#x648;&#x646;&#x62A;&#x648; 16.04</title><link>https://academy.hsoub.com/devops/servers/web/apache/%D9%83%D9%8A%D9%81-%D8%AA%D9%86%D8%B4%D8%A6-%D8%B4%D9%87%D8%A7%D8%AF%D8%A9-ssl-%D9%85%D9%88%D9%91%D9%8E%D9%82%D8%B9%D8%A9-%D8%B0%D8%A7%D8%AA%D9%8A%D9%91%D9%8B%D8%A7-%D9%84%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85%D9%87%D8%A7-%D9%85%D8%B9-%D8%AE%D8%A7%D8%AF%D9%88%D9%85-%D8%A7%D9%84%D9%88%D9%90%D8%A8-apache-%D8%B9%D9%84%D9%89-%D8%A3%D9%88%D8%A8%D9%88%D9%86%D8%AA%D9%88-1604-r325/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2017_07/main2.jpg.9c7cc780a0abe937b60260ce8476f2fa.jpg" /></p>

<h2 id="مقدمة">
	مقدمة
</h2>

<p>
	يُستخدم ميثاق (بروتوكول) الوِب <abbr title="Transport Layer Security | بروتوكول أمن طبقة النقل">TLS</abbr> (اختصار لـ Transport Layer Security، أمان طبقة النقل) وسلفه <abbr title="Secure Socket Layer | طبقة المنافذ الآمنة">SSL</abbr> (اختصار لـ Secure Sockets Layer، طبقة المقابس الآمنة) لتغليف البيانات العاديّة ضمن إطار محميّ وآمن. يمكن للخواديم باستخدام هذه التقنية أن تؤمّن تبادل البيانات بينها وبين العملاء حتى ولو اعتُرِضت طريقُ الرسائل بين الخادوم والعميل. يساعد نظام الشهادات الأمنية Certificates المستخدِمين والزوار في التحقّق من أمان المواقع التي يتّصلون بها.
</p>

<p>
	سنقدّم في هذا الدليل الخطوات اللازمة لإعداد شهادة أمنيّة موقَّعة ذاتيًّا Self-signed certificate لاستخدامها مع خادوم الوِب Apache على أوبونتو 16.04.
</p>

<p>
	<strong>ملحوظة:</strong> تعمّي الشهادات الموقَّعة ذاتيًّا الاتصالات بين الخادوم والعملاء؛ لكن لن يمكنَ للعملاء استخدامُها للتحقّق من التحقّق من هويّة خادومك تلقائيًّا، إذ أنه لم تُوقّعها سلطة معترف بها. تتضمَّن المتصفّحات مثل فيرفكس وكروم قائمة بالسلطات المعترف بها والمخوَّلة إصدار شهادات <abbr title="Transport Layer Security | بروتوكول أمن طبقة النقل">TLS</abbr>.<br>
	يُناسب استخدام الشهادات الموقَّعة ذاتيًّا بيئات الاختبار، على الحاسوب الشخصي أو عندما لا يكون لديك نطاق Domain؛ مثلا في واجهات الوِب غير المتاحة للعموم. إن كان لديك نطاق فالأفضل أن تستخدم <a href="https://academy.hsoub.com/devops/servers/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%AA%D8%AB%D8%A8%D9%8A%D8%AA-%D8%B4%D9%87%D8%A7%D8%AF%D8%A9-ssl-%D9%85%D9%86-%D8%B3%D9%84%D8%B7%D8%A9-%D8%B4%D9%87%D8%A7%D8%AF%D8%A7%D8%AA-%D8%AA%D8%AC%D8%A7%D8%B1%D9%8A%D8%A9-%D8%A7%D9%84%D9%85%D9%81%D8%A7%D9%87%D9%8A%D9%85-%D8%A7%D9%84%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A9-r146/" rel="">شهادة أمنية من سطلة معترف بها</a>. يمكنك الحصول على شهادة مجانيّة من <a href="https://academy.hsoub.com/devops/servers/%D8%AA%D9%86%D8%B5%D9%8A%D8%A8-%D8%B4%D9%87%D8%A7%D8%AF%D8%A9-ssl-%D9%85%D8%AC%D8%A7%D9%86%D9%8A%D8%A9-%D8%B9%D8%A8%D8%B1-%D8%AE%D8%AF%D9%85%D8%A9-lets-encrypt-%D8%B9%D9%84%D9%89-%D8%AE%D8%A7%D8%AF%D9%88%D9%85-%D9%84%D9%8A%D9%86%D9%83%D8%B3-r151/" rel="">Let’s encrypt وإعدادها</a>.
</p>

<h2 id="المتطلبات">
	المتطلبات
</h2>

<p>
	ستحتاج قبل البدء بتنفيذ الخطوات الواردة في هذا الدرس إلى إعداد مستخدم إداري بامتيازات <code>sudo</code> غير المستخدم الجذر. راجع درس <a href="https://academy.hsoub.com/devops/servers/%D8%A7%D9%84%D8%A5%D8%B9%D8%AF%D8%A7%D8%AF-%D8%A7%D9%84%D8%A7%D8%A8%D8%AA%D8%AF%D8%A7%D8%A6%D9%8A-%D9%84%D8%AE%D8%A7%D8%AF%D9%88%D9%85-%D8%A3%D9%88%D8%A8%D9%86%D8%AA%D9%88-1404-r4/" rel="">الإعداد الابتدائي لخادوم أوبونتو</a> لمعرفة كيفية ذلك.
</p>

<p>
	ستحتاج أيضا لتثبيت خادوم الوِب Apache. إن رغبت في تثبيت كامل حزم LAMP (أي لينكس Linux، أباتش Apache، وMySQL وPHP) فالدرس <a href="https://academy.hsoub.com/devops/servers/%D9%83%D9%8A%D9%81-%D8%AA%D8%AB%D8%A8%D8%AA-%D8%AD%D8%B2%D9%85-mysql-%D8%8Capache-%D8%8Clinux-lamp-%D9%88-php-%D8%B9%D9%84%D9%89-%D8%A3%D9%88%D8%A8%D9%86%D8%AA%D9%88-1404-r27/" rel="">كيف تثبت حزم MySQL ،Apache ،Linux :LAMP و PHP</a> موجود لهذا الغرض؛ أما إن كنت ترغب في تثبيت Apache لوحده فيمكنك الاعتماد على الدرس المُشار إليه مع ترك الخطوات الخاصّة بكلّ من MySQL وPHP.
</p>

<p>
	تأكّد من توفّرك على المتطلّبات ثم نفّذ الخطوات المشروحة أدناه.
</p>

<h2 id="الخطوة-اﻷولى-إنشاء-شهادة-ssl">
	الخطوة اﻷولى: إنشاء شهادة <abbr title="Secure Socket Layer | طبقة المنافذ الآمنة">SSL</abbr>
</h2>

<p>
	يعمل بروتكول <abbr title="Transport Layer Security | بروتوكول أمن طبقة النقل">TLS</abbr> (وسلفه <abbr title="Secure Socket Layer | طبقة المنافذ الآمنة">SSL</abbr>) باستخدام مفتاحيْن <a href="https://academy.hsoub.com/programming/general/%D9%85%D8%A7%D9%84%D9%81%D8%B1%D9%82-%D8%A8%D9%8A%D9%86-%D8%A7%D9%84%D8%AA%D8%B1%D9%85%D9%8A%D8%B2-encoding%D8%8C-%D8%A7%D9%84%D8%AA%D8%B9%D9%85%D9%8A%D8%A9-encryption%D8%8C-%D8%A7%D9%84%D8%AA%D8%AC%D8%B2%D8%A6%D8%A9-hashing-%D9%88%D8%A7%D9%84%D8%AA%D8%B4%D9%88%D9%8A%D8%B4-obfuscation%D8%9F-r308" rel="">للتعميّة</a> واحد عمومي Public وآخر خاصّ (أو سرّي) Private. يُخزَّن المفتاح السّري على الخادوم ولا يجوز أن يطّلع عليه أي عميل فهو خاصّ بالخادوم الذي يستخدمه لتعميّة المحتوى المُرسَل إلى العملاء. يُمكن لأيّ عميل الاطّلاع على شهادة <abbr title="Transport Layer Security | بروتوكول أمن طبقة النقل">TLS</abbr>. تحوي هذه الشهادة المفتاح العموميّ الذي يُستخدَم لفكّ التعميّة عن المحتوى القادم من الخادوم.
</p>

<p>
	<strong>ملحوظة:</strong> رغم أن استخدام البروتكول <abbr title="Secure Socket Layer | طبقة المنافذ الآمنة">SSL</abbr> يقلّ يومًا بعد يوم إلا أن المصطلح “شهادة <abbr title="Secure Socket Layer | طبقة المنافذ الآمنة">SSL</abbr>” لا يزال يُستَخدَم كثيرًا، ويُقصَد به - في الغالب - <abbr title="Transport Layer Security | بروتوكول أمن طبقة النقل">TLS</abbr>، الذي هو نسخة محسَّنة من <abbr title="Secure Socket Layer | طبقة المنافذ الآمنة">SSL</abbr>.
</p>

<p>
	تتيح مكتبة OpenSSL (مكتبة برمجيّة توفّر أدوات للتعامل مع شهادات <abbr title="Secure Socket Layer | طبقة المنافذ الآمنة">SSL</abbr>/<abbr title="Transport Layer Security | بروتوكول أمن طبقة النقل">TLS</abbr>) إنشاء مفتاح تعميّة موقَّع ذاتيًّا بالأمر التالي:
</p>

<pre class="ipsCode" id="ips_uid_7710_7">
    sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/<abbr title="Secure Socket Layer | طبقة المنافذ الآمنة">ssl</abbr>/private/apache-selfsigned.key -out /etc/<abbr title="Secure Socket Layer | طبقة المنافذ الآمنة">ssl</abbr>/certs/apache-selfsigned.crt
</pre>

<p>
	ستُطرَح عليك مجموعة من الأسئلة، ولكن قبل النظر في تلك الأسئلة سنشرح الخيارات المذكورة في الأمر السابق:
</p>

<ul>
<li>
		<code>openssl</code>: هذا هو الأمر الأساسي لإنشاء الشهادات، المفاتيح وبقية الملفات وإدارتها في OpenSSL.
	</li>
	<li>
		<code>req</code>: يحدّد هذا الأمر الفرعي المعيار <code>X.509</code> لاستخدامه في البنية التحتيّة التي نريد استخدامها لإدارة المفاتيح العموميّة. يعتمد الميثاقان <abbr title="Secure Socket Layer | طبقة المنافذ الآمنة">SSL</abbr> وTLS المعيار <code>X.509</code> لإدارة المفاتيح العمومية. نستخدم هذا الأمر الفرعي لطلب إنشاء شهادة تتوافق مع هذا المعيار.
	</li>
	<li>
		<code>x.509</code>: يغيّر هذا الخيار طريقة عمل الأمر الفرعي السابق ليخبره أننا في طور إنشاء شهادة موّقَّعة ذاتيًّا بدلا من إرسال طلب لتوقيع شهادة الذي هو السلوك المبدئي للأمر الفرعي.
	</li>
	<li>
		<code>nodes</code>: يطلُب هذا الخيار من <code>openssl</code> تجاوز خيار تأمين الشهادة بعبارة سرّ Passphrase. نريد أن يكون Apache قادرا على قراءة الشهادة بدون تدخّل من المستخدم عند بدْء تشغيل الخادوم. يمنع وجود عبارة سرّ Apache من قراءة ملفّ الشهادة وسنحتاج عند وجودها لإدخالها في كلّ مرة نعيد فيها تشغيل الخادوم.
	</li>
	<li>
		<code>days 365</code>: يحدّد هذا الخيار مدّة صلاحيّة الشهادة. اخترنا سنة.
	</li>
	<li>
		<code>newkey rsa:2048</code>: يخبر هذا الخيار الأمر <code>openssl</code> أننا نريد توليد شهادة ومفتاح جديد في نفس الوقت. بما أننا لم نولّد المفتاح المطلوب لتوقيع الشهادة في خطوة منفصلة فإننا نحتاج لإنشائه مع الشهادة. يحدّد الجزء <code>rsa:2048</code> نوعيّة المفتاح بـ RSA وطوله بـ 2048 بت.
	</li>
	<li>
		<code>keyout</code>: يحدّد المسار الذي نريد حفظ المفتاح الخاصّ فيه.
	</li>
	<li>
		<code>out</code>: يحدّد المسار الذي نريد حفظ الشهادة فيه.
	</li>
</ul>
<p>
	ستنشئ هذه الخيارات مفاتيح التعميّة والشهادة. يطلُب الأمر كما أسلفنا الإجابة على بضعة أسئلة كما في الصورة التالية.
</p>

<p style="text-align: center;">
	<img alt="01_openssl_selfseigned_key.png" class="ipsImage ipsImage_thumbnailed" data-fileid="23964" data-unique="tplfebsi2" src="https://academy.hsoub.com/uploads/monthly_2017_07/01_openssl_selfseigned_key.png.bf64000132448760115371c73608e1f0.png"></p>

<p>
	تتعلّق الأسئلة بمعلومات عامة من قبيل الدولة والمدينة والمؤسّسة والمنظَّمة المُصدِرة للشهادة إضافة إلى معلومات عن الخادوم.
</p>

<p>
	يتعلّق أهمّ الأسئلة المطروحة - السطر <code>Common Name</code> - بالخادوم. يجب أن تجيب باسم النطاق الذي يعمل عليه الخادوم أو - وهو الأكثر شيوعا - عنوان IP العمومي للخادوم.
</p>

<p>
	يبدو المحثّ Prompt على النحو التالي:
</p>

<pre class="ipsCode" id="ips_uid_7710_7">
<code class="hljs css"><span class="hljs-tag"><span class="typ">Country</span></span><span class="pln"> </span><span class="hljs-tag"><span class="typ">Name</span></span><span class="pln"> </span><span class="pun">(</span><span class="lit">2</span><span class="pln"> </span><span class="hljs-tag"><span class="pln">letter</span></span><span class="pln"> </span><span class="hljs-tag"><span class="pln">code</span></span><span class="pun">)</span><span class="pln"> </span><span class="hljs-attr_selector"><span class="pun">[</span><span class="pln">AU</span><span class="pun">]</span></span><span class="pun">:حرفان</span><span class="pln"> </span><span class="pun">يمثّلان</span><span class="pln"> </span><span class="pun">الدولة</span><span class="pln">
</span><span class="hljs-tag"><span class="typ">State</span></span><span class="pln"> </span><span class="hljs-tag"><span class="kwd">or</span></span><span class="pln"> </span><span class="hljs-tag"><span class="typ">Province</span></span><span class="pln"> </span><span class="hljs-tag"><span class="typ">Name</span></span><span class="pln"> </span><span class="pun">(</span><span class="hljs-tag"><span class="pln">full</span></span><span class="pln"> </span><span class="hljs-tag"><span class="pln">name</span></span><span class="pun">)</span><span class="pln"> </span><span class="hljs-attr_selector"><span class="pun">[</span><span class="typ">Some</span><span class="pun">-</span><span class="typ">State</span><span class="pun">]</span></span><span class="pun">:اسم</span><span class="pln"> </span><span class="pun">المنطقة</span><span class="pln"> </span><span class="pun">(المحافظة</span><span class="pln"> </span><span class="pun">أو</span><span class="pln"> </span><span class="pun">الولاية)</span><span class="pln">
</span><span class="hljs-tag"><span class="typ">Locality</span></span><span class="pln"> </span><span class="hljs-tag"><span class="typ">Name</span></span><span class="pln"> </span><span class="pun">(</span><span class="hljs-tag"><span class="pln">eg</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-tag"><span class="pln">city</span></span><span class="pun">)</span><span class="pln"> </span><span class="hljs-attr_selector"><span class="pun">[]</span></span><span class="pun">:اسم</span><span class="pln"> </span><span class="pun">المدينة</span><span class="pln">
</span><span class="hljs-tag"><span class="typ">Organization</span></span><span class="pln"> </span><span class="hljs-tag"><span class="typ">Name</span></span><span class="pln"> </span><span class="pun">(</span><span class="hljs-tag"><span class="pln">eg</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-tag"><span class="pln">company</span></span><span class="pun">)</span><span class="pln"> </span><span class="hljs-attr_selector"><span class="pun">[</span><span class="typ">Internet</span><span class="pln"> </span><span class="typ">Widgits</span><span class="pln"> </span><span class="typ">Pty</span><span class="pln"> </span><span class="typ">Ltd</span><span class="pun">]</span></span><span class="pun">:اسم</span><span class="pln"> </span><span class="pun">المنظَّمة</span><span class="pln"> </span><span class="pun">أو</span><span class="pln"> </span><span class="pun">الشركة</span><span class="pln">
</span><span class="hljs-tag"><span class="typ">Organizational</span></span><span class="pln"> </span><span class="hljs-tag"><span class="typ">Unit</span></span><span class="pln"> </span><span class="hljs-tag"><span class="typ">Name</span></span><span class="pln"> </span><span class="pun">(</span><span class="hljs-tag"><span class="pln">eg</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-tag"><span class="pln">section</span></span><span class="pun">)</span><span class="pln"> </span><span class="hljs-attr_selector"><span class="pun">[]</span></span><span class="pun">:اسم</span><span class="pln"> </span><span class="pun">الفرع</span><span class="pln">
</span><span class="hljs-tag"><span class="typ">Common</span></span><span class="pln"> </span><span class="hljs-tag"><span class="typ">Name</span></span><span class="pln"> </span><span class="pun">(</span><span class="hljs-tag"><span class="pln">e</span></span><span class="hljs-class"><span class="pun">.</span><span class="pln">g</span></span><span class="pun">.</span><span class="pln"> </span><span class="hljs-tag"><span class="pln">server</span></span><span class="pln"> </span><span class="hljs-tag"><span class="pln">FQDN</span></span><span class="pln"> </span><span class="hljs-tag"><span class="kwd">or</span></span><span class="pln"> </span><span class="hljs-tag"><span class="pln">YOUR</span></span><span class="pln"> </span><span class="hljs-tag"><span class="pln">name</span></span><span class="pun">)</span><span class="pln"> </span><span class="hljs-attr_selector"><span class="pun">[]</span></span><span class="pun">:عنوان</span><span class="pln"> </span><span class="pun">الخادوم</span><span class="pln">
</span><span class="hljs-tag"><span class="typ">Email</span></span><span class="pln"> </span><span class="hljs-tag"><span class="typ">Address</span></span><span class="pln"> </span><span class="hljs-attr_selector"><span class="pun">[]</span></span><span class="pun">:بريد</span><span class="pln"> </span><span class="pun">المسؤول</span></code></pre>

<p>
	سيوضع الملفان المنشآن في مجلّدات فرعيّة من المجلّد <code>etc/ <abbr title="Secure Socket Layer | طبقة المنافذ الآمنة">ssl</abbr>/</code> حسب ماهو محدَّد في الأمر.<br>
	سنحتاج أيضًا - ما دمنا نتحدَّث عن OpenSSL - إلى إنشاء مجموعة Diffie-Hellman قويّة لتُستخدَم عندما يُناقش الخادوم طريقة نقل البيانات مع العملاء (خطوة من خطوات عدّة ضمن تقنيّة <abbr title="Secure Socket Layer | طبقة المنافذ الآمنة">SSL</abbr>/<abbr title="Transport Layer Security | بروتوكول أمن طبقة النقل">TLS</abbr> لتأمين نقل البيانات). ينشئ اﻷمر التالي المطلوب:
</p>

<pre class="ipsCode" id="ips_uid_7710_7">
<code class="hljs avrasm"><span class="pln">sudo openssl dhparam </span><span class="pun">-</span><span class="hljs-keyword"><span class="kwd">out</span></span><span class="pln"> </span><span class="pun">/</span><span class="pln">etc</span><span class="pun">/</span><span class="pln"><abbr title="Secure Socket Layer | طبقة المنافذ الآمنة">ssl</abbr></span><span class="pun">/</span><span class="pln">certs</span><span class="pun">/</span><span class="pln">dhparam</span><span class="hljs-preprocessor"><span class="pun">.</span><span class="pln">pem</span></span><span class="pln"> </span><span class="hljs-number"><span class="lit">2048</span></span></code></pre>

<p>
	يمكن أن يستغرق الأمر بضعة دقائق، نحصُل بعدها على مجموعة Diffie-Hellman مناسبة (على المسار <code>etc/<abbr title="Secure Socket Layer | طبقة المنافذ الآمنة">ssl</abbr>/certs/dhparam.pem/</code>) لاستعمالها في إعداداتنا.
</p>

<h2 id="الخطوة-الثانية-إعداد-apache-لاستخدام-ssl">
	الخطوة الثانية: إعداد Apache لاستخدام <abbr title="Secure Socket Layer | طبقة المنافذ الآمنة">SSL</abbr>
</h2>

<p>
	أنشأنا في الخطوة السابقة ملفّيْ الشهادة والمفتاح الخاصّ. نحتاج الآن لضبط Apache للاستفادة من هذيْن الملفّيْن.<br>
	سنعدّل بضعة إعدادات:
</p>

<ol>
<li>
		سننشئ مقطعا جديدًا في إعدادات Apache لتحديد خيارات إعداد مبدئيّة آمنة لـ <abbr title="Secure Socket Layer | طبقة المنافذ الآمنة">SSL</abbr>.
	</li>
	<li>
		سنعدّل المضيف الافتراضي Virtual host الخاص بـ <abbr title="Secure Socket Layer | طبقة المنافذ الآمنة">SSL</abbr> للإشارة إلى شهادة <abbr title="Secure Socket Layer | طبقة المنافذ الآمنة">SSL</abbr> التي أنشأناها في الخطوة السابقة.
	</li>
	<li>
		سنعدّل المضيف الافتراضي غير المُعمَّى ليعيد توجيه جميع الطلبات إلى المضيف الافتراضي المُعمَّى (الخاص بـ <abbr title="Secure Socket Layer | طبقة المنافذ الآمنة">SSL</abbr>). يُنصَح بهذا الإجراء لجعل جميع الاتصالات القادمة إلى الموقع آمنة (تمرّ عبر شهادة <abbr title="Secure Socket Layer | طبقة المنافذ الآمنة">SSL</abbr>).
	</li>
</ol>
<p>
	يجدر بالإعدادات التي سنحصُل عليها بعد تنفيذ النقاط المُشار إليها أعلاه أن تكون آمنة.
</p>

<h3 id="تحديد-خيارات-إعداد-مبدئية-آمنة-في-apache">
	تحديد خيارات إعداد مبدئيّة آمنة في Apache
</h3>

<p>
	سننشئ أولا ملفّ إعداد جديدًا في Apache نعرّف فيه بعض إعدادات <abbr title="Secure Socket Layer | طبقة المنافذ الآمنة">SSL</abbr>. سنضبُط Apache للعمل بخوارزميّات تعميّة فعّالة ونفعّل بعض الميزات المتقدّمة لمساعدتنا في إبقاء خادومنا آمنا. سيُمكن لأيّ مضيف افتراضي يفعّل <abbr title="Secure Socket Layer | طبقة المنافذ الآمنة">SSL</abbr>.
</p>

<p>
	أنشئ ملفّ إعداد جديد ضمن المجلَّد <code>etc/apache2/conf-available/</code> (مجلَّد إعدادات Apache). سنسمّي هذا الملف بـ<code><abbr title="Secure Socket Layer | طبقة المنافذ الآمنة">ssl</abbr>-params.conf</code> حتى يكون واضحًا أنه يتعلّق بمعطيات Parameters إعداد <abbr title="Secure Socket Layer | طبقة المنافذ الآمنة">SSL</abbr>.
</p>

<pre class="ipsCode" id="ips_uid_7710_7">
<code class="hljs lasso"><span class="pln">sudo nano </span><span class="pun">/</span><span class="pln">etc</span><span class="pun">/</span><span class="pln">apache2</span><span class="pun">/</span><span class="pln">conf</span><span class="hljs-attribute"><span class="pun">-</span><span class="pln">available</span></span><span class="pun">/</span><span class="pln"><abbr title="Secure Socket Layer | طبقة المنافذ الآمنة">ssl</abbr></span><span class="hljs-attribute"><span class="pun">-</span><span class="kwd">params</span></span><span class="hljs-built_in"><span class="pun">.</span></span><span class="pln">conf</span></code></pre>

<p>
	سنعتمد لضبط إعدادات Apache بطريقة آمنة على توصيّات <a href="https://raymii.org/s/static/About.html" rel="external nofollow">Remy van Elst</a> من موقع <a href="https://cipherli.st/" rel="external nofollow">Cipherli.st</a>. جُهِّز هذا الموقع لتوفير إعدادات تعميّة جاهزة للاستعمال في أكثر البرمجيّات شيوعًا على الخواديم.
</p>

<p>
	<strong>ملحوظة</strong><br>
	توفّر الإعدادات المُقترَحة مبدئيًّا في الموقع أعلاه درجة أمان عاليّة. يمكن أن تأتي هذه الدرجة من الأمان على حساب التوافق مع البرامج العميلة (المتصفّحات أو أنظمة التشغيل القديمة). إن أردت دعم إصدارات قديمة من هذه البرامج فإن الموقع يوفّر إعدادات بديلة للإعدادات المبدئيّة، يمكنك الحصول عليها بالنقر على الرابط “Yes, give me a ciphersuite that works with legacy / old software” وستلاحظ أن الإعدادات تبدّلت.<br>
	يعتمد الخيار بين النسخة المبدئية من الإعدادات والنسخة البديلة على نوعيّة العملاء التي تريد دعمها. توفّر النسختان أمانًا جيّدًا.
</p>

<p>
	سننسخ - لأغراض هذا الدرس - الإعدادات المقترحة، مع إجراء تعديليْن عليها.
</p>

<p>
	سنعدّل التعليمة <code>SSLOpenSSLConfCmd DHParameters</code> لتشير إلى ملف Diffie-Hellman الذي أنشأناه في الخطوة الأولى. سنعدّل أيضًا تعليمات الترويسة لتغيير عمل الخاصيّة <code>Strict-Transport-Security</code> وذلك بحذف التعليمة <code>preload</code>. توفّر هذه الخاصيّة أمانًا عاليَّا جدًّا إلا أنها يمكن إن فُعِّلت بدون وعي أو بطريقة غير صحيحة - خصوصًا عند استخدام الميزة <code>preload</code> - أن تؤدّي إلى اختلالات كبيرة في عمل الخادوم. تأكّد عندما تفعِّل هذه الميزة أنك تدرك جيّدًا ما تفعله.
</p>

<pre class="ipsCode" id="ips_uid_7710_7">
<code class="hljs vala"><span class="hljs-preprocessor"><span class="com"># from https://cipherli.st/</span></span><span class="pln">
</span><span class="hljs-preprocessor"><span class="com"># and https://raymii.org/s/tutorials/Strong_SSL_Security_On_Apache2.html</span></span><span class="pln">

</span><span class="typ">SSLCipherSuite</span><span class="pln"> EECDH</span><span class="pun">+</span><span class="pln">AESGCM</span><span class="pun">:</span><span class="pln">EDH</span><span class="pun">+</span><span class="pln">AESGCM</span><span class="pun">:</span><span class="pln">AES256</span><span class="pun">+</span><span class="pln">EECDH</span><span class="pun">:</span><span class="pln">AES256</span><span class="pun">+</span><span class="pln">EDH
</span><span class="typ">SSLProtocol</span><span class="pln"> </span><span class="typ">All</span><span class="pln"> </span><span class="pun">-</span><span class="typ">SSLv2</span><span class="pln"> </span><span class="pun">-</span><span class="typ">SSLv3</span><span class="pln">
</span><span class="typ">SSLHonorCipherOrder</span><span class="pln"> </span><span class="typ">On</span><span class="pln">
</span><span class="hljs-preprocessor"><span class="com"># تعطيل التعليمة preload في الخاصيّة Strict-Transport-Security</span></span><span class="pln">
</span><span class="hljs-preprocessor"><span class="com"># يمكنك إن أردت تفعيل هذه الخاصية وذلك بنزع علامة التعليق # من بداية السطر</span></span><span class="pln">
</span><span class="hljs-preprocessor"><span class="com">#Header always set Strict-Transport-Security "max-age=63072000; includeSubdomains; preload"</span></span><span class="pln">
</span><span class="hljs-preprocessor"><span class="com"># نفس التعليمة السابقة ولكن دون preload</span></span><span class="pln">
</span><span class="typ">Header</span><span class="pln"> always </span><span class="hljs-keyword"><span class="kwd">set</span></span><span class="pln"> </span><span class="typ">Strict</span><span class="pun">-</span><span class="typ">Transport</span><span class="pun">-</span><span class="typ">Security</span><span class="pln"> </span><span class="hljs-string"><span class="str">"max-age=63072000; includeSubdomains"</span></span><span class="pln">
</span><span class="typ">Header</span><span class="pln"> always </span><span class="hljs-keyword"><span class="kwd">set</span></span><span class="pln"> X</span><span class="pun">-</span><span class="typ">Frame</span><span class="pun">-</span><span class="typ">Options</span><span class="pln"> DENY
</span><span class="typ">Header</span><span class="pln"> always </span><span class="hljs-keyword"><span class="kwd">set</span></span><span class="pln"> X</span><span class="pun">-</span><span class="typ">Content</span><span class="pun">-</span><span class="typ">Type</span><span class="pun">-</span><span class="typ">Options</span><span class="pln"> nosniff
</span><span class="hljs-preprocessor"><span class="com"># Requires Apache &gt;= 2.4</span></span><span class="pln">
</span><span class="typ">SSLCompression</span><span class="pln"> off 
</span><span class="typ">SSLSessionTickets</span><span class="pln"> </span><span class="typ">Off</span><span class="pln">
</span><span class="typ">SSLUseStapling</span><span class="pln"> on 
</span><span class="typ">SSLStaplingCache</span><span class="pln"> </span><span class="hljs-string"><span class="str">"shmcb:logs/stapling-cache(150000)"</span></span><span class="pln">
</span><span class="hljs-preprocessor"><span class="com"># أضفنا هنا المسار إلى ملفّ Diffie-Hellman</span></span><span class="pln">
</span><span class="typ">SSLOpenSSLConfCmd</span><span class="pln"> </span><span class="typ">DHParameters</span><span class="pln"> </span><span class="hljs-string"><span class="str">"/etc/<abbr title="Secure Socket Layer | طبقة المنافذ الآمنة">ssl</abbr>/certs/dhparam.pem"</span></span></code></pre>

<p>
	احفظ الملفّ ثم أغلقه عندما تكون جاهزا لذلك.
</p>

<h3 id="تعديل-ملف-مضيف-ssl-الافتراضي-المبدئي">
	تعديل ملف مضيف <abbr title="Secure Socket Layer | طبقة المنافذ الآمنة">SSL</abbr> الافتراضي المبدئي
</h3>

<p>
	ننتقل الآن إلى الملف المبدئي Default لمضيف <abbr title="Secure Socket Layer | طبقة المنافذ الآمنة">SSL</abbr> الافتراضي الموجود على المسار <code>etc/apache2/sites-available/default-<abbr title="Secure Socket Layer | طبقة المنافذ الآمنة">ssl</abbr>.conf/</code>. إن كنت تستخدم مضيفا اقتراضيًّا آخر فأبدله بالمضيف الافتراضي المبدئي في الأمر أدناه.
</p>

<p>
	نأخذ أولًا نسخة احتياطية من الملف:
</p>

<pre class="ipsCode" id="ips_uid_7710_7">
<code class="hljs avrasm"><span class="pln">sudo </span><span class="hljs-keyword"><span class="pln">cp</span></span><span class="pln"> </span><span class="pun">/</span><span class="pln">etc</span><span class="pun">/</span><span class="pln">apache2</span><span class="pun">/</span><span class="pln">sites</span><span class="pun">-</span><span class="pln">available</span><span class="pun">/</span><span class="kwd">default</span><span class="pun">-</span><span class="pln"><abbr title="Secure Socket Layer | طبقة المنافذ الآمنة">ssl</abbr></span><span class="hljs-preprocessor"><span class="pun">.</span><span class="pln">conf</span></span><span class="pln"> </span><span class="pun">/</span><span class="pln">etc</span><span class="pun">/</span><span class="pln">apache2</span><span class="pun">/</span><span class="pln">sites</span><span class="pun">-</span><span class="pln">available</span><span class="pun">/</span><span class="kwd">default</span><span class="pun">-</span><span class="pln"><abbr title="Secure Socket Layer | طبقة المنافذ الآمنة">ssl</abbr></span><span class="hljs-preprocessor"><span class="pun">.</span><span class="pln">conf</span></span><span class="hljs-preprocessor"><span class="pun">.</span><span class="pln">bak</span></span></code></pre>

<p>
	ثم نفتح ملف المضيف الافتراضي لتحريره:
</p>

<pre class="ipsCode" id="ips_uid_7710_7">
<code class="hljs haskell"><span class="hljs-title"><span class="pln">sudo</span></span><span class="pln"> nano </span><span class="pun">/</span><span class="pln">etc</span><span class="pun">/</span><span class="pln">apache2</span><span class="pun">/</span><span class="pln">sites</span><span class="pun">-</span><span class="pln">available</span><span class="pun">/</span><span class="hljs-default"><span class="hljs-keyword"><span class="kwd">default</span></span><span class="pun">-</span><span class="pln"><abbr title="Secure Socket Layer | طبقة المنافذ الآمنة">ssl</abbr></span><span class="pun">.</span><span class="pln">conf</span></span></code></pre>

<p>
	يبدو محتوى الملف، بعد نزع أغلب التعليقات، على النحو التالي:
</p>

<pre class="ipsCode" id="ips_uid_7710_7">
<code class="hljs apache"><span class="hljs-tag"><span class="tag">&lt;IfModule</span><span class="pln"> </span><span class="atn">mod_ssl</span><span class="pln">.</span><span class="atn">c</span><span class="tag">&gt;</span></span><span class="pln">
        </span><span class="hljs-tag"><span class="tag">&lt;VirtualHost</span><span class="pln"> _</span><span class="atn">default_:443</span><span class="tag">&gt;</span></span><span class="pln">
                </span><span class="hljs-keyword"><span class="pln">ServerAdmin</span></span><span class="pln"> webmaster@localhost

                </span><span class="hljs-keyword"><span class="hljs-common"><span class="pln">DocumentRoot</span></span></span><span class="pln"> /var/www/html

                </span><span class="hljs-keyword"><span class="pln">ErrorLog</span></span><span class="pln"> </span><span class="hljs-cbracket"><span class="pln">${APACHE_LOG_DIR}</span></span><span class="pln">/error.log
                </span><span class="hljs-keyword"><span class="pln">CustomLog</span></span><span class="pln"> </span><span class="hljs-cbracket"><span class="pln">${APACHE_LOG_DIR}</span></span><span class="pln">/access.log combined

                </span><span class="hljs-keyword"><span class="pln">SSLEngine</span></span><span class="pln"> </span><span class="hljs-literal"><span class="pln">on</span></span><span class="pln">

                </span><span class="hljs-keyword"><span class="pln">SSLCertificateFile</span></span><span class="pln">      /etc/<abbr title="Secure Socket Layer | طبقة المنافذ الآمنة">ssl</abbr>/certs/<abbr title="Secure Socket Layer | طبقة المنافذ الآمنة">ssl</abbr>-cert-snakeoil.pem
                </span><span class="hljs-keyword"><span class="pln">SSLCertificateKeyFile</span></span><span class="pln"> /etc/<abbr title="Secure Socket Layer | طبقة المنافذ الآمنة">ssl</abbr>/private/<abbr title="Secure Socket Layer | طبقة المنافذ الآمنة">ssl</abbr>-cert-snakeoil.key

                </span><span class="hljs-tag"><span class="tag">&lt;FilesMatch</span><span class="pln"> </span><span class="atv">"\.(cgi|shtml|phtml|php)$"</span><span class="tag">&gt;</span></span><span class="pln">
                                </span><span class="hljs-keyword"><span class="pln">SSLOptions</span></span><span class="pln"> +StdEnvVars
                </span><span class="hljs-tag"><span class="tag">&lt;/FilesMatch&gt;</span></span><span class="pln">
                </span><span class="hljs-tag"><span class="tag">&lt;Directory</span><span class="pln"> </span><span class="pun">/</span><span class="atn">usr</span><span class="pun">/</span><span class="atn">lib</span><span class="pun">/</span><span class="atn">cgi-bin</span><span class="tag">&gt;</span></span><span class="pln">
                                </span><span class="hljs-keyword"><span class="pln">SSLOptions</span></span><span class="pln"> +StdEnvVars
                </span><span class="hljs-tag"><span class="tag">&lt;/Directory&gt;</span></span><span class="pln">

                </span><span class="hljs-comment"><span class="pln"># BrowserMatch "MSIE [2-6]" \</span></span><span class="pln">
                </span><span class="hljs-comment"><span class="pln">#               nokeepalive <abbr title="Secure Socket Layer | طبقة المنافذ الآمنة">ssl</abbr>-unclean-shutdown \</span></span><span class="pln">
                </span><span class="hljs-comment"><span class="pln">#               downgrade-1.0 force-response-1.0</span></span><span class="pln">

        </span><span class="hljs-tag"><span class="tag">&lt;/VirtualHost&gt;</span></span><span class="pln">
</span><span class="hljs-tag"><span class="tag">&lt;/IfModule&gt;</span></span></code></pre>

<p>
	سنعدّل قليلا على الملف بإعداد تعليمات بريد مدير الخادوم، عنوان، اسم الخادوم… إلخ. كما سنعدّل تعليمة <abbr title="Secure Socket Layer | طبقة المنافذ الآمنة">SSL</abbr> لتشير إلى مسار ملفّيْ الشهادة والمفاتيح. نختُم بنزع التعليق عن خيار يوفّر الدعم للمتصفّحات القديمة لتفعيله.
</p>

<p>
	يبدو الملف بعد التعديلات كالتالي:
</p>

<pre class="ipsCode" id="ips_uid_7710_7">
<code class="hljs apache"><span class="hljs-tag"><span class="tag">&lt;IfModule</span><span class="pln"> </span><span class="atn">mod_ssl</span><span class="pln">.</span><span class="atn">c</span><span class="tag">&gt;</span></span><span class="pln">
        </span><span class="hljs-tag"><span class="tag">&lt;VirtualHost</span><span class="pln"> _</span><span class="atn">default_:443</span><span class="tag">&gt;</span></span><span class="pln">
                </span><span class="hljs-comment"><span class="pln"># بريد مدير الخادوم</span></span><span class="pln">
                </span><span class="hljs-keyword"><span class="pln">ServerAdmin</span></span><span class="pln"> your_email@example.com
                </span><span class="hljs-comment"><span class="pln"># نطاق الخادوم أو عنوان IP الخاص به</span></span><span class="pln">
                </span><span class="hljs-keyword"><span class="hljs-common"><span class="pln">ServerName</span></span></span><span class="pln"> server_domain_or_IP

                </span><span class="hljs-keyword"><span class="hljs-common"><span class="pln">DocumentRoot</span></span></span><span class="pln"> /var/www/html

                </span><span class="hljs-keyword"><span class="pln">ErrorLog</span></span><span class="pln"> </span><span class="hljs-cbracket"><span class="pln">${APACHE_LOG_DIR}</span></span><span class="pln">/error.log
                </span><span class="hljs-keyword"><span class="pln">CustomLog</span></span><span class="pln"> </span><span class="hljs-cbracket"><span class="pln">${APACHE_LOG_DIR}</span></span><span class="pln">/access.log combined

                </span><span class="hljs-keyword"><span class="pln">SSLEngine</span></span><span class="pln"> </span><span class="hljs-literal"><span class="pln">on</span></span><span class="pln">

                </span><span class="hljs-keyword"><span class="pln">SSLCertificateFile</span></span><span class="pln">      /etc/<abbr title="Secure Socket Layer | طبقة المنافذ الآمنة">ssl</abbr>/certs/apache-selfsigned.crt
                </span><span class="hljs-keyword"><span class="pln">SSLCertificateKeyFile</span></span><span class="pln"> /etc/<abbr title="Secure Socket Layer | طبقة المنافذ الآمنة">ssl</abbr>/private/apache-selfsigned.key

                </span><span class="hljs-tag"><span class="tag">&lt;FilesMatch</span><span class="pln"> </span><span class="atv">"\.(cgi|shtml|phtml|php)$"</span><span class="tag">&gt;</span></span><span class="pln">
                                </span><span class="hljs-keyword"><span class="pln">SSLOptions</span></span><span class="pln"> +StdEnvVars
                </span><span class="hljs-tag"><span class="tag">&lt;/FilesMatch&gt;</span></span><span class="pln">
                </span><span class="hljs-tag"><span class="tag">&lt;Directory</span><span class="pln"> </span><span class="pun">/</span><span class="atn">usr</span><span class="pun">/</span><span class="atn">lib</span><span class="pun">/</span><span class="atn">cgi-bin</span><span class="tag">&gt;</span></span><span class="pln">
                                </span><span class="hljs-keyword"><span class="pln">SSLOptions</span></span><span class="pln"> +StdEnvVars
                </span><span class="hljs-tag"><span class="tag">&lt;/Directory&gt;</span></span><span class="pln">
                </span><span class="hljs-comment"><span class="pln"># دعم المتصفحات القديمة</span></span><span class="pln">
                </span><span class="hljs-keyword"><span class="pln">BrowserMatch</span></span><span class="pln"> </span><span class="hljs-string"><span class="pln">"MSIE [2-6]"</span></span><span class="pln"> \
                               </span><span class="hljs-keyword"><span class="pln">nokeepalive</span></span><span class="pln"> <abbr title="Secure Socket Layer | طبقة المنافذ الآمنة">ssl</abbr>-unclean-shutdown \
                               </span><span class="hljs-keyword"><span class="pln">downgrade</span></span><span class="pln">-1.0 force-response-1.0

        </span><span class="hljs-tag"><span class="tag">&lt;/VirtualHost&gt;</span></span><span class="pln">
</span><span class="hljs-tag"><span class="tag">&lt;/IfModule&gt;</span></span></code></pre>

<p>
	احفظ الملف ثم أغلقه.
</p>

<h3 id="إعادة-توجيه-طلبات-http-غير-المعماة-إلى-https">
	إعادة توجيه طلبات HTTP (غير المُعمَّاة) إلى HTTPS
</h3>

<p>
	يجيب الخادوم بإعداداته الحاليّة على الطلبات الآمنة (HTTPS) وغير الآمنة (HTTP) على حدّ السواء. يُنصَح في أغلب الحالات من أجل أمان أعلى أن تُوجَّه طلبات HTTP تلقائيَّا إلى HTTPS.
</p>

<p>
	نفتح ملف المضيف الافتراضي - أو المضيف الذي تريده - لتحريره:
</p>

<pre class="ipsCode" id="ips_uid_7710_7">
<code class="hljs haskell"><span class="hljs-title"><span class="pln">sudo</span></span><span class="pln"> nano </span><span class="pun">/</span><span class="pln">etc</span><span class="pun">/</span><span class="pln">apache2</span><span class="pun">/</span><span class="pln">sites</span><span class="pun">-</span><span class="pln">available</span><span class="pun">/</span><span class="hljs-number"><span class="lit">000</span></span><span class="pun">-</span><span class="hljs-default"><span class="hljs-keyword"><span class="kwd">default</span></span><span class="pun">.</span><span class="pln">conf</span></span></code></pre>

<p>
	كلّ ما نحتاجه هو إضافة تعليمة إعادة إعادة التوجيه <code>Redirect</code> داخل إعداد الوسم <code>VirtualHost</code> والإشارة إلى النسخة الآمنة من الموقع (<code>https</code>):
</p>

<pre class="ipsCode" id="ips_uid_7710_7">
<code class="hljs bash"><span class="tag">&lt;VirtualHost</span><span class="pln"> *:</span><span class="hljs-number"><span class="pln">80</span></span><span class="tag">&gt;</span><span class="pln">
        . . .

        Redirect </span><span class="hljs-string"><span class="pln">"/"</span></span><span class="pln"> </span><span class="hljs-string"><span class="pln">"https://your_domain_or_IP/"</span></span><span class="pln">

        . . .
</span><span class="tag">&lt;/VirtualHost&gt;</span></code></pre>

<p>
	احفظ الملف ثم أغلقه.
</p>

<h2 id="الخطوة-الثالثة-تعديل-الجدار-الناري">
	الخطوة الثالثة: تعديل الجدار الناري
</h2>

<p>
	إن كان جدار <code>ufw</code> الناري مفعّلًا، وهو ما توصي به الدروس المُشار إليها في المتطلّبات، فقد تحتاج لتعديل إعداداتِه من أجل السماح للبيانات المُؤَمَّنة (عبر <abbr title="Secure Socket Layer | طبقة المنافذ الآمنة">SSL</abbr>).
</p>

<p>
	يُسجّل Apache أثناء تثبيته مجموعات من المعلومات المختصرة Profiles لدى جدار <code>ufw</code> الناري. يمكننا عرض المجموعات المتوفّرة بالأمر التالي:
</p>

<pre class="ipsCode" id="ips_uid_7710_7">
<code class="hljs bash"><span class="hljs-built_in"><span class="pln">sudo</span></span><span class="pln"> ufw app list</span></code></pre>

<p>
	تظهر مُخرجات الأمر :
</p>

<pre class="ipsCode" id="ips_uid_7710_7">
<code class="hljs mathematica"><span class="typ">Available</span><span class="pln"> applications</span><span class="pun">:</span><span class="pln">
  </span><span class="typ">Apache</span><span class="pln">
  </span><span class="typ">Apache</span><span class="pln"> </span><span class="hljs-keyword"><span class="typ">Full</span></span><span class="pln">
  </span><span class="typ">Apache</span><span class="pln"> </span><span class="typ">Secure</span><span class="pln">
  </span><span class="typ">OpenSSH</span></code></pre>

<p>
	يمكنك عرض الإعداد الحالي بالأمر
</p>

<pre class="ipsCode" id="ips_uid_7710_7">
<code class="hljs bash"><span class="hljs-built_in"><span class="pln">sudo</span></span><span class="pln"> ufw status</span></code></pre>

<p>
	إن كان إعدادك الحالي يسمح لطلبات HTTP فقط فستبدو إعداداتك كالتالي”
</p>

<pre class="ipsCode" id="ips_uid_7710_7">
<code class="hljs http"><span class="hljs-attribute"><span class="typ">Status</span></span><span class="pun">:</span><span class="pln"> </span><span class="hljs-string"><span class="pln">active</span></span><span class="pln">

</span><span class="erlang"><span class="hljs-variable"><span class="typ">To</span></span><span class="pln">                         </span><span class="hljs-variable"><span class="typ">Action</span></span><span class="pln">      </span><span class="hljs-variable"><span class="typ">From</span></span><span class="pln">
</span><span class="hljs-pp"><span class="pun">--</span><span class="pln">                         </span><span class="pun">------</span><span class="pln">      </span><span class="pun">----</span><span class="pln">
</span><span class="typ">OpenSSH</span><span class="pln">                    ALLOW       </span><span class="typ">Anywhere</span><span class="pln">
</span><span class="typ">Apache</span><span class="pln">                     ALLOW       </span><span class="typ">Anywhere</span><span class="pln">
</span><span class="typ">OpenSSH</span><span class="pln"> </span><span class="hljs-params"><span class="pun">(</span><span class="pln">v6</span><span class="pun">)</span></span><span class="pln">               ALLOW       </span><span class="typ">Anywhere</span><span class="pln"> </span><span class="hljs-params"><span class="pun">(</span><span class="pln">v6</span><span class="pun">)</span></span><span class="pln">
</span><span class="typ">Apache</span><span class="pln"> </span><span class="hljs-params"><span class="pun">(</span><span class="pln">v6</span><span class="pun">)</span></span><span class="pln">                ALLOW       </span><span class="typ">Anywhere</span><span class="pln"> </span><span class="hljs-params"><span class="pun">(</span><span class="pln">v6</span><span class="pun">)</span></span></span></span></code></pre>

<p>
	يمكننا تفعيل المجموعة <code>Apache Full</code> للسماح لطلبات HTTPS وHTTP معًا، ثم حذف المجموعة <code>Apache</code> لأننا لم نعد بحاجة إليها، فهي متَضَمَّنة في المجموعة <code>Apache Full</code> :
</p>

<pre class="ipsCode" id="ips_uid_7710_7">
<code class="hljs bash"><span class="hljs-built_in"><span class="pln">sudo</span></span><span class="pln"> ufw allow </span><span class="hljs-string"><span class="str">'Apache Full'</span></span><span class="pln">
</span><span class="hljs-built_in"><span class="pln">sudo</span></span><span class="pln"> ufw </span><span class="kwd">delete</span><span class="pln"> allow </span><span class="hljs-string"><span class="str">'Apache'</span></span></code></pre>

<p>
	<strong>ملحوظة:</strong> يمكنك استخدام الأمر <code>sudo ufw app info PROFILE</code> حيث <code>PROFILE</code> اسم مجموعة المعلومات لمعرفة المنافذ Ports والبروتوكولات التي تسمح المجموعة للطلبات بالمرور عبرها.
</p>

<p>
	يجب أن تبدو حالة الجدار الناري الآن على النحو التالي:
</p>

<pre class="ipsCode" id="ips_uid_7710_7">
<code class="hljs bash"><span class="hljs-built_in"><span class="pln">sudo</span></span><span class="pln"> ufw status</span></code></pre>

<p>
	المخرجات:
</p>

<pre class="ipsCode" id="ips_uid_7710_7">
<code class="hljs http"><span class="hljs-attribute"><span class="typ">Status</span></span><span class="pun">:</span><span class="pln"> </span><span class="hljs-string"><span class="pln">active</span></span><span class="pln">

</span><span class="erlang"><span class="hljs-variable"><span class="typ">To</span></span><span class="pln">                         </span><span class="hljs-variable"><span class="typ">Action</span></span><span class="pln">      </span><span class="hljs-variable"><span class="typ">From</span></span><span class="pln">
</span><span class="hljs-pp"><span class="pun">--</span><span class="pln">                         </span><span class="pun">------</span><span class="pln">      </span><span class="pun">----</span><span class="pln">
</span><span class="typ">OpenSSH</span><span class="pln">                    ALLOW       </span><span class="typ">Anywhere</span><span class="pln">
</span><span class="typ">Apache</span><span class="pln"> </span><span class="typ">Full</span><span class="pln">                ALLOW       </span><span class="typ">Anywhere</span><span class="pln">
</span><span class="typ">OpenSSH</span><span class="pln"> </span><span class="hljs-params"><span class="pun">(</span><span class="pln">v6</span><span class="pun">)</span></span><span class="pln">               ALLOW       </span><span class="typ">Anywhere</span><span class="pln"> </span><span class="hljs-params"><span class="pun">(</span><span class="pln">v6</span><span class="pun">)</span></span><span class="pln">
</span><span class="typ">Apache</span><span class="pln"> </span><span class="typ">Full</span><span class="pln"> </span><span class="hljs-params"><span class="pun">(</span><span class="pln">v6</span><span class="pun">)</span></span><span class="pln">           ALLOW       </span><span class="typ">Anywhere</span><span class="pln"> </span><span class="hljs-params"><span class="pun">(</span><span class="pln">v6</span><span class="pun">)</span></span></span></span></code></pre>

<h2 id="الخطوة-الرابعة-اعتماد-التغييرات-في-apache">
	الخطوة الرابعة: اعتماد التغييرات في Apache
</h2>

<p>
	نحن جاهزون الآن، بعد أن عدّلنا الإعدادات، لتفعيل وحدات Modules الترويسات Headers وSSL في Apache، وتفعيل المضيف الافتراضي الجاهز لاستخدام <abbr title="Secure Socket Layer | طبقة المنافذ الآمنة">SSL</abbr> ثم إعادة تشغيل Apache.
</p>

<p>
	يفعّل الأمران التاليّان على التوالي <code>mod_ssl</code> (وحدة <abbr title="Secure Socket Layer | طبقة المنافذ الآمنة">SSL</abbr> في Apache) و<code>mod_headers</code> (وحدة الترويسات) اللتين تحتاجهما إعداداتنا للعمل:
</p>

<pre class="ipsCode" id="ips_uid_7710_7">
<code class="hljs bash"><span class="hljs-built_in"><span class="pln">sudo</span></span><span class="pln"> a2enmod <abbr title="Secure Socket Layer | طبقة المنافذ الآمنة">ssl</abbr>
</span><span class="hljs-built_in"><span class="pln">sudo</span></span><span class="pln"> a2enmod headers</span></code></pre>

<p>
	ثم نفعّل المضيف الافتراضي (ضع اسم المضيف مكان <code>default-<abbr title="Secure Socket Layer | طبقة المنافذ الآمنة">ssl</abbr></code> إن كنت تستخدم مضيفًا غير المضيف المبدئي):
</p>

<pre class="ipsCode" id="ips_uid_7710_7">
<code class="hljs haskell"><span class="hljs-title"><span class="pln">sudo</span></span><span class="pln"> a2ensite </span><span class="hljs-default"><span class="hljs-keyword"><span class="kwd">default</span></span><span class="pun">-</span><span class="pln"><abbr title="Secure Socket Layer | طبقة المنافذ الآمنة">ssl</abbr></span></span></code></pre>

<p>
	نحتاج أيضًا لتفعيل ملفّ الإعداد <code><abbr title="Secure Socket Layer | طبقة المنافذ الآمنة">ssl</abbr>-params</code> الذي أنشأناه سابقا:
</p>

<pre class="ipsCode" id="ips_uid_7710_7">
<code class="hljs bash"><span class="hljs-built_in"><span class="pln">sudo</span></span><span class="pln"> a2enconf <abbr title="Secure Socket Layer | طبقة المنافذ الآمنة">ssl</abbr></span><span class="pun">-</span><span class="kwd">params</span></code></pre>

<p>
	يجدر بالوحدات المطلوبة أن تكون الآن مفعَّلة وجاهزة للعمل، بقي لنا فقط اعتماد التغييرات. لكن قبل ذلك سنتأكّد من أنه لا توجد أخطاء صياغة في الملفات التي أعددناها وذلك بتنفيذ الأمر التالي:
</p>

<pre class="ipsCode" id="ips_uid_7710_7">
<code class="hljs bash"><span class="hljs-built_in"><span class="pln">sudo</span></span><span class="pln"> apache2ctl configtest</span></code></pre>

<p>
	إن جرى كلّ شيء على ما يُرام فستظهر رسالة تشبه ما يلي:
</p>

<pre class="ipsCode" id="ips_uid_7710_7">
<code class="hljs applescript"><span class="pln">AH00558</span><span class="pun">:</span><span class="pln"> apache2</span><span class="pun">:</span><span class="pln"> </span><span class="typ">Could</span><span class="pln"> </span><span class="hljs-keyword"><span class="kwd">not</span></span><span class="pln"> reliably determine </span><span class="hljs-keyword"><span class="pln">the</span></span><span class="pln"> server</span><span class="str">'s fully qualified domain </span><span class="hljs-property"><span class="str">name</span></span><span class="str">, using </span><span class="hljs-number"><span class="str">127.0</span></span><span class="hljs-number"><span class="str">.1</span></span><span class="hljs-number"><span class="str">.1</span></span><span class="str">. Set </span><span class="hljs-keyword"><span class="str">the</span></span><span class="str"> '</span><span class="typ">ServerName</span><span class="str">' directive globally </span><span class="hljs-keyword"><span class="str">to</span></span><span class="str"> suppress this message
Syntax OK</span></code></pre>

<p>
	السطر الأول ليس سوى رسالة تفيد بأنّ التعليمة <code>ServerName</code> غير مضبوطة لتعمل على كامل الخادوم (مثلا مضبوطة في المضيفات الافتراضية فقط). يمكنك التخلّص من هذه الرسالة - إن أردت - بضبط قيمة التعليمة <code>ServerName</code> على نطاق الخادوم أو عنوان IP الخاصّ به في ملف الإعدادات العام <code>etc/apache2/apache2.conf/</code>. هذا الإعداد اختياري، فالرسالة لا تتسبّب في أي خلل.
</p>

<p>
	تظهر في السطر الثاني نتيجة التحقّق من الصياغة <code>Syntax OK</code> وتفيد بأنه لا توجد مشكلة من هذه الناحيّة. يمكننا إذن إعادة تشغيل خادوم الوِب لاعتماد التعديلات:
</p>

<pre class="ipsCode" id="ips_uid_7710_7">
<code class="hljs bash"><span class="hljs-built_in"><span class="pln">sudo</span></span><span class="pln"> systemctl restart apache2</span></code></pre>

<h2 id="الخطوة-الخامسة-اختبار-التعمية">
	الخطوة الخامسة: اختبار التعمية
</h2>

<p>
	افتح متصفّح الوِب وأدخل العنوان <code>//:https</code> متبوعًا باسم نطاق الخادوم أو عنوان IP الخاصّ به:
</p>

<pre class="ipsCode" id="ips_uid_7710_7">
<code class="hljs cs"><span class="pln">https</span><span class="pun">:</span><span class="hljs-comment"><span class="com">//server_domain_or_IP</span></span></code></pre>

<p>
	بما أنّ الشهادة الأمنيّة التي أنشأناه لا تصدُر من سلطة شهادات يثق بها المتصفّح فستظهر صفحة مخيفة عند زيارة الموقع تحمل الرسالة التالية.
</p>

<p style="text-align: center;">
	<img alt="02_self_signed_warning.png" class="ipsImage ipsImage_thumbnailed" data-fileid="23965" data-unique="b5dcqgu1y" src="https://academy.hsoub.com/uploads/monthly_2017_07/02_self_signed_warning.png.dab8248fa15ae3e0faaa5c3ca57a0e7c.png"></p>

<p>
	هذا السلوك متوقَّع وطبيعي. نهتمّ في هذا الدرس بجانب التعميّة من الشهادات الأمنيّة دون جانب التحقّق من هويّة المضيف (الموقع) الذي توفّره سلطات الشهادات (وهو جانب مهمّ أيضًا لأمان التصفّح).
</p>

<p>
	انقر على زرّ ADVANCED ثم انقر على الرابط الذي ينقلك إلى موقعك (يوجد عادة أسفل الصفحة).
</p>

<p style="text-align: center;">
	<img alt="03_warning_override.png" class="ipsImage ipsImage_thumbnailed" data-fileid="23966" data-unique="no3nv159n" src="https://academy.hsoub.com/uploads/monthly_2017_07/03_warning_override.png.d58540e7c43c0055d9e2035c45dc1e6c.png"></p>

<p>
	ستُنقَل إلى صفحة الموقع. إن نظرت إلى شريط العناوين في المتصفّح فسترى صورة قفل عليه علامة <code>x</code> أمام عنوان الموقع. يعني هذا الرّمز أن المتصفّح لم يستطع التحقّق من هوية الشهادة، إلا أنه يعمّي الاتصال بينك والخادوم.
</p>

<p>
	إن أعددتَ إعادة توجيه طلبات HTTP إلى HTTPS فيمكنك التحقق من نجاح الأمر بالذهاب إلى العنوان <code>http://server_domain_or_IP</code> (بدون حرف <code>s</code> في <code>http</code>). إن ظهرت نفس الأيقونة السابقة في شريط العناوين فهذا يعني نجاح الإعداد.
</p>

<h2 id="الخطوة-السادسة-جعل-إعادة-التوجيه-دائما">
	الخطوة السادسة: جعل إعادة التوجيه دائما
</h2>

<p>
	إن كنت متأكّدًا من رغبتك في السماح للطلبات الآمنة فقط (القادمة عبر HTTPS)، وتحقّقت في الخطوة السابقة من عمل توجيه طلبات HTTP إلى HTTPS فيجب عليك جعل إعادة التوجيه دائمة.
</p>

<p>
	افتح ملف إعداد المضيف الافتراضي الذي نريد:
</p>

<pre class="ipsCode" id="ips_uid_7710_7">
<code class="hljs haskell"><span class="hljs-title"><span class="pln">sudo</span></span><span class="pln"> nano </span><span class="pun">/</span><span class="pln">etc</span><span class="pun">/</span><span class="pln">apache2</span><span class="pun">/</span><span class="pln">sites</span><span class="pun">-</span><span class="pln">available</span><span class="pun">/</span><span class="hljs-number"><span class="lit">000</span></span><span class="pun">-</span><span class="hljs-default"><span class="hljs-keyword"><span class="kwd">default</span></span><span class="pun">.</span><span class="pln">conf</span></span></code></pre>

<p>
	نبحث عن سطر إعادة التوجيه الذي أضفناه في خطوة سابقة ثم نضيف إليه الكلمة المفتاحية <code>permanent</code> على النحو التالي:
</p>

<pre class="ipsCode" id="ips_uid_7710_7">
<code class="hljs bash"><span class="tag">&lt;VirtualHost</span><span class="pln"> *:</span><span class="hljs-number"><span class="pln">80</span></span><span class="tag">&gt;</span><span class="pln">
        . . .

        Redirect permanent </span><span class="hljs-string"><span class="pln">"/"</span></span><span class="pln"> </span><span class="hljs-string"><span class="pln">"https://your_domain_or_IP/"</span></span><span class="pln">

        . . .
</span><span class="tag">&lt;/VirtualHost&gt;</span></code></pre>

<p>
	احفظ الملف ثم أغلقه.
</p>

<p>
	<strong>ملحوظة:</strong> إعادة التوجيه التي أعددناها في الخطوة الثانية باستخدام التعليمة <code>Redirect</code> فقط هي من النوع <code>302</code>. تصبح إعادة التوجيه هذه من النوع <code>301</code> (<a href="https://academy.hsoub.com/marketing/search-engine-optimisation/%D8%A3%D9%87%D9%85-%D8%B9%D9%86%D8%A7%D8%B5%D8%B1-seo-%D8%BA%D9%8A%D8%B1-%D8%A7%D9%84%D9%85%D8%B1%D8%A6%D9%8A%D8%A9-%D9%81%D9%8A-%D8%B5%D9%81%D8%AD%D8%A7%D8%AA-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D8%A8%D8%A7%D9%84%D9%86%D8%B3%D8%A8%D8%A9-%D9%84%D9%84%D9%85%D8%B7%D9%88%D8%B1%D9%8A%D9%86-r30/#%D8%A5%D8%B9%D8%A7%D8%AF%D8%A9-%D8%A7%D9%84%D8%AA%D9%88%D8%AC%D9%8A%D9%87-301-302" rel="">الفرق بين إعادة التوجيه <code>301</code>و<code>302</code></a>) عند إضافة الكلمة المفتاحية <code>permanent</code> (دائم) إلى التعليمة.
</p>

<p>
	نتحقّق من خلو الإعدادات من أخطاء في الصياغة:
</p>

<pre class="ipsCode" id="ips_uid_7710_7">
<code class="hljs bash"><span class="hljs-built_in"><span class="pln">sudo</span></span><span class="pln"> apache2ctl configtest</span></code></pre>

<p>
	ثم عندما يكون كلّ شيء على ما يرام نعيد تشغيل خادوم الوِب:
</p>

<pre class="ipsCode" id="ips_uid_7710_7">
<code class="hljs bash"><span class="hljs-built_in"><span class="pln">sudo</span></span><span class="pln"> systemctl restart apache2</span></code></pre>

<p>
	ترجمة - بتصرّف للمقال <a href="https://www.digitalocean.com/community/tutorials/how-to-create-a-self-signed-ssl-certificate-for-apache-in-ubuntu-16-04" rel="external nofollow">How To Create a Self-Signed <abbr title="Secure Socket Layer | طبقة المنافذ الآمنة">SSL</abbr> Certificate for Apache in Ubuntu 16.04</a> لصاحبه Justin Ellingwood.
</p>
]]></description><guid isPermaLink="false">325</guid><pubDate>Fri, 07 Jul 2017 07:32:12 +0000</pubDate></item><item><title>&#x62A;&#x62B;&#x628;&#x64A;&#x62A; &#x648;&#x636;&#x628;&#x637; &#x648;&#x62D;&#x62F;&#x627;&#x62A; &#x623;&#x628;&#x627;&#x62A;&#x634;&#x64A; &#x639;&#x644;&#x649; &#x623;&#x648;&#x628;&#x646;&#x62A;&#x648;</title><link>https://academy.hsoub.com/devops/servers/web/apache/%D8%AA%D8%AB%D8%A8%D9%8A%D8%AA-%D9%88%D8%B6%D8%A8%D8%B7-%D9%88%D8%AD%D8%AF%D8%A7%D8%AA-%D8%A3%D8%A8%D8%A7%D8%AA%D8%B4%D9%8A-%D8%B9%D9%84%D9%89-%D8%A3%D9%88%D8%A8%D9%86%D8%AA%D9%88-r192/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2016_01/ubuntu-server-apache-modules.png.c521c98e16504316c66605a1f3a750d5.png" /></p>

<p dir="rtl">أباتشي هو خادوم يعتمد على الوحدات، هذا يعني أن الوظيفة الأساسية فقط هي مضمَّنة في أساس الخادوم؛ الميزات الإضافية متوفرة عبر وحدات يمكن تحميلها إلى أباتشي؛ تُضمَّن افتراضيًّا مجموعة أساسية من الوحدات في الخادوم أثناء البناء، إذا بُنِي الخادوم ليستخدم الوحدات المُحمَّلة ديناميكيًا، فيمكن بناء تلك الوحدات بناءً منفصلًا ويمكن أن تضاف في أي وقت باستخدام التعليمة <span style="font-family:courier new,courier,monospace;">LoadModule</span>؛ عدا ذلك، فيجب إعادة بناء أباتشي في كل مرة تُضاف أو تُحذف فيها الوحدات.</p><p dir="rtl" style="text-align: center;"><a href="https://academy.hsoub.com/uploads/monthly_2016_01/ubuntu-server-apache-modules.png.4eb585fffa8f2ec2b19dc0a8fccc9662.png" class="ipsAttachLink ipsAttachLink_image"><img data-fileid="11757" src="https://academy.hsoub.com/uploads/monthly_2016_01/ubuntu-server-apache-modules.thumb.png.34b4c78c1bddf38c5730512f969bbfbc.png" class="ipsImage ipsImage_thumbnailed" alt="ubuntu-server-apache-modules.thumb.png.3"></a></p><p dir="rtl">يبني أوبنتو أباتشي ليسمح بالتحميل الديناميكي للوحدات؛ يمكن أن تُضاف تعليمات الضبط شرطيًّا في حال تطلب وجود وحدة معينة بوضعها في قسم <span style="font-family:courier new,courier,monospace;">&lt;IfModule&gt;</span>.</p><p dir="rtl">تستطيع تثبيت وحدات أباتشي إضافية واستخدامها في خادوم الويب؛ على سبيل المثال، نفِّذ الأمر الآتي من الطرفية لتثبيت وحدة الاستيثاق الخاصة بقواعد بيانات MySQL:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo apt-get install libapache2-mod-auth-mysql</pre><p dir="rtl">انظر إلى مجلد<span style="font-family:courier new,courier,monospace;"> ‎/etc/apache2/mods-available</span> للمزيد من الوحدات.</p><p dir="rtl">استخدم الأداة<span style="font-family:courier new,courier,monospace;"> a2enmod</span> لتفعيل وحدة:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo a2enmod auth_mysql
sudo service apache2 restart</pre><p dir="rtl">وبشكلٍ مشابه، الأداة <span style="font-family:courier new,courier,monospace;">a2dismod</span> ستعطل وحدة:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo a2dismod auth_mysql
sudo service apache2 restart</pre><h2 dir="rtl">ضبط HTTPS</h2><p dir="rtl">تُضيف الوحدة<span style="font-family:courier new,courier,monospace;"> mod_ssl</span> ميزةً مهمةً لخادوم أباتشي، ألا وهي القدرة على تشفير الاتصالات؛ وهذا يعني أنه عندما يتواصل متصفح الويب باستخدام <abbr title="Secure Socket Layer | طبقة المنافذ الآمنة">SSL</abbr>، فستُستخدَم السابقة<span style="font-family:courier new,courier,monospace;"> https‎://‎</span> في بداية URL في شريط العنوان في المتصفح.</p><p dir="rtl">تتوفر الوحدة<span style="font-family:courier new,courier,monospace;"> mod_ssl</span> في الحزمة<span style="font-family:courier new,courier,monospace;"> apache2-common</span>؛ نفِّذ الأمر الآتي من الطرفية لتفعيل وحدة<span style="font-family:courier new,courier,monospace;"> mod_ssl</span>:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo a2enmod ssl</pre><p dir="rtl">هنالك ملف ضبط HTTPS افتراضي في<span style="font-family:courier new,courier,monospace;"> ‎/etc/apache2/sites-available/default-<abbr title="Secure Socket Layer | طبقة المنافذ الآمنة">ssl</abbr>.conf</span>؛ ولكي يستطيع أباتشي توفير HTTPS، فيجب توفير شهادة ومفتاح أيضًا؛ ضبط HTTPS الافتراضي سيستخدم شهادة ومفتاح مولد من الحزمة <span style="font-family:courier new,courier,monospace;"><abbr title="Secure Socket Layer | طبقة المنافذ الآمنة">ssl</abbr>-cert</span>؛ هذه الشهادات مناسبة للاختبار، لكن يجب استبدال الشهادة والمفتاح المولد تلقائيًا بشهادة خاصة بالموقع أو الخادوم، للمزيد من المعلومات حول توليد مفتاح والحصول على شهادة، راجع <a href="https://academy.hsoub.com/devops/servers/%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-%D8%A7%D9%84%D8%A3%D9%85%D9%86-%D9%88%D8%A7%D9%84%D8%AD%D9%85%D8%A7%D9%8A%D8%A9-%D8%B9%D9%84%D9%89-%D8%AE%D9%88%D8%A7%D8%AF%D9%8A%D9%85-%D8%A3%D9%88%D8%A8%D9%86%D8%AA%D9%88-%D8%A7%D9%84%D8%B4%D9%87%D8%A7%D8%AF%D8%A7%D8%AA-certificates-r187/">درس الشهادات</a>.</p><p dir="rtl">أدخِل الأمر الآتي لضبط أباتشي ليتعامل مع HTTPS:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo a2ensite default-ssl</pre><p dir="rtl"><strong>ملاحظة</strong>: المجلدان <span style="font-family:courier new,courier,monospace;">‎/etc/<abbr title="Secure Socket Layer | طبقة المنافذ الآمنة">ssl</abbr>/certs</span> و ‎<span style="font-family:courier new,courier,monospace;">/etc/<abbr title="Secure Socket Layer | طبقة المنافذ الآمنة">ssl</abbr>/private</span> هما المساران الافتراضيان للشهادة والمفتاح؛ إذا ثبتت الشهادة والمفتاح في مجلد آخر، فتأكد من تغيير قيمة <span style="font-family:courier new,courier,monospace;">SSLCertificateFile</span> و<span style="font-family:courier new,courier,monospace;"> SSLCertificateKeyFile</span> بما يلائمك.</p><p dir="rtl">بعد أن ضبطنا أباتشي ليستخدم HTTPS، فعلينا إعادة تشغيل الخدمة لتفعيل الإعدادات الجديدة:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo service apache2 restart</pre><p dir="rtl"><strong>ملاحظة</strong>: اعتمادًا على من أين حصلت على الشهادة، ربما تحتاج إلى إدخال عبارة مرور عند تشغيل أباتشي.</p><p dir="rtl">تستطيع الوصول إلى صفحات الخادوم الآمنة بكتابة <a rel="external nofollow" href="https://hostname/url/">https://hostname/url/</a>‎ في شريط العنوان في المتصفح.</p><h2 dir="rtl">لغة السكربتات PHP5</h2><p dir="rtl">إن PHP هي لغة برمجة عامة ملائمة لتطوير الويب؛ يمكن تضمين سكربت PHP في HTML؛ وهذا القسم سيشرح كيفية تثبيت وضبط PHP5 على خادوم أوبنتو مع أباتشي و MySQL.</p><p dir="rtl">يفترض هذا القسم أنك ثبتت وضبطت خادوم الويب أباتشي وقواعد بيانات MySQL؛ تستطيع الرجوع إلى الأقسام التي تشرح <a href="https://academy.hsoub.com/devops/servers/%D8%AA%D9%86%D8%B5%D9%8A%D8%A8-%D9%88%D8%A5%D8%B9%D8%AF%D8%A7%D8%AF-%D8%AE%D8%A7%D8%AF%D9%88%D9%85-%D8%A3%D8%A8%D8%A7%D8%AA%D8%B4%D9%8A-httpd-%D8%B9%D9%84%D9%89-%D8%A3%D9%88%D8%A8%D9%86%D8%AA%D9%88-r190/">ضط أباتشي</a> و MySQL في هذه <a href="https://academy.hsoub.com/search/?tags=ubuntu+server+guide">السلسلة</a> لمزيدٍ من المعلومات.</p><h3 dir="rtl">التثبيت</h3><p dir="rtl">لغة PHP5 متوفرة في أوبنتو، وعلى عكس بايثون وبيرل المثبتتين في النظام افتراضيًّا، يجب تثبيت PHP يدويًّا.</p><ul><li><p dir="rtl">أدخِل الأمر الآتي في الطرفية لتثبيت PHP5:</p></li></ul><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo apt-get install php5 libapache2-mod-php5</pre><p dir="rtl">تستطيع تشغيل سكربتات PHP5 من سطر الأوامر؛ يجب عليك تثبيت الحزمة<span style="font-family:courier new,courier,monospace;"> php5-cli</span> لتنفيذ سكربتات PHP5 من سطر الأوامر؛ وذلك بإدخال الأمر الآتي في الطرفية:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo apt-get install php5-cli</pre><p dir="rtl">تستطيع أيضًا تشغيل سكربتات PHP5 دون تثبيت وحدة PHP5 التابعة لأباتشي؛ للقيام بذلك، عليك تثبيت الحزمة<span style="font-family:courier new,courier,monospace;"> php5-cgi</span>؛ وذلك بإدخال الأمر الآتي في الطرفية:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo apt-get install php5-cgi</pre><p dir="rtl">لاستخدام MySQL مع PHP5، فعليك تثبيت الحزمة<span style="font-family:courier new,courier,monospace;"> php5-mysql</span>، وبذلك بتنفيذ الأمر الآتي:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo apt-get install php5-mysql</pre><p dir="rtl">وبشكل مشابه، لاستخدام PostgreSQL مع PHP5، فعليك تثبيت الحزمة <span style="font-family:courier new,courier,monospace;">php5-pgsql</span>:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo apt-get install php5-pgsql</pre><h3 dir="rtl">الضبط</h3><p dir="rtl">بعد أن تُثبِّت PHP5، تستطيع تشغيل سكربتات PHP5 من متصفح الويب، وإذا ثبتت الحزمة<span style="font-family:courier new,courier,monospace;"> php5-cli</span> فتستطيع تشغيل سكربتات php5 من سطر الأوامر.</p><p dir="rtl">خادوم أباتشي مضبوطٌ افتراضيًا لتشغيل سكربتات PHP5؛ بكلمات أخرى، وحدة PHP5 مفعَّلة افتراضيًا في خادوم أباتشي بعد تثبيت الوحدة مباشرةً؛ رجاءً تأكد إذا كانت الملفات <span style="font-family:courier new,courier,monospace;">etc/apache2/mods/‎enabled/php5.conf<span style="line-height: 22.4px;">/</span></span> و <span style="font-family:courier new,courier,monospace;">‎/etc/apache2/mods-enabled/php5.load </span>موجودةً، إن لم تكن موجودةً، فتستطيع تفعيل الوحدة باستخدام الأمر<span style="font-family:courier new,courier,monospace;"> a2enmod</span>.</p><p dir="rtl">بعد أن تثبت الحزمة المتعلقة بلغة PHP5 وتُفعِّل وحدة أباتشي، فعليك أن تعيد تشغيل خادوم أباتشي لتستطيع تنفيذ سكربتات PHP5؛ وذلك بالأمر الآتي:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo service apache2 restart</pre><h3 dir="rtl">الاختبار</h3><p dir="rtl">للتأكد من التثبيت الصحيح للغة PHP؛ فنفِّذ سكربت <span style="font-family:courier new,courier,monospace;">phpinfo</span> الآتي:</p><pre data-pbcklang="php" data-pbcktabsize="4" class="php ipsCode prettyprint">&lt;?php
  phpinfo();
?&gt;</pre><p dir="rtl">عليك حفظ محتويات الملف السابق باسم <span style="font-family:courier new,courier,monospace;">phpinfo.php</span> ووضعه تحت مجلد <span style="font-family:courier new,courier,monospace;">DocumentRoot</span> في خادوم ويب أباتشي؛ وعندما توجه متصفحك نحو <a rel="external nofollow" href="http://hostname/phpinfo.php">http://hostname/phpinfo.php</a> فسوف يعرض لك إعدادات ضبط PHP5 المختلفة.</p><h3 dir="rtl">مصادر</h3><ul dir="rtl"><li>لتفاصيل أكثر، راجع توثيق موقع <a rel="external nofollow" href="http://www.php.net/docs.php">php.net</a>.</li><li>هنالك مجموعة كبيرة من الكتب عن PHP، كتابان جيدان من O'Reilly هما «<a rel="external nofollow" href="http://oreilly.com/catalog/9780596005603/">Learning PHP5</a>»، و «<a rel="external nofollow" href="http://oreilly.com/catalog/9781565926813/">PHP </a><a rel="external nofollow" href="http://oreilly.com/catalog/9781565926813/">CookBook</a>».</li></ul><h2 dir="rtl">Ruby on Rails</h2><p dir="rtl">إن Ruby on Rails هو إطار عمل مفتوح المصدر للويب لتطوير تطبيقات ويب يعتمد على قواعد البيانات؛ حيث يُفضِّل هذا الإطار المبدأ «convention over configuration».</p><h3 dir="rtl">التثبيت</h3><p dir="rtl">قبل تثبيت Ruby on Rails، يجب أن يكون لديك خادومي أباتشي و MySQL؛ رجاءً عُد للأقسام التي تشرح <a style="line-height: 22.4px;" href="https://academy.hsoub.com/devops/servers/%D8%AA%D9%86%D8%B5%D9%8A%D8%A8-%D9%88%D8%A5%D8%B9%D8%AF%D8%A7%D8%AF-%D8%AE%D8%A7%D8%AF%D9%88%D9%85-%D8%A3%D8%A8%D8%A7%D8%AA%D8%B4%D9%8A-httpd-%D8%B9%D9%84%D9%89-%D8%A3%D9%88%D8%A8%D9%86%D8%AA%D9%88-r190/">تثبيت أباتشي</a><span style="line-height: 22.4px;"> </span><span style="line-height: 22.4px;">و </span><span style="line-height: 22.4px;">MySQL</span><span style="line-height: 22.4px;"> </span><span style="line-height: 22.4px;">في هذه </span><a style="line-height: 22.4px;" href="https://academy.hsoub.com/search/?tags=ubuntu+server+guide">السلسلة</a> للمزيد من المعلومات.</p><p dir="rtl">بعد أن تُثبَّت حزم أباتشي و MySQL؛ فيجب أن تكون جاهزًا لتثبيت حزمة Ruby on Rails؛ وذلك بإدخال الأمر الآتي في الطرفية:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo apt-get install rails</pre><h3 dir="rtl">الضبط</h3><p dir="rtl">عدِّل ملف الضبط<span style="font-family:courier new,courier,monospace;"> ‎/etc/apache2/sites-available/000-default.conf</span> لإعداد النطاقات.</p><p dir="rtl">أول شيء يجب تغييره هو التعليمة <span style="font-family:courier new,courier,monospace;">DocumentRoot</span>:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">DocumentRoot /path/to/rails/application/public</pre><p dir="rtl">ثم عدِّل التعليمة ‎<span style="font-family:courier new,courier,monospace;">&lt;Directory "/path/to/rails/application/public"&gt;</span>‎:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">&lt;Directory "/path/to/rails/application/public"&gt;
  Options Indexes FollowSymLinks MultiViews ExecCGI
  AllowOverride All
  Order allow,deny
  allow from all
  AddHandler cgi-script .cgi
&lt;/Directory&gt;</pre><p dir="rtl">يجب أن تُفعِّل الوحدة <span style="font-family:courier new,courier,monospace;">mod_rewrite</span> لأباتشي، وذلك بإدخال الأمر الآتي في الطرفية:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo a2enmod rewrite</pre><p dir="rtl">في النهاية، يجب أن تُعدِّل ملكية <span style="font-family:courier new,courier,monospace;">‎/path/to/rails/application/public </span>و <span style="font-family:courier new,courier,monospace;">‎‎/path/to/‎ rails/application/tmp</span> للمستخدم الذي يُشغِّل عملية أباتشي:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo chown -R www-data:www-data /path/to/rails/application/public
sudo chown -R www-data:www-data /path/to/rails/application/tmp</pre><p dir="rtl">هذا كل ما في الأمر! يجب أن يكون خادومك جاهزًا الآن لتخديم تطبيقات Ruby on Rails.</p><h3 dir="rtl">مصادر</h3><ul dir="rtl"><li>راجع موقع <a rel="external nofollow" href="http://rubyonrails.org/">Ruby on Rails</a> لمزيدٍ من المعلومات.</li><li><a rel="external nofollow" href="http://pragprog.com/titles/rails3/agile-web-development-with-rails-third-edition">Agile Development with Rails</a> هو مصدر رائع قد تستفيد منه.</li><li>صفحة ويكي أوبنتو «<a rel="external nofollow" href="https://help.ubuntu.com/community/RubyOnRails">Ruby on Rails</a>».</li></ul><div id="sdfootnote1"><p>ترجمة -وبتصرف- للمقالين: <a rel="external nofollow" href="https://help.ubuntu.com/lts/serverguide/php5.html">Ubuntu Server Guide: PHP5 - Scripting Language</a> و <a rel="external nofollow" href="https://help.ubuntu.com/lts/serverguide/ruby-on-rails.html">Ubuntu Server Guide: Ruby on Rails</a>.</p></div>
]]></description><guid isPermaLink="false">192</guid><pubDate>Sun, 24 Jan 2016 12:11:27 +0000</pubDate></item><item><title>&#x62A;&#x646;&#x635;&#x64A;&#x628; &#x648;&#x625;&#x639;&#x62F;&#x627;&#x62F; &#x62E;&#x627;&#x62F;&#x648;&#x645; &#x623;&#x628;&#x627;&#x62A;&#x634;&#x64A; (HTTPD) &#x639;&#x644;&#x649; &#x623;&#x648;&#x628;&#x646;&#x62A;&#x648;</title><link>https://academy.hsoub.com/devops/servers/web/apache/%D8%AA%D9%86%D8%B5%D9%8A%D8%A8-%D9%88%D8%A5%D8%B9%D8%AF%D8%A7%D8%AF-%D8%AE%D8%A7%D8%AF%D9%88%D9%85-%D8%A3%D8%A8%D8%A7%D8%AA%D8%B4%D9%8A-httpd-%D8%B9%D9%84%D9%89-%D8%A3%D9%88%D8%A8%D9%86%D8%AA%D9%88-r190/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2016_01/ubuntu-server-apache-httpd.png.eb06c1c207c36e8ab1086f0e83d8f9ac.png" /></p>

<p dir="rtl">خادوم الويب هو برمجية مسؤولة عن قبول طلبات HTTP من العملاء المعروفين بمتصفحات الويب، وتخديمهم بردود HTTP مع محتويات البيانات الاختيارية؛ التي تكون عادةً صفحات ويب كمستندات HTML والكائنات الأخرى مثل الصور والفيديو ...إلخ.</p><p dir="rtl" style="text-align: center;"><a href="https://academy.hsoub.com/uploads/monthly_2016_01/ubuntu-server-apache-httpd.png.fdab1f42251e845e156aa528728240cb.png" class="ipsAttachLink ipsAttachLink_image"><img data-fileid="11755" src="https://academy.hsoub.com/uploads/monthly_2016_01/ubuntu-server-apache-httpd.thumb.png.a851a4687a83c0babab6a034e25d5582.png" class="ipsImage ipsImage_thumbnailed" alt="ubuntu-server-apache-httpd.thumb.png.a85"></a></p><h2 dir="rtl">خادوم أباتشي (HTTPD)</h2><p dir="rtl">أباتشي (Apache) هو أشهر خادوم ويب مستخدم في أنظمة لينُكس؛ تُستعمَل خواديم الويب لتخديم الصفحات المطلوبة من العملاء؛ يَطلب ويَعرض العملاءُ صفحاتَ الويب عادةً باستخدام متصفح ويب مثل فايرفكس أو كروميوم أو أوبرا أو موزيلا.</p><p dir="rtl">يُدخِل المستخدم URL (اختصار للعبارة Uniform Resource Locator) للإشارة إلى خادوم ويب باسم النطاق الكامل (FQDN) والمسار إلى الهدف المطلوب؛ على سبيل المثال، لعرض الصفحة الرئيسية لموقع أوبنتو، فسيدخل المستخدم اسم النطاق الكامل فقط:</p><p style="text-align: center;"><a rel="external nofollow" href="http://www.ubuntu.com/">www.ubuntu.com</a></p><p dir="rtl">لعرض الصفحة الفرعية للمجتمع، فإن المستخدم سيُدخِل اسم النطاق الكامل متبوعًا بمسار:</p><p style="text-align: center;"><a rel="external nofollow" href="http://www.ubuntu.com/community">www.ubuntu.com/community</a></p><p dir="rtl">أشهر بروتوكول مُستخدَم لنقل صفحات الويب هو بروتوكول نقل النص الفائق (Hyper Text Transfer Protocol، اختصارًا HTTP)، بروتوكولات أخرى مدعومة مثل بروتوكول نقل النص الفائق فوق طبقة مقابس آمنة (Hyper Text Transfer Protocol over Secure Sockets Layer، اختصارًا HTTPS)، وبروتوكول نقل الملفات (File Transfer Protocol، اختصارًا FTP) الذي هو بروتوكول لرفع (upload) أو تنزيل (download) الملفات.</p><p dir="rtl">يُستخدَم خادوم ويب أباتشي عادةً مع محرك قواعد بيانات MySQL، ولغة معالجة النصوص الفائقة (PHP)، وغيرها من «لغات السكربتات» (scripting languages) مثل بايثون و بيرل؛ يُسمَّى هذا الضبط بالمصطلح LAMP‏ (Linux, Apache, MySQL and Perl/Python/PHP) ويُشكِّل منصةً قوية ومرنةً لتطوير ونشر تطبيقات الويب.</p><h2 dir="rtl">التثبيت</h2><p dir="rtl">خادوم أباتشي متوفر في أوبنتو؛ أدخل الأمر الآتي لتثبيته:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo apt-get install apache2</pre><h2 dir="rtl">الضبط</h2><p dir="rtl">يُضبَط أباتشي بوضع تعليمات (directives) في ملفات ضبط نصية بسيطة؛ هذه التعليمات موزعة بين الملفات والمجلدات الآتية:</p><ul dir="rtl"><li>ملف <span style="font-family:courier new,courier,monospace;">apache2.conf</span>: ملف ضبط أباتشي الرئيسي؛ يحتوي على الإعدادات العامة لأباتشي.</li><li>الملف<span style="font-family:courier new,courier,monospace;"> httpd.conf</span>: تاريخيًا كان ملف ضبط أباتشي الرئيسي؛ وسُمِّي هذا الملف باسم عفريت <span style="font-family:courier new,courier,monospace;">httpd</span>؛ الآن الملفُ فارغٌ افتراضيًا، حيث نُقِلَت معظم خيارات الضبط إلى المجلدات تالية الذكر؛ يمكن أن يُستخدَم هذا الملف لإعدادات الضبط التي يجريها المستخدم وتؤثر على ضبط أباتشي العام.</li><li>المجلد <span style="font-family:courier new,courier,monospace;">conf-available</span>: يحتوي على ملفات الضبط المتوفرة لأباتشي؛ جميع الملفات التي كانت في مجلد ‎<span style="font-family:courier new,courier,monospace;">/etc/apache2/conf.d</span> انتقلت إلى ‎<span style="font-family:courier new,courier,monospace;">/etc/apache2/conf-available</span>.</li><li>المجلد <span style="font-family:courier new,courier,monospace;">conf-enabled</span>: يحتوي على الوصلات الرمزية للملفات في مجلد ‎<span style="font-family:courier new,courier,monospace;">/etc/apache2/conf-available</span>؛ فعندما تُضاف وصلة رمزية لملف ضبط، فإنه سيُفعَّل عندما يُعاد تشغيل خدمة أباتشي.</li><li>الملف <span style="font-family:courier new,courier,monospace;">envvars</span>: الملف حيث تُضبَط قيم متغيرات البيئة (environment variables) لأباتشي.</li><li>مجلد <span style="font-family:courier new,courier,monospace;">mods-available</span>: يحتوي هذا المجلد على ملفات خاصة لتحميل الوحدات (modules) وضبطها، لا تملك جميع الوحدات ملفات ضبط خاصة بها.</li><li>مجلد <span style="font-family:courier new,courier,monospace;">mods-enabled</span>: يحتوي على الوصلات الرمزية إلى الملفات في ‎<span style="font-family:courier new,courier,monospace;">/etc/apache2/mods-available</span>؛ فعندما تُضاف وصلة رمزية لملف ضبط خاص بوحدة، فإن هذه الوحدة ستُفعَّل في المرة القادمة التي سيُعاد تشغيل أباتشي فيها.</li><li>ملف <span style="font-family:courier new,courier,monospace;">ports.conf</span>: يحتوي على التعليمات التي تُحدِّد منافذ TCP التي يستمع إليها أباتشي.</li><li>مجلد<span style="font-family:courier new,courier,monospace;"> sites-available</span>: يحتوي هذا المجلد على ملفات الضبط «للمضيفين الوهميين» (Virtual Hosts) في أباتشي؛ يسمح المضيفون الوهميون بضبط أباتشي لتشغيل عدة مواقع تملك ضبطًا منفصلًا.</li><li>مجلد<span style="font-family:courier new,courier,monospace;"> sites-enabled</span>: مثل <span style="font-family:courier new,courier,monospace;">mods-enabled</span>، يحتوي مجلد <span style="font-family:courier new,courier,monospace;">sites-enabled </span>على وصلاتٍ رمزية لمحتويات مجلد <span style="font-family:courier new,courier,monospace;">‎/etc/apache2/sites-available</span>؛ وبشكل مشابه، فإن ملفات الضبط التي تُوصَل وصلًا رمزيًا لهذا المجلد ستُفعَّل في المرة القادمة التي سيُعاد تشغيل خادوم أباتشي فيها.</li><li>الملف <span style="font-family:courier new,courier,monospace;">magic</span>: يُستخدَم لتحديد نوع MIME بناءً على أول عدِّة بايتات من الملف.</li></ul><p dir="rtl">بالإضافة لذلك، يمكن أن تُضاف ملفات ضبط أخرى باستخدام التعليمة Include؛ ويمكن أن تُستخدم المحارف الخاصة (wildcards) لتضمين العديد من ملفات الضبط؛ أي تعليمة يمكن أن توضع في أيّ من ملفات الضبط تلك. لا تؤخذ التعديلات على ملفات الضبط الرئيسية بعين الاعتبار من أباتشي إلا إذا بدء أو أعيد تشغيله.</p><p dir="rtl">يقرأ الخادوم أيضًا ملفًا يحتوي على أنواع المستندات (mime types)؛ يُحدَّد اسم الملف بالتعليمة TypesConfig ويكون عمومًا هو الملف <span style="font-family:courier new,courier,monospace;">‎/etc/apache2/mods-available/mime.conf</span>؛ الذي ربما يحتوي على إضافات أو تعديلات على ‎<span style="font-family:courier new,courier,monospace;">/etc/mime.types</span>.</p><h3 dir="rtl">الإعدادات الأساسية</h3><p dir="rtl">يشرح هذا القسم معاملات ضبط خادوم أباتشي الأساسية؛ ارجع إلى <a rel="external nofollow" href="http://httpd.apache.org/docs/2.4/">توثيق أباتشي</a> للمزيد من التفاصيل.</p><p dir="rtl">يأتي أباتشي مع ضبط افتراضي «صديق» للمضيفين الوهميين؛ هذا يعني أنه مضبوط مع مضيف وهمي وحيد افتراضيًا (باستخدام التعليمة VirtualHost) الذي يمكن أن يعدَّل أو يُستخدَم كما هو لو أردت الحصول على موقع وحيد فقط؛ أو تستطيع استخدامه كقالب للمضيفين الوهميين الإضافيين إذا كنت تريد الحصول على عدِّة مواقع؛ إذا تُرِكَ كما هو، فسيُخدِّم المضيف الوهمي الافتراضي موقعك الافتراضي؛ أو الموقع الذي سيراه مستخدمو الموقع لو أن عنوان URL الذي أدخلوه لا يُطابِق التعليمة ServerName لأيٍّ من مواقعك المخصصة؛ لتعديل المضيف الوهمي الافتراضي فيجب تعديل الملف ‎<span style="font-family:courier new,courier,monospace;">/etc/apache2‎/sites-available/default</span>.</p><p dir="rtl"><strong>ملاحظة</strong>: التعليمات المضبوطة لمضيفٍ وهمي لا تطبَّق إلا عليه فقط؛ إذا ضُبِطَت تعليمة لعموم الخادوم ولم يعاد تعريفها في ضبط المضيف الوهمي، فسيُستخدَم الضبط الافتراضي؛ على سبيل المثال، تستطيع ضبط عنوان بريد webmaster ولا تُعيد تعريفه لكل مضيف وهمي.</p><p dir="rtl">إذا أردت ضبط مضيفٍ وهميٍ جديد أو موقع؛ فانسخ هذا الملف إلى نفس المجلد باسمٍ من اختيارك؛ على سبيل المثال:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo cp /etc/apache2/sites-available/000-default.conf \
/etc/apache2/sites-available/mynewsite.conf</pre><p dir="rtl">عدِّل ملف ضبط الموقع الجديد باستخدام بعض التعليمات المشروحة في الأسفل.</p><ul dir="rtl"><li><strong>التعليمة ServerAdmin</strong> تحدد البريد الإلكتروني لمدير الخادوم؛ القيمة الافتراضية هي webmaster@localhost؛ يجب أن تُعدَّل القيمة إلى البريد الإلكتروني الخاص بك (إذا كنت مديرًا للنظام)؛ إذا حدثت مشكلة مع موقع الويب، فسيُظهِر أباتشي رسالة خطأ تحتوي على هذا البريد الإلكتروني للتبليغ عن المشكلة؛ اعثر على هذه التعليمة في ملف ضبط الموقع الخاص بك في <span style="font-family:courier new,courier,monospace;">‎/etc/apache2/sites-available</span>.</li><li><strong>التعليمة listen</strong> تحدد المنفذ وبشكل اختياري عنوان IP الذي يجب على أباتشي الاستماع إليه؛ إذا لم يُحدَّد عنوان IP، فسيستمع أباتشي على جميع عناوين IP المُسندَة للخادوم الذي يعمل عليه أباتشي؛ القيمة الافتراضية للتعليمة <span style="font-family:courier new,courier,monospace;">listen</span> هي 80؛ عدِّل هذه القيمة إلى 127.0.0.1:80 لجعل أباتشي يستمع فقط إلى بطاقة loopback لذلك لن يكون متوفرًا إلى الإنترنت، عدِّل القيمة إلى 81 (على سبيل المثال) لتغيير المنفذ الذي يستمع إليه أباتشي؛ أو اتركه كما هو للعمل العادي؛ هذه التعليمة توجد وتُعدَّل في ملفها الخاص <span style="font-family:courier new,courier,monospace;">‎/etc/apache2/ports.conf</span>.</li><li><strong>التعليمة ServerName</strong> هي اختيارية وتحدد ما هو اسم النطاق الكامل (FQDN) لموقعك الذي سيستجيب أباتشي له؛ المضيف الوهمي الافتراضي لا يملك خاصية <span style="font-family:courier new,courier,monospace;">ServerName</span> مُحدَّدة، لذلك سيستجيب لجميع الطلبات التي لا تطابقها التعليمة <span style="font-family:courier new,courier,monospace;">ServerName</span> في أي مضيف وهمي آخر؛ إذا حصل وامتلكتَ النطاق ذو الاسم ubunturocks.com وأردت أن تستضيف الموقع على خادومك، فإن قيمة <span style="font-family:courier new,courier,monospace;">ServerName</span> في ملف ضبط المضيف الوهمي الخاص بك ستكون ubunturocks.com، أضف هذه التعليمة إلى ملف ضبط المضيف الوهمي الجديد الذي أنشَأناه سابقًا (<span style="font-family:courier new,courier,monospace;">‎/etc/apache2/sites-available/mynewsite.conf</span>).</li></ul><p dir="rtl">ربما تريد من موقعك أن يستجيب إلى www.ubunturocks.com، ولما كان العديد من المستخدمين يعتبرون أنّ السابقة www هي سابقة ملائمة لمواقع الويب؛ فعليك استخدام التعليمة <span style="font-family:courier new,courier,monospace;">ServerAlias</span> لهذا الغرض؛ ربما تستخدم المحارف الخاصة (wildcards) للتعليمة <span style="font-family:courier new,courier,monospace;">ServerAlias</span>.</p><p dir="rtl">فمثلًا، سيسبب الضبط الآتي استجابة موقعك لأي طلب نطاق ينتهي بالعبارة «‎.ubunturocks.com»:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">ServerAlias *.ubunturocks.com</pre><ul><li><p dir="rtl">تُحدِّد <strong>التعليمة DocumentRoot</strong> أين يجب أن يبحث أباتشي عن الملفات لإنشاء الموقع؛ القيمة الافتراضية هي ‎<span style="font-family:courier new,courier,monospace;">/var/www</span> كما هو محدد في ‎<span style="font-family:courier new,courier,monospace;">/etc/apache2/sites-available/000-default.conf</span>؛ يمكنك تستطيع تعديل هذه القيمة في ملف ضبط مضيفك الوهمي؛ لكن تذكر أن تُنشِئ المجلد إذا كان ذلك ضروريًا.</p></li></ul><p dir="rtl">فعِّل المضيف الوهمي الجديد باستخدام الأداة <span style="font-family:courier new,courier,monospace;">a2ensite</span> وأعد تشغيل أباتشي:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo a2ensite mynewsite
sudo service apache2 restart</pre><p dir="rtl"><strong>ملاحظة</strong>: تأكد أنك ستستبدل mynewsite باسم أكثر وصفًا للمضيف الوهمي؛ إحدى الطرق لتسمية الملف هي استخدام قيمة <span style="font-family:courier new,courier,monospace;">ServerName</span> للمضيف الوهمي.</p><p dir="rtl">وبشكلٍ مشابه، استخدم الأداة <span style="font-family:courier new,courier,monospace;">a2dissite</span> لتعطيل المواقع؛ يمكن أن يكون هذا مفيدًا عند استكشاف أخطاء الضبط عند وجود أكثر من مضيف وهمي:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo a2dissite mynewsite
sudo service apache2 restart</pre><h3 dir="rtl">الإعدادات الافتراضية</h3><p dir="rtl">سيشرح هذا القسم إعدادات الضبط الافتراضية لخادوم أباتشي؛ مثلًا، إذا أضفت مضيفًا وهميًا فالإعدادات التي ستضبطها للمضيف الوهمي ستكون لها الأولوية لذاك المضيف الوهمي؛ وستُستخدَم القيمة الافتراضية للتعليمات غير المُعرَّفة ضمن إعدادات المضيف الوهمي.</p><ul dir="rtl"><li><strong>التعليمة DirectoryIndex</strong> هي الصفحة الافتراضية المُخدَّمة من الخادوم عندما يَطلب المستخدم فهرس الدليل بإدخال شرطة أمامية (‎/‎) في نهاية اسم الدليل.</li></ul><p dir="rtl">على سبيل المثال، عندما يطلب المستخدم الصفحة ‎<a rel="external nofollow" href="http://www.example.com/directory/">http://www.example.com/directory/</a>‎‎‎ فأنه إما سيحصل على صفحة DirectoryIndex إن وجدت، أو على قائمة بمحتويات المجلد مولدَّةً من الخادوم إذا لم تكن موجودةً وكان قد حُدِّد الخيار Indexes، أو صفحة «Permission Denied» إن لم يتحقق أيٌّ منهما. سيحاول الخادوم إيجاد أحد الملفات المذكورة في التعليمة DirectoryIndex وستُعيد أول ملف ستجده؛ إذا لم تجد أي ملف من تلك الملفات وكان الخيار «Options Indexes» مضبوطًا لهذا المجلد، فسيولِّد الخادوم قائمةً بصيغة HTML للمجلدات الفرعية والملفات في هذا الدليل؛ القيمة الافتراضية الموجودة في ملف <span style="font-family:courier new,courier,monospace;">‎/etc/apache2/mods-available/dir.conf </span>هي "<span style="font-family:courier new,courier,monospace;">index.html index.cgi index.pl index.php index.xhtml index.htm</span>" وبالتالي إذا عَثَر أباتشي على ملف في المجلد المطلوب يطابق أحد تلك الأسماء، فسيُظهِر أول مطابقة.</p><ul dir="rtl"><li><strong>التعليمة ErrorDocument</strong> تسمح لك بتحديد ملف لكي يستعمله أباتشي عند حدوث خطأ معين؛ على سبيل المثال، إذا طلب المستخدم ملفًا غير موجودٍ، فسيحدث خطأ 404؛ وافتراضيًا، سيُعيد أباتشي الرمز HTTP 404؛ راجع<span style="font-family:courier new,courier,monospace;"> ‎/etc/apache2/conf.d/localized-error-pages </span>لمعلومات تفصيليّة عن استخدام<span style="font-family:courier new,courier,monospace;"> ErrorDocument </span>بما فيها أماكن ملفات الأمثلة.</li></ul><p dir="rtl">يكتب الخادوم سجل النقل افتراضيًا إلى الملف ‎<span style="font-family:courier new,courier,monospace;">/var/log/apache2/access.log</span>، تستطيع تغيير هذا لكل موقع بناءً على ملفات ضبط مضيفك الوهمي باستخدام التعليمة <span style="font-family:courier new,courier,monospace;">CustomLog</span>؛ أو أن تقبل باستخدام القيمة الافتراضية المحددة في ‎<span style="font-family:courier new,courier,monospace;">/etc/apache2/conf.d/other-vhosts-access-log</span>. ربما تحدد أيضًا الملف الذي تريد تسجيل الأخطاء إليه باستخدام التعليمة <span style="font-family:courier new,courier,monospace;">ErrorLog</span>، التي تكون قيمتها الافتراضية هي <span style="font-family:courier new,courier,monospace;">‎/var/log/apache2/error.log</span>؛ لكن اترك هذا السجل منفصلًا عن سجل النقل للمساعدة في استكشاف الأخطاء الحاصلة مع خادوم أباتشي؛ ربما تحدد أيضًا التعليمة <span style="font-family:courier new,courier,monospace;">LogLevel</span> (القيمة الافتراضية هي "warn") و LogFormat (راجع ‎<span style="font-family:courier new,courier,monospace;">/etc/apache2/apache2.conf</span> للقيمة الافتراضية).</p><p dir="rtl">تُحدَّد بعض الخيارات على أساس المجلد بدلًا من الخادوم؛ التعليمة <span style="font-family:courier new,courier,monospace;">Options</span> هي إحداها، يكون قسم Directory محاطًا بوسوم شبيهة بلغة XML، كما يلي:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">&lt;Directory /var/www/mynewsite&gt;
...
&lt;/Directory&gt;</pre><ul dir="rtl"><li><strong>التعليمة <span style="font-family:courier new,courier,monospace;">Options</span></strong> ضمن قسم Directory تقبل قيمة واحدة أو أكثر من القيم الآتية مفصولةً بفراغات:</li><li style="margin-right: 40px;"><strong>ExecCGI</strong>: السماح بتنفيذ سكربتات CGI، لن تُنفَّذ سكربتات CGI ما لم يُحدَّد هذا الخيار.</li></ul><p style="margin-right: 80px;"><strong>تنويه</strong>: لا يجب أن تُنفَّذ أغلبية الملفات كسكربتات CGI، لأن ذلك سيكون خطرًا جدًا! سكربتات CGI يجب أن تُبقى في مجلد منفصل وخارج المجلد الجذر لموقعك، ويجب أن يكون الخيار ExecCGI مضبوطًا لهذا المجلد فقط؛ هذا هو الضبط الافتراضي، والمكان الافتراضي لسكربتات CGI هو ‎<span style="font-family:courier new,courier,monospace;">/usr/lib/cgi-bin</span>.</p><ul dir="rtl" style="margin-right: 40px;"><li><strong>Includes</strong>: السماح بتضمينات من جهة الخادوم؛ حيث تسمح تضمينات الخادوم لملف HTML بتضمين الملفات الأخرى، راجع «<a rel="external nofollow" href="https://help.ubuntu.com/community/ServerSideIncludes">Apache SSI Documentation</a>» لمزيدٍ من المعلومات.</li><li><strong>IncludesNOEXEC</strong>: السماح بتضمينات من جهة الخادوم، لكن تعطيل الأمرَين ‎#exec و ‎#Include في سكربتات CGI.</li><li><strong>Indexes</strong>: عرض قائمة مُنسَّقة بمحتويات المجلد، إذا لم يُعثر على ملف <span style="font-family:courier new,courier,monospace;">DirectoryIndex</span> (مثل index.html) في المجلد المطلوب.</li></ul><p style="margin-right: 80px;"><strong>تحذير</strong>: لأغراض تتعلق بالحماية، لا يجب أن يُضبَط هذا الخيار عادةً؛ وخصوصًا في مجلد جذر الموقع! فعِّل هذا الخيار بحذر لكل مجلد على حدة إن كنت متأكدًا أنك تريد أن يتمكن المستخدمون من رؤية كامل محتويات المجلد.</p><ul dir="rtl" style="margin-right: 40px;"><li><strong>Multiview</strong>: دعم «content-negotiated multiviews»؛ هذا الخيار مُعطَّل افتراضيًا لأسباب أمنية، راجع <a rel="external nofollow" href="http://httpd.apache.org/docs/2.4/mod/mod_negotiation.html#multiviews">توثيق أباتشي حول هذا الخيار</a>.</li><li><strong>SysLinksIfOwnerMatch</strong>: اتباع الوصلات الرمزية فقط إذا كان الملف أو المجلد الهدف له نفس مالك الوصلة.</li></ul><h2 dir="rtl">إعدادات httpd</h2><p dir="rtl">يشرح هذا القسم بعض إعدادات ضبط عفريت httpd الأساسية.</p><ul dir="rtl"><li><strong>التعليمة LockFile</strong>: تضبط التعليمة LockFile المسار إلى ملف القفل الذي سيستخدم عندما يُبنى الخادوم مع أحد الخيارين USE_FCNTL_SERIALIZED_ACCEPT أو USE_FLOCK_SERIALAIZED_‎ ACCEPT؛ يجب أن يكون الملف مخزنًا على قرصٍ محلي، ويجب أن يترك لقيمته الافتراضية ما لم يكن مجلد السجلات موجودًا على مشاركة NFS، إذا كانت هذه هي الحالة، فيجب أن تبدَّل القيمة إلى مسار في القرص المحلي، وإلى مجلد قابل للقراءة من المستخدم الجذر (root) فقط.</li><li><strong>التعليمة PidFile</strong>: التعليمة PidFile تضبط الملف الذي يُسجِّل فيه الخادوم رقم عمليته (process ID أو <abbr title="Process IDentifier | معرّف العملية أو البرنامج">pid</abbr> اختصارًا)؛ يجب أن يكون هذا الملف قابلًا للقراءة فقط من الجذر، وفي أغلب الحالات، يجب أن تترك هذه التعليمة بقيمتها الافتراضية.</li><li><strong>التعليمة User</strong>: تَضبُط التعليمة User معرِّف userid المستعمل من الخادوم للإجابة عن الطلبيات؛ هذا الخيار يُعرِّف حدود وصول الخادوم، لن يتمكن زوار الموقع من الوصول إلى أي ملف لا يمكن لهذا المستخدم الوصول إليه، القيمة الافتراضية لهذه التعليمة هي "www-data".</li><li>تحذير: ما لم تكن متأكدًا تمامًا مما تفعل، فلا تضبط التعليمة User إلى root، سيسبب استخدام الجذر كمستخدم هنا في إنشاء ثغرات كبيرة في خادوم الويب.</li><li><strong>التعليمة Group</strong>: التعليمة Group شبيهة بالتعليمة User، التعليمة Group تحدد المجموعة التي سيجيب عبرها الخادوم عن الطلبيات؛ المجموعة الافتراضية هي "www-data" أيضًا.</li></ul><h2 dir="rtl">مشاركة إذن الكتابة</h2><p dir="rtl">لكي يتمكن أكثر من مستخدم من الكتابة إلى نفس المجلد، فمن الضروري أن نعطي إذن الكتابة للمجموعة التي يشتركون بها؛ المثال الآتي يُشارِك إذن الكتابة للمجلد ‎<span style="font-family:courier new,courier,monospace;">/var/www</span> للمجموعة «webmasters»:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo chgrp -R webmasters /var/www
sudo find /var/www -type d -exec chmod g=rwxs "{}" \;
sudo find /var/www -type f -exec chmod g=rws "{}" \;</pre><p dir="rtl"><strong>ملاحظة</strong>: لو أردت أن يُمنَح الوصول لأكثر من مجموعة واحدة للمجلد، ففعِّل قوائم التحكم بالوصول (ACLs).</p><h2 dir="rtl">مصادر</h2><ul dir="rtl"><li><a rel="external nofollow" href="http://httpd.apache.org/docs/2.4/">توثيق أباتشي</a>، الذي يشرح بعمق معلومات حول تعليمات ضبط أباتشي، وأيضًا راجع الحزمة <span style="font-family:courier new,courier,monospace;">apache2-doc</span> لتوثيق أباتشي الرسمي.</li><li>راجع توثيق <a rel="external nofollow" href="http://www.modssl.org/docs/">Mod <abbr title="Secure Socket Layer | طبقة المنافذ الآمنة">SSL</abbr></a> للمزيد من المعلومات المتعلقة بالوحدة <abbr title="Secure Socket Layer | طبقة المنافذ الآمنة">SSL</abbr>.</li><li>كتاب O'Reilly المسمى «<a rel="external nofollow" href="http://oreilly.com/catalog/9780596001919/">Apache Cookbook</a>» هو مصدر رائع للقيام بضبط خاص لأباتشي.</li><li>لأسئلة حول أباتشي على أوبنتو، فاسأل في قناة IRC المسماة ‎#ubuntu-server على خادوم <a rel="external nofollow" href="http://freenode.net/">freenode.net</a>.</li><li>لما كان أباتشي يُدمَج عادةً مع PHP و MySQL، فصفحة ويكي أوبنتو «<a rel="external nofollow" href="https://help.ubuntu.com/community/ApacheMySQLPHP">Apache MySQL PHP</a>» هي مصدر جيد للمعلومات.</li></ul><p dir="rtl">ترجمة -وبتصرف- للمقال <a rel="external nofollow" href="https://help.ubuntu.com/lts/serverguide/httpd.html">Ubuntu Server Guide: HTTPD - Apache2 Web Server</a>.</p>
]]></description><guid isPermaLink="false">190</guid><pubDate>Sun, 24 Jan 2016 10:46:27 +0000</pubDate></item><item><title>&#x643;&#x64A;&#x641;&#x64A;&#x629; &#x625;&#x639;&#x62F;&#x627;&#x62F; &#x627;&#x633;&#x62A;&#x64A;&#x62B;&#x627;&#x642; &#x643;&#x644;&#x645;&#x629; &#x627;&#x644;&#x633;&#x631; &#x645;&#x639; &#x62E;&#x627;&#x62F;&#x648;&#x645; Apache &#x639;&#x644;&#x649; Ubuntu</title><link>https://academy.hsoub.com/devops/servers/web/apache/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%A5%D8%B9%D8%AF%D8%A7%D8%AF-%D8%A7%D8%B3%D8%AA%D9%8A%D8%AB%D8%A7%D9%82-%D9%83%D9%84%D9%85%D8%A9-%D8%A7%D9%84%D8%B3%D8%B1-%D9%85%D8%B9-%D8%AE%D8%A7%D8%AF%D9%88%D9%85-apache-%D8%B9%D9%84%D9%89-ubuntu-r128/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2015_11/apache-auth.png.1bda866ee26fd1bdecbf04268f577eab.png" /></p>

<p dir="rtl">عند إعداد خادوم ويب توجد غالبًا أقسام من الموقع نرغب بتقييد الوصول إليها، تُوفِّر تطبيقات الويب عادةً طرق التصريح authorization والاستيثاق authentication الخاصّة بها، ولكن يُمكِن استخدام خادوم الويب بذاته لتقييد الوصول إن كانت هذه الطّرق غير كافية أو غير متوفّرة.</p><p dir="rtl" style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_11/apache-auth.png.603be991cf2370e8fc6cb416d166e687.png"><img data-fileid="6590" class="ipsImage ipsImage_thumbnailed" alt="apache-auth.thumb.png.77c1058abf32f79f1a" src="https://academy.hsoub.com/uploads/monthly_2015_11/apache-auth.thumb.png.77c1058abf32f79f1ab7aee0fbe88d5b.png"></a></p><p dir="rtl">سنشرح في هذا الدّرس كيف نحمي الممتلكات assets باستخدام كلمة سر على خادوم ويب Apache يعمل على Ubuntu.</p><h2 dir="rtl">المتطلبات الأساسية</h2><p dir="rtl">نحتاج للوصول إلى بيئة خادوم Ubuntu لكي نبدأ، نحتاج أيضًا لمستخدم غير جذري non-root مع صلاحيّات sudo من أجل تنفيذ مهام إداريّة administrative، لكي تتعلّم كيفيّة إعداد مستخدم بامتيازات sudo اتبع دليلنا للإعداد الأولي لخادوم Ubuntu 14.04.</p><h2 dir="rtl">تثبيت حزمة أدوات Apache المساعدة</h2><p dir="rtl">سنستخدم أداة مُساعِدة utility تُدعى <span style="font-family:courier new,courier,monospace;">htpasswd</span> من أجل إنشاء الملف الذي يقوم بتخزين كلمات السّر التي نحتاجها للوصول إلى المحتوى المُقيَّد لدينا، تُوجَد هذه الأداة في الحِزمة <span style="font-family:courier new,courier,monospace;">apache2-utils</span> داخل المستودعات repositories في Ubuntu.</p><p dir="rtl">نُحدِّث الذاكرة المؤقتة cache للحِزَم المحليّة ونُثبِّت الحِزمَة بكتابة هذا الأمر، سننتهز الفرصة أيضًا لتثبيت خادوم Apache2 في حال لم يكن مُثبّتًا لديك:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo apt-get update
sudo apt-get install apache2 apache2-utils</pre><h2 dir="rtl">إنشاء ملف كلمات السر</h2><p dir="rtl">نستطيع الآن الوصول للأمر <span style="font-family:courier new,courier,monospace;">htpasswd</span> واستخدامه لإنشاء ملف كلمات السّر والذي يستعمله خادوم Apache لاستيثاق authenticate المستخدمين، سنقوم بإنشاء ملف مخفي لهذا الغرض يُدعى <span style="font-family:courier new,courier,monospace;">htpasswd.</span> بداخل دليل الإعدادات <span style="font-family:courier new,courier,monospace;">etc/apache2/</span>.</p><p dir="rtl">عند استخدام هذه الأداة لأوّل مرّة نحتاج لإضافة الخيار <span style="font-family:courier new,courier,monospace;">c-</span> لإنشاء الملف المُحدَّد، نقوم بتحديد اسم مستخدم (في هذا المثال sammy) في نهاية الأمر لإنشاء مُدخَل جديد بداخل الملف:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo htpasswd -c /etc/apache2/.htpasswd sammy</pre><p dir="rtl">سيتم سؤالنا عن تزويد كلمة سر وتأكيدها للمستخدم.</p><p dir="rtl">نترك الوسيط <span style="font-family: 'courier new', courier, monospace; line-height: 24.8889px;">c-</span> لأي مستخدمين آخرين نرغب في إضافتهم:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo htpasswd /etc/apache2/.htpasswd another_user</pre><p dir="rtl">إن قمنا بمشاهدة محتويات الملف نستطيع رؤية اسم المستخدم وكلمة السّر المُشفّرة لكل تسجيل record:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">cat /etc/apache2/.htpasswd</pre><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sammy:$apr1$lzxsIfXG$tmCvCfb49vpPFwKGVsuYz.
another_user:$apr1$p1E9MeAf$kiAhneUwr.MhAE2kKGYHK.</pre><h2 dir="rtl">إعداد استيثاق كلمة السر لخادوم Apache</h2><p dir="rtl">الآن وبعد أن أصبحنا نمتلك ملف لأسماء المستخدمين وكلمات السّر في صيغة يستطيع خادوم Apache قراءتها، نحتاج لإعداد Apache لكي يتفحّص هذا الملف قبل تخديم محتوانا المحمي، بإمكاننا فعل هذا بطريقتين مختلفتين.</p><p dir="rtl">الخيار الأول هو تحرير edit إعدادات Apache وإضافة حماية كلمة السّر إلى ملف المضيف الافتراضي virtual host file. يُعطينا هذا الخيار أداء أفضل بشكل عام لأنّه يتجنّب تكلفة قراءة ملفات إعدادات مُوزَّعة، إن كنت تملك هذا الخيار فإنّنا ننصح بهذا الأسلوب.</p><p dir="rtl">إن لم تكن لدينا القدرة على تعديل ملف المضيف الافتراضي (أو كنّنا نستخدم مُسبقًا ملفات <span style="font-family:courier new,courier,monospace;">htaccess. </span>لأغراض أخرى) نستطيع تقييد النفاذ باستخدام ملف <span style="font-family: 'courier new', courier, monospace; line-height: 24.8889px;">htaccess.</span>، يستخدم Apache ملفّات <span style="font-family: 'courier new', courier, monospace; line-height: 24.8889px;">htaccess.</span> من أجل السّماح لتعيين بعض عناصر الإعدادات داخل ملف في دليل المحتوى. العيب في هذا هو أنّه يجب على Apache إعادة قراءة هذه الملفّات عند كل طلب يتضمّن هذا الدّليل ممّا قد يؤثر على الأداء.</p><p dir="rtl">اختر الخيار الذي يُناسِب احتياجاتك أدناه.</p><h3 dir="rtl">إعداد التحكم بالنفاذ Access Control داخل تعريف المضيف الافتراضي</h3><p dir="rtl">نبدأ بفتح ملف المضيف الافتراضي الذي نرغب بإضافة تقييد له، سنستخدم في مثالنا الملف <span style="font-family:courier new,courier,monospace;">000-default.conf</span> الذي يحمل المضيف الظاهري الافتراضي والمُثبَّت عبر حزمة apache في Ubuntu:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo nano /etc/apache2/sites-enabled/000-default.conf</pre><p dir="rtl">ينبغي أن يبدو المحتوى داخل الملف مُشابِهًا لما يلي بعد إزالة التّعليقات:</p><p><strong>etc/apache2/sites-enabled/000-default.conf/</strong></p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">&lt;VirtualHost *:80&gt;
    ServerAdmin webmaster@localhost
    DocumentRoot /var/www/html
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
&lt;/VirtualHost&gt;</pre><p dir="rtl">يتم الاستيثاق على أساس كل دليل، سنحتاج لإعداد الاستيثاق إلى استهداف الدّليل الذي نرغب بتقييد الوصول إليه بواسطة كتلة <span style="font-family:courier new,courier,monospace;">&lt;Directory ___&gt;</span>، في مثالنا سنقيّد الوصول إلى كامل جذر المستند document root ولكن نستطيع تعديل القائمة لاستهداف دليل مُحدَّد داخل مساحة الويب:</p><p><strong>etc/apache2/sites-enabled/000-default.conf/</strong></p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">&lt;VirtualHost *:80&gt;
    ServerAdmin webmaster@localhost
    DocumentRoot /var/www/html
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined

    &lt;Directory "/var/www/html"&gt;
    &lt;/Directory&gt;
&lt;/VirtualHost&gt;</pre><p dir="rtl">نُحدِّد داخل كتلة الدّليل أنّنا نرغب بإعداد استيثاق أساسي Basic، نختار من أجل AuthName اسم حقل يتم عرضه عند السؤال عن الاعتمادات credentials، نستخدم الأمر التوجيهي <span style="font-family:courier new,courier,monospace;">AuthUserFile</span> ليشير إلى Apache عن ملف كلمات السّر الذي أنشأناه، سنحتاج أخيرًا إلى <span style="font-family:courier new,courier,monospace;">valid-user</span> للوصول إلى هذا المورد، وهذا يعني أنّه سيتم السماح بالدخول لكل من يثبت صحّة هويته بكلمة سر:</p><p><strong>etc/apache2/sites-enabled/000-default.conf/</strong></p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">&lt;VirtualHost *:80&gt;
    ServerAdmin webmaster@localhost
    DocumentRoot /var/www/html
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined

    &lt;Directory "/var/www/html"&gt;
        AuthType Basic
        AuthName "Restricted Content"
        AuthUserFile /etc/apache2/.htpasswd
        Require valid-user
    &lt;/Directory&gt;
&lt;/VirtualHost&gt;</pre><p dir="rtl">عند الانتهاء نحفظ ونغلق الملف، نعيد تشغيل Apache لتنفيذ سياسة policy كلمات السّر:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo service apache2 restart</pre><p dir="rtl">يجب الآن أن يكون الملف الذي حدّدناه محميًّا بكلمة سر.</p><h3 dir="rtl">إعداد التحكم بالنفاذ Access Control باستخدام ملفات htaccess.</h3><p dir="rtl">إن كُنّا نرغب بإعداد حماية كلمة السّر باستخدام ملفّات <span style="font-family:courier new,courier,monospace;">htaccess.</span> بدلًا من الطريقة السّابقة فينبغي أن نبدأ بتحرير ملف إعدادات Apache الرئيسي للسماح بملفّات <span style="font-family: 'courier new', courier, monospace; line-height: 24.8889px;">htaccess.</span>:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo nano /etc/apache2/apache2.conf</pre><p dir="rtl">نبحث عن الكتلة <span style="font-family:courier new,courier,monospace;">&lt;Directory&gt;</span> من أجل الدّليل<span style="font-family:courier new,courier,monospace;"> var/www/</span> الذي يحتوي جذر المستند، نقوم بتشغيل معالجة <span style="font-family: 'courier new', courier, monospace; line-height: 24.8889px;">htaccess.</span> بتغيير الأمر التّوجيهي <span style="font-family:courier new,courier,monospace;">AllowOverride</span> داخل تلك الكتلة من “None” إلى “All”:</p><p><strong>etc/apache2/apache2.conf/</strong></p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">. . .

&lt;Directory /var/www/&gt;
    Options Indexes FollowSymLinks
    AllowOverride All
    Require all granted
&lt;/Directory&gt;

. . .</pre><p dir="rtl">عند الانتهاء نحفظ ونغلق الملف.</p><p dir="rtl">نحتاج بعد ذلك لإضافة ملف <span style="font-family: 'courier new', courier, monospace; line-height: 24.8889px;">htaccess.</span> إلى الدّليل الذي نرغب بتقييد الوصول إليه، في هذا المثال سنقيّد الوصول إلى كامل جذر المستند (كامل الموقع) والذي يتواجد في المسار <span style="font-family:courier new,courier,monospace;">var/www/html/</span>، ولكن يُمكننا وضع هذا الملف في أي دليل نرغب بتقييد الوصول إليه:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo nano /var/www/html/.htaccess</pre><p dir="rtl">نُحدِّد بداخل هذا الملف أنّنا نرغب بإعداد استيثاق أساسي Basic، نختار من أجل <span style="font-family:courier new,courier,monospace;">AuthName</span> اسم حقل يتم عرضه عند السؤال عن الاعتمادات credentials، نستخدم الأمر التوجيهي <span style="font-family:courier new,courier,monospace;">AuthUserFile</span> ليشير إلى Apache عن ملف كلمات السّر الذي أنشأناه، سنحتاج أخيرًا إلى <span style="font-family:courier new,courier,monospace;">valid-user</span> للوصول إلى هذا المورد، وهذا يعني أنّه سيتم السماح بالدخول لكل من يثبت صحّة هويته بكلمة سر:</p><p><strong>var/www/html/.htaccess/</strong></p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">AuthType Basic
AuthName "Restricted Content"
AuthUserFile /etc/apache2/.htpasswd
Require valid-user</pre><p dir="rtl">نحفظ ونغلق الملف، نعيد تشغيل خادوم الويب لنحمي بكلمة سر كل المحتوى الموجود في الدّليل بواسطة الملف <span style="font-family:courier new,courier,monospace;">htaccess.</span>:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo service apache2 restart</pre><h2 dir="rtl">تأكيد استيثاق كلمة السر</h2><p dir="rtl">للتأكّد من أنّ المحتوى محمي لدينا نُجرِّب النفاذ إلى المحتوى المُقيَّد من متصفّح إنترنت، يجب أن يتم عرض مُحث prompt لاسم المستخدم وكلمة السّر يُشبه ما يلي:</p><p dir="rtl" style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_11/img1.png.6e86c5aac7df02f8e71a2b76cfe8e1e4.png"><img data-fileid="6553" class="ipsImage ipsImage_thumbnailed" alt="img1.thumb.png.338c9f708d6c8a3ca0c346ae5" src="https://academy.hsoub.com/uploads/monthly_2015_11/img1.thumb.png.338c9f708d6c8a3ca0c346ae5508845b.png"></a></p><p dir="rtl">إن أدخلنا الاعتمادات الصحيحة سيتم السماح لنا بالنفاذ إلى المحتوى، وإن أدخلنا الاعتمادات الخاطئة أو ضغطنا على إلغاء Cancel سنشاهد صفحة الخطأ "Authorization Required":</p><p dir="rtl" style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_11/img2.png.dedda37b8ea34f3bd02ea6133ef0a46b.png"><img data-fileid="6554" class="ipsImage ipsImage_thumbnailed" alt="img2.thumb.png.0f23b30ccd63ff9a96d89287d" src="https://academy.hsoub.com/uploads/monthly_2015_11/img2.thumb.png.0f23b30ccd63ff9a96d89287d404fed7.png"></a></p><h2 dir="rtl">الخاتمة</h2><p dir="rtl"><a rel="external nofollow" name="_GoBack"></a> يجب أن يكون لدينا الآن كل ما نحتاجه لإعداد استيثاق أساسي لموقعنا، فلنضع في اعتبارنا أنّ حماية كلمة السّر يجب أن تكون جنبًا إلى جنب مع تشفير SSL كي لا يتم إرسال اعتماداتنا إلى الخادوم في شكل نص مُجرَّد plain text،<span style="color: rgb(82, 82, 82); font-family: 'Droid Arabic Naskh', 'Open Sans', 'Helvetica Neue', Helvetica, Tahoma, Arial, sans-serif; font-size: 16px; line-height: 32px; text-align: justify;"> </span>يمكنك الإطلاع أيضا على <a href="https://academy.hsoub.com/devops/servers/%D8%A5%D9%86%D8%B4%D8%A7%D8%A1-%D8%B4%D9%87%D8%A7%D8%AF%D8%A9-ssl-%D9%84%D8%AE%D8%A7%D8%AF%D9%88%D9%85-apache-%D8%B9%D9%84%D9%89-ubuntu-1404-r104/">كيفيّة إنشاء شهادة SSL موقّعة ذاتيًّا لاستخدامها مع Apache</a>.</p><p dir="rtl">ترجمة -وبتصرّف- لـ <a rel="external nofollow" href="https://www.digitalocean.com/community/tutorials/how-to-set-up-password-authentication-with-apache-on-ubuntu-14-04">How To Set Up Password Authentication with Apache on Ubuntu 14.04</a> لصاحبه Justin Ellingwood.</p><p dir="rtl"><span style="line-height: 22.4px;">حقوق الصورة البارزة: </span><a style="line-height: 22.4px;" href="http://www.freepik.com/free-vector/laptop-security-vector-image_715008.htm" rel="external nofollow">Designed by Freepik</a><span style="line-height: 22.4px;">.</span></p>
]]></description><guid isPermaLink="false">128</guid><pubDate>Mon, 02 Nov 2015 22:59:00 +0000</pubDate></item><item><title>&#x643;&#x64A;&#x641;&#x64A;&#x629; &#x62D;&#x645;&#x627;&#x64A;&#x629; &#x62E;&#x627;&#x62F;&#x648;&#x645; Apache &#x628;&#x627;&#x633;&#x62A;&#x62E;&#x62F;&#x627;&#x645; Fail2Ban &#x639;&#x644;&#x649; Ubuntu</title><link>https://academy.hsoub.com/devops/servers/web/apache/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%AD%D9%85%D8%A7%D9%8A%D8%A9-%D8%AE%D8%A7%D8%AF%D9%88%D9%85-apache-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-fail2ban-%D8%B9%D9%84%D9%89-ubuntu-r126/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2015_10/fail2ban-apache.png.afc0439190c0028168e7833867240e9b.png" /></p>

<p dir="rtl">من المهم عند العمل على خادوم ويب تنفيذ تدابير أمنيّة لحماية موقعنا ومستخدمينا، إنّ حماية مواقع الإنترنت والتّطبيقات لدينا باستخدام سياسات الجّدار النّاري firewall policies وتقييد الوصول إلى بعض المناطق باستخدام استيثاق كلمة السّر password authentication هو نقطة بدء رائعة لتأمين النظام لدينا، ومع ذلك من المُرجَّح أن يجذب أي طلب لكلمة السّر مُتاح للعوام محاولات القوة القاسية brute force من قبل المستخدمين والروبوتات bots الخبيثين.</p><p dir="rtl" style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_10/fail2ban-apache.png.181fff7cf9cc575cda065ae8190a9811.png"><img data-fileid="6453" class="ipsImage ipsImage_thumbnailed" alt="fail2ban-apache.thumb.png.80e5443fd0ddd9" src="https://academy.hsoub.com/uploads/monthly_2015_10/fail2ban-apache.thumb.png.80e5443fd0ddd9517a8966f4c0eb9905.png"></a></p><p dir="rtl">يتمكّن إعداد <strong>fail2ban</strong> من المساعدة في الحد من هذه المشكلة، فعندما يفشل المستخدمون بالاستيثاق إلى خدمة ما بشكلٍ متكرّر (أو الانخراط في أي نشاط مشبوه آخر) تستطيع fail2ban أن تصدر حظرًا مؤقّتًا على عنوان IP المُهاجِم عن طريق التّعديل بشكل ديناميكي على سياسة الجّدار النّاري التي تعمل حاليًّا. تعمل كل "jail" تابعة لـ fail2ban عن طريق تفحّص السّجلّات المكتوبة من قبل خدمة ما بحثًا عن أنماط patterns تُشير إلى محاولات فاشلة بالاستيثاق. من السّهل إعداد fail2ban لكي تراقب سجلّات Apache باستخدام مُرشِّحات filters الإعداد المُضمَّنة.</p><p dir="rtl">سنشرح في هذا الدّرس كيفيّة تثبيت fail2ban وإعدادها لمراقبة سجلّات Apache بحثًا عن محاولات التّسلّل، سنستخدم خادوم Ubuntu من أجل هذا.</p><h2 dir="rtl">المتطلبات الأساسية</h2><p dir="rtl">ينبغي قبل أن نبدأ أن نمتلك خادوم Ubuntu مع إعداد حساب غير جذري non-root، ويجب أن يكون هذا الحساب مُعدًّا بامتيازات sudo من أجل إصدار أوامر إداريّة administrative commands. لكي تتعلّم كيفيّة إعداد مستخدم بامتيازات <span style="font-family:courier new,courier,monospace;">sudo</span> اتبع دليلنا <a href="https://academy.hsoub.com/devops/servers/%D8%A7%D9%84%D8%A5%D8%B9%D8%AF%D8%A7%D8%AF-%D8%A7%D9%84%D8%A7%D8%A8%D8%AA%D8%AF%D8%A7%D8%A6%D9%8A-%D9%84%D8%AE%D8%A7%D8%AF%D9%88%D9%85-%D8%A3%D9%88%D8%A8%D9%86%D8%AA%D9%88-1404-r4/">للإعداد الأولي لخادوم Ubuntu 14.04</a>.</p><h2 dir="rtl"><a rel="external nofollow" name="_GoBack"></a>تثبيت Apache وإعداد استيثاق كلمة السر</h2><p dir="rtl">إن كنتَ مهتمًّا بحماية خادوم <strong>Apache</strong> باستخدام fail2ban فمن الغالب أنك تملك مسبقًا خادومًا مُعدًّا وقيد التشغيل، وإن لم تكن كذلك تستطيع تثبيت Apache من خلال مستودعات Ubuntu الافتراضيّة باستخدام <span style="font-family:courier new,courier,monospace;">apt</span>.</p><p dir="rtl">فلنقم بتحديث دليل الحِزَم المحلّي وتثبيت Apache بكتابة ما يلي:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo apt-get update
sudo apt-get install apache2</pre><p dir="rtl">إنّ خدمة fail2ban مفيدة من أجل حماية نقاط تسجيل الدخول، ومن أجل أن يكون هذا مفيدًا لتثبيت Apache يجب تنفيذ استيثاق كلمة السّر على الأقل لمجموعة فرعيّة من المحتوى على الخادوم، تستطيع اتباع هذا الدّليل لإعداد حماية كلمة السّر من أجل خادوم Apache لديك.</p><h2 dir="rtl">تثبيت Fail2Ban</h2><p dir="rtl">بعد أن أصبح خادوم Apache لدينا قيد التّشغيل وتمّ تمكين استيثاق كلمة السّر عليه نستطيع المضي قدمًا وتثبيت fail2ban (نقوم هنا بإدراج إعادة جلب للمستودع مرّة أخرى في حال قمتَ بالفعل بتثبيت Apache في الخطوات السّابقة):</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo apt-get update
sudo apt-get install fail2ban</pre><p dir="rtl">سيقوم هذا بتثبيت برمجيّة fail2ban، والتي هي مُعدَّة افتراضيًّا لكي تحظر فقط محاولات تسجيل دخول SSH الفاشلة، نحتاج إلى تمكين بعض القواعد التي تقوم بإعدادها لكي تتفحّص سجلّات Apache لدينا بحثًا عن أنماط تشير إلى نشاط خبيث.</p><h2 dir="rtl">ضبط الإعدادات العامة داخل Fail2Ban</h2><p dir="rtl">نحتاج لكي نبدأ إلى ضبط ملف الإعدادات الذي تستخدمه fail2ban لتحديد سجلّات التطبيقات التي يجب أن تراقبها والإجراءات التي يجب أن يتمّ اتخاذها عند إيجاد مُدخلات مُخالِفة، ومن الموارد الرئيسيّة التي يتم تزويدنا بها لهذا الأمر نجد الملف <span style="font-family:courier new,courier,monospace;">etc/fail2ban/jail.conf/</span>.</p><p dir="rtl">ولإجراء التعديلات نحتاج إلى نسخ هذا الملف إلى <span style="font-family:courier new,courier,monospace;">etc/fail2ban/jail.local/</span>، وهذا يمنع الكتابة فوق التغييرات التي أجريناها إن قام تحديث الحِزمة package بتزويدنا بملف جديد افتراضي:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local</pre><p dir="rtl">نقوم بفتح الملف الجديد المنسوخ حتى نستطيع إعداد مراقبة سجلّات Apache لدينا:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo nano /etc/fail2ban/jail.local
</pre><h3 dir="rtl">تغيير الإعدادات الافتراضية</h3><p dir="rtl">ينبغي أن نبدأ بتقييم المجموعة الافتراضيّة داخل الملف لنرى إن كانت تُلائِم احتياجاتنا، نستطيع إيجاد هذه المجموعة تحت قسم <strong>[DEFAULT]</strong> داخل الملف. تقوم هذه العناصر بتعيين السّياسة policy العامّة وبإمكاننا تجاوز أي منها في jails مُحدّدة.</p><p dir="rtl">ومن أوائل العناصر التي يجب أن ننظر إليها هي قائمة العُمَلاء Clients التي لا تخضع لسياسات fail2ban، ويتم تعيينها باستخدام الأمر التّوجيهي <span style="font-family:courier new,courier,monospace;">ignoreip</span>، من الجّيد أحيانًا إضافة عنوان IP الخاص بنا أو بشبكتنا إلى قائمة الاستثناءات لتجنّب حظر أنفسنا، على الرّغم من أنّ هذا أقل من أن يكون مشكلة مع تسجيلات الدّخول إلى خادوم الويب إن كان بإمكاننا المحافظة على النفاذ للـ Shell، حيث أنّنا دائمًا نستطيع إلغاء الحظر يدويًّا. نستطيع إضافة عناوين IP أو شبكات إضافيّة بفصلها بمسافة Space إلى القائمة الحاليّة:</p><p dir="rtl"><strong>etc/fail2ban/jail.local/</strong></p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">[DEFAULT]

. . .
ignoreip = 127.0.0.1/8 your_home_IP</pre><p>ومن العناصر الأخرى التي قد نرغب بضبطها نجد <span style="font-family:courier new,courier,monospace;">bantime</span> والذي يتحكّم بعدد الثّواني التي سيتم خلالها حظر العضو المُخالِف، من المثالي تعيينه إلى مدّة طويلة كافية لتكون مُدمِّرة لجهود المستخدم الخبيث، وفي نفس الوقت قصيرة بما فيه الكفاية لتسمح للمستخدمين الشرعيّين لتصحيح أخطائهم، يتم تعيين هذه القيمة افتراضيًّا إلى 600 ثانية (10 دقائق)، قم بزيادتها أو إنقاصها على النحو الذي تراه مناسبًا:</p><p><strong>etc/fail2ban/jail.local/</strong></p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">[DEFAULT]

. . .
bantime = 3600</pre><p dir="rtl">يُحدّد العنصران التّاليان نطاق أسطر السّجلّات المستخدمة لتحديد العميل المُخالِف، يُحدِّد <span style="font-family:courier new,courier,monospace;">findtime</span> المدّة الزمنية مُقدّرةً بالثواني ويُشير الأمر التّوجيهي <span style="font-family:courier new,courier,monospace;">maxretry</span> إلى عدد المحاولات التي يتم التسامح معها خلال تلك المدّة، فإن قام العميل بعدد محاولات أكثر من <span style="font-family:courier new,courier,monospace;">maxretry</span> خلال المدّة الزمنيّة المُحدّدة بواسطة <span style="font-family:courier new,courier,monospace;">findtime</span> فسيتمّ حظره:</p><p><strong>etc/fail2ban/jail.local/</strong></p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">[DEFAULT]

. . .
findtime = 3600 # These lines combine to ban clients that fail
maxretry = 6 # to authenticate 6 times within a half hour.</pre><h3 dir="rtl">إعداد تنبيهات البريد الإلكتروني (اختياري)</h3><p dir="rtl">نستطيع تمكين تنبيهات البريد الإلكتروني إن كُنّا نرغب باستقبال بريد كلّما حدث حظر، ويتوجب علينا أولًا لفعل هذا أن نقوم بإعداد MTA على خادومنا بحيث يستطيع إرسال بريد إلكتروني، لتتعلّم كيفيّة استخدام Postfix من أجل هذه المهمّة اتبع هذا الدّليل.</p><p dir="rtl">ويتوجّب علينا بعد الانتهاء من إعداد MTA أن نقوم بضبط بعض الإعدادات الإضافيّة داخل القسم <strong>[DEFAULT] </strong>من الملف <span style="font-family:courier new,courier,monospace;">etc/fail2ban/jail.local/</span>. نبدأ بإعداد الأمر التّوجيهي mta، فإن قمنا بإعداد Postfix -كما هو واضح في الدّرس التعليمي المذكور بالأعلى- نُغيّر هذه القيمة إلى “mail”:</p><p><strong>etc/fail2ban/jail.local/</strong></p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">[DEFAULT]

. . .
mta = mail</pre><p dir="rtl">يجب أن نختار عنوان البريد الإلكتروني الذي سيتم إرسال التنبيهات إليه ونكتبه داخل الأمر التّوجيهي <span style="font-family:courier new,courier,monospace;">destemail</span>، بإمكاننا استخدام الأمر التّوجيهي <span style="font-family:courier new,courier,monospace;">sendername</span> لتعديل حقل المُرسِل Sender في تنبيهات البريد الإلكتروني:</p><p><strong>etc/fail2ban/jail.local/</strong></p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">[DEFAULT]

. . .
destemail = youraccount@email.com
sendername = Fail2BanAlerts</pre><p dir="rtl">إنّ الإجراء <span style="font-family:courier new,courier,monospace;">action</span> -بحسب تعبير fail2ban- هو العمليّة التي تتلو فشل العميل بالاستيثاق مرات كثيرة، الإجراء الافتراضي (يُدعى _<span style="font-family:courier new,courier,monospace;">action</span>) هو ببساطة حظر عنوان الـ IP من المنفذ port قيد الطلب، ويوجد على أيّة حال إجراءان آخران مُعدّان مُسبقًا يُمكن استخدامهما إن كنّا نملك إعداد بريد إلكتروني.</p><p dir="rtl">نستطيع استخدام الإجراء <span style="font-family:courier new,courier,monospace;">action_mw</span> لحظر العميل وإرسال تنبيه بريد إلكتروني إلى الحساب المضبوط لدينا مع تقرير “whois” حول عنوان المُخالِف، بإمكاننا أيضًا استخدام الإجراء <span style="font-family:courier new,courier,monospace;">action_mwl</span> والذي يقوم بنفس العمل ولكن يقوم بتضمين سطور سجلّات المُخالِف والتي قامت بإطلاق عمليّة الحظر:</p><p><strong>etc/fail2ban/jail.local/</strong></p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">[DEFAULT]

. . .
action = %(action_mwl)s</pre><h2 dir="rtl">إعداد Fail2Ban لمراقبة سجلات Apache</h2><p dir="rtl">بعد أن قمنا بضبط بعض إعدادات fail2ban العامّة في مكانها الصحيح نستطيع التركيز على تمكين بعض jails المرتبطة بـ Apache والتي ستراقب سجلّات خادوم الويب لدينا بحثًا عن أنماط سلوك مُعيّن.</p><p dir="rtl">تتميّز كل jails داخل ملف الإعدادات بترويسة header تحتوي اسم الـ jail بين قوسين مربّعين (كل قسم يشير إلى إعدادات jail مُحدّدة ما عدا القسم <strong>[DEFAULT]</strong>)، وافتراضيًّا نجد <strong>ssh]</strong> jail<strong>]</strong> هي الوحيدة المُمكّنة.</p><p dir="rtl">لتمكين مراقبة السّجلّات بحثًا عن محاولات تسجيل دخول Apache سنقوم بتمكين <strong>[</strong>jail <strong>[apache</strong>، نُعدّل الأمر التّوجيهي enabled داخل هذا القسم بحيث يصبح true:</p><p><strong>etc/fail2ban/jail.local/</strong></p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">[apache]

enabled = true
port = http,https
filter = apache-auth
logpath = /var/log/apache*/*error.log
maxretry = 6
. . .</pre><p dir="rtl">إن كان خادوم Apache يقوم بالكتابة إلى موقع السّجلّات الافتراضي (<span style="font-family:courier new,courier,monospace;">var/log/apache/error.log/</span>) تكون jail مُعدّة مُسبقًا للبحث في المكان المناسب، وإن كُنّا نقوم بوضع السّجلّات في مكان آخر نُعدِّل مسار السّجل logpath حسب الحاجة، لا تتردد في ضبط الأمر التّوجيهي <span style="font-family:courier new,courier,monospace;">maxretry</span> أو إضافة قيمة <span style="font-family:courier new,courier,monospace;">findtime</span> لهذه الـ jail إن كنت ترغب في وضع قيود أخرى لهذه الـ jail تحديدًا:</p><p><strong>etc/fail2ban/jail.local/</strong></p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">[apache]

enabled = true
port = http,https
filter = apache-auth
logpath = /var/log/apache/custom_log_location.log
maxretry = 3
findtime = 600
. . .</pre><p dir="rtl">تهتم jail السابقة بأمر حظر فشل الاستيثاق الأساسي، توجد أيضًا بعض jails التي تستحق تمكينها (إنّ jail التي تُدعى <strong>[apache-multiport]</strong> هي jail تراثيّة legacy لا نحتاج إليها).</p><p dir="rtl">تُستَخدم jail التي تُدعى <strong>[apache-noscript]</strong> لحظر العُملاء الذين يبحثون عن تنفيذ واستغلال scripts على الموقع، إن لم نكن نستخدم PHP أو أيّة لغة برمجة أخرى بالتزامن مع خادوم الويب لدينا فبإمكاننا تمكين هذه الـ jail لحظر هؤلاء العملاء الذين يطلبون هذا النوع من الموارد:</p><p><strong>etc/fail2ban/jail.local/</strong></p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">[apache-noscript]

enabled = true
. . .</pre><p dir="rtl">تُستخدَم jail التي تُدعى <strong>[apache-overflows] </strong>لحظر العملاء الذين يحاولون طلب روابط URLs طويلة غير معتادة ومثيرة للشك، والتي تكون عادةً إشارة لمحاولات استغلال Apache عن طريق محاولة تحريض حدوث buffer overflow.</p><p dir="rtl">بإمكاننا تمكين هذه الـ jail إن أردنا منع هذا النوع من الهجمات:</p><p><strong>etc/fail2ban/jail.local/</strong></p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">[apache-overflows]

enabled = true
. . .</pre><p dir="rtl">نستطيع القيام بفحوصات إضافيّة للتحقّق عن طريق نسخ ولصق المدخلة entry التي تُدعى<strong> [apache-overflows]</strong> وتعديلها قليلًا، فعلى سبيل المثال بإمكاننا نسخ ولصق هذا القسم وتعديل اسم الـ jail والمُرشِّح filter إلى apache-badbots لإيقاف بعض نماذج طلبات الروبوتات bots الخبيثة المعروفة:</p><p><strong>etc/fail2ban/jail.local/</strong></p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">[apache-overflows]

enabled = true
port = http,https
filter = apache-overflows
logpath = /var/log/apache*/*error.log
maxretry = 2


[apache-badbots]

enabled = true
port = http,https
filter = apache-badbots
logpath = /var/log/apache*/*error.log
maxretry = 2</pre><p dir="rtl">إن لم نكن نستخدم Apache لتزويدنا بالنفاذ إلى محتوى الويب داخل دليل المستخدمين الرئيسي فبإمكاننا نسخ ولصق ما سبق مرةً أخرى وتغيير أسماء الـ jail والمُرشِّح إلى <span style="font-family:courier new,courier,monospace;">apache-nohome</span>:</p><p><strong>etc/fail2ban/jail.local/</strong></p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">[apache-overflows]

enabled = true
port = http,https
filter = apache-overflows
logpath = /var/log/apache*/*error.log
maxretry = 2


[apache-badbots]

enabled = true
port = http,https
filter = apache-badbots
logpath = /var/log/apache*/*error.log
maxretry = 2


[apache-nohome]

enabled = true
port = http,https
filter = apache-nohome
logpath = /var/log/apache*/*error.log
maxretry = 2</pre><p dir="rtl">وأخيرًا إن كُنّا نستخدم Apache مع PHP فقد نرغب بتمكين jail التي تُدعى <strong>[php-url-fopen]</strong> والتي تقوم بحجب محاولات استخدام سلوك PHP مُحدَّد لأغراض خبيثة، من المحتمل أن يتوجّب علينا تغيير الأمر التّوجيهي <span style="font-family:courier new,courier,monospace;">logpath</span> لكي يشير إلى مسار السّجلّات الصحيح (المسار الافتراضي على Ubuntu هو <span style="font-family:courier new,courier,monospace;">var/log/apache2/access.log/</span>)، نستطيع استخدام نموذج مشابه للنموذج الذي يوافق سجل الأخطاء في jails الأخرى:</p><p dir="rtl"><strong>etc/fail2ban/jail.local/</strong></p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">[php-url-fopen]

enabled = true
port = http,https
filter = php-url-fopen
logpath = /var/www/apache*/*access.log</pre><p dir="rtl">عندما ننتهي من التّعديلات التي نحتاجها نقوم بحفظ وإغلاق الملف.</p><h2 dir="rtl">تنفيذ Apache Jails لدينا</h2><p dir="rtl">لكي يتم تنفيذ تغييراتنا على الإعدادات نحتاج إلى إعادة تشغيل خدمة fail2ban، نستطيع فعل ذلك بكتابة ما يلي:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo service fail2ban restart</pre><p dir="rtl">ينبغي أن يتم إعادة تشغيل الخدمة وتنفيذ سياسات الحظر المختلفة التي قمنا بإعدادها.</p><h2 dir="rtl">الحصول على معلومات حول Jails التي تم تمكينها</h2><p dir="rtl">نستطيع رؤية جميع jails التي تمّ تمكينها لدينا باستخدام الأمر <span style="font-family:courier new,courier,monospace;">fail2ban-client</span>:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo fail2ban-client status</pre><p dir="rtl">ينبغي أن نشاهد قائمة بكامل jails التي قمنا بتمكينها:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">Status

|- Number of jail:    7
`- Jail list:         php-url-fopen, apache-overflows, apache-noscript, ssh, apache-badbots, apache-nohome, apache</pre><p>نستطيع أن نرى قيام fail2ban بتعديل قواعد الجّدار النّاري لدينا لإنشاء إطار عمل لمنع العملاء، وحتى بدون قواعد الجّدار النّاري السابقة سيكون لدينا الآن إطار عمل مُمكّن يسمح لـ fail2ban بحظر العملاء انتقائيًّا عن طريق إضافتهم إلى سلاسل chains مبنيّة لهذا الغرض:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo iptables -S</pre><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-N fail2ban-apache
-N fail2ban-apache-badbots
-N fail2ban-apache-nohome
-N fail2ban-apache-noscript
-N fail2ban-apache-overflows
-N fail2ban-php-url-fopen
-N fail2ban-ssh
-A INPUT -p tcp -m multiport --dports 80,443 -j fail2ban-apache-nohome
-A INPUT -p tcp -m multiport --dports 80,443 -j fail2ban-apache-badbots
-A INPUT -p tcp -m multiport --dports 80,443 -j fail2ban-php-url-fopen
-A INPUT -p tcp -m multiport --dports 80,443 -j fail2ban-apache-overflows
-A INPUT -p tcp -m multiport --dports 80,443 -j fail2ban-apache-noscript
-A INPUT -p tcp -m multiport --dports 80,443 -j fail2ban-apache
-A INPUT -p tcp -m multiport --dports 22 -j fail2ban-ssh
-A fail2ban-apache -j RETURN
-A fail2ban-apache-badbots -j RETURN
-A fail2ban-apache-nohome -j RETURN
-A fail2ban-apache-noscript -j RETURN
-A fail2ban-apache-overflows -j RETURN
-A fail2ban-php-url-fopen -j RETURN
-A fail2ban-ssh -j RETURN</pre><p dir="rtl">وإن أردنا رؤية تفاصيل حظر مُطبَّق من قبل أي jail فمن الأسهل ربّما استخدام الأمر <span style="font-family:courier new,courier,monospace;">fail2ban-client</span> مرة أخرى:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo fail2ban-client status apache</pre><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">Status for the jail: apache

|- filter
| |- File list: /var/log/apache2/error.log
| |- Currently failed: 0
| `- Total failed: 0
`- action
   |- Currently banned: 0
   | `- IP list:
   `- Total banned: 0</pre><h2 dir="rtl">اختبار سياسات Fail2Ban</h2><p dir="rtl">من الهام اختبار سياسات fail2ban لكي نتأكّد من أنها تقوم بحظر نقل البيانات كما هو متوقّع، على سبيل المثال نستطيع إعطاء بيانات خاطئة في مُحث prompt استيثاق Apache عدّة مرات، وبعد أن نتجاوز الحدّ ينبغي أن يتم حظرنا وألا نكون قادرين على الوصول للموقع، وإن قمنا بإعداد تنبيهات البريد الإلكتروني فيجب أن نرى رسائل حول الحظر في البريد الإلكتروني الذي قمنا باختياره لاستقبال التّنبيهات.</p><p dir="rtl">عندما ننظر إلى الحالة باستخدام الأمر<span style="font-family:courier new,courier,monospace;"> fail2ban-client</span> سنشاهد أنّ عنوان IP الخاص بنا يتم حظره من الموقع:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo fail2ban-client status apache</pre><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">Status for the jail: apache

|- filter
| |- File list: /var/log/apache2/error.log
| |- Currently failed: 0
| `- Total failed: 12
`- action
   |- Currently banned: 1
   | `- IP list: 111.111.111.111
   `- Total banned: 1</pre><p dir="rtl">وعندما نكون مقتنعين بأنّ قواعدنا تعمل بشكل صحيح نستطيع فك الحظر يدويًّا عن عنوان IP الخاص بنا عن طريق الأمر <span style="font-family:courier new,courier,monospace;">fail2ban-client</span> بكتابة ما يلي:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo fail2ban-client set apache unbanip 111.111.111.111</pre><p dir="rtl">ينبغي أن نكون الآن قادرين على محاولة الاستيثاق مرة أخرى.</p><h2 dir="rtl">الخاتمة</h2><p dir="rtl">إنّ إعداد fail2ban لحماية خادوم Apache لدينا هو عمليّة سهلة إلى حدٍّ ما في أبسط الحالات، توفّر fail2ban على أيّة حال قدرًا كبيرًا من المرونة لبناء سياسات تُلائِم احتياجاتنا الأمنيّة، وبإلقاء نظرة على المتغيّرات والأنماط داخل الملف <span style="font-family:courier new,courier,monospace;">etc/fail2ban/jail.local/</span> والملفات التي يعتمد عليها داخل الدّليل <span style="font-family:courier new,courier,monospace;">etc/fail2ban/filter.d/</span> والدّليل <span style="font-family:courier new,courier,monospace;">etc/fail2ban/action.d/</span> نجد العديد من الأجزاء التي يمكننا تطويعها tweak وتغييرها لكي تلبّي احتياجاتنا، إنّ تعلّم أساسيّات كيفيّة حماية خادومنا باستخدام fail2ban يزوّدنا بقدرٍ كبير من الأمان وبأقل جهد.</p><p dir="rtl">إن كنت ترغب في تعلّم المزيد حول <strong>fail2ban</strong> قم بزيارة الروابط التالية:</p><ul dir="rtl"><li><a href="https://academy.hsoub.com/devops/servers/%D9%83%D9%8A%D9%81-%D9%8A%D8%B9%D9%85%D9%84-fail2ban-%D8%B9%D9%84%D9%89-%D8%B2%D9%8A%D8%A7%D8%AF%D8%A9-%D8%AD%D9%85%D8%A7%D9%8A%D8%A9-%D8%AE%D8%A7%D8%AF%D9%88%D9%85%D9%83-r88/">كيف تعمل Fail2Ban لحماية الخدمات على خادوم لينِكس</a></li><li><a href="https://academy.hsoub.com/devops/servers/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%AD%D9%85%D8%A7%D9%8A%D8%A9-ssh-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-fail2ban-%D8%B9%D9%84%D9%89-ubuntu-r113/">كيفيّة حماية SSH باستخدام Fail2Ban على Ubuntu 14.04</a></li><li><a href="https://academy.hsoub.com/devops/web-servers/nginx/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%AD%D9%85%D8%A7%D9%8A%D8%A9-%D8%AE%D8%A7%D8%AF%D9%88%D9%85-nginx-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-fail2ban-%D8%B9%D9%84%D9%89-ubuntu-r124/">كيفيّة حماية خادوم Nginx باستخدام Fail2Banعلى Ubuntu 14.04</a></li></ul><p dir="rtl">ترجمة -وبتصرّف- للمقال <a rel="external nofollow" href="https://www.digitalocean.com/community/tutorials/how-to-protect-an-apache-server-with-fail2ban-on-ubuntu-14-04">How To Protect an Apache Server with Fail2Ban on Ubuntu 14.04</a> لصاحبه Justin Ellingwood.</p>
]]></description><guid isPermaLink="false">126</guid><pubDate>Fri, 30 Oct 2015 07:19:54 +0000</pubDate></item><item><title>&#x625;&#x646;&#x634;&#x627;&#x621; &#x634;&#x647;&#x627;&#x62F;&#x629; SSL &#x644;&#x62E;&#x627;&#x62F;&#x648;&#x645; Apache &#x639;&#x644;&#x649; Ubuntu 14.04</title><link>https://academy.hsoub.com/devops/servers/web/apache/%D8%A5%D9%86%D8%B4%D8%A7%D8%A1-%D8%B4%D9%87%D8%A7%D8%AF%D8%A9-ssl-%D9%84%D8%AE%D8%A7%D8%AF%D9%88%D9%85-apache-%D8%B9%D9%84%D9%89-ubuntu-1404-r104/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2015_08/ssl-apache_(1).png.b243b89ea1269fc9dc6392ebc8685342.png" /></p>

<p>TLS، أو حماية طبقة النقل (Transport Layer Security)، وسلفها SSL أو طبقة الحِزَم الآمنة (Secure Sockets Layer) هما عبارة عن بروتوكولات آمنة يتم إنشاؤها بهدف توجيه تدفّق البيانات العادية (traffic) ضمن طريق مشفّر وآمن أثناء تنقّلها.</p><p style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_08/ssl-apache_(1).png.f1fb3d2e09389fd15c5f00b3855b5ba4.png"><img data-fileid="4269" class="ipsImage ipsImage_thumbnailed" alt="ssl-apache_(1).thumb.png.d98534d30252182" src="https://academy.hsoub.com/uploads/monthly_2015_08/ssl-apache_(1).thumb.png.d98534d302521820853295a52683a17c.png"></a></p><p style="text-align: center;"> </p><p>تسمح هذه البروتوكولات للتدفّق بأن يتمّ إرساله بشكل آمن بين جهات بعيدة عن بعضها البعض دون وجود إمكانية لاعتراض تدفّق البيانات بينها وقراءتها بواسطة شخص ما في المنتصف. لها أيضًا دور فعّال في التحقق من هوّية النطاقات والخواديم الموجودة على الإنترنت عبر استخدامها كأداة للتحقق من هوية تلك الخواديم والنطاقات عبر جهة معيّنة تقوم بإصدار تلك الشهادات.</p><p>في هذا الدرس، سنشرح كيفيّة إنشاء شهادة SSL موقّعة ذاتيًا لخادوم Apache على Ubuntu 14.04، والذي سيسمح لك بأن تقوم بتشفير التدفّق القادم إلى خادومك. صحيح أنّ هذا لن يوفّر لك ميّزة الاستفادة من استيثاق جهة ما من جهات الطرف الثالث (third-parties) لهويّة خادومك، إلّا أنّه يحقق هدف أولئك الذين يريدون نقل المعلومات بأمان وببساطة.</p><h2>المتطلبات</h2><p>قبل أن تبدأ، يجب أن تهتم ببعض الإعدادات بالطبع.</p><p>سنستخدم مستخدمًا غير مستخدم الجذر مع صلاحيات sudo في هذا الدرس. يمكنك إعداد واحد عبر اتباع الخطوات المذكورة في <a href="https://academy.hsoub.com/devops/servers/%D8%A7%D9%84%D8%A5%D8%B9%D8%AF%D8%A7%D8%AF-%D8%A7%D9%84%D8%A7%D8%A8%D8%AA%D8%AF%D8%A7%D8%A6%D9%8A-%D9%84%D8%AE%D8%A7%D8%AF%D9%88%D9%85-%D8%A3%D9%88%D8%A8%D9%86%D8%AA%D9%88-1404-r4/">درسنا حول إعداد خادوم أوبونتو 14.04 الابتدائي</a>.</p><p>ستحتاج أيضًا إلى تثبيت خادوم Apache. إذا لم تقم بالفعل بتثبيته وتشغيله فقم بتطبيق الأوامر التالية:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">sudo apt-get update
sudo apt-get install apache2</pre><h2>الخطوة الأولى: تفعيل وحدة SSL</h2><p>يأتي دعم SSL افتراضيًا بالواقع مع حزمة Apache على أوبونتو 14.04. نحتاج فقط أن نقوم بتفعيله بكلّ بساطة لكي نستفيد من مميزات SSL على خادومنا.</p><p>لتفعيله، قم بالأمر التالي:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">sudo a2enmod ssl</pre><p>بعد أن تقوم بتفعيل SSL، سيجب عليك إعادة تشغيل خادوم الويب ليتم تطبيق التغييرات:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">sudo service apache2 restart</pre><p>بعد هذا، سيكون خادومنا قادرًا على استخدام SSL في حال قمنا بضبطه ليقوم بذلك.</p><h2>الخطوة الثانية: إنشاء شهادة SSL موقعة ذاتيا</h2><p>فلنبدأ عبر إنشاء مسار فرعي ضمن مجلّد إعدادات خادوم Apache لنضع ملفّات الشهادة التي سنقوم بإنشائها فيه:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">sudo mkdir /etc/apache2/ssl</pre><p>والآن وبعد أن قمنا بإنشاء ذلك المسار، يمكننا أن نقوم بإنشاء تلك الملفّات بأمر واحد وهو:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/apache2/ssl/apache.key -out /etc/apache2/ssl/apache.crt</pre><p>فلنتعرّف على ما يعنيه الأمر السابق:</p><ul><li><strong>openssl</strong>: هذا هو الأمر الأساسي الذي يتم توفيره بواسطة OpenSSL لإنشاء وإدارة الشهادات، المفاتيح وطلبات التوقيع.. إلخ.</li><li><strong>req</strong>: يقوم هذا بتحديد أمرٍ فرعي لإدارة طلب توقيع شهادة X.509 (CSR). X.509 هو معيار بنية تحتية للمفاتيح العمومية تستخدمه SSL لإدارة الشهادات والمفاتيح. بما أننا نريد <em>إنشاء</em> شهادة X.509 جديدة، فإنّ هذا هو ما نريده.</li><li><strong>x509-</strong>: يقوم هذا الخيار بتحديد أننا نريد إنشاء ملفّ شهادة موقّعة ذاتيًا عوضًا عن إنشاء طلب شهادة.</li><li><strong>nodes-</strong>: يخبر هذا الخيار OpenSSL بأننا لا نريد تأمين ملفّ المفتاح الخاصّ بنا بجملة مرور، لأنّ استخدام هذا الخيار سيعترض طريق خادوم أباتشي عندما يتم تشغيله تلقائيًا حيث أنّه يجب علينا إدخال جملة المرور في كلّ مرّة يبدأ فيها الخادوم وفي كلّ مرّة يتم فيها إعادة تشغيله.</li><li><strong>days 365-</strong>: يحدد هذا أنّ الشهادة التي سنقوم بإنشائها صالحة لمدّة 365 يومًا.</li><li><strong>newkey rsa:2048-</strong>: سينشئ هذا الخيار طلب الشهادة ومفتاحًا خاصًّا جديدًا في الوقت ذاته. هذا ضروري جدًا بما أننا لم نقم بإنشاء مفتاحٍ خاصّ مسبقًا. يقوم <strong>rsa:2048</strong> بإخبار OpenSSL بأن يقوم بتوليد مفتاح RSA بطول 2048 بت.</li><li><strong>keyout-</strong>: يسمّي هذا المُعامِل الملفّ الناتج لملفّ المفتاح الخاصّ الذي يتم إنشاؤه.</li><li><strong>out-</strong>: يسمّي هذا الخيار ملفّ الشهادة الناتج الذي نقوم بإنشائه.</li></ul><p>عندما تقوم بضغط زرّ <span style="font-family:courier new,courier,monospace;">Enter</span> فسيتم سؤالك بضع أسئلة.</p><p>أهمّ واحدٍ منها هو ذاك السؤال الذي يسألك عن الـ"Common Name". يجب أن تقوم بإدخال اسم نطاقك الذي تريد استخدامه مع الشهادة هنا، أو عنوان الـIP العام إذا كنتَ لا تمتلك نطاقًا بعد.</p><p>أجوبة الأسئلة ستبدو شيئًا كهذا:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">Country Name (2 letter code) [AU]:US
State or Province Name (full name) [Some-State]:New York
Locality Name (eg, city) []:New York City
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Your Company
Organizational Unit Name (eg, section) []:Department of Kittens
Common Name (e.g. server FQDN or YOUR name) []:your_domain.com
Email Address []:your_email@domain.com</pre><p>سيتم إنشاء الشهادة والمفتاح في مسار <span style="font-family:courier new,courier,monospace;">etc/apache2/ssl/</span>.</p><h2>الخطوة الثالثة: إعداد Apache ليستخدم SSL</h2><p>الآن وبعد أن أصبح ملفّا الشهادة والمفتاح متوفّرين، يمكننا الآن ضبط خادوم أباتشي ليستخدم هذه الملفّات ضمن ملفّ مستضيف وهمي (virtual host file). يمكنك تعلّم المزيد عن <a href="https://academy.hsoub.com/devops/servers/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%B6%D8%A8%D8%B7-%D8%A7%D9%84%D9%85%D8%B3%D8%AA%D8%B6%D9%8A%D9%81%D8%A7%D8%AA-%D8%A7%D9%84%D8%A7%D9%81%D8%AA%D8%B1%D8%A7%D8%B6%D9%8A%D8%A9-%D9%81%D9%8A-%D8%AE%D8%A7%D8%AF%D9%88%D9%85-%D9%88%D8%A8-apache-%D8%B9%D9%84%D9%89-%D8%A3%D9%88%D8%A8%D9%86%D8%AA%D9%88-1404-r10/">كيفيّة إعداد واحد من موقعنا</a>.</p><p>عوضًا عن وضع إعداداتنا كلّها في ملفّ <span style="font-family:courier new,courier,monospace;">000-default.conf</span> في مجلّد <span style="font-family:courier new,courier,monospace;">sites-available</span> الفرعي، فسنقوم بوضع هذه الإعدادات في ملفّ <span style="font-family:courier new,courier,monospace;">default-ssl.conf</span> والذي يحوي إعدادات SSL الافتراضية.</p><p>افتح الملفّ بصلاحيات الجذر عبر:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">sudo nano /etc/apache2/sites-available/default-ssl.conf</pre><p>يجب أن يبدو الملفّ كالتالي (بعد إزالة التعليقات):</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">&lt;IfModule mod_ssl.c&gt;
    &lt;VirtualHost _default_:443&gt;
        ServerAdmin webmaster@localhost
        DocumentRoot /var/www/html
        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined
        SSLEngine on
        SSLCertificateFile /etc/ssl/certs/ssl-cert-snakeoil.pem
        SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key
        &lt;FilesMatch "\.(cgi|shtml|phtml|php)$"&gt;
                        SSLOptions +StdEnvVars
        &lt;/FilesMatch&gt;
        &lt;Directory /usr/lib/cgi-bin&gt;
                        SSLOptions +StdEnvVars
        &lt;/Directory&gt;
        BrowserMatch "MSIE [2-6]" \
                        nokeepalive ssl-unclean-shutdown \
                        downgrade-1.0 force-response-1.0
        BrowserMatch "MSIE [17-9]" ssl-unclean-shutdown
    &lt;/VirtualHost&gt;
&lt;/IfModule&gt;</pre><p>قد يبدو هذا معقّدًا قليلًا، ولكن لحسن الحظّ فإننا لا نحتاج إلى تعديل معظم الخيارات هنا.</p><p>نريد فقط إعداد الأمور العادية التي نريدها ضبطها للمستضيف الوهمي (مدير الخادوم، اسم الخادوم، اختصار الخادوم، المسار الجذر.. إلخ) بالإضافة إلى تغيير المكان الذي يبحث فيه أباتشي عن شهادة الـSSL والمفتاح.</p><p>في النهاية، سيبدو الملفّ كالتالي:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">&lt;IfModule mod_ssl.c&gt;
    &lt;VirtualHost _default_:443&gt;
        ServerAdmin admin@example.com
        ServerName your_domain.com
        ServerAlias www.your_domain.com
        DocumentRoot /var/www/html
        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined
        SSLEngine on
        SSLCertificateFile /etc/apache2/ssl/apache.crt
        SSLCertificateKeyFile /etc/apache2/ssl/apache.key
        &lt;FilesMatch "\.(cgi|shtml|phtml|php)$"&gt;
                        SSLOptions +StdEnvVars
        &lt;/FilesMatch&gt;
        &lt;Directory /usr/lib/cgi-bin&gt;
                        SSLOptions +StdEnvVars
        &lt;/Directory&gt;
        BrowserMatch "MSIE [2-6]" \
                        nokeepalive ssl-unclean-shutdown \
                        downgrade-1.0 force-response-1.0
        BrowserMatch "MSIE [17-9]" ssl-unclean-shutdown
    &lt;/VirtualHost&gt;
&lt;/IfModule&gt;</pre><p>احفظ الملفّ واخرج عندما تنتهي.</p><h2>الخطوة الرابعة: تفعيل شهادة SSL للمستضيف الوهمي</h2><p>الآن وبعد أن قمنا بضبط المستضيف الوهمي الذي أعددناه ليستخدم SSL افتراضيًا، يجب عليك أن نقوم بتفعيله.</p><p>يمكننا القيام بذلك ببساطة عبر تنفيذ:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">sudo a2ensite default-ssl.conf</pre><p>ومن ثمّ، سيجب عليك إعادة تشغيل خادوم أباتشي لتحميل ملفّ إعدادات المستضيف الجديد:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">sudo service apache2 restart</pre><p>يجب أن يتمَّ الآن تفعيل المستضيف الوهمي الجديد الخاصّ بك، والذي سيخدم المحتوى المشفّر باستخدام شهادة SSL التي قمتَ بإنشائها.</p><h2>الخطوة الخامسة: اختبر إعداداتك</h2><p>الآن وبعد أن قمتَ بإعداد كلّ شيء، يمكنك اختبار إعداداتك عبر زيارة اسم النطاق الخاصّ بك أو عنوان الـIP بعد كتابة <span style="font-family:courier new,courier,monospace;">//:https</span> قبله، كالتالي:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">https://اسم_النطاق_أو_عنوان_الآي_بي</pre><p>سترى رسالة تنبيه أنّ متصفّحك لم يتمكّن من التحقق من هوية خادومك لأنّه لم يتم توقيع الشهادة الخاصّة به من قبل جهة من الجهات التي يثق بها ذلك المتصفّح.</p><p style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_08/001.png.39d408d6bca5e2a54ac3864f0c42d484.png"><img data-fileid="4260" class="ipsImage ipsImage_thumbnailed" alt="001.thumb.png.e8e5e6fed7a13f5588fc404ac1" src="https://academy.hsoub.com/uploads/monthly_2015_08/001.thumb.png.e8e5e6fed7a13f5588fc404ac1e931f8.png"></a></p><p>هذه رسالة متوقّعة بمّا أنّ شهادتنا هي شهادة موقّعة ذاتيًا (self-signed). صحيحٌ أّنّه لن يكون من الممكن استخدام شهادتنا للتحقق من هوية خادومنا، إلّا أنّ الخادوم سيزال قادرًا على التواصل المشفّر.</p><p>بمّا أنّ هذه الرسالة هي رسالة متوقّعة، فيمكنك الضغط على زرّ "المتابعة على كلّ حال" أو "Proceed anyway" أو أيّ خيار مشابه تجده أمامك للمتابعة.</p><p>سيتم أخذك بعدها إلى قيمة خيار DocumentRoot التي قمتَ بإعدادها مسبقًا في ملفّ إعدادات SSL الخاصّ بالمستضيف الوهمي. الآن هكذا، أصبح تدفّق البيانات الخاصّ بك مشفّرًا. يمكنك التحقق من ذلك عبر الضغط على أيقونة القفل الموجودة في شريط العنوان:</p><p style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_08/002.png.49601350d764e862c87577c900a856bd.png"><img data-fileid="4261" class="ipsImage ipsImage_thumbnailed" alt="002.thumb.png.f3b3fd244e285403c6f6dd6c95" src="https://academy.hsoub.com/uploads/monthly_2015_08/002.thumb.png.f3b3fd244e285403c6f6dd6c95cf996e.png"></a></p><p>يمكنك أن ترى ذلك القسم الأخضر في المنتصف الذي يخبرك أنّ الاتصال مشفّر.</p><h2>الخاتمة</h2><p>يجب أن تمتلك SSL مفعّلةً الآن على خادومك. ستساعدك على تأمين الاتصال بين موقعك وبين الزوّار، ولكنّ المتصفّحات ستقوم بتحذير كلّ مستخدم يزور موقعك بخصوص شهادة خادومك وأنّه غير قادر على التحقق منها.</p><p>إذا كنتَ تخطط لإطلاق موقع للعموم وتحتاج SSL، فإنّه يجب عليك شراء شهادة SSL من جهة شهادات موثوقة لموقعك.</p><p>يمكنك قراءة المزيد من الدروس حول <a href="https://academy.hsoub.com/devops/servers/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%B6%D8%A8%D8%B7-%D8%A7%D9%84%D9%85%D8%B3%D8%AA%D8%B6%D9%8A%D9%81%D8%A7%D8%AA-%D8%A7%D9%84%D8%A7%D9%81%D8%AA%D8%B1%D8%A7%D8%B6%D9%8A%D8%A9-%D9%81%D9%8A-%D8%AE%D8%A7%D8%AF%D9%88%D9%85-%D9%88%D8%A8-apache-%D8%B9%D9%84%D9%89-%D8%A3%D9%88%D8%A8%D9%86%D8%AA%D9%88-1404-r10/">كيفية إعداد خادوم أباتشي</a> أو <a href="https://academy.hsoub.com/devops/servers/%D9%85%D9%82%D8%AF%D9%91%D9%85%D8%A9-%D9%81%D9%8A-%D8%AA%D8%A3%D9%85%D9%8A%D9%86-%D8%AE%D8%A7%D8%AF%D9%88%D9%85-%D9%84%D9%8A%D9%86%D9%83%D8%B3-r51/">تأمين خادومك</a>.</p><p>ترجمة -وبتصرف- للمقال: <a rel="external nofollow" href="https://www.digitalocean.com/community/tutorials/how-to-create-a-ssl-certificate-on-apache-for-ubuntu-14-04">How To Create a SSL Certificate on Apache for Ubuntu 14.04</a> لصاحبه: Justin Ellingwood.</p><p>حقوق الصورة البارزة: <a rel="external nofollow" href="http://www.freepik.com/free-vector/protection-infographic_793799.htm">Designed by Freepik</a>.</p>
]]></description><guid isPermaLink="false">104</guid><pubDate>Sat, 29 Aug 2015 21:00:00 +0000</pubDate></item><item><title>&#x643;&#x64A;&#x641; &#x62A;&#x636;&#x628;&#x637; OPcache &#x644;&#x644;&#x62A;&#x62E;&#x632;&#x64A;&#x646; &#x627;&#x644;&#x645;&#x624;&#x642;&#x62A; &#x639;&#x644;&#x649; &#x62E;&#x627;&#x62F;&#x648;&#x645; &#x648;&#x64A;&#x628; Apache</title><link>https://academy.hsoub.com/devops/servers/web/apache/%D9%83%D9%8A%D9%81-%D8%AA%D8%B6%D8%A8%D8%B7-opcache-%D9%84%D9%84%D8%AA%D8%AE%D8%B2%D9%8A%D9%86-%D8%A7%D9%84%D9%85%D8%A4%D9%82%D8%AA-%D8%B9%D9%84%D9%89-%D8%AE%D8%A7%D8%AF%D9%88%D9%85-%D9%88%D9%8A%D8%A8-apache-r52/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2015_05/php-opcache-apache.png.62a80047e01583c76661318d40e85b40.png" /></p>

<h2 id="ما-هو-opcache">
	ما هو OPcache؟
</h2>

<p>
	يحتاج كلّ طلب Request في PHP إلى أن يُحلَّل Parsed، يُترجَم Compiled ثمّ يُنفَّذ Executed؛ لكن في حالات عديدة تؤدّي الطّلبات دائمًا إلى نفس النّتائج، وهو ما يعني أن الخادوم يكرّر في كلّ مرة الخطوات الثّلاث المذكورة دون حاجة لذلك. هنا يأتي دور أدوات التّخزين المؤقَّت للشّيفرة العمليّة Opcode (اختصار ل Operation code، وهو ناتج التّحليل ثمّ التّرجمة أي الصّيغة الّتي يُنفَّذ بها الطّلب)، ومن بينها OPcache.
</p>

<p>
	يتلخَّص عمل OPcache في الاحتفاظ بالشيفرة العمليّة في ذاكرة الوصول العشوائي RAM وتنفيذها - عند إعادة الطّلب - من الذّاكرة مباشرةً دون الحاجة للمرور بخطوتَيْ التّحليل والتّرجمة؛ وهو ما يعني اختصار الخطوات والتّقليل من حِمل العمل، غير الضّروريّ، على الخادوم.
</p>

<p>
	نفترض في هذا الدّرس وجود <a href="http://academy.hsoub.com/devops/servers/%D9%83%D9%8A%D9%81-%D8%AA%D9%8F%D8%AB%D8%A8%D9%91%D9%90%D8%AA-%D8%AD%D9%90%D8%B2%D9%85-mysql%D8%8C-apache%D8%8C-linux-lamp-%D9%88php-%D8%B9%D9%84%D9%89-ubuntu-1404-r27/" rel="">حزم LAMP مثبَّتة ومضبوطة على خادومك</a>.
</p>

<h2 id="تفعيل-opcache">
	تفعيل OPcache
</h2>

<p>
	تأتي أداة OPcache مضمَّنةً في الإصدار 5.5 من PHP.
</p>

<p>
	الأمر التّالي يُظهر إصدار <code>PHP</code> المستخدَم:
</p>

<pre class="ipsCode prettyprint" data-pbcklang="" data-pbcktabsize="">
php -v</pre>

<p>
	عندي مثلًا:
</p>

<pre class="ipsCode prettyprint" data-pbcklang="" data-pbcktabsize="">
PHP 5.5.9-1ubuntu4.9 (cli) (built: Apr 17 2015 11:44:57) 
Copyright (c) 1997-2014 The PHP Group
Zend Engine v2.5.0, Copyright (c) 1998-2014 Zend Technologies
    with Zend OPcache v7.0.3, Copyright (c) 1999-2014, by Zend Technologies</pre>

<p>
	لاحظ السّطر الأخير:
</p>

<pre class="ipsCode prettyprint" data-pbcklang="" data-pbcktabsize="">
with Zend OPcache v7.0.3, Copyright (c) 1999-2014, by Zend Technologies</pre>

<p>
	يخبرنا هذا السّطر أن <code>OPache</code> مُثبَّت؛ وأنّ الإصدار المستخدَم هو <code>7.0.3</code>.
</p>

<p>
	إذا اتّبعت خطوات <a href="http://academy.hsoub.com/devops/servers/%D9%83%D9%8A%D9%81-%D8%AA%D9%8F%D8%AB%D8%A8%D9%91%D9%90%D8%AA-%D8%AD%D9%90%D8%B2%D9%85-mysql%D8%8C-apache%D8%8C-linux-lamp-%D9%88php-%D8%B9%D9%84%D9%89-ubuntu-1404-r27/" rel="">كيف تُثبِّت وتؤمِّن phpMyAdmin على Ubuntu 14.04</a> فستجد أنّ OPcache مُفعَّل. للتّأكّد ننشئ ملفّ <code>info.php</code> (راجِع الدّرس السّابق) ثمّ ندخل إلى العنوان
</p>

<pre class="html ipsCode prettyprint" data-pbcklang="html" data-pbcktabsize="4">
http://domain_or_ip/info.php</pre>

<p>
	حيث <code>domain_or_ip</code> نطاق أو عنوان IP الخادوم. في صفحة معلومات الخادوم نبحث عن بعض التّفاصيل.
</p>

<div class="figure">
	<p class="caption">
		<img alt="" class="ipsImage ipsImage_thumbnailed" data-fileid="o_19lhc0fqqn4i1rhp2vlomgm5ar" src=""><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_05/01_opcache_parsed.png.f30fb8cf582698fe1ccf94f54c27da74.png" data-fileid="2052" rel="external"><img alt="01_opcache_parsed.png" class="ipsImage ipsImage_thumbnailed" data-fileid="2052" src="https://academy.hsoub.com/uploads/monthly_2015_05/01_opcache_parsed.thumb.png.83f7dfa3cfa1e52ebe6377a46d00dcbf.png" style="width: 700px; height: 259px; border: 0px solid black; margin: 1px;"></a>
	</p>
</div>

<p>
	يُمكن ملاحظة أنّ ملفّ إعداد خادوم الويب المستخدَم هو <code>etc/php5/apache2/php.ini/</code> وأنّ خادوم الويب يبحث عن ملفّات إعداد إضافيّة في المجلَّد <code>etc/php5/apache2/conf.d/</code>؛ تظهر ملفّات الإعداد الموجودة في هذا المجلّد ضمن خانة Additional .ini files parsed، ومن بينها الملفّ <code>etc/php5/apache2/conf.d/05-opcache.ini/</code>. يتحكّم هذا الملفّ في إعداد OPcache كما سنرى.
</p>

<p>
	إذا نزلنا أسفل الصّفحة فسنجد فقرات خاصّة ب OPcache:
</p>

<div class="figure">
	<p class="caption">
		<a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_05/02_zend_Opcache.png.39539571e5efb4dffb9c9c5a62302e6e.png" rel="external" data-fileid="2053"><img alt="02_zend_Opcache.png" class="ipsImage ipsImage_thumbnailed" data-fileid="2053" src="https://academy.hsoub.com/uploads/monthly_2015_05/02_zend_Opcache.thumb.png.aa974c8b4b85fa6eb7fe2923b76741e3.png"></a>
	</p>
</div>

<p>
	ما يهمّنا الآن من هذه الفقرة هو السّطر الأوّل:
</p>

<pre class="ipsCode prettyprint" data-pbcklang="" data-pbcktabsize="">
Opcode Caching  Up and Running</pre>

<p>
	أي أنّ التّخزين المؤقَّت مُفعَّل ويعمل.
</p>

<h2 id="إعداد-opcache">
	إعداد OPcache
</h2>

<p>
	توجد خيّارات عديدة لضبط آليّة عمل OPcache. سنتعرّض في هذه الفقرة لأهمّها. يقدّم توثيق PHP قائمة ب<a href="http://php.net/manual/en/opcache.configuration.php" rel="external nofollow">جميع الخيّارات الموجودة</a>.
</p>

<h3 id="حجم-ذاكرة-التخزين-المؤقت">
	1- حجم ذاكرة التّخزين المؤقّت
</h3>

<p>
	تُحدّد تعليمة <code>opcache.memory_consumption</code> حجم الذّاكرة المخصَّصة لاستخدام OPcache، حيثُ تُخزّن الشيفرة العمليّة لسكربتات PHP. تُضاف هذه التّعليمة إلى ملفّ إعداد OPcache الموجد على المسار <code>etc/php5/apache2/conf.d/05-opcache.ini/</code>. نفتح الملفّ للتّحرير:
</p>

<pre class="ipsCode prettyprint" data-pbcklang="" data-pbcktabsize="">
sudo nano /etc/php5/apache2/conf.d/05-opcache.ini</pre>

<p>
	محتوى الملفّ:
</p>

<pre class="ipsCode prettyprint" data-pbcklang="" data-pbcktabsize="">
; configuration for php ZendOpcache module
; priority=05
zend_extension=opcache.so</pre>

<p>
	<strong>ملحوظة:</strong> لتعطيل OPcache أضف علامة <code>;</code> أما سطر <code>zend_extension=opcache.so</code>؛ ثمّ أعد تشغيل خادوم ويب Apache. ستلاحظ أنّ صفحة المعلومات لم تعد تظهر البيانات المتعلّقة ب Zend OPcache.
</p>

<p>
	نُضيف تعليمة <code>opcache.memory_consumption</code> ونحدّد قيمتها، علمًا أنّ القيمة الافتراضيّة هي 64MB. مثلًا، التّعليمة التّاليّة تحدّد حجم ذاكرة التّخزين المؤقّت ب128 ميغا بايت:
</p>

<pre class="ipsCode prettyprint" data-pbcklang="" data-pbcktabsize="">
opcache.memory_consumption=128</pre>

<p>
	ينصح التّوثيق الرّسمي لOPcache بإعطاء قيمة 128 لهذه التّعليمة، إلّا أنّ الأمر يعتمد على قدرات خادومك ونوعيّة وعدد التّطبيقات والخدمات العاملة عليه.
</p>

<h3 id="الحد-الأقصى-لعدد-الملفات-المخزنة">
	2- الحدّ الأقصى لعدد الملفّات المُخزّنة
</h3>

<p>
	تُتيح تعليمة <code>opcache.max_accelerated_file</code> تحديد عدد أقصى للملفّات المحتفظ بها في ذاكرة التّخزين المؤقَّت. القيمة المنصوح بها هي <code>4000</code>:
</p>

<pre class="ipsCode prettyprint" data-pbcklang="" data-pbcktabsize="">
opcache.max_accelerated_files=4000</pre>

<h3 id="المدة-اللازمة-للتحقق-من-وجود-تغيير-على-برنامج-مخزن-في-الذاكرة">
	3- المدّة اللّازمة للتّحقّق من وجود تغيير على برنامج مُخزَّن في الذّاكرة
</h3>

<p>
	تُحدّد تعليمة <code>opcache.revalidate_freq</code> مدّة زمنيّة (بالثّانيّة) يُتحقّق بعد انقضائها من وجود تغييرات على الملفّ المخزّن في ذاكرة الوصول العشوائيّ؛ إذا كان الاختبار إيجابيًّا، أي حدث تغيير، فإنّ الملفّ يُعاد تحليله وترجمته قبل أن يُخزّن من جديد. يُنصَح بقيمة <code>60</code> لهذه التّعليمة:
</p>

<pre class="ipsCode prettyprint" data-pbcklang="" data-pbcktabsize="">
opcache.revalidate_freq=60</pre>

<p>
	<strong>ملحوظة:</strong> إضافة علامة <code>;</code> في بداية سطر يعني تجاهلَه. في هذه الحالة، إذا كان السّطر يحوي تعليمة فلن تؤخَذ في الحسبان.
</p>

<p>
	يظهر الملفّ الآن بالمحتوى التّالي:
</p>

<pre class="ipsCode prettyprint" data-pbcklang="" data-pbcktabsize="">
; configuration for php ZendOpcache module
; priority=05
zend_extension=opcache.so
opcache.memory_consumption=128
opcache.max_accelerated_files=4000
opcache.revalidate_freq=60</pre>

<p>
	لم يتبقّ إلا إعادة تشغيل خادوم الويب لتفعيل الخيّارات:
</p>

<pre class="ipsCode prettyprint" data-pbcklang="" data-pbcktabsize="">
sudo service apache2 restart</pre>

<p>
	ملحوظة: يمكن التّأكّد من عبر صفحة <code>info.php</code> حيث تظهر قيمة الخيّارات أعلاه في خانات بنفس أسماء الخيّارات.
</p>

<h2 id="خاتمة">
	خاتمة
</h2>

<p>
	يُساعد استخدام أداة OPcache في تحسين أداء الخادوم بشكل ملحوظ والاستفادة القصوى من موارد الجهاز. حاول - بحذر - تجربة إعدادات مختلفة وتفحّص تأثيراتها على الأداء حتى تجد الإعداد الأكثر مناسبةً لبيئة عملك. إذا أردت مواصلة التّحسين فدرس <a href="http://academy.hsoub.com/devops/linux/%D9%83%D9%8A%D9%81%D9%8A%D9%91%D8%A9-%D8%AA%D8%AB%D8%A8%D9%8A%D8%AA-%D9%88%D8%A5%D8%B9%D8%AF%D8%A7%D8%AF-%D8%A7%D9%84%D8%B0%D9%91%D8%A7%D9%83%D8%B1%D8%A9-%D8%A7%D9%84%D9%85%D9%8F%D8%AE%D8%A8%D9%91%D8%A6%D8%A9-memcache-%D8%B9%D9%84%D9%89-ubuntu-r47/" rel="">كيفيّة تثبيت وإعداد الذّاكرة المُخبّئة (Memcache) على Ubuntu</a> خطوة جيّدة في هذا المجال.
</p>
]]></description><guid isPermaLink="false">52</guid><pubDate>Tue, 19 May 2015 18:05:00 +0000</pubDate></item><item><title>&#x643;&#x64A;&#x641;&#x64A;&#x629; &#x636;&#x628;&#x637; &#x627;&#x644;&#x645;&#x633;&#x62A;&#x636;&#x64A;&#x641;&#x627;&#x62A; &#x627;&#x644;&#x627;&#x641;&#x62A;&#x631;&#x627;&#x636;&#x64A;&#x629; &#x641;&#x64A; &#x62E;&#x627;&#x62F;&#x648;&#x645; &#x648;&#x64A;&#x628; Apache &#x639;&#x644;&#x649; &#x623;&#x648;&#x628;&#x646;&#x62A;&#x648; 14.04</title><link>https://academy.hsoub.com/devops/servers/web/apache/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%B6%D8%A8%D8%B7-%D8%A7%D9%84%D9%85%D8%B3%D8%AA%D8%B6%D9%8A%D9%81%D8%A7%D8%AA-%D8%A7%D9%84%D8%A7%D9%81%D8%AA%D8%B1%D8%A7%D8%B6%D9%8A%D8%A9-%D9%81%D9%8A-%D8%AE%D8%A7%D8%AF%D9%88%D9%85-%D9%88%D9%8A%D8%A8-apache-%D8%B9%D9%84%D9%89-%D8%A3%D9%88%D8%A8%D9%86%D8%AA%D9%88-1404-r10/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2015_03/Apache_HTTP_SERVER.png.064d0da5e444902a3cc36ca0092f445f.png" /></p>

<p dir="rtl">يُعتبَر خادوم ويب Apache الوسيلة الأكثر شعبيةً لتقديم المحتوى على شبكة الإنترنت، حيثُ يستعمله أكثر من نصف مواقع الويب على الشبكة لقدرته الفائقة ومرونته العالية.</p><p dir="rtl">يُقسِّم خادوم Apache وظائفَه والعناصر التي تُكوِّنه إلى عدة وحدات يُمكِن تخصيصها وإعدادُها بشكل مستقل. تُسمَّى الوحدة الأساسية - التي تُمثِّل نطاقًا Domain أو موقع ويب - مُستضيفًا افتراضيًا Virtual host. تُتيح المُستضيفات الافتراضية إمكانية استضافة عدة نطاقات أو مواقع ويب على نفس العنوان باستخدام آليةٍ للمطابقة بين مُستضيف افتراضي وموقع ويب. تُناسِب هذه الطّريقة أي شخص يُريد استضافة عدة مواقع على نفس الخادوم الافتراضي الخاص Virtual private server, VPS.</p><p dir="rtl">يُوجِّه كل واحد من النطاقات المضبوطة الزائرَ إلى مجلَّد مُحدَّد توجد به معلومات الموقع المطلوب دون أن يُشيرَ أبدًا إلى أن مواقع أخرى تُدار على نفس الخادوم. يُمكِن بطريقة المستضيفات الافتراضية ضبط عدد غير محدود من المواقع على نفس الخادوم ما دام يتحمّل عبئ الحِمل Load الذي تُمثِّله هذه المواقع.</p><p dir="rtl">سنعرِض في هذا المقال طريقة إعداد مستضيفات افتراضية على خادوم ويب Apache يعمل على خادوم افتراضي خاص مع توزيعة أوبنتو 14.04. ستتعلَّم كيف تُقدِّم محتوى مختلِفا لزوّار متعدِّدين حسب النطاق الذي يطلبونه.</p><h2 dir="rtl">المتطلبات</h2><p dir="rtl">قبل البدء في هذا الدّرس يجب إنشاء مستخدم آخر غير المستخدِم الجذر Root user كما هو موضَّح في الخطوات من 1 إلى 4 من الدرس <a href="https://academy.hsoub.com/devops/servers/%D8%A7%D9%84%D8%A5%D8%B9%D8%AF%D8%A7%D8%AF-%D8%A7%D9%84%D8%A7%D8%A8%D8%AA%D8%AF%D8%A7%D8%A6%D9%8A-%D9%84%D8%AE%D8%A7%D8%AF%D9%88%D9%85-%D8%A3%D9%88%D8%A8%D9%86%D8%AA%D9%88-1404-r4/">الإعداد الابتدائي لخادوم أوبنتو</a>.</p><p dir="rtl">ستحتاج أيضًا إلى تثبيت خادوم ويب Apache لمتابعة الخطوات المذكروة في هذا الدّرس. إن لم تكُن ثبَّت البرنامج حتى الآن يُمكنك ذلك باستخدام أداة <span style="font-family:courier new,courier,monospace;">apt-get</span> كما يلي:</p><pre class="php ipsCode prettyprint">sudo apt-get update
sudo apt-get install apache2</pre><p>بعد استكمال هذه الخطوات يُمكننا البدء.</p><p dir="rtl">سنُنشئ خلال هذا الدرس مستضيفَيْن افتراضييْن، واحد للنطاق <span style="font-family:courier new,courier,monospace;">example.com</span> والآخر لـ <span style="font-family:courier new,courier,monospace;">test.com</span>. أثناء إعداد مستضيفاتك الافتراضية استخدِم النطاقات الخاصّة بك مكان المثاليْن المذكوريْن هنا.</p><p dir="rtl">سنُريك خلال هذا الدّرس كيف تُحرِّر ملف المستضيفات على جهازك الشخصي Local hosts file لاختبار إعداداتك إن كنتَ تستخدم نطاقات وهمية. ستتمكَّن بهذه الطريقة من تجربة الإعدادات من جهازك الشخصي رغم أن المحتوى لن يكون مُتاحا لزوّار آخرين عبر النطاق الوهمي.</p><h2 dir="rtl">الخطوة الأولى - أنشئ بنية المجلد Directory structure</h2><p dir="rtl">أول خطوة نقوم بها هي إنشاء بنية المجلَّد الذي سيحوي بيانات الموقِع الذي ننوي تقديمه إلى الزّوّار.</p><p dir="rtl">يُعرَّف مبدأ المستند Document root بأنه المجلّد الأعلى مستوًى Top-level directory الذي سيبحث فيه خادوم وب Apache عن محتوى الموقع. بالنسبة لمثالنا سننشئ مبدأ مستند (مجلَّد) داخل المسار <span style="font-family:courier new,courier,monospace;">var/www/ </span>لكلٍّ من المستضيفين الافتراضيّين الذين نعدهما. داخل كل من المجلَّدين نُنشئ مجلَّدًا باسم<span style="font-family:courier new,courier,monospace;"> public_html</span>، وهو المجلَّد الذي سيحوي ملفات الموقع وهو ما يمنح بعض المرونة في الاستضافة.</p><p dir="rtl">لتطبيق ما ورد في الفقرة أعلاه نُنفِّذ الأوامر التالية:</p><pre class="php ipsCode prettyprint">sudo mkdir -p /var/www/example.com/public_html
sudo mkdir -p /var/www/test.com/public_html</pre><p>في الأمرين السابقين يظهر كل من النطاقين الذين نريد تقديمهما من خادومنا الافتراضي الخاص باللون الأحمر.</p><h2 dir="rtl">الخطوة الثانية - امنح الأذونات Permissions</h2><p dir="rtl">أنشأنا في الخطوة الأولى بنية المجلَّدات، لكن هذه المجلَّدات مملوكة من المستخدِم الجذر، نظرا لاستخدام sudo أمام أمر إنشاء المجلّد. إن أردنا إعطاء المستخدِم العادي القدرة على تحرير الملفات الموجودة في مجلَّد الوب فبإمكاننا تغيير مُلكية هذه المجلّدات عن طريق الأمر:</p><pre class="php ipsCode prettyprint">sudo chown -R $USER:$USER /var/www/example.com/public_html
sudo chown -R $USER:$USER /var/www/test.com/public_html</pre><p>عند تنفيذ الأمر - بالضغط على زر Enter - فإن المتغيّر <span style="font-family:courier new,courier,monospace;">USER$</span> سيُبدَل بقيمته وهي اسم المستخدِم الحالي. ينتج عن الأمر تغيير ملكية المجلَّد <span style="font-family:courier new,courier,monospace;">public_html</span> الذي يتضمّن محتوى الموقِع فيُصبِح المستخدم الحالي هو المالك بدلا من المستخدِم الجذر.</p><p dir="rtl">سيتوجّب علينا أيضًا تغيير الأذونات قليلًا للتأكد من أنّ إذن القراءة متاح من مجلّد الويب العام (<span style="font-family:courier new,courier,monospace;">var/www/</span>) وكل الملفات الموجودة داخله أو داخل المجلّدات المتفرّعة منه حتى يُقدَّم المحتوى بشكل صحيح:</p><pre class="php ipsCode prettyprint">sudo chmod -R 755 /var/www</pre><p dir="rtl">لدى خادوم الويب الآن الأذونات التي يحتاجها لتقديم المحتوى، ولدى المستخدم أيضا القدرة على إنشاء وتحرير المجلَّدات التي يحتاجها.</p><h2 dir="rtl">الخطوة الثالثة - أنشئ صفحات تجريبية Demo pages لكل مستضيف افتراضي</h2><p dir="rtl">في هذه الخطوة سننشئ محتوى لتقديمه. الهدف من إنشاء المحتوى في هذه الخطوة توضيحي، لذا ستكون الصفحات بسيطة جدا: <span style="font-family:courier new,courier,monospace;">index.html</span> لكل موقع.</p><p dir="rtl">سنبدأ بـ <span style="font-family:courier new,courier,monospace;">example.com</span>. نستطيع إنشاء وتحرير ملف<span style="font-family:courier new,courier,monospace;"> index.html</span> عن طريق محرِّر nano عبر الأمر التالي:</p><pre class="php ipsCode prettyprint">nano /var/www/example.com/public_html/index.html</pre><p>أضف مستنَد HTML بسيطًا يُبرز اسم الموقع. يظهر الملف بالشكل التالي:</p><pre class="html ipsCode prettyprint">&lt;html&gt;
&lt;head&gt;
  &lt;meta http-equiv="content-type" content="text/html; charset=utf-8" /&gt;
  &lt;title&gt; Example.com أهلًا بك في موقع&lt;/title&gt;
&lt;/head&gt;

&lt;body dir="rtl"&gt;
  &lt;h1&gt;هنيئا لك! المُستضيف الافتراضي Example.com يعمل بشكل صحيح&lt;/h1&gt;
&lt;/body&gt;
&lt;/html&gt;</pre><p>احفظ الملف (<span style="font-family:courier new,courier,monospace;">Ctrl+O</span> ثم زر Enter) ثم أغلقه بعد الانتهاء من تحريره (<span style="font-family:courier new,courier,monospace;">Ctrl+x</span>).</p><p dir="rtl">ننسخ الملف ليكون أساس الموقع الثاني عبر الأمر :</p><pre class="php ipsCode prettyprint">cp /var/www/example.com/public_html/index.html /var/www/test.com/public_html/index.html</pre><p dir="rtl">يُمكِن بعدها فتح الملف وتحرير المعلومات لتُناسب الموقع الثاني:</p><pre class="php ipsCode prettyprint">nano /var/www/test.com/public_html/index.html</pre><pre class="html ipsCode prettyprint">&lt;html&gt;
&lt;head&gt;
  &lt;meta http-equiv="content-type" content="text/html; charset=utf-8" /&gt;
  &lt;title&gt; Test.com أهلًا بك في موقع&lt;/title&gt;
&lt;/head&gt;

&lt;body dir="rtl"&gt;
  &lt;h1&gt;هنيئا لك! المُستضيف الافتراضي Test.com يعمل بشكل صحيح&lt;/h1&gt;
&lt;/body&gt;
&lt;/html&gt;</pre><p>احفظ الملف ثم أغلقه. لدينا الآن الصفحات الضرورية لاختبار إعداد المستضيف الافتراضي.</p><h2 dir="rtl">الخطوة الرابعة - أنشئ ملفات مستضيفات افتراضية جديدة</h2><p dir="rtl">تُحدِّد ملفات المستضيفات الافتراضية إعدادات هذه المستضيفات كما أنها تُملي على خادوم ويب Apache الكيفية التي سيُجيب بها على طلبات النطاقات المختلفة.</p><p dir="rtl">يأتي خادوم Apache بملف ابتدائي اسمه <span style="font-family:courier new,courier,monospace;">000-default.conf</span> لإعداد المستضيفات الافتراضية. يُمكننا استخدام هذا الملف للبدء، لذا سننسخ هذا الملف لإعداد المستضيفات الافتراضية الخاصة بنطاقاتنا.</p><p dir="rtl">سنبدأ بإعداد أحد النطاقات ثم ننسخه إلى النطاق الثاني مع القيام بالتعديلات اللازمة. يجب - في الإعداد المبدئي لأوبنتو - أن ينتهي ملف المستضيف الافتراضي بالامتداد <span style="font-family:courier new,courier,monospace;">conf.</span></p><p dir="rtl">أنشئ ملف المستضيف الافتراضي الأول.</p><p dir="rtl">ابدأ بنسخ ملف النطاق الأول:</p><pre class="php ipsCode prettyprint">sudo cp /etc/apache2/sites-available/000-default.conf /etc/apache2/sites-available/example.com.conf</pre><p dir="rtl">افتَح الملف الجديد في المحرِّر بامتيازات المستخدِم الجذر :</p><pre class="php ipsCode prettyprint">sudo nano /etc/apache2/sites-available/example.com.conf</pre><p dir="rtl">سيبدو الملف بالشكل التّالي (حُذِفت التعليقات لجعل الملف أسهل للقراءة):</p><pre class="php ipsCode prettyprint">&lt;VirtualHost *:80&gt;
  ServerAdmin webmaster@localhost
  DocumentRoot /var/www/html
  ErrorLog ${APACHE_LOG_DIR}/error.log
  CustomLog ${APACHE_LOG_DIR}/access.log combined
&lt;/VirtualHost&gt;</pre><p>احفظ الملف ثم أغلقه بعد الانتهاء من تحريره.</p><h2 dir="rtl">الخطوة الخامسة - فعل ملفات المستضيفات الافتراضية الجديدة</h2><p dir="rtl">بعد إنشاء ملفات إعداد المستضيفات الافتراضية نأتي لخطوة التفعيل؛ يوفِّر خادوم Apache بعض الأدوات لهذا الغرض.</p><p dir="rtl">لتفعيل الموقعيْن نستخدم أداة <strong>a2ensite</strong> كما يلي:</p><pre class="php ipsCode prettyprint">sudo a2ensite example.com.conf
sudo a2ensite test.com.conf</pre><p>ثم نعيد تشغيل Apache لأخذ التغييرات بالاعتبار:</p><pre class="php ipsCode prettyprint">sudo service apache2 restart</pre><p dir="rtl">أثناء إعادة تشغيل خادوم الوب قد تظهر رسالة كالتالية:</p><pre class="php ipsCode prettyprint">* Restarting web server apache2

AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1. Set the 'ServerName' directive globally to suppress this message</pre><p dir="rtl">لا يُمثِّل هذا التحذير أي خطر وليس له تأثير على موقعك.</p><h2 dir="rtl">الخطوة السادسة - اضبط ملف المستضيفات المحلي (خطوة اختيارية)</h2><p dir="rtl">إن لم تتوفّر لديك أسماء نطاقات حقيقية لتجربة الخطوات المذكورة في هذا الدّرس يُمكنك اختيار نطاقات وهمية والتجربة بها على جهاز ك المحلي (الشخصي) عن طريق التعديل المؤقَّت على ملف المستضيفات المحلي. ستُوَجَّه كل طلبات النطاقات المضبوطة بهذه الطريقة إلى خادومك الافتراضي الخاص، تماما كما كان سيفعل نظام أسماء النِّطاقات Domain Name System, DNS لو استخدمتَ أسماء نطاقات مُسَجَّلة. ينبغي الانتباه أن هذه الطريقة ستعمل من جهازك الشخصي فقط وتقتصر على اختبار الإعدادات.</p><p dir="rtl">تأكَّد من القيام بالخطوات التالية على جهازك المحلي وليس على خادومك الافتﻻاضي الخاص. ستحتاج لمعرفة كلمة سر اسم المستخدِم الجذر أو أن تكون ضمن مجموعة المديرين على نظام التشغيل.</p><p dir="rtl">الأمر التالي يفتح ملف المستضيفات للتحرير على أنظمة Linux و Mac:</p><pre class="php ipsCode prettyprint">sudo nano /etc/hosts</pre><p dir="rtl">بالنسبة لمستخدمي Windows توجد تعليمات التعديل على ملف المستضيفات هنا.</p><p dir="rtl">ستحتاج لعنوان IP العمومي لخادومك الافتراضي الخاص والنطاق الذي تُريد استخدامه للوصول إلى الخادوم الافتراضي. يتكوَّن سطر ملف الإعداد من عنوان IP متبوعًا باسم النطاق. باعتبار أن 111.111.111.111 هو عنوان IP الخادوم نُضيف الأسطر التالية في أسفل ملف المستضيفات:</p><pre class="php ipsCode prettyprint">127.0.0.1 localhost
127.0.1.1 guest-desktop
111.111.111.111 example.com
111.111.111.111 test.com</pre><p>بهذه الطّريقة ستُوجَّه كل استعلامات الجهاز المحلي التي تطلُب النِّطاقين <span style="font-family:courier new,courier,monospace;">example.com</span> أو <span style="font-family:courier new,courier,monospace;">test.com</span> إلى الخادوم على العنوان 111.111.111.111، وهو ما يُساعدنا على اختبار إعدادات خادوم الوب إن لم نكن مالِكي النطاقيْن المذكوريْن.</p><p dir="rtl">احفَظ الملف ثم أغلِقه.</p><h2 dir="rtl">الخطوة السابعة - اختبر النتائج</h2><p dir="rtl">يُمكنك بعد الانتهاء من ضبط المُستضيفات الافتراضية اختبار الإعدادت بالذهاب إلى النطاقات المضبوطة عبر متصفِّح الوب:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">http://example.com</pre><p dir="rtl">يجب أن تكون النتيجة كما في الصّورة:</p><p style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" rel="external nofollow" href="https://academy.hsoub.com/uploads/monthly_2015_03/example.png.f2855ea82075b8653f639931617e99f6.png"><img class="ipsImage ipsImage_thumbnailed" data-fileid="217" alt="example.thumb.png.3b798d4d1eb8c79473044a" src="https://academy.hsoub.com/uploads/monthly_2015_03/example.thumb.png.3b798d4d1eb8c79473044a3faa76d775.png"></a></p><p> الشيء بالنسبة للموقع الآخر:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint"> http://test.com</pre><p dir="rtl">ستظهر الصّفحة التي أنشأتَها في الملف الثاني:</p><p dir="rtl" style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" rel="external nofollow" href="https://academy.hsoub.com/uploads/monthly_2015_03/test.png.4ec8439d5afe66877533521cb38dd058.png"><img class="ipsImage ipsImage_thumbnailed" data-fileid="218" alt="test.thumb.png.e237a460739f4862770473a51" src="https://academy.hsoub.com/uploads/monthly_2015_03/test.thumb.png.e237a460739f4862770473a515631c84.png"></a></p><p dir="rtl">يدل ظهور الصفحتين بشكل صحيح أن إعداد مستضيفيْن افتراضيّيْن على نفس الخادوم جرى بطريقة جيّدة.</p><p dir="rtl">لا تنسَ حذف الأسطر الإضافية من ملف المستضيفات المحلي بعد التأكد من إعداد المستضيفات الافتراضية على الخادوم. أُضيفت هذه الأسطُر للاختبار فقط ومن الأحسن حذفها بعد انتهائه. ستحتاج إلى شراء وإعداد نطاقات إن احتجتَ دائما إلى خادومك عن طريق أسماء نطاقات.</p><h2 dir="rtl">خاتمة</h2><p dir="rtl">ستحصُل بعد متابعة هذا الدّرس على خادوم ويب واحد يتعامل مع نطاقيْن منفصلين. يُمكنك زيادة عدد النطاقات باتّباع الخطوات المذكورة أعلاه لإنشاء مستضيفات افتراضية جديدة. لا توجد تقييد على عدد النطاقات التي يُمكِن لـApache التعامل معها، أضِف ما تُريد من النطاقات ما دام الخادوم يستطيع تحمّلَها.</p><p dir="rtl">ترجمة -وبتصرّف- للمقال <a rel="external nofollow" href="https://www.digitalocean.com/community/tutorials/how-to-set-up-apache-virtual-hosts-on-ubuntu-14-04-lts">How To Set Up Apache Virtual Hosts on Ubuntu 14.04 LTS</a> لصاحبه Justin Ellingwood.</p>
]]></description><guid isPermaLink="false">10</guid><pubDate>Wed, 04 Mar 2015 01:00:00 +0000</pubDate></item></channel></rss>
