SSD Nodes Learn
מדריכים Matt Connorמאת Matt Connor · עודכן 2026-07-24

התקנת LAMP stack ב-Ubuntu 24.04 עם PHP-FPM

מדריך מלא להקמת Apache, MariaDB ו-PHP 8.3 ב-Ubuntu 24.04. נלמד איך להגדיר PHP-FPM, vhost מבוסס שם ו-Certbot ל-HTTPS ללא שגיאות הרשאה ב-MariaDB.

מה אתם בונים

LAMP stack מורכב מארבעה רכיבים בשרת Ubuntu 24.04 אחד: Linux כמערכת ההפעלה, Apache לניהול HTTP, MariaDB לאחסון הנתונים, ו-PHP 8.3 להרצת הקוד. בסיום התהליך תהיה לכם וירטואלי הוסט (virtual host) מבוסס שם המשרת ספריית אפליקציה, מסד נתונים עם משתמש ייעודי בעל הרשאות מינימליות (least-privilege), PHP מחובר ל-Apache באמצעות PHP-FPM, ותעודת Let's Encrypt בחינם.

ההתקנה עצמה כוללת ארבע פקודות apt. רוב המדריך עוסק בחיבור בין הרכיבים ובמגוון טעויות קטנות שעלולות לגרום למערכת חדשה להציג דף ריק, להוריד את קוד המקור לדפדפן, או למנוע גישה למסד הנתונים שהותקן. לכל טעות כזו יש סימן מזהה, והן מפורטות להלן עם הטקסט המדויק שיופיע על המסך.

דרישות קדם ומכשולים נפוצים

הנח שיש לך שרת Ubuntu 24.04 KVM VPS חדש עם משתמש sudo או root, וכתובת IPv4 ציבורית. מערכת מינימלית דורשת 1 GB של RAM; מומלץ להקצות 2 GB לפני התקנת אפליקציה המשתמשת במסד נתונים, מכיוון שה-buffers الافتراضي של MariaDB יחד עם מספר תהליכי PHP-FPM צורכים את ה-gigabyte הראשון במהירות.

שני תנאים חייבים להתקיים כדי ש-Certbot יעבוד בסוף התהליך, לכן יש להכין אותם מראש. עליך להחזיק שם דומיין עם רשומת A המצביעה על ה-IP הציבורי של ה-VPS — Let's Encrypt מבצע אימות באמצעות HTTP לשם זה, וכתובת IP בלבד לא תוכל לקבל תעודה. בנוסף, פורטים 80 ו-443 חייבים להיות נגישים מהאינטרנט; אצל ספקי שירות רבים, המשמעות היא פתיחתם ב-firewall ברשת בלוח הבקרה וגם ב-ufw בשרת עצמו. שינויי DNS עשויים לקחת עד שעה כדי להתפשט, לכן הגדר את רשומת ה-A מראש כדי שהיא תהיה פעילה בזמן שתזדקק לה.

Step 1 - התקנת Apache ואימות דף ברירת המחדל

sudo apt update
sudo apt install -y apache2

apt מפעילה ומאפשרת את השירות עבורך. בדוק זאת:

systemctl status apache2

עליך לראות שורה המכילה את active (running). כעת פתח את http://YOUR_SERVER_IP/ בדפדפן. התוצאה הנכונה היא Apache2 Ubuntu Default Page עם הכיתה הגדולה "It works!" — זהו אישור ש-Apache מגיש דפים ולא שגיאה. הדף נמצא בכתובת /var/www/html/index.html ומוגש על ידי ה-virtual host המוגדר כברירת מחדל 000-default.conf. בהמשך תבטל את שניהם; כרגע, נוכחותם היא בדיוק מה שצריך להופיע.

אם הדף אינו נטען כלל למרות ש-systemctl מראה שהתהליך פועל, חומת אש (firewall) חוסמת את הגישה. זהו השלב הבא.

Step 2 - פתיחת ה-firewall עבור HTTP ו-HTTPS

חבילת apache2 רושמת שלושה application profiles של ufw. רשימתם:

sudo ufw app list

תראה את Apache, Apache Full, ו-Apache Secure. Apache מיועד ל-port 80 בלבד, Apache Secure מיועד ל-443 בלבד, ו-Apache Full מיועד לשניהם — זהו הפרופיל הרלוונטי, מכיוון שתוסיף TLS בהמשך.

sudo ufw allow OpenSSH
sudo ufw allow "Apache Full"
sudo ufw enable

אפשר את OpenSSH לפני הרצת ufw enable. ברירת המחדל של ufw היא חסימת כל ה-incoming traffic, והפעלתו ללא rule של SSH תנתק את החיבור שלך ברגע שההגדרה תופעל — הסשן הנוכחי יישאר פעיל אך לא תוכל להתחבר מחדש. ודא באמצעות sudo ufw status; עליך לוודא ש-OpenSSH, Apache Full, והמקבילים שלהם ב-v6 מוגדרים כ-ALLOW.

Step 3 - התקנת MariaDB ואבטחתה

sudo apt install -y mariadb-server
systemctl status mariadb

גרסת Ubuntu 24.04 כוללת את MariaDB 10.11, גרסת LTS (תמיכה ארוכת טווח), לכן אין צורך במאגר חיצוני. לאחר שהשירות פועל, יש להגן עליו:

sudo mysql_secure_installation

מומלץ לקרוא את ההודעות במקום ללחוץ Enter ללא בדיקה. כאשר מופיעה השאלה לגבי ה-current root password, לחץ על Enter — עדיין אין סיסמה. כאשר מופיעה השאלה "Switch to unix_socket authentication?", התשובה אינה משנה דבר מכיוון שהאפשרות כבר מופעלת בחבילה זו, לכן לחץ על n. בחר ב-n עבור השאלה "Change the root password?" מהסיבה המפורטת בפסקה הבאה, ולאחר מכן ענה Y לשאר השאלות: הסרת משתמשים אנונימיים, איסור התחברות root מרחוק, מחיקת מסד הנתונים test וטעינה מחדש של טבלאות ההרשאות.

זהו החלק שמבלבל את כולם. ב-MariaDB של Ubuntu, חשבון מסד הנתונים root משתמש ב-unix_socket authentication ולא בסיסמה. המשמעות היא שמסד הנתונים סומך על משתמש ה-operating-system שאליו התחברת. לכן, הפקודה הבאה תעבוד מתוך shell של root:

sudo mysql

...והיא תעביר אותך ישירות ל-MariaDB [(none)]> prompt ללא בקשת סיסמה. אותה פקודה שתורץ ממשתמש ללא הרשאות תידחה, וזהו העיקרון המרכזי: הגישה ל-root של מסד הנתונים קשורה ל-sudo במכונה, ואין סיסמה שניתן לגנוב, להשיג באמצעות phishing או באמצעות brute-force. שיטה זו מאובטחת יותר מסיסמה, לכן השאר אותה כפי שהיא. הכלל הנובע מכך הוא: לעולם אל תכוון אפליקציה לחשבון ה-root. צור משתמש ייעודי לכל אפליקציה (Step 7), מכיוון שאפליקציה המתחברת דרך TCP עם שם משתמש וסיסמה אינה יכולה להשתמש ב-socket auth בכל מקרה, וכדאי להגביל כל אפליקציה למסד הנתונים שלה בלבד.

Step 4 - התקנת PHP 8.3 עם PHP-FPM

גרסת ה-PHP המוגדרת כברירת מחדל ב-Ubuntu 24.04 היא 8.3. התקן את מנהל התהליכים FPM ואת ההרחבות (extensions) הנדרשות לאפליקציה טיפוסית:

sudo apt install -y php8.3-fpm php8.3-mysql php8.3-cli \
  php8.3-curl php8.3-xml php8.3-mbstring php8.3-zip

שים לב למה לא מופיע ברשימה: libapache2-mod-php. החבילה הישנה הזו מטמיעה מפרשן PHP בתוך כל תהליך של Apache. זה פשוט, אך כל worker נושא עמו עותק של PHP בין אם הוא משרת סקריפט או תמונה סטטית. שניהם חולקים מחזור חיים אחד, והשיטה עובדת רק עם ה-prefork MPM של Apache — המודול הכי פחות יעיל. לעומת זאת, PHP-FPM מריץ את PHP כמאגר תהליכים (pool) משלו, ש-Apache מתקשרת איתו דרך socket. כך Apache יכולה להשתמש ב-event MPM מבוסס threads עבור קבצים סטטיים ולהעביר הלאה רק בקשות PHP. המאגר מכוון באופן עצמאי מהשרת, ואותו הגדרת FPM בדיוק תעבוד גם אם תשתמש ב-nginx לפניו. זו ברירת המחדל הנוכחית מסיבות מוצדקות.

Apache מתקשרת עם FPM באמצעות המודול proxy_fcgi. הפעל את המודול, הפעל את קובץ ההגדרות שהחבילה של FPM הורידה, והפעל מחדש:

sudo a2enmod proxy_fcgi setenvif
sudo a2enconf php8.3-fpm
sudo systemctl restart apache2

a2enconf php8.3-fpm מפעילה את /etc/apache2/conf-available/php8.3-fpm.conf, המכיל את הכלל המנתב קבצי PHP אל ה-socket של FPM. הליבה של המנגנון מזהה כל קובץ .php ומעבירה אותו אל ה-socket בכתובת /run/php/php8.3-fpm.sock:

<FilesMatch ".+\.ph(ar|p|tml)$">
    SetHandler "proxy:unix:/run/php/php8.3-fpm.sock|fcgi://localhost"
</FilesMatch>

אין צורך לערוך את הקובץ הזה; הוא מגיע עם הגדרות נכונות. אך ידיעת נתיב ה-socket היא זו שתאפשר לך לאבחן בעתיד שגיאות מסוג "PHP downloads instead of running" או "Primary script unknown" — שתיהן נובעות מחוסר הסכמה בין Apache ל-FPM בנוגע ל-socket הזה או לקובץ שמאחוריו.

Step 5 - Virtual host מבוסס שם עבור האפליקציה שלך

Virtual hosting מבוסס שם מאפשר לכתובת IP אחת לשרת אתרים רבים; Apache בוחר את האתר לפי ה-header של Host: בבקשה. צור ספרייה עבור האפליקציה, הרחק מה-/var/www/html ברירת המחדל:

sudo mkdir -p /var/www/testapp
sudo chown -R www-data:www-data /var/www/testapp
sudo chmod -R 755 /var/www/testapp

הבעלות על הקבצים חשובה. Apache ו-PHP-FPM רצים תחת המשתמש www-data ב-Ubuntu, לכן קבצים שהשרת צריך לקרוא — ותיקיות שהאפליקציה צריכה לכתוב אליהן, כמו תיקיית uploads — חייבים להיות בבעלות www-data. אם תרצה לערוך קבצים גם כמשתמש המחובר שלך, דפוס נפוץ הוא להיות הבעלים של הקבצים ולהוסיף את המשתמש שלך לקבוצת www-data; עבור פריסה פשוטה, www-data:www-data היא האופציה הצפויה ביותר.

צור את ה-virtual host ב-/etc/apache2/sites-available/testapp.conf:

<VirtualHost *:80>
    ServerName app.example.com
    DocumentRoot /var/www/testapp

    <Directory /var/www/testapp>
        Options -Indexes +FollowSymLinks
        AllowOverride All
        Require all granted
    </Directory>

    ErrorLog ${APACHE_LOG_DIR}/testapp-error.log
    CustomLog ${APACHE_LOG_DIR}/testapp-access.log combined
</VirtualHost>

הגדר את ServerName לדומיין האמיתי שלך. Options -Indexes מונע מ-Apache להציג את רשימת הקבצים בתיקייה כאשר אין קובץ index — אחרת מבקרים יוכלו לעיין במבנה המקור של הקוד. AllowOverride All מאפשר לקובץ .htaccess לעבוד, מה שרוב אפליקציות ה-PHP מצפות לו עבור כתובות URL יפות; ניתן להסיר אותו מ-None לשיפור מהירות קל אם האפליקציה שלך אינה זקוקה לו. הפעל את האתר, בטל את ברירת המחדל, בדוק את הקונפיגורציה, ובצע reload:

sudo a2ensite testapp
sudo a2dissite 000-default
sudo apache2ctl configtest
sudo systemctl reload apache2

apache2ctl configtest אמור להדפיס את Syntax OK. השורה a2dissite 000-default היא השורה שמשתמשים נוטים לשכוח, והיא הסיבה לכך שדף ברירת המחדל נשאר מוצג — נושא שמוסבר בסעיף ה-failures.

Step 6 - Prove PHP runs, then delete the proof

צור קובץ PHP בשורה אחת בתוך תיקיית השורש של האפליקציה:

echo "<?php phpinfo();" | sudo tee /var/www/testapp/info.php

גלוש לכתובת http://app.example.com/info.php. תוצאה תקינה היא טבלה ארוכה בצבעי סגול ואפור של PHP Version 8.3.x המפרטת את המודולים הטעונים, כאשר השורה Server API מציגה את FPM/FastCGI. שורה אחרונה זו מאשרת שהבקשות עוברות דרך PHP-FPM ולא דרך mod_php.

כעת מחק את הקובץ מיד:

sudo rm /var/www/testapp/info.php

הקובץ phpinfo() חושף את גרסת ה-PHP המדויקת שלך, את כל ההרחבות הטעונות, נתיבי קבצים ופרטי סביבה — מידע קריטי לכל מי שסורק את השרת לחיפוש גרסה עם חולשה ידועה. זהו בדיקה בלבד, לא תכונה. מחק את הקובץ ברגע שצפית בדף. אם במקום הטבלה הדפדפן הציע לך להוריד את info.php, ה-PHP אינו מוגדר כראוי מול Apache; עבור לסעיף תקלות לפני שתבצע פעולה אחרת.

Step 7 - יצירת מסד הנתונים של האפליקציה ומשתמש עם הרשאות מינימליות

פתחו את מסד הנתונים כמשתמש root המחובר באמצעות socket:

sudo mysql

לאחר מכן, צרו מסד נתונים אחד ומשתמש אחד המוגבל בדיוק למסד הנתונים הזה:

CREATE DATABASE appdb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'appuser'@'localhost' IDENTIFIED BY 'a-long-random-password';
GRANT ALL PRIVILEGES ON appdb.* TO 'appuser'@'localhost';
FLUSH PRIVILEGES;
EXIT;

ישנן שלוש בחירות מכוונות כאן. utf8mb4 הוא UTF-8 ב-4 bytes אמיתי — ה-alias הישן utf8 חותך באופן שקט emoji וبعض תווים ב-CJK, לכן תמיד השתמשו ב-utf8mb4. ההרשאה (grant) היא על appdb.*, לא על *.*: משתמש זה יכול לגשת למסד הנתונים שלו בלבד ולא לשום דבר אחר, כך שפרצת SQL-injection באפליקציה לא תוכל לקרוא טבלאות של אתרים אחרים. ו-'appuser'@'localhost' מגביל את החשבון לחיבורים שמקורם במכונה עצמה.

בצעו בדיקה כמשתמש זה:

mysql -u appuser -p appdb

המערכת תבקש סיסמה ותעביר אתכם לממשק MariaDB [appdb]>. שימו לב שאין דגל -h — השאירו אותו ללא שימוש והלקוח יתחבר דרך ה-Unix socket המקומי, וזה בדיוק מה ש-MariaDB מחשיב כ-localhost. נקודה אחת שחשוב להכיר: עבור MySQL ו-MariaDB, localhost פירושו Unix socket ו-127.0.0.1 פירושו חיבור TCP. בגרסת Ubuntu 24.04 MariaDB סטנדרטית, השרת עדיין מתרגם חיבור TCP מ-127.0.0.1 חזרה ל-localhost, ולכן שניהם תואמים לחשבון — אך בשרתים עם skip-name-resolve מופעל (שיפור ביצועים נפוץ, והסטנדרט בתמונות container רבות), השניים נחשבים למארחים שונים, ואפליקציה המנסה להתחבר דרך 127.0.0.1 תידחה עם שגיאת ERROR 1045 (28000): Access denied for user 'appuser'@'127.0.0.1' (using password: YES) גם אם הסיסמה נכונה.

