Product SiteDocumentation Site

11.2. مخدم الوب (HTTP)

The Falcot Corp administrators decided to use the Apache HTTP server, included in Debian Buster at version 2.4.38.

11.2.1. تثبيت أباتشي

Installing the apache2 package is all that is needed. It contains all the modules, including the Multi-Processing Modules (MPMs) that affect how Apache handles parallel processing of many requests, which used to be provided in separate apache2-mpm-* packages. It will also pull apache2-utils containing the command line utilities that we will discover later.
تؤثر MPM المستخدمة بشكل كبير على طريقة تعامل Apache مع الطلبات المتوازية. عند استخدام worker MPM، يستخدم أباتشي ”الخيوط threads“ (عمليات خفيفة)، بينما يستخدم عند اختيار prefork MPM احتياطياً (pool) من عمليات منشأة مسبقاً. أما عند استخدام event MPM فهو يستخدم الخيوط أيضاً، لكن مع إعادة تسليم الاتصالات غير النشطة (خصوصاً تلك التي تبقى مفتوحة عبر ميزة keep-alive في HTTP) إلى خيط إدارة خاص.
The Falcot administrators also install libapache2-mod-php7.3 so as to include the PHP support in Apache. This causes the default event MPM to be disabled, and prefork to be used instead. To use the event MPM one can use php7.3-fpm.
أباتشي مخدم تجزيئي (modular)، وهناك مزايا كثيرة تقدمها وحدات (modules) خارجية يُحمّلها البرنامج الرئيسي أثناء مرحلة التهيئة. يُفعّل الإعداد الافتراضي أهم الوحدات شيوعاً، لكن لتفعيل وحدات جديدة يكفي استدعاء a2enmod module؛ولتعطيل وحدة ما، يُستَخدَم الأمر a2dismod module. في الواقع هذه البرامج تُنشِئ فقط (أو تحذف) وصلات رمزية في /etc/apache2/mods-enabled/، تشير إلى الملفات الفعلية (المُخزَّنة في /etc/apache2/mods-available/).
في الإعداد الافتراضي، ينصت مخدم الوب للمنفذ 80 (حسب الإعدادات في /etc/apache2/ports.conf)، ويخدّم الصفحات من المجلد /var/www/html/ (حسب الإعدادات في /etc/apache2/sites-enabled/000-default.conf).

11.2.2. Adding support for SSL

Apache 2.4 includes the SSL module (mod_ssl) required for secure HTTP (HTTPS) out of the box. It just needs to be enabled with a2enmod ssl, then the required directives have to be added to the configuration files. A configuration example is provided in /etc/apache2/sites-available/default-ssl.conf.
If you want to generate trusted certificates, you can follow section قسم 10.2.1, “Creating gratis trusted certificates” and then adjust the following variables:
SSLCertificateFile      /etc/letsencrypt/live/DOMAIN/fullchain.pem
SSLCertificateKeyFile   /etc/letsencrypt/live/DOMAIN/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/DOMAIN/chain.pem
SSLCACertificateFile    /etc/ssl/certs/ca-certificates.crt
Some extra care must be taken if you want to favor SSL connections with Perfect Forward Secrecy (those connections use ephemeral session keys ensuring that a compromission of the server's secret key does not result in the compromission of old encrypted traffic that could have been stored while sniffing on the network). Have a look at Mozilla's recommendations in particular:
As an alternative to the standard SSL module, there is an extension module called mod_gnutls, which is shipped with the libapache2-mod-gnutls package and enabled with the a2enmod gnutls.

11.2.3. إعداد مضيف ظاهري

المضيف الظاهري (virtual host) هو هوية إضافية لمخدم الوب.
يميّز أباتشي بين نوعين من الاستضافة الظاهرية: النوع الذي يعتمد على عنوان IP (أو المنفذ)، والنوع الذي يعتمد على اسم نطاق مخدم الوب. تحتاج الطريقة الأولى لتخصيص عنوان IP مختلف (أو منفذ) لكل موقع، بينما يمكن أن تعمل الثانية على عنوان IP (ومنفذ) وحيد، وتُفرَّق المواقع عن بعضها باسم المضيف (hostname) الذي يرسله عميل HTTP (وهذه لا تعمل إلا مع النسخة 1.1 من بروتوكول HTTP — لحسن الحظ هذه النسخة قديمة لدرجة أن جميع العملاء يستخدمونها فعلاً).
إن التناقص (المستمر) في عناوين IPv4 يدفعنا عادة لتفضيل الطريقة الثانية؛ لكنها تزيد تعقيد الأمور إذا كان المضيفات الظاهرية مضطرة لتوفير HTTPS أيضاً، لأن بروتوكول SSL لم يكن يدعم الاستضافة الظاهرية التي تعتمد على الأسماء قديماً؛ ولا تدعم جميع المتصفحات امتداد SNI (بيان اسم المخدم، Server Name Indication) التي تسمح بالجمع بينهما. عندما تحتاج عدة مواقع HTTPS العمل على المخدم نفسه، سيُفرّق بينها عادة بتشغيلها على منافذ مختلفة أو عناوين IP مختلفة (قد يساعد IPv6 هنا).
يُفعّل الإعداد الافتراضي لأباتشي 2 الاستضافة الظاهرية المعتمدة على الأسماء. بالإضافة لذلك، يُعرَّف مضيف ظاهري في الملف /etc/apache2/sites-enabled/000-default.conf؛ يستخدم هذا المضيف إذا لم يُعثَر على اسم مضيف يطابق طلب العميل.
بعد ذلك، يُعرّف كل مضيف ظاهري إضافي بملف يُخزَّن في /etc/apache2/sites-available/. بالتالي، لإعداد موقع وب للنطاق falcot.org يكفي إنشاء الملف التالي، ثم تفعيل المضيف الظاهري باستخدام a2ensite www.falcot.org.

مثال 11.13. الملف /etc/apache2/sites-available/www.falcot.org.conf

<VirtualHost *:80>
ServerName   www.falcot.org
ServerAlias  falcot.org
DocumentRoot /srv/www/www.falcot.org
</VirtualHost>
يستخدم المخدم أباتشي، كما هي إعداداته حتى الآن، ملف سجلات وحيد لجميع المضيفات الظاهرية (رغم أن تغيير هذا ممكن عبر إضافة تعليمات CustomLog في تعاريف المضيفات الظاهرية). من المنطقي إذن تعديل صيغة ملف السجلات هذا بحيث يتضمن اسم المضيف الظاهري. يمكن تحقيق هذا عبر إنشاء ملف /etc/apache2/conf-available/customlog.conf يُعرِّف صيغة جديدة لكافة ملفات السجلات (باستخدام التعليمة التوجيهية LogFormat) وتفعيله بالأمر a2enconf customlog. كما يجب أيضاً إزالة (أو تعليق) سطر CustomLog من الملف /etc/apache2/sites-available/000-default.conf.

مثال 11.14. The /etc/apache2/conf-available/customlog.conf file

# New log format including (virtual) host name
LogFormat "%v %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" vhost

# Now let's use this "vhost" format by default
CustomLog /var/log/apache2/access.log vhost

11.2.4. التعليمات التوجيهية الشائعة

يستعرض هذا القسم سريعاً بعض تعليمات إعداد أباتشي شائعة الاستخدام.
يحوي ملف الإعداد الرئيسي عدة كتل Directory عادة؛ تسمح بتحديد تصرفات المخدم المختلفة حسب موقع الملف الذي يقدمه. هذه الكتل تحوي عادة تعليمتي Options و AllowOverride.

مثال 11.15. كتلة Directory

<Directory /srv/www>
Options Includes FollowSymlinks
AllowOverride All
DirectoryIndex index.php index.html index.htm
</Directory>
تحوي تعليمة DirectoryIndex قائمة الملفات لتجربتها عند الرد على العميل عندما يطلب مجلداً. يستخدم أول ملف متوفر ويرسل كرد على الطلب.
تُتبَع التعليمة Options بقائمة من الخيارات المطلوب تفعيلها. تُعطّل القيمة None جميع الخيارات؛ وفي المقابل، تُفعِّلها All جميعاً عدا MultiViews. من الخيارات المتاحة:
  • ExecCGI indicates that CGI scripts can be executed.
  • FollowSymlinks tells the server that symbolic links can be followed, and that the response should contain the contents of the target of such links.
  • SymlinksIfOwnerMatch also tells the server to follow symbolic links, but only when the link and the its target have the same owner.
  • Includes enables Server Side Includes (SSI for short). These are directives embedded in HTML pages and executed on the fly for each request.
  • IncludesNOEXEC allows Server Side Includes (SSI) but disables the exec command and limits the include directive to text/markup files.
  • Indexes tells the server to list the contents of a directory if the HTTP request sent by the client points at a directory without an index file (i.e., when no files mentioned by the DirectoryIndex directive exists in this directory).
  • MultiViews enables content negotiation; this can be used by the server to return a web page matching the preferred language as configured in the browser.
تسرد التعليمة AllowOverride جميع الخيارات التي يمكن تفعيلها أو تعطيلها باستخدام ملفات .htaccess. أحد الاستخدامات الشائعة لها هو تقييد ExecCGI، بحيث يختار مدير النظام المستخدمين الذين يحق لهم تشغيل البرامج تحت هوية مخدم الوب (المستخدم www-data).

11.2.4.1. طلب المصادقة

يلزم أحياناً تقييد الوصول لأجزاء من موقع الوب، بحيث يسمح فقط للمستخدمين المشروعين الذي يدخلون اسم مستخدم وكلمة سر بالوصول للمحتويات.

مثال 11.16. ملف .htaccess يطلب المصادقة

Require valid-user
AuthName "Private directory"
AuthType Basic
AuthUserFile /etc/apache2/authfiles/htpasswd-private
The /etc/apache2/authfiles/htpasswd-private file contains a list of users and passwords; it is commonly manipulated with the htpasswd command. For example, the following command is used to add a user or change their password:
# htpasswd /etc/apache2/authfiles/htpasswd-private user
New password:
Re-type new password:
Adding password for user user

11.2.4.2. تقييد الوصول

The Require directive controls access restrictions for a directory (and its subdirectories, recursively).
يمكن استخدامها لتقييد الوصول اعتماداً على معايير كثيرة؛ سنكتفي نحن بشرح تقييد الوصول اعتماداً على عنوان IP الخاص بالعميل، لكن يمكن جعل القيود أقوى من ذلك بكثير، خصوصاً عند جمع عدة تعليمات Require معاً ضمن كتلة RequireAll.

مثال 11.17. السماح بالوصول من الشبكة المحلية فقط

Require ip 192.168.0.0/16

11.2.5. محللات السجلات

كثيراً ما يُثبّت محلل سجلات على مخدم الوب؛ لأنه يعطي مديري النظم فكرة دقيقة عن أنماط استخدام المخدم.
اختار مديرو النظم في شركة فلكوت AWStats ‏(Advanced Web Statistics، إحصائيات الوب المتقدمة) لتحليل ملفات سجلات أباتشي.
أولى خطوات الإعداد هي تخصيص الملف /etc/awstats/awstats.conf. لقد ترك مديرو النظم في فلكوت الملف دون تعديل عدا البارمترات التالية:
LogFile="/var/log/apache2/access.log"
LogFormat = "%virtualname %host %other %logname %time1 %methodurl %code %bytesd %refererquot %uaquot"
SiteDomain="www.falcot.com"
HostAliases="falcot.com REGEX[^.*\.falcot\.com$]"
DNSLookup=1
LoadPlugin="tooltips"
جميع هذه البارمترات مشروحة في التعليقات في ملف القالب. بالأخص، يحدد المتغيران LogFile وLogFormat موقع ملف السجلات وصيغة المعلومات التي يحويها؛ ويسرد SiteDomain وHostAliases الأسماء المتنوعة التي يعرف بها الموقع الرئيسي.
يجب ألا تعطى القيمة 1 للمتغير DNSLookup في المواقع عالية الطلب؛ أما بالنسبة للمواقع الأصغر، مثل موقع فلكوت المعروض أعلاه، فيسمح هذا الخيار بالحصول على تقارير أوضح تتضمن الأسماء الكاملة للأجهزة بدلاً من عناوين IP.
يمكن تفعيل AWstats أيضاً للمضيفات الظاهرية الأخرى؛ يحتاج كل مضيف لملف إعداد خاص، مثل /etc/awstats/awstats.www.falcot.org.conf.

مثال 11.18. ملف إعداد AWstats لمضيف ظاهري

Include "/etc/awstats/awstats.conf"
SiteDomain="www.falcot.org"
HostAliases="falcot.org"
يستخدم AWstats أيقونات عديدة مُخزّنة في المجلد /usr/share/awstats/icon/. حتى تتوفر هذه الأيقونات على موقع الوب، يجب تعديل إعدادات أباتشي وإضافة التعليمة التوجيهية التالية:
Alias /awstats-icon/ /usr/share/awstats/icon/
بعد بضعة دقائق (وبعد أن يعمل السكربت بضع مرات)، تصبح النتائج متوفرة على الموقع: