آموزش PHP جلسه ششم: نگاه اجمالی به تنظیمات Apache و PHP

در این جلسه، میخواهیم تنظیمات Apache و PHP را بصورت اجمالی بررسی کنیم.
ضمناً این جلسه را تا آخر دنبال کنید تا ذهنیتی از تنظیمات ایجاد شود. در جلسات آینده، در مورد این جلسه بیشتر بحث خواهد شد و فهم این دستورات با توجه به ذهنیتی که ایجاد میشود، راحتتر خواهد شد.
ابتدا از فایل تنظیمات آپاچی شروع میکنیم.

وب سرور آپاچی:

در این قسمت، اول در مورد مسیر فایل های تنظیمات آپاچی در توزیع های لینوکس، توضیح میدهیم و در ادامه، مکان این فایل ها در WampServer ویندوز و بعد دستورات آن را بررسی میکنیم.

اگر شما روی ویندوز کار میکنید، پایین تر در مورد WAMP توضیح داده شده است.

مسیر فایل های آپاچی در Ubuntu (بطور پیش فرض) بصورت زیر میباشد:

ServerRoot              ::      /usr/local/apache2
-------------------------------------------------------------------
DocumentRoot            ::      /usr/local/apache2/htdocs
-------------------------------------------------------------------
Apache Config File      ::      /usr/local/apache2/conf/httpd.conf
-------------------------------------------------------------------
ErrorLog                ::      /usr/local/apache2/logs/error_log
-------------------------------------------------------------------
start/stop              ::      /usr/local/apache2/bin/apachectl (start|restart|stop)
حالت پیش فرض زمانی است که شما میخواهید بصورت دستی آپاچی را نصب کنید. یعنی سورس آپاچی را از سایتش دانلود کرده اید و در پیکربندی مسیر prefix را تغییر نداده اید و بعد از پیکربندی، آن را کامپایل و نصب میکنید.

خط 1: آپاچی در مسیر /usr/local/apache2 نصب میشود.

خط 3: مسیر فایل پروژه ها، در مسیر /usr/local/apache2/htdocs قرار دارد. مسیر DocumentRoot در wampserver پوشه ی www بود.
خط 5: فایل تنظیمات آپاچی در مسیر usr/local/apache2/conf/httpd.conf قرار دارد.
خط 7: خطاهای آپاچی در مسیر /usr/local/apache2/logs/error_log لاگ میشوند.

خط 9: apachectl فایلی است که داخل آن اسکریپتی به زبان Shell نوشته شده است. این فایل نقش یک رابط را ایفا میکند.
این فایل در مسیر /usr/local/apache2/bin/apachectl قرار دارد.

اسکریپت apachectl ابزاری از قبیل (نمایش نسخه، start | stop | restart ، چک کردن درستی سینتکس تنظیمات ، ...) را در اختیار ما میگذارد.
برای دیدن محتوای فایل apachectl، به مسیر گفته شده بروید و فایل را با یک ادیتور باز کنید.

از آنجایی که فایل مجوز execute دارد و اجراییست، بنابراین میتوان کدهای درون آن را اجرا کرد. کافیست مانند کامند روبرو، آنرا صدا بزنیم: /usr/local/apache2/bin/apacheclt ، البته اینجا پیامی میدهد که چگونه باید استفاده شود.

فایل apachectl دارای چندین فلگ میباشد. با اجرای کامند /usr/local/apache2/bin/apachectl -h میتوانید لیست راهنمای دستورات را ببینید.

bithub@ubuntu:~$ /usr/local/apache2/bin/apachectl -h
-------------------------------------------------------
Usage: /usr/sbin/apache2 [-D name] [-d directory] [-f file]
                         [-C "directive"] [-c "directive"]
                         [-k start|restart|graceful|graceful-stop|stop]
                         [-v] [-V] [-h] [-l] [-L] [-t] [-T] [-S] [-X]
Options:
  -D name            : define a name for use in <IfDefine name> directives
  -d directory       : specify an alternate initial ServerRoot
  -f file            : specify an alternate ServerConfigFile
  -C "directive"     : process directive before reading config files
  -c "directive"     : process directive after reading config files
  -e level           : show startup errors of level (see LogLevel)
  -E file            : log startup errors to file
  -v                 : show version number
  -V                 : show compile settings
  -h                 : list available command line options (this page)
  -l                 : list compiled in modules
  -L                 : list available configuration directives
  -t -D DUMP_VHOSTS  : show parsed vhost settings
  -t -D DUMP_RUN_CFG : show parsed run settings
  -S                 : a synonym for -t -D DUMP_VHOSTS -D DUMP_RUN_CFG
  -t -D DUMP_MODULES : show all loaded modules 
  -M                 : a synonym for -t -D DUMP_MODULES
  -t -D DUMP_INCLUDES: show all included configuration files
  -t                 : run syntax check for config files
  -T                 : start without DocumentRoot(s) check
  -X                 : debug mode (only one worker, do not detach)

با توجه به راهنمای دستورات، فرضا اگر بخواهیم، نسخه ی Apache را مشاهده کنیم:

bithub@ubuntu:~$ sudo /usr/local/apache2/bin/apachectl -v
----------------------------------------------------------
Server version: Apache/2.4.25 (Ubuntu)
Server built:   2016-12-21T00:00:00

حالا اگر بخواهیم Apache را start کنیم، به شکل زیر عمل میکنیم:

bithub@ubuntu:~$ sudo /usr/local/apache2/bin/apachectl -k start

 فلگ -k وجودش اختیاریست.

 

حالا اگر مانند جلسه ی قبل، پکیج apache2 را از روی مخازن لینوکس، بر روی Ubuntu نصب کرده باشیم، این مسیر دهی ها تغییر کرده است.
تغییرات را در لیست زیر ببینید:

ServerRoot              ::      /etc/apache2
-------------------------------------------------------------------
DocumentRoot            ::      /var/www/html
-------------------------------------------------------------------
Apache Config Files     ::      /etc/apache2/apache2.conf
                        ::      /etc/apache2/ports.conf
-------------------------------------------------------------------
ErrorLog                ::      /var/log/apache2/error.log
-------------------------------------------------------------------
start/stop              ::      /etc/init.d/apache2 (start|stop|restart)

خط 1: پکیج apache2 در مسیر /etc/apache2 نصب شده است.
خط 3: برخلاف تنظیمات پیش فرض، مسیر پوشه ی پروژه /var/www/html میباشد.
خط 5: مسیر فایل تنظیمات در اینجا، به چند فایل تقسیم شده است. و فایل اصلی /etc/apache2/apache2.conf میباشد و بقیه ی فایل ها به این فایل Include شده اند.

خط 6: فایل تنظیمات Port در مسیر /etc/apache2/ports.conf قرار گرفته است.
خط 8: خطاهای آپاچی در مسیر /var/log/apache2/error.log ثبت میشوند.

خط 10: عمل start | stop | restart توسط sudo /etc/init.d/apache2 start|stop|restart صورت میگیرد.

فایل apache2 در مسیر etc/init.d اسکریپتی است که مخصوص start | stop | restart نوشته شده است.
در بعضی از توزیع ها مانند CentOS, RHEL و حتی در تنظیمات پیش فرض پکیج آپاچی، نام این اسکریپت httpd است.

سؤال: پس apachectl کجاست؟
جواب: در مسیر /usr/sbin/apachectl قرار دارد و داخل اسکریپت /etc/init.d/apache2 آمده است. یعنی تفاوتی در دستور اتفاق نیفتاده است. فقط apache2 بعنوان واسط داره دستور apachectl start|stop|restart را اجرا میکنه.

سؤال: در جلسه ی قبل، از دستور service apache2 start|stop|restart استفاده کردیم. چه تفاوتی بین این دستور و دستور /etc/init.d/apache2 وجود دارد؟
چواب: هیچ تفاوتی. دقیقا مثل هم هستن و دستور service اصطلاحا یک upstart برای /etc/init.d هست.

سؤال: در جلسه ی قبل برای نمایش نسخه ی آپاچی، از دستور apache2 -v استفاده شد. چه فرقی بین apache2 و apachectl و /etc/init.d/apache2 وجود دارد؟
جواب: apache2 خود سرویس دهنده ی آپاچی است. در بعضی از توزیع ها مانند CentOS, RHEL نام آن httpd است.
ولی apachectl اسکریپتی است که برای اجرای دستورات، داخل کدهایش apache2 را صدا میزند. یعنی عملاً apache2 داره با یک واسطه بنام apachectl، اجرا میشه.
اما /etc/init.d/apache2 اسکریپتی است که برای اجرای دستورات start | stop | restart داخل کدهایش، اسکریپت apachectl را صدا میزند. بنابراین در اینجا apache2 با دو واسطه، اجرا میگردد.

 

مسیر فایل های آپاچی در توزیع های Fedora و CentOS و RHEL:

ServerRoot              ::      /etc/httpd
Primary Config Fle      ::      /etc/httpd/conf/httpd.conf
Other Config Files      ::      /etc/httpd/conf.d
DocumentRoot            ::      /var/www/html
ErrorLog                ::      /var/log/httpd/error_log
start/stop              ::      /sbin/service httpd {start|stop|restart}

 

 

اما اگر در سیستم عامل ویندوز کار میکنید و wampserver را نصب کرده اید، بر فرض اینکه ومپ را در مسیر درایو C نصب کرده باشید، فایل تنظیمات در مسیر C:\wamp64\bin\apache\apache2.4.18\conf\httpd.conf قرار گرفته است. البته برای باز کردن این فایل، میتوانید روی آیکون wamp کلیک کنید و از Apache > httpd.conf آنرا باز کنید.
این فایل را باز کنید تا برخی از دستورات این فایل را بررسی کنیم.

دستوراتی که در پایین بررسی میکنیم، این دستورات داخل فایل تنظیمات آپاچی در توزیع های لینوکس هم وجود دارند و تفاوتی بینشان نیست.

خط 62 و 63، تغییر Port آپاچی:

Listen 0.0.0.0:80
Listen [::0]:80

صحبت های جلسه ی اول را دوباره مرور میکنیم تا چرخه ی توضیح را کاملتر کنم.
وقتی سایتی را میخواهیم باز کنیم، آدرس را در مرورگر وارد میکنیم. مرورگر آیپی نام سایت را پیدا میکند و درخواستی به آیپی آن سایت ارسال میکند.
همراه این درخواست، آیپی فرستنده ی درخواست هم ارسال میشود.
همراه این درخواست، یک شماره به نام Port هم ارسال میشود.

در ادامه درخواست به کامپیوتر مقصد میرسد. اما ازآنجایی که روی کامپیوتر مقصد، برنامه های متفاوتی باز شده است، درخواست ارسال شده، مربوط به کدام برنامه است؟
اینجا پورت کمک میکند و میگوید درخواست مخصوص برنامه ایست که پورت آن 80 است. پورت مانند یک پلاک میماند.
وب سرور آپاچی هم بطور پیش فرض روی پورت 80 باز شده است.

 بطور پیش فرض اگر در مرورگرها پورت را وارد نکنیم، مرورگر پورت ارسالی را 80 در نظر میگیرد: http://bithub.ir:80

حالا ممکن است پورت 80 از قبل توسط برنامه ای مانند skype اشغال شده باشد یا برای یک آیپی خاص(از آیپی های روی سیستم) پورت دیگری مد نظر دارید، میتوانید پورت وب سرور آپاچی را عوض کنید.

خط اول از دستورات بالا یعنی Listen 0.0.0.0:80 میگوید، روی تمام IPv4 های سیستم(سیستمی که وب سرور روی آن نصب است)، پورت 80 باز است و به درخواست ها گوش میدهد. یعنی اگر در مرورگر آدرس آیپی 127.0.0.1 یا نام localhost را وارد کنید، صفحه ی index از پوشه ی www باز میشود.
یا مثلا به کمک cmd آیپی سیستمتون رو بدست بیارید:

ipconfig
----------------------------
Wireless LAN adapter Wi-Fi:

   Connection-specific DNS Suffix  . :
   Link-local IPv6 Address . . . . . : fe80::e457:60ff:407c:690a%11
   IPv4 Address. . . . . . . . . . . : (192.168.1.2)
   Subnet Mask . . . . . . . . . . . : 255.255.255.0
   Default Gateway . . . . . . . . . : 192.168.1.1
همانطور که میبینید، آیپی سیستم من 192.168.1.2 هست بنابراین با توجه به دستور Listen 0.0.0.0:80 اگر آیپی 192.168.1.2 را در مرورگرم، وارد کنم، صفحه ی localhost باز خواهد شد. البته نمیشود گفت صفحه ی localhost باز میشود. چون خود localhost هم یک نامی است که به آیپی ورژن 4 127.0.0.1 و آیپی ورژن 6 ::1 درخواست را ارسال میکند.

حالا مرورگر درخواست را به 192.168.1.2 ارسال میکند و کامپیوتر 192.168.1.2 درخواست را تحویل میگیرد و با توجه به پورت 80، این درخواست را تحویل آپاچی میدهد.
بنابراین با توجه به تنظیمات وب سرور (در ادامه آن را بررسی میکنیم)، صفحه ای از پروژه ی ما باز میشود. این صفحه در تنظیمات ذکر شده که فلان آیپی چه صفحه ای رو باز کنه و مثلا آیپی 127.0.0.1 صفحه ی \www\index.php را باز کند.

اما پاسخ وب سرور به مرورگر: با توجه به نکته ای که بالاتر گفتیم؛ "آیپی مبدأ همراه با درخواست به وب سرور ارسال میشود"، بنابراین وب سرور، پاسخ را به آیپی مبدأ میفرستد.

خط دوم تنظیمات Listen [::0]:80 آمده است. آیپی ورژن 6 است معادل دستور بالاییش ولی برای IPv6 ها.
حالا میخواهیم پورت خط اول را 8080 و پورت خط دوم را همان 80 بگذاریم:

Listen 0.0.0.0:8080
Listen [::0]:80

بعد از تغییر در تنظیمات، آپاچی را restart کنید.
با توجه به تنظیمات بالا، تمام IPv4 های روی سیستم با پورت 8080 باز میشود.
مثلا اگر 127.0.0.1 را در مرورگر وارد کنم، هیچ صفحه ای باز نمیشود. یا با توجه به ipconfig اگر 192.168.1.2 را در مرورگر وارد کنم، باز هم هیچ صفحه ای باز نمیشود، اما اگر localhost را وارد کنم، صفحه ی index باز میشود. بخاطر وجود دستور Listen [0:0:0]:80
اما اگر 127.0.0.1:8080 یا 192.168.1.2:8080 را وارد کنم، صفحه ی index باز میشود.

سؤال: چرا localhost باز شد؟
جواب: در cmd ویندوز از localhost پینگ بگیرید تا متوجه شوید:

C:\>ping localhost
-----------------------------------------------------
Pinging DESKTOP-OK90BC1 [::1] with 32 bytes of data:
Reply from ::1: time<1ms
Reply from ::1: time<1ms
Reply from ::1: time<1ms
Reply from ::1: time<1ms
آیپی آدرس localhost در DNS Client (روی ویندوز نصب است)، ست شده است و به هر دو آیپی v4 و v6 درخواست را ارسال میکند.

یک تست دیگر روی سیستم انجام میدم. تنظیمات وب سرور روی به شکل زیر تغییر میدم و وب سرور رو ریستارت میکنم:

Listen 0.0.0.0:80
Listen 192.168.1.2:8080
Listen [::0]:80
Listen [::1]:8081

