نگاه اجمالی به تنظیمات 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
میتوانید لیست راهنمای دستورات را ببینید.
bidak@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 را مشاهده کنیم:
bidak@ubuntu:~$ sudo /usr/local/apache2/bin/apachectl -v
----------------------------------------------------------
Server version: Apache/2.4.25 (Ubuntu)
Server built: 2016-12-21T00:00:00
حالا اگر بخواهیم Apache را start کنیم، به شکل زیر عمل میکنیم:
bidak@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://example.com: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 هم یک نامی است که به آیپی ورژن 4127.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 = file
مسیر ذخیره ی فایل های سشن:
session.save_path ="c:/wamp64/tmp"
فعال یا غیر فعال کردن OpCache:
opcache.enable=0
اسلاید مقاله: لینک اسلاید Apache
اسلاید مقاله: لینک اسلاید PHP
نویسنده: محسن موحد
پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .