LAMP

از ArchWiki پارسی
پرش به: ناوبری، جستجو


سرور وب آپاچی یا به اختصار آپاچی، یک وب سرور بسیار محبوب است که توسط Apache Software Foundation توسعه داده میشود.

آپاچی معمولا در کنار یک زبان اسکریپتی مثل PHP و یک پایگاه‌داده مانند MySQL استفاده میشود. این ترکیب معمولا به نام LAMP تلقی میشود (Linux، Apache، MySQL، PHP). این مقاله به توصیف نصب و راه اندازی آپاچی و متصل کردن PHP و MySQL به آن میپردازد.

نصب

بسته apache را نصب کنید.

پیکربندی

پیکربندی‌های آپاچی در مسیر ‎/etc/httpd/conf‎ قرار داردند. و فایل اصلی پیکربندی در ‎/etc/httpd/conf/httpd.conf‎ قرار دارد که شامل دیگر فایلهای پیکربندی میشود. فایل پیشفرض پیکربندی برای یک راه‌اندازی ساده کافیست. به صورت پیشفرض مسیر فایلهای سرور در ‎/srv/http‎ قرار دارد که فایل‌های موجود در این مسیر برای همه قابل دسترسی هستند.

برای شروع آپاچی، سرویس آپاچی ‎httpd.service‎ را از طریق Systemd را start کنید.

حالا آپاچی در حالت اجراست، برای اطمینان با مروگر خود به آدرس http://localhost بروید که باید یک صفحه ساده‌ی index مشاهده کنید.

برای پیکربندی اضافی، بخشهای بعدی را بخوانید.

تنظیمات پیشرفته

تنظیمات لیست شده موجود در ‎/etc/httpd/conf/httpd.conf‎ ممکن است برای شما جالب باشند:

User http

برای دلایل امنیتی، به محض اینکه آپاچی توسط root شروع به کار میکند (مستقیم یا از طریق اسکریپتهای موقع startup) آپاچی به این UID کاربر را تعویض میکند. کاربر پیشفرض http است، که در طی فرایند نصب در سیستم ایجاد میشود.

Listen 80

این پورت پیشفرضی است که آپاچی به آن گوش میدهد. برای دسترسی اینترنتی با روتر باید پورت را forward کنید. اگر که میخواهید آپاچی را برای توسعه محلی استفاده کنید بهتر است آپاچی را فقط از طریق کامپیوتر خودتان قابل دسترسی کنید. پس این خط را به ‎Listen 127.0.0.1:80‎ تغییر دهید.

ServerAdmin you@example.com

این ایمیل، ایمیل مدیر است که برای مثال در مواقعی که سایت خطا میدهد نمایش داده میشود.

DocumentRoot "/srv/http"

این مسیر مسیری است که باید صفحات وبتان را در آن قرار دهید.

شما قادر هستید که این مسیر را به مسیر دلخواه خودتان تغییر دهید، ولی به یاد داشته باشید که ‎<Directory "/srv/http">‎ را دقیقا نیز به همان صورتی که ‎<Directory "/srv/http">‎ را تغییر داده‌اید، تغییر دهید، در غیراینصورت با خطای ۴۰۳(نداشتن دسترسی) مواجه خواهید شد. فراموش نکنید که ‎Require all denied‎ را به ‎Require all granted‎ تغییر دهید، درغیر اینصورت با خطای خطای ۴۰۳ مواجه خواهید شد. به یاد داشته باشید که DocmunetRoot و مسیرهای مادر آن باید دسترسی اجرایی به دیگران بدهد (که با دستور ‎chmod o+x /path/to/DocumentRoot‎ امکان‌پذیر است)، درغیراینصورت با خطای خطای ۴۰۳ مواجه خواهید شد.

ServerAdmin AllowOverride None

این دستور راهنمای موجود در ‎<Directory>‎ باعث میشود که آپاچی به صورت کلی فایلهای ‎.htaccess‎ را در نظر نگیرد. توجه کنید که این مسئله در آپاچی نسخه 2.4 به صورت پیشفرض در نظر گرفته شده است، پس اگر که قصد استفاده از فایلهای ‎.htaccess‎ را دارید باید پیشفرض را باطل کنید. اگر قصد دارید که از ‎mod_rewrite‎ یا دیگر تنظیمات درون فایلهای ‎.htaccess‎ استفاده کنید. میتوانید در همان فایل اعلام کنید که راهنما اجازه‌ی باطلسازی پیکربندی پیشفرض سرور را دارد. برای اطلاعات بیشتر مستندات آپاچی را مطالعه کنید.

نکته: اگر با مشکلی در فایل پیکربندی مواجه شدید میتوانید فایل پیکربندی را با این دستور چک کنید‎apachectl configtest‎

تنظیمات بیشتر در فایل ‎/etc/httpd/conf/extra/httpd-default.conf‎ قابل دسترسی هستند: برای خاموش کردن امضای سرور:

ServerSignature Off

برای پنهان کردن اطلاعات سرور مانند نسخه آپاچی و PHP:

ServerTokens Prod

مسیرهای کاربر

به صورت پیشفرض مسیر کاربر از طریق آدرس http://localhost/~yourusername قابل دسترس است که این آدرس محتویات ‎~/public_html‎ را نمایش میدهد (این مسیر در فایل پیکربندی ‎/etc/httpd/conf/extra/httpd-userdir.conf‎ قابل تغییر است). اگر قصد ندارید که مسیرهایتان روی وب قابل دسترس باشند، خط زیر را در فایل ‎/etc/httpd/conf/httpd.conf‎ کامنت کنید.

Include conf/extra/httpd-userdir.conf

قبل از هرچیز باید از سطح دسترسی مسیر home اطمینان حاصل کنید تا آپاچی بتواند به آن مسیر دسترسی داشته باشد. مسیر home شما و ‎~/public_html‎ باید دسترسی اجرایی برای دیگر کاربران داشته باشد

 $ chmod o+x ~
 $ chmod o+x ~/public_html
 $ chmod -R o+r ~/public_html

حالا ‎httpd.service‎ را دوباره راه‌اندازی کنید.

راه‌اندازی TLS/SSL

به صورت پیشفرض openssl از TLS/SSL پشتیبانی میکند که از قبل در آرچ نصب شده است.

فایل ‎/etc/httpd/conf/httpd.conf‎ را باز کنید و خطوط زیر را از کامنت خارج کنید:

LoadModule ssl_module modules/mod_ssl.so
LoadModule socache_shmcb_module modules/mod_socache_shmcb.so
Include conf/extra/httpd-ssl.conf

فراموش نکنید که پورت شماره ۴۴۳ را به لیست پورتها در فایل ‎/etc/httpd/conf/httpd.conf‎ اضافه کنید.

Listen 443

برای استفاده از TLS/SSL نیاز به یک کلید و گواهینامه دارید. اگر که دامنه‌ای عمومی دارید میتوانید از Let's Encrypt به صورت رایگان استفاده کنید. درغیراینصورت بخش ایجاد یک کلید و یک گواهی self-signed را دنبال کنید.

بعد از بدست‌آوردن کلید و گواهینامه اطمینان حاصل کنید که هردو خطوط ‎SSLCertificateFile‎ و ‎SSLCertificateKeyFile‎ در فایل ‎/etc/httpd/conf/extra/httpd-ssl.conf‎ به کلید و گواهینامه اشاره میکنند

در آخر سرویس ‎httpd.service‎ را دوباره راه‌اندازی کنید تا تغییرات اعمال شوند.

نکته: موزیلا مقاله‌ای سودمند درباره SSL/TLS دارد که شامل پیکربندی برای آپاچی نیز میشود، همچنین این مقاله شامل یک ابزار اتوماتیک‌سازی نیز میشود که به شما کمک میکند پیکربندی امنتری ایجاد کنید.

ایجاد یک کلید و یک گواهی self-signed

یک کلید شخصی و یک گواهینامه self-signed ایجاد کنید. درصورتی که نصب نیاز به CSRنداشته باشد اجرای این دستور کافیست.

# cd /etc/httpd/conf
# openssl req -new -x509 -nodes -newkey rsa:4096 -keyout server.key -out server.crt -days 1095
# chmod 400 server.key
توجه: سوئیچ -days انتخابیست و اندازه‌ی کلید RSA میتواند حداقل ۲۰۴۸ باشد.

اگر نیاز دارید که یک CSR بسازید، به جای مراحل بالا از کلیدسازهای زیر استفاده کنید:

# openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:4096 -out server.key
# chmod 400 server.key
# openssl req -new -sha256 -key server.key -out server.csr
# openssl x509 -req -days 1095 -in server.csr -signkey server.key -out server.crt

درصورتی که نیاز به تنظیمات بیشتری دارید صفحه مستندات openssl را بخوانید.

میزبانهای مجازی

توجه: برای پشتیبانی از SSL در میزبان مجازی نیاز است که یک بخش جداگانه برای <VirtualHost dommainame:443> اضافه کنید. برای فایل نمونه بخش مدیریت میزبانهای مجازی را ببنید.

اگر که میخواهید بیشتر از یک میزبان داشته باشید، خط زیر را در فایل ‎/etc/httpd/conf/httpd.conf‎ از حالت کامنت خارج کنید:

Include conf/extra/httpd-vhosts.conf

در فایل ‎/etc/httpd/conf/extra/httpd-vhosts.conf‎ میزبانهای‌ مجازی خود را تنظیم کنید. فایل پیشفرض شامل مثالهای فروانی میشود که شما را در شروع کار راهنمایی میکند.

برای تست کردن میزبانهای مجازی روی ماشین مجازی‌تان، نام‌های مجازی را به فایل ‎/etc/hosts‎ اضافه کنید:

 
 127.0.0.1 domainname1.dom 
 127.0.0.1 domainname2.dom

برای اعمال تغییرات سرویس ‎httpd.service‎ را دوباره راه‌اندازی کنید.

مدیریت میزبانهای مجازی

درصورتی که تعداد بسیار زیادی میزبان مجازی دارید، احتمال آن پیش می‌آید که بخواهید آنها را فعال یا غیرفعال کنید. پیشنهاد میشود برای هر هاست مجازی یک فایل مجزا ایجاد کنید و تمامی فایلها را درون یک پوشه قرار دهید. برای مثال پوشه‌ی ‎/etc/httpd/conf/vhosts‎:

ابتدا پوشه را ایجاد کنید:

# mkdir /etc/httpd/conf/vhosts

سپس فایلهای پیکربندی را ایجاد و در آن قرار دهید:

 # nano /etc/httpd/conf/vhosts/domainname1.dom
 # nano /etc/httpd/conf/vhosts/domainname2.dom
 ...

در مرحله آخر، آخرین ‎Include‎ را در فایل ‎/etc/httpd/conf/httpd.conf‎ قرار دهید:

 #Enabled Vhosts:
 Include conf/vhosts/domainname1.dom
 Include conf/vhosts/domainname2.dom

حالا میتوانید با کامنت یا از کامنت خارج کردن هاستهای مجازی‌تان را فعال یا غیرفعال کنید.

یک فایل vhost بسیار ابتدایی به این صورت است:

/etc/httpd/conf/vhosts/domainname1.dom
<VirtualHost domainname1.dom:80>
    ServerAdmin webmaster@domainname1.dom
    DocumentRoot "/home/user/http/domainname1.dom"
    ServerName domainname1.dom
    ServerAlias domainname1.dom
    ErrorLog "/var/log/httpd/domainname1.dom-error_log"
    CustomLog "/var/log/httpd/domainname1.dom-access_log" common

    <Directory "/home/user/http/domainname1.dom">
        Require all granted
    </Directory>
</VirtualHost>

<VirtualHost domainname1.dom:443>
    ServerAdmin webmaster@domainname1.dom
    DocumentRoot "/home/user/http/domainname1.dom"
    ServerName domainname1.dom:443
    ServerAlias domainname1.dom:443
    ErrorLog "/var/log/httpd/domainname1.dom-error_log"
    CustomLog "/var/log/httpd/domainname1.dom-access_log" common

    <Directory "/home/user/http/domainname1.dom">
        Require all granted
    </Directory>
    
    SSLEngine on
    SSLCertificateFile "/etc/httpd/conf/apache.crt"
    SSLCertificateKeyFile "/etc/httpd/conf/apache.key"
</VirtualHost>

افزونه‌ها

PHP

برای نصب PHP، ابتدا بسته php و سپس بسته php-apache را نصب کنید.

فایل ‎/etc/httpd/conf/httpd.conf‎ را باز کنید و خط زیر را کامنت کنید:

#LoadModule mpm_event_module modules/mod_mpm_event.so

و خط زیر را از کامنت خارج کنید:

LoadModule mpm_prefork_module modules/mod_mpm_prefork.so


توجه: انجام دو مرحله بالا لازم است چون فایل ‎libphp7.so‎ که در php-apache موجود است با ‎mod_mpm_event‎ کار نمیکند و فقط با ‎mod_mpm_prefork‎ کار میکند.

درصورتی که مراحل بالا را انجام ندهید با خطای زیر مواجه میشوید:

Apache is running a threaded MPM, but your PHP Module is not compiled to be threadsafe.  You need to recompile PHP.
AH00013: Pre-configuration failed
httpd.service: control process exited, code=exited status=1