לכן, הגדירו את האפליקציה שלכם עם host localhost, משתמש appuser, ומסד נתונים appdb — לעולם לא עם root. ב-PHP, הן mysqli והן PDO עוברות לשימוש ב-Unix socket כאשר ה-host הוא המחרוזת המדויקת localhost, מה שמתאים לחשבון שיצרתם זה עתה. אם framework דורש host מספרי ב-TCP, צרו את המשתמש כך שיתאים לאופן החיבור בפועל — 'appuser'@'127.0.0.1', או @'%' (בצירוף כלל firewall) רק אם חייבים להגיע למסד הנתונים ממכונה אחרת.

Step 8 - הוספת HTTPS באמצעות Certbot

הגשת טופס התחברות באמצעות HTTP רגיל שולחת סיסמאות בטקסט גלוי, וכל דפדפן מודרני יסמן את הדף כ-"Not secure". Certbot פותר זאת באמצעות פקודה אחת. התקן את התוסף של Apache:

sudo apt install -y certbot python3-certbot-apache
sudo certbot --apache

Certbot משתמש בשני תוספים במקרה זה. ה-apache authenticator מוכיח שאתה שולט בדומיין על ידי הצגת קובץ אימות (challenge file) באופן זמני דרך Apache הפועל, וה-apache installer משנה את ה-virtual host שלך כדי להוסיף את בלוק ה-443, מפנה אותו אל התעודה החדשה, ומבצע הפניה (redirect) של כל תעבורת ה-HTTP ל-HTTPS כברירת מחדל — החל מגרסה Certbot 2.0 אין שאלה לגבי הפניה; העבר את --no-redirect אם עליך להמשיך להגיש HTTP רגיל. מכיוון שהגדרת ServerName אמיתי ב-Step 5, Certbot מזהה את הדומיין באופן אוטומטי. תעודות תקפות ל-90 יום והחבילה מתקינה timer של systemd המחדש אותן; בדוק את ה-timer באמצעות sudo certbot renew --dry-run, שאמור להסתיים ב-Congratulations, all simulated renewals succeeded.

למדריך מלא על תהליך האימות, מנגנון חידוש התעודה, ודרישות ה-DNS וה-firewall, עיין במדריך הנלווה issuing free Let's Encrypt TLS certificates with Certbot on Apache.

Backups, upgrades, and hardening

גבו את שני הרכיבים השומרים על המצב (state) שלכם: מסדי הנתונים ושורש האתר (web root). הגישה הפשוטה והאמינה ביותר היא ביצוע dump לוגי מדי לילה — sudo sh -c 'mysqldump --all-databases --single-transaction | gzip > /root/db-$(date +%F).sql.gz', ולאחר מכן העתקת הקובץ אל מחוץ לשרת. חשוב לעטוף את כל תהליך העבודה ב-sudo sh -c: ללא כך, ה-shell יריץ את ה-> /root/... redirect תחת המשתמש שלכם והפעולה תיכשל עם Permission denied, מכיוון שרק mysqldump ירש את ה-sudo. --single-transaction מספקת snapshot עקבי של טבלאות ה-InnoDB ללא נעילתן. ש搭配ו זאת עם tar של /var/www ו-/etc/apache2/sites-available, ותוכלו לשחזר את כל ה-stack על VPS חדש באמצעות הקבצים הללו.

שדרוגים הם תהליך sudo apt update && sudo apt upgrade רגיל. השדרוג בעייתי במיוחד הוא PHP version bump — כאשר גרסת Ubuntu עתידית תשנה את ברירת המחדל ל-PHP 8.4, ייתכן ש-apt יתקין את php8.4-fpm לצד 8.3, ה-socket יהפוך ל-/run/php/php8.4-fpm.sock, והגדרות ה-Apache שלכם עדיין יצביעו על ה-socket של 8.3. יש להפעיל את ה-conf החדש (sudo a2enconf php8.4-fpm) ולבטל את הישן, אחרת האתר יחזיר שגיאת Primary script unknown לאחר שדרוג שגרתי. מכיוון שגרסאות PHP מתעדכנות מהר יותר מגרסאות LTS, מומלץ לבדוק את הערות השחרור (release notes) של PHP במקום להגביל גרסת patch ספציפית.

שני צעדי hardening כדאי לבצע ביום הראשון. ראשית, התקינו Fail2Ban watching SSH על השרת — VPS ציבורי מקבל ניסיונות התחברות אוטומטיים תוך דקות, ו-jail קטן יהפוך אלפי ניסיונות למעט ניסיונות לפני חסימה. שנית, אם אתם מעדיפים לנהל את ה-Apache virtual hosts, מסדי הנתונים של MariaDB ומשתמשים דרך דפדפן במקום לערוך קבצים ידנית, the Webmin web-based control panel פועל על ה-stack הזה בדיוק ומנהל את אותם קבצי הגדרות שכתבתם. אף אחד מהם אינו מחליף הבנה של המרכיבים, אך שניהם מפחיתים את רמת המורכבות בניהול היומיומי.

Failure modes, with the strings you will see

The default page will not go away. ערכת את ה-virtual host, ביצעת reload, אך הדפדפן עדיין מציג את "Apache2 Ubuntu Default Page" ואת ה-banner של "It works!". Apache מגיש את ה-virtual host הראשון שמתאים לבקשה, וכאשר אף ServerName אינו תואם לבקשה, הקובץ הראשון לפי סדר אלפביתי מנצח — 000-default.conf מופיע לפני testapp.conf. או ששם ה-host של הבקשה אינו תואם ל-ServerName שלך, או שלא הרצת מעולם את sudo a2dissite 000-default. בטל את ה-default, sudo systemctl reload apache2, וודא באמצעות apache2ctl -S, שמדפיס את מפת ה-vhost ומראה איזה config מחזיק ב-default. נקה גם את ה-browser cache; קובץ 200 שמור מהדף הישן עשוי להישאר ולהופיע.

A .php file downloads instead of running. פתחת את info.php והדפדפן מוריד קובץ המכיל את קוד המקור של <?php, או מציג אותו כטקסט פשוט, במקום להריץ אותו. Apache מגיש את הקובץ כ-static asset מכיוון שה-PHP handler אינו מחובר — דילגת על sudo a2enmod proxy_fcgi, או על sudo a2enconf php8.3-fpm, או שלא הפעלת מחדש את Apache לאחר מכן. הרץ את שלושתם (Step 4) ובצע reload. ודא שה-module טעון באמצעות apache2ctl -M | grep fcgi, שאמור לרשום את proxy_fcgi_module. מדובר בדליפת קוד מקור ולא בבאג קוסמטי, לכן תקן זאת לפני שתעלה תוכן אמיתי לשרת.

ERROR 1698 (28000): Access denied for user 'root'@'localhost'. הרצת את mysql -u root או mariadb -u root ללא sudo. חשבון ה-root משתמש ב-unix_socket auth, ולכן הוא מקבל אותך רק כאשר משתמש ה-OS שלך הוא בפועל root. הפתרון הוא sudo mysql — ללא -u root, ללא סיסמה. הודעה זו היא ההתנהגות הצפויה של socket auth שעובד כראוי, ולא התקנה שבורה.

ERROR 1045 (28000): Access denied for user 'appuser'@'127.0.0.1' מהאפליקציה, עם הסיסמה הנכונה. החשבון קיים כ-'appuser'@'localhost', אך האפליקציה שלך מתחברת דרך TCP ל-127.0.0.1 בשרת שבו פתרון שמות המhosts מבוטל (skip-name-resolve), ולכן MariaDB מזהה את שניהם כ-hosts שונים — localhost הוא ה-Unix socket, 127.0.0.1 הוא TCP. כוון את האפליקציה ל-host localhost כדי שתשתמש ב-socket ותתאים לחשבון, או צור חשבון שני 'appuser'@'127.0.0.1' אם ה-framework תומך ב-TCP בלבד.

