תצורת Apache: אופטימיזציה, אבטחה וקישוריות מטמון
דמיינו: חנות מסחר אלקטרוני מבוססת WordPress עם 1000 מבקרים ייחודיים בשעה זורקת שגיאת 503. תמונה טיפוסית — Apache מיצה את MaxClients, ו-PHP-FPM לא מוגדר. ללא קישוריות מטמון, כל בקשה לתוכן סטטי (CSS, JS, תמונות) טוענת את השרת מחדש — LCP מזנק מעבר ל-5 שניות. ב-90% מהמקרים, זה נפתר על ידי מעבר ל-PHP-FPM דרך Unix socket והפעלת mod_expires. במשך 10 שנים, הגדרנו Apache עבור 500+ פרויקטים: מדפי נחיתה פשוטים ועד SaaS בעומס גבוה. להלן תכנית מוכחת שמפחיתה TTFB ב-30% וצריכת זיכרון ב-40%.
הבעיה הלא-מובנת מאליה היא .htaccess. בכל בקשה, Apache בודק תיקיות מהשורש ועד DocumentRoot עבור .htaccess. עבור מבנים עמוקים, זה יכול להיות עד 10 פעולות דיסק. אנו משתמשים ב-AllowOverride None ומעבירים חוקים לתצורת VirtualHost. זה מאיץ את האספקה ב-15–20%.
בעיות טיפוסיות שאנו פותרים
- אספקת תוכן סטטי איטית — ללא mod_expires ו-mod_deflate, הדפדפן מבקש מחדש קבצים כל פעם, LCP גדל ב-30%.
- VirtualHosts לא מאובטחים — תיקיות פתוחות, פרוטוקולים מיושנים, חוסר HSTS.
- .htaccess שגוי — Laravel נשבר בגלל חוסר RewriteRule, .env נגיש מבחוץ.
- PHP-FPM דרך TCP במקום Unix socket — תוספת של 20% זמן השהיה על localhost.
- אין הגבלת קצב — לקוח יחיד יכול להוריד את כל התוכן תוך שניות.
כיצד אנו מגדירים Apache מוכן לשימוש
הערימה שלנו: Apache 2.4+, PHP 8.3 (FPM דרך socket), Laravel, WordPress, כל CMS. עבור כל פרויקט, אנו יוצרים תצורה מוכנת לייצור המותאמת לעומס. הנה דוגמה עבור Laravel:
<VirtualHost *:443>
ServerName example.com
DocumentRoot /var/www/myapp/current/public
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/example.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem
Protocols h2 http/1.1
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"
Header always set X-Frame-Options "DENY"
<Directory /var/www/myapp/current/public>
AllowOverride All
Require all granted
Options -Indexes
</Directory>
<FilesMatch \.php$>
SetHandler "proxy:unix:/var/run/php/php8.3-fpm.sock|fcgi://localhost"
</FilesMatch>
<FilesMatch "\.(css|js|jpg|png|gif|ico|svg|woff2)$">
Header set Cache-Control "public, max-age=31536000, immutable"
</FilesMatch>
ErrorLog ${APACHE_LOG_DIR}/myapp-error.log
CustomLog ${APACHE_LOG_DIR}/myapp-access.log combined
</VirtualHost> דוגמת תצורה עבור WordPress עם אופטימיזציה נוספת
<VirtualHost *:443>
ServerName blog.example.com
DocumentRoot /var/www/wp/current
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/blog.example.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/blog.example.com/privkey.pem
Protocols h2 http/1.1
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"
Header always set X-Content-Type-Options "nosniff"
<Directory /var/www/wp/current>
AllowOverride None
Require all granted
Options -Indexes +FollowSymLinks
# WordPress rewrite rules
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</Directory>
<FilesMatch \.php$>
SetHandler "proxy:unix:/var/run/php/php8.3-fpm.sock|fcgi://localhost"
</FilesMatch>
<IfModule mod_expires.c>
ExpiresActive On
ExpiresByType image/jpg "access plus 1 year"
ExpiresByType image/jpeg "access plus 1 year"
ExpiresByType image/gif "access plus 1 year"
ExpiresByType image/png "access plus 1 year"
ExpiresByType text/css "access plus 1 month"
ExpiresByType application/javascript "access plus 1 month"
</IfModule>
<IfModule mod_deflate.c>
AddOutputFilterByType DEFLATE text/html text/css application/json application/javascript
DeflateCompressionLevel 6
</IfModule>
ErrorLog ${APACHE_LOG_DIR}/wp-error.log
CustomLog ${APACHE_LOG_DIR}/wp-access.log combined
</VirtualHost> מה כלול בעבודה
- ביקורת על תצורת Apache הנוכחית.
- הגדרת VirtualHost, SSL (Let's Encrypt), HSTS.
- אופטימיזציה של MPM event, gzip, קישוריות מטמון.
- .htaccess מותאם ל-CMS שלך (Laravel, WordPress, Drupal).
- הטמעת הגבלת קצב וכותרות אבטחה.
- בדיקת עומס (ab, siege) ומסירת תיעוד.
- הכשרת הצוות שלך בניהול תצורה ותמיכה לאחר פריסה.
אופטימיזציה של MPM וקישוריות מטמון לפרויקטים בעומס גבוה
השלב הראשון הוא בחירת MPM. עבור אתרי PHP דינמיים, השתמשו ב-mpm_event. דוגמת אופטימיזציה:
<IfModule mpm_event_module>
StartServers 2
MinSpareThreads 25
MaxSpareThreads 75
ThreadLimit 64
ThreadsPerChild 25
MaxRequestWorkers 150
MaxConnectionsPerChild 0
</IfModule>לאחר מכן הפעילו דחיסה וקישוריות מטמון:
<IfModule mod_deflate.c>
AddOutputFilterByType DEFLATE text/html text/css application/json application/javascript
DeflateCompressionLevel 6
</IfModule>
<IfModule mod_expires.c>
ExpiresActive On
ExpiresByType text/css "access plus 1 year"
ExpiresByType application/javascript "access plus 1 year"
ExpiresByType image/jpeg "access plus 1 year"
ExpiresByType image/png "access plus 1 year"
</IfModule>טעות נפוצה היא שימוש ב-mod_php במקום PHP-FPM. הראשון צורך 40% יותר זיכרון בעומס שיא. מעבר ל-PHP-FPM מפחית TTFB ב-15% ומכפיל את התפוקה.
למה להשתמש ב-PHP-FPM עם Apache?
PHP-FPM דרך Unix socket מפחית זמן השהיה ב-20% על localhost בהשוואה ל-TCP. יתר על כן, mod_php צורך 40% יותר זיכרון בעומסי שיא מכיוון שכל תהליך Apache נושא את המפרש. PHP-FPM מאפשר ניהול גמיש של pools ותצורת php.ini נפרדת.
כיצד Apache שונה מ-Nginx ומתי לבחור בו
| קריטריון | Apache | Nginx |
|---|---|---|
| עיבוד דינמי | mod_php (מובנה) | PHP-FPM (חיצוני) |
| .htaccess | נתמך לכל תיקייה | לא נתמך |
| זיכרון לכל חיבור | גבוה יותר (תהליך לכל בקשה) | נמוך יותר (מונע אירועים) |
| תוכן סטטי | טוב עם mod_cache | מצוין מחוץ לקופסה |
| גמישות תצורה | מודולרי, הרבה הוראות | פשוט יותר, פחות אפשרויות |
Apache עדיף על Nginx בשני מקרים: כאשר .htaccess קריטי (אירוח משותף) או כאשר משתמשים במודולים כמו mod_ldap, mod_authnz_ldap. אחרת, Nginx נותן 30% יותר RPS על תוכן סטטי.
השוואת מודולי MPM של Apache
| פרמטר | mpm_prefork | mpm_worker | mpm_event |
|---|---|---|---|
| סוג | חוט אחד לכל בקשה | מספר חוטים לכל תהליך | חוטים + לולאת אירועים |
| זיכרון | גבוה (תהליך 1 = בקשה 1) | בינוני | נמוך |
| תאימות | mod_php, אפליקציות ישנות | PHP-FPM, Python | PHP-FPM, Python, Node |
| בעומס | ממצה זיכרון במהירות | טוב יותר מ-prefork | אופטימלי לעומסים גבוהים |
תהליך עבודה לתצורת Apache
- ניתוח: לימוד תצורה נוכחית, עומס, CMS.
- עיצוב: בחירת MPM, מודולים, פרמטרי קישוריות מטמון.
- יישום: הגדרת VirtualHost, SSL, .htaccess, הגבלת קצב.
- בדיקה: בדיקת LCP, CLS, TTFB דרך Lighthouse, בדיקת עומס.
- פריסה: החלת תצורה, ניטור לוגים, מסירת תיעוד.
טעויות נפוצות שאנו נמנעים מהן:
- חוסר
<VirtualHost *:443> ServerName example.com DocumentRoot /var/www/myapp/current/public SSLEngine on SSLCertificateFile /etc/letsencrypt/live/example.com/fullchain.pem SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem Protocols h2 http/1.1 Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains" Header always set X-Frame-Options "DENY" <Directory /var/www/myapp/current/public> AllowOverride All Require all granted Options -Indexes </Directory> <FilesMatch \.php$> SetHandler "proxy:unix:/var/run/php/php8.3-fpm.sock|fcgi://localhost" </FilesMatch> <FilesMatch "\.(css|js|jpg|png|gif|ico|svg|woff2)$"> Header set Cache-Control "public, max-age=31536000, immutable" </FilesMatch> ErrorLog ${APACHE_LOG_DIR}/myapp-error.log CustomLog ${APACHE_LOG_DIR}/myapp-access.log combined </VirtualHost>. - הרשאות DocumentRoot שגויות (צריך להיות 755, לא 777).
- שימוש ב-mod_php במקום PHP-FPM — 40% יותר צריכת זיכרון.
לוחות זמנים משוערים
הגדרת Apache בסיסית עם PHP-FPM אורכת מיום אחד. מחזור מלא עם אופטימיזציה, אבטחה ובדיקת עומס — עד 3 ימים. העלות מחושבת בנפרד. הזמינו ביקורת תצורה — אנו נעריך את הפרויקט שלכם ונציע פתרון מוכן לשימוש. קבלו תצורת Apache העומדת בשיטות העבודה המומלצות עם פעילות יציבה מובטחת בעומס שיא. צרו קשר לייעוץ על הפרויקט שלכם.