حالا بغیر از اینکه 192.168.1.2 و localhost با پورت 80 باز میشوند، 192.168.1.2 با پورت 8080 و localhost با پورت 8081 باز خواهد شد.

 

در ادامه ی فایل تنظیمات LoadModule ها آمده اند. لیستی از ماژول های فعال و غیر فعال روی وب سرور هستند. خط هایی که با # شروع شده اند، آن خطوط کامنت شده اند. بعنوان مثال، خط زیر ماژول مفسر PHP است:

LoadModule php7_module "c:/wamp64/bin/php/php7.0.4/php7apache2_4.dll"
ماژول PHP توسط خود PHP تولید شده بنابراین برای آپاچی یک ماژول Third Party محسوب میشود.

یوزر آپاچی:

User daemon
Group daemon

وب سرور آپاچی بعنوان یوزر daemon در سرور فعال است. این یوزرو میتونید تغییر بدید. (برای باز کردن این موضوع بعدا در مورد permission ها در لینوکس، صحبت میکنیم.)

دسترسی به تمام دایرکتوری های داخل سیستم بسته شده است: 

<Directory />
    AllowOverride none
    Require all denied
</Directory>

دایرکتوری پروژه:

DocumentRoot "c:/wamp64/www"
 بطور پیش فرض تمام درخواست ها به پوشه ی www ارسال میشوند. مگر اینکه برای هر آدرس، پوشه ای مخصوص آن آدرس ست کرده باشید.

مجوز های دایرکتوری www:

<Directory "c:/wamp64/www/">
    Options +Indexes +FollowSymLinks +Multiviews
    AllowOverride all
    Require local
</Directory>

اگر از طریق موبایل یا سیستمی دیگر، میخواهید پروژه ی local را باز کنید، کافیست آیپی کامپیوتر سرور، یعنی 192.168.1.2 (با توجه به ipconfig گرفته شده در کامپیوتر سرور) در موبایل یا سیستمی دیگر وارد کنید.
اما دو نکته وجود دارد:
1. روی کامپیوتر سرور Windows Firewall with Advanced Security را باز کنید و در قسمت Inbound Rules، یک Rule جدید برای Port 80 ایجاد کنید. تا درخواست های وب سرور بلاک نشوند.
2. بعد ازینکه مورد اول برطرف شد، اگر آیپی 192.168.1.2 را فرضاً در مرورگر موبایل وارد کنید، با خطای You don't have permission to access / on this server روبرو میشوید. از روی این خطا میتوان فهمید، درخواست شما به آپاچی رسیده است، ولی بخاطر نداشتن دسترسی به پوشه ی www، نمیتوانید آن را باز کنید.
بنابراین برای حل این موضوع، داخل فایل c:\wamp64\bin\apache\apache2.4.18\conf\extra\httpd-vhosts.conf دستور Require all granted را جایگزین Require local کنید.

موبایل فقط یک مثال بود. از هر سیستمی که در داخل یک شبکه با کامپیوتر سرور قرار دارد، میتوانید اینکار را انجام دهید. مثلا از سیستم عامل میتوانید به سیستم عامل های نصب شده روی VM دسترسی داشته باشید و بالعکس ...
اگر روی مودم، آیپی استاتیک set کرده اید(بطور پیش فرض غیر فعال است)، برای اینکه همه ی افراد در فضای اینترنت نتوانند از راه دور به آپاچی روی سیستم ما دسترسی داشته باشند، بجای دستور Require all granted از دستور Require ip ip_address1 ip_address2 ... استفاده کنید. یعنی آیپی آن دستگاه را مشخص کنید. بنابراین اگر میخواهید از موبایل به پروژه دسترسی داشته باشید، آیپی موبایل را وارد میکنید، فرضا دستور Require ip 192.168.1.4 را من وارد میکنم. در نتیجه وقتی در مرورگر موبایل آیپی 192.168.1.2 را وارد میکنید، درخواست به کامپیوتر 192.168.1.2 میرسد. آپاچی چک میکند آیا آیپی ارسال کننده ی درخواست، یعنی 192.168.1.4 اجازه ی دسترسی دارد یا نه. در نتیجه با توجه به دستور Require ip 192.168.1.4 صفحه ی پروژه باز میشود.