AH01071: Got error 'Primary script unknown' ב-/var/log/apache2/testapp-error.log, כאשר הדפדפן מציג את File not found.. Apache העביר את הבקשה ל-PHP-FPM, אך FPM לא הצליח למצוא את ה-script בנתיב ש-Apache סיפק לו. שתי סיבות נפוצות: ה-FPM socket בקונפיגורציה שלך מצביע על גרסת PHP שאינה מותקנת (php8.4 socket לאחר שדרוג בעוד שרק 8.3 רצה), או שהקובץ פשוט לא נמצא שם מכיוון ש-DocumentRoot והספריה ה-real אינם תואמים. בדוק שה-socket קיים באמצעות ls -l /run/php/, וודא ש-DocumentRoot תואם למקום שבו הקובץ נמצא, והפעל מחדש גם את php8.3-fpm וגם את apache2.

AH00558: apache2: Could not reliably determine the server's fully qualified domain name בכל הפעלה מחדש. זוהי אזהרה לא מזיקה, לא שגיאה — Apache אומר לך שאין ServerName גלובלי מוגדר. השתק אותה על ידי כתיבת ServerName your.domain לתוך /etc/apache2/conf-available/servername.conf והרצת sudo a2enconf servername.

(98)Address already in use: AH00072: make_sock: could not bind to address 0.0.0.0:80 כאשר Apache עולה. שרת אינטרנט אחר כבר תופס את פורט 80 — לעיתים קרובות nginx שנותר מניסוי קודם. מצא אותו באמצעות sudo ss -ltnp | grep :80, ולאחר מכן עצור ונטרל את השירות השני לפני הפעלת Apache.

FAQ

mod_php או PHP-FPM - באיזה מהם כדאי להשתמש?

השתמש ב-PHP-FPM. mod_php מטמיע מפרשן (interpreter) בתוך כל תהליך Apache וכופה את השימוש ב-prefork MPM האיטי, ולכן Apache סוחבת עומס של PHP גם בעת שירות תמונה סטטית. PHP-FPM מריץ PHP כמאגר (pool) נפרד המכוון באופן עצמאי, אשר Apache ניגשת אליו דרך socket. שיטה זו מאפשרת עבודה עם ה-event MPM המהיר יותר, ותיקנות קלה למעבר ל-nginx בעתיד. זוהי ברירת המחדל המודרנית; mod_php רלוונטית רק עבור אפליקציות ישנות (legacy) התלויות בהתנהגות מסוימת בתוך התהליך (in-process).

מדוע הדפדפן מוריד את קובץ ה-PHP במקום להריץ אותו?

Apache מתייחס לקובץ .php כהורדה סטטית מכיוון שאין לו PHP handler מחובר. ב-Ubuntu 24.04 עם FPM, המשמעות היא שפספסת אחד מבין sudo a2enmod proxy_fcgi, sudo a2enconf php8.3-fpm, או את הפעולה של Apache restart לאחר מכן. הרץ את שלושתם ולאחר מכן וודא באמצעות apache2ctl -M | grep fcgi ש-proxy_fcgi_module מופיע ברשימה. עד שתתקן זאת, השרת חושף את קוד המקור, לכן יש להתייחס לכך כעניין דחוף.

מדוע גישת root נדחית ב-MariaDB למרות שיש את הסיסמה הנכונה?

מכיוון שאין סיסמה — MariaDB ב-Ubuntu מבצעת אימות לחשבון root באמצעות unix_socket, מה שמקשר אותו למשתמש root של מערכת ההפעלה. פקודת mysql -u root מתוך shell רגיל תחזיר ERROR 1698 (28000): Access denied for user 'root'@'localhost' כפי שתוכנן. התחבר באמצעות sudo mysql במקום זאת, וצור משתמש נפרד המאומת באמצעות סיסמה עבור כל אפליקציה, במקום להשתמש מחדש ב-root.

כיצד אוסיף HTTPS לאתר ה-LAMP שלי?

התקן את certbot ו-python3-certbot-apache, כוון את רשומת ה-A של הדומיין אל השרת, ולאחר מכן הרץ את sudo certbot --apache. מנגנון האימות של Apache מוכיח שליטה בדומיין דרך Apache הפועל, והמתקין מעדכן את ה-virtual host עבור פורט 443 ומגדיר חידוש אוטומטי. המדריך מלא ל-Certbot ו-Apache מסביר את התהליך, את טיימר החידוש ואת מצבי הכשל הנפוצים.

#lamp#apache#mariadb#php-fpm#ubuntu