به عنوان راه دوم میتوانید از ‎mod_proxy_fcgi‎ استفاده کنید.

برای فعالسازی PHP این خطوط را به ‎/etc/httpd/conf/httpd.conf‎ اضافه کنید:

  • این خط را در بخش ‎LoadModule‎ هرجایی بعد از ‎LoadModule dir_module modules/mod_dir.so‎ قرار دهید:
LoadModule php7_module modules/libphp7.so
  • این خط را به انتهای لیست ‎Include‎ اضافه کنید:
Include conf/extra/php7_module.conf
  • و این Handler را در انتهای ‎LoadModule‎ قرار دهید:
AddHandler php7-script php

با استفاده از ‎httpd.service‎ Systemd را دوباره راه‌اندازی کنید:

برای اطمینان از اینکه PHP به درستی پیکربندی شده است این کار را انجام دهید: یک فایل به اسم ‎test.php‎ در مسیر ‎DocumentRoot‎ ایجاد کنید و یک خط کد PHP زیر را در آن قرار دهید:

<?php phpinfo(); ?>

برای دیدن نتیجه به آدرس http://localhost/test.php یا http://localhost/~myname/test.php بروید.

برای پیکربندی پیشرفته‌تر، صفحه PHP را بخوانید.

استفاده از php-fpm و mod_proxy_fcgi

توجه: برعکس راه‌اندازی معمول با ProxyPass، تنظیم پروکسی با SetHandler دیگر دستورات راهنما مثل DirectoryIndex را رعایت میکند. این قضیه در امر باعث میشود که نرم‌افزار ساخته شده با libphp7، mod_fastcgi و mod_fcgid از سازگاری بالاتری برخوردار باشند. هرچند، اکر همچنان میخواهید از ProxyPass استفاده کنید، از خط زیر شروع کنید:
ProxyPassMatch ^/(.*\.php(/.*)?)$ unix:/run/php-fpm/php-fpm.sock|fcgi://localhost/srv/http/$1

بسته php-fpm را نصب کنید.

ماژولهای پروکسی را فعال کنید:

/etc/httpd/conf/httpd.conf
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so

فایل ‎/etc/httpd/conf/extra/php-fpm.conf‎ را با محتوای زیر ایجاد کنید:

/etc/httpd/conf/extra/php-fpm.conf
<FilesMatch \.php$>
    SetHandler "proxy:unix:/run/php-fpm/php-fpm.sock|fcgi://localhost/"
</FilesMatch>

و آن را در انتهای ‎/etc/httpd/conf/httpd.conf‎ قرار دهید:

Include conf/extra/php-fpm.conf
توجه: علامت پایپ ببین ‎sock‎ و ‎fcgi‎ اجازه ندارند که فضای خالی اطرافش باشد! هر رشته‌ای میتوان جایگزین ‎localhost‎ کرد.

میتوانید PHP-FPM را در فایل ‎/etc/php/php-fpm.d/www.conf‎ پیکربندی کنید، ولی پیکربندی پیشفرض نیازی به تغییر ندارند و کار میکند.

توجه:

اگر خطوط زیر را به ‎httpd.conf‎ اضافه کرده‌اید، آنها را حذف کنید، چون دیگر به آنها نیازی نیست:

LoadModule php7_module modules/libphp7.so
Include conf/extra/php7_module.conf

دو سرویس ‎httpd.service‎ و ‎php-fpm.service‎ را دوباره راه‌اندازی کنید.

استفاده از apache2-mpm-worker و mod_fcgid

دو پکیج mod_fcgid و php-cgi را از مخازن نصب کنید.

مسیر موردنیاز را ایجاد کنید و درصورت نیاز آن را برای PHP به صورت symlink دربیاورید:

 # mkdir /srv/http/fcgid-bin
 # ln -s /usr/bin/php-cgi /srv/http/fcgid-bin/php-fcgid-wrapper

فایل ‎/etc/httpd/conf/extra/php-fcgid.conf‎ را با محتویات زیر بسازید:

/etc/httpd/conf/extra/php-fcgid.conf
# Required modules: fcgid_module