نکته: بطور پیش فرض، دسترسی از راه دور وجود ندارد. بنابراین اگر Require all granted باشد، فقط آیپی های داخل شبکه ی شما، میتوانند به آپاچی دسترسی داشته باشند و مشکلی پیش نمیآید. مگر اینکه برای آیپی های داخل شبکه هم بخواهید، محدودیت دسترسی ایجاد کنید. در جلسات آینده، روش دسترسی از راه دور راه توضیح خواهیم داد.

نکته: البته در هاست ها و سرور ها این دستور همان Require all granted ست شده است. بخاطر اینکه همه ی افراد در اینترنت، به سایت دسترسی داشته باشند و آن سایت در مرورگرشان باز شود.
اگر در موبایل میخواهید، پوشه و فایلی را باز کنید، در ادامه ی آدرس آیپی، آن پوشه و فایل را اضافه میکنید. مثلا: 192.168.1.2/project1/info.php

 

Directory Index:

<IfModule dir_module>
    DirectoryIndex index.php index.php3 index.html index.htm
</IfModule>
فرضا وقتی localhost را وارد میکنیم، چون صفحه ای را ذکر نکردیم، ابتدا دنبال index.php میگردد و به ترتیب ...

در بلاک زیر، دسترسی فایلی مثل .htaccess بسته شده است و آپاچی اجازه ی باز شدن این فایل را نمیدهد:

<Files ".ht*">
    Require all denied
</Files>

 مسیر ثبت خطاهای آپاچی:

ErrorLog "c:/wamp64/logs/apache_error.log"

 

حالا یک نگاه اجمالی به تنظیمات php.ini داشته باشیم:

این فایل در مسیر C:\wamp64\bin\php\php7.0.4 قرار گرفته. همچنین میتوانید روی آیکون ومپ کلیک کنید و از مسیر PHP > php.ini فایل تنظیمات را باز کنید. در این صورت فایل php.ini با ادیتور پیش فرضی که در زمان نصب WampServer انتخاب کرده اید، باز خواهد شد.

با ON کردن short_open_tag میتوانید از تگهای <? ?> بجای <?php ?> استفاده کنید:

short_open_tag = Off

میتوانید بعضی از توابع PHP رو غیر فعال کنید:

disable_functions =

فعال یا غیر فعال کردن Output Buffering:

output_buffering = On

حداکثر زمان اجرای اسکریپت در یک درخواست:

max_execution_time = 120

حداکثر میزان مصرفی رم، در اجرای یک اسکریپت:

memory_limit = 128M

چه خطاهایی از PHP نمایش داده شود:

error_reporting = E_ALL

 خطای های PHP نشان داده شود یا خیر:

display_errors = On

مسیر ثبت خطاهای PHP:

error_log ="c:/wamp64/logs/php_error.log"

حداکثر مقدار داده ی ارسال شده:

post_max_size = 8M

فعال یا غیر فعال کردن آپلود فایل:

file_uploads = On

حداکثر مقدار سایز برای آپلود فایل:

upload_max_filesize = 2M

حداکثر تعداد آپلود فایل در یک درخواست:

max_file_uploads = 20

مشخص میکنید سشن در فایل ثبت و مدیریت شود یا در دیتابیس:

session.save_handler = files

مسیر ذخیره ی فایل های سشن:

session.save_path ="c:/wamp64/tmp"

فعال یا غیر فعال کردن OpCache:

opcache.enable=0

مطالب سایت را بدون ذکر منبع (http://bithub.ir) در جایی منتشر نکنید. با تیشکر.


مطالب مرتبط

نظرات کاربران

برای ارسال نظر، باید عضو سایت شوید.
ARAH724

ARAH724:باسلام خدمت جناب موحد سایت خیلی خوبی دارین واق عن عالیه (۲ سال پیش)