Chapter 10: Dynamic Website Hosting (PHP, Python, Node.js with MySQL)
10.3 PHP with MySQL
Friends, with PHP the web server doesn't run the code itself – it sends .php files to PHP-FPM. If the socket path is right, everything works.
मित्रांनो, PHP साठी वेब सर्व्हर स्वतः कोड चालवत नाही – तो .php फाइल्स PHP-FPM कडे पाठवतो. सॉकेटचा पाथ बरोबर असला की सगळं चालतं.
दोस्तों, PHP के लिए वेब सर्वर ख़ुद कोड नहीं चलाता – वो .php फ़ाइल्स PHP-FPM को भेजता है. सॉकेट का पाथ सही हो तो सब चलता है.
Install PHP
| OS + web server | Install command | PHP handler |
|---|---|---|
| AL2023 + Nginx or Apache | sudo yum install -y php php-fpm php-mysqlnd php-cli |
PHP-FPM socket /run/php-fpm/www.sock |
| CentOS Stream 9 + Nginx or Apache | sudo yum install -y php php-fpm php-mysqlnd php-cli |
PHP-FPM socket /run/php-fpm/www.sock |
| Ubuntu + Nginx | sudo apt install -y php-fpm php-mysql |
PHP-FPM socket /run/php/php8.x-fpm.sock |
| Ubuntu + Apache | sudo apt install -y php libapache2-mod-php php-mysql |
Apache mod_php (no FPM needed) |
On AL2023 / CentOS, start PHP-FPM and restart the web server:
sudo service php-fpm start
sudo systemctl enable php-fpm
sudo service nginx restart # or: sudo service httpd restart
php -v
On Amazon Linux 2023 and CentOS, Apache is automatically wired to PHP-FPM by /etc/httpd/conf.d/php.conf, and the default Nginx server is wired by /etc/nginx/default.d/php.conf. For your own Nginx server block, add the PHP location shown below.
Nginx server block for PHP
AL2023 / CentOS Stream 9 — /etc/nginx/conf.d/phpapp.conf:
sudo mkdir -p /var/www/phpapp
sudo tee /etc/nginx/conf.d/phpapp.conf > /dev/null <<'EOF'
server {
listen 80;
server_name YOUR_SERVER_NAME;
root /var/www/phpapp;
index index.php index.html;
location / {
try_files $uri $uri/ /index.php?$args;
}
location ~ \.php$ {
try_files $uri =404;
fastcgi_pass unix:/run/php-fpm/www.sock;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
}
EOF
sudo sed -i "s/YOUR_SERVER_NAME/$(curl -s https://checkip.amazonaws.com)/" /etc/nginx/conf.d/phpapp.conf
sudo nginx -t && sudo service nginx reload
Ubuntu — /etc/nginx/sites-available/phpapp:
ls /run/php/ # note the socket name, e.g. php8.3-fpm.sock (24.04) or php8.1-fpm.sock (22.04)
sudo mkdir -p /var/www/phpapp
sudo tee /etc/nginx/sites-available/phpapp > /dev/null <<'EOF'
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name _;
root /var/www/phpapp;
index index.php index.html;
location / {
try_files $uri $uri/ /index.php?$args;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php-fpm.sock;
}
}
EOF
sudo ln -sf /etc/nginx/sites-available/phpapp /etc/nginx/sites-enabled/phpapp
sudo rm -f /etc/nginx/sites-enabled/default /etc/nginx/sites-enabled/mysite
sudo nginx -t && sudo service nginx reload
/run/php/php-fpm.sock is a symlink to the versioned socket; if it does not exist on your system, replace it with the exact name shown by ls /run/php/.
Apache virtual host for PHP
With Apache, PHP works automatically once PHP is installed (mod_php on Ubuntu, php-fpm via php.conf on AL2023/CentOS). Just point a virtual host at the folder (as in Chapter 7) with DirectoryIndex index.php index.html, or use the default /var/www/html.
The PHP application
sudo tee /var/www/phpapp/db.php > /dev/null <<'EOF'
<?php
$dsn = "mysql:host=127.0.0.1;dbname=appdb;charset=utf8mb4";
$user = "appuser";
$pass = "App@Pass123";
try {
$pdo = new PDO($dsn, $user, $pass, [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]);
} catch (PDOException $e) {
http_response_code(500);
die("Database connection failed: " . htmlspecialchars($e->getMessage()));
}
EOF
sudo tee /var/www/phpapp/index.php > /dev/null <<'EOF'
<?php
require __DIR__ . "/db.php";
if ($_SERVER["REQUEST_METHOD"] === "POST" && !empty($_POST["name"]) && !empty($_POST["city"])) {
$stmt = $pdo->prepare("INSERT INTO students (name, city) VALUES (?, ?)"); // prepared = safe from SQL injection
$stmt->execute([$_POST["name"], $_POST["city"]]);
header("Location: /");
exit;
}
$rows = $pdo->query("SELECT id, name, city FROM students ORDER BY id")->fetchAll(PDO::FETCH_ASSOC);
?>
<!DOCTYPE html>
<html><head><meta charset="utf-8"><title>PHP + MySQL on EC2</title></head>
<body style="font-family:Arial;max-width:700px;margin:30px auto">
<h1>Students (PHP + MySQL)</h1>
<table border="1" cellpadding="6">
<tr><th>ID</th><th>Name</th><th>City</th></tr>
<?php foreach ($rows as $r): ?>
<tr><td><?= $r["id"] ?></td><td><?= htmlspecialchars($r["name"]) ?></td><td><?= htmlspecialchars($r["city"]) ?></td></tr>
<?php endforeach; ?>
</table>
<h3>Add student</h3>
<form method="post">
<input name="name" placeholder="Name" required>
<input name="city" placeholder="City" required>
<button type="submit">Add</button>
</form>
<p>Served by PHP <?= phpversion() ?> on <?= gethostname() ?></p>
</body></html>
EOF
sudo chmod 640 /var/www/phpapp/db.php
# let the PHP process user read db.php: apache (AL2023/CentOS php-fpm & httpd) or www-data (Ubuntu)
sudo chown root:apache /var/www/phpapp/db.php # Ubuntu: sudo chown root:www-data /var/www/phpapp/db.php
sudo restorecon -Rv /var/www/phpapp 2>/dev/null # CentOS only (harmless elsewhere)
curl -s http://localhost/ -H "Host: $(curl -s https://checkip.amazonaws.com)" | head -20
Quick PHP test page
echo "<?php phpinfo();" | sudo tee /var/www/phpapp/info.php shows full PHP configuration. Delete it after testing — it reveals sensitive details.
PHP file downloads instead of running?
If the browser downloads index.php or shows raw PHP code, the web server is not passing .php files to PHP: PHP-FPM is not running, the location ~ \.php$ block is missing, or the socket path is wrong. Check sudo service php-fpm status (Ubuntu: php8.3-fpm) and the Nginx error log.
Ravindra Bagale's Tip
Many students create info.php for testing and then forget it. That page shows your server's paths, versions and settings to everyone. As soon as the test is done, run sudo rm /var/www/phpapp/info.php.
Ravindra Bagale's Tip – मराठी
खूप students test साठी info.php बनवतात आणि नंतर विसरतात. तो page तुमच्या server चे paths, versions आणि settings सगळ्यांना दाखवतो. Test झाला की लगेच sudo rm /var/www/phpapp/info.php करा.
Ravindra Bagale's Tip – हिंदी
बहुत students test के लिए info.php बनाते हैं और फिर भूल जाते हैं. वो page आपके server के paths, versions और settings सबको दिखाता है. Test होते ही तुरंत sudo rm /var/www/phpapp/info.php करो.
Lab
Chala, PHP app deploy kara aani browser madhun Mauli Dairy che teen customers (naav aani city) form ne add kara. Mag mysql -u appuser -p -h 127.0.0.1 -e "SELECT * FROM appdb.students;" ne te rows database madhe aale ka te bagha.