<IfModule fcgid_module>
    AddHandler php-fcgid .php
    AddType application/x-httpd-php .php
    Action php-fcgid /fcgid-bin/php-fcgid-wrapper
    ScriptAlias /fcgid-bin/ /srv/http/fcgid-bin/
    SocketPath /var/run/httpd/fcgidsock
    SharememPath /var/run/httpd/fcgid_shm
        # If you don't allow bigger requests many applications may fail (such as WordPress login)
        FcgidMaxRequestLen 536870912
        # Path to php.ini – defaults to /etc/phpX/cgi
        DefaultInitEnv PHPRC=/etc/php/
        # Number of PHP childs that will be launched. Leave undefined to let PHP decide.
        #DefaultInitEnv PHP_FCGI_CHILDREN 3
        # Maximum requests before a process is stopped and a new one is launched
        #DefaultInitEnv PHP_FCGI_MAX_REQUESTS 5000
        <Location /fcgid-bin/>
        SetHandler fcgid-script
        Options +ExecCGI
    </Location>
</IfModule>

با ویرایش فایل ‎/etc/httpd/conf/httpd.conf‎، اکشنهای ماژول را فعالسازی کنید:

‎LoadModule actions_module modules/mod_actions.so‎

و خطوط زیر را به آن اضافه کنید:

 LoadModule fcgid_module modules/mod_fcgid.so
 Include conf/extra/httpd-mpm.conf
 Include conf/extra/php-fcgid.conf

سرویس ‎httpd.service‎ را دوباره راه‌اندازی کنید.

MySQL/MariaDB

برای راه‌اندازی PHP#MySQL/MariaDB، صفحه‌ات مربوطه را بخوانید.

وقتی کار پیکربندی به اتمام رسید، سرویس ‎httpd.service‎ رو دوباره راه‌اندازی کنید تا تغییرات اعمال شوند.

HTTP2

برای فعالسازی از پشتیبانی HTTP/2، بسته nghttp2 را نصب کنید.

سپس خط موجود در فایل ‎httpd.conf‎ را از کامنت خارج کنید:

LoadModule http2_module modules/mod_http2.so

خط زیر را اضافه کنید.

Protocols h2 http/1.1

برای اطلاعات بیشتر مستندات را ببینید.

عیب‌یابی

وضعیت و گزارشات آپاچی

وضعیت دیمون آپاچی را با systemctl بررسی کنید.

فایلهای گزارشی آپاچی در مسیر ‎/var/log/httpd‎ موجود هستند.


خطای: PID file /run/httpd/httpd.pid not readable (yet?) after start

خط ‎unique_id_module‎ موجود در فایل ‎httpd.conf‎ را از کامنت خارج کنید: ‎#LoadModule unique_id_module modules/mod_unique_id.so‎

خطای: Apache is running a threaded MPM, but your PHP Module is not compiled to be threadsafe

اگر موقع لود کردن ‎php7_module‎ سرویس ‎httpd.service‎ با موفقیت شروع نشد، در ژورنال با خطایی مانند زیر مواجه خواهید شد:

Apache is running a threaded MPM, but your PHP Module is not compiled to be threadsafe.  You need to recompile PHP.

در اینصروت نیاز است که ‎mpm_event_module‎ را با ‎mpm_prefork_module‎ تعویض کنید.

/etc/httpd/conf/httpd.conf
LoadModule mpm_event_module modules/mod_mpm_event.so
LoadModule mpm_prefork_module modules/mod_mpm_prefork.so

و سرویس ‎httpd.service‎ را دوباره راه‌اندازی کنید.

خطای: AH00534: httpd: Configuration error: No MPM loaded

ممکن در مواقعی که آپاچی را اخیرا بروزرسانی کرده باشید با این خطا مواجه شوید. دلیل بوجود آمدن این شرایط تغییرات اخیر در فایل ‎httpd.conf‎ است که دوباره آن را تولید نکرده‌اید. برای حل این خطا خط زیر را از کامنت خارج کنید:

/etc/httpd/conf/httpd.conf
LoadModule mpm_prefork_module modules/mod_mpm_prefork.so

تغییر دادن max_execution_time در php.ini باعث هیچ تغییری نمیشود

اگر ‎max_execution_time‎ درون فایل ‎php.ini‎ را به عددی بزرگتر از ۳۰ (ثانیه) تغییر داده باشید ممکن است همچنان خطای ‎503 Service Unavailable‎ را بعد از درخواست به آپاچی مشاهده کنید. برای حل این مشکل یک ‎ProxyTimeout‎ راهنما به پیکربندی http قبل از ‎<FilesMatch \.php$>‎ ایجاد کنید.

/etc/httpd/conf/httpd.conf
ProxyTimeout 300

و در آخر سرویس ‎httpd.service‎ را دوباره راه‌اندازی کنید.

پیوستها و منابع