From 418d1991e5d592a31329546deb311a8eba629ed9 Mon Sep 17 00:00:00 2001 From: Nathan Melehan Date: Fri, 6 Feb 2026 18:19:50 +0000 Subject: [PATCH 01/19] [Update] Deploy a RAG-Powered Chatbot with LangChain on an Akamai Compute Instance Add missing chatbot stories zip file --- .gitignore | 1 - .../chatbot-short-stories.zip | Bin 0 -> 41973 bytes 2 files changed, 1 deletion(-) create mode 100644 docs/guides/akamai/solutions/deploy-rag-powered-chatbot-langchain-akamai-compute-instance/chatbot-short-stories.zip diff --git a/.gitignore b/.gitignore index 52bce1a639a..7381324ecf0 100644 --- a/.gitignore +++ b/.gitignore @@ -25,7 +25,6 @@ Thumbs.dbi *.jar *.rar *.tar -*.zip *.log *.sql diff --git a/docs/guides/akamai/solutions/deploy-rag-powered-chatbot-langchain-akamai-compute-instance/chatbot-short-stories.zip b/docs/guides/akamai/solutions/deploy-rag-powered-chatbot-langchain-akamai-compute-instance/chatbot-short-stories.zip new file mode 100644 index 0000000000000000000000000000000000000000..a353727f373158ea89e458eb885cc2f88ffff200 GIT binary patch literal 41973 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 Date: Tue, 17 Feb 2026 09:23:33 -0800 Subject: [PATCH 02/19] Updated PHP-FRM and NGINX content --- .../web-servers/nginx/php-fpm-nginx/index.md | 585 ++++++++++++++++++ 1 file changed, 585 insertions(+) create mode 100644 docs/guides/web-servers/nginx/php-fpm-nginx/index.md diff --git a/docs/guides/web-servers/nginx/php-fpm-nginx/index.md b/docs/guides/web-servers/nginx/php-fpm-nginx/index.md new file mode 100644 index 00000000000..a6fd62860a1 --- /dev/null +++ b/docs/guides/web-servers/nginx/php-fpm-nginx/index.md @@ -0,0 +1,585 @@ +--- +slug: php-fpm-nginx +title: "Modern PHP-FPM and NGINX Configuration" +description: 'Install and configure PHP-FPM and NGINX using current upstream best practices and Akamai-specific considerations.' +authors: ["Akamai"] +contributors: ["Akamai"] +published: 2026-03-22 +keywords: ["php", "php-fpm", "nginx", "web servers", "linux"] +tags:["web-servers", "nginx", "php", "serve"] +license: '[CC BY-ND 4.0](https://creativecommons.org/licenses/by-nd/4.0)' +external_resources: +- [PHP-FPM documentation](https://www.php.net/manual/en/install.fpm.php) +- [NGINX](https://nginx.org/en/docs/) +--- + +The PHP FastCGI Process Manager (PHP-FPM) manages PHP processes independent of the web server as a modern FastCGI implementation with NGINX. + +Use PHP-FPM with NGINX when you need process isolation, independent PHP and web server scaling, or improved resource management for PHP applications compared to mod_php or CGI implementations + +This guide demonstrates how to deploy PHP-FPM and NGINX on Akamai cloud compute infrastructure. It covers installation of both components on a supported Linux distribution, NGINX configuration for FastCGI proxy, PHP-FPM pool setup, deployment testing, and application of basic security hardening. It addresses Akamai-specific requirements for instance sizing, firewall configuration through Cloud Manager, and performance tuning. + +For complete documentation and configuration options see the official: + +- [PHP-FPM documentation](https://www.php.net/manual/en/install.fpm.php) +- [NGINX](https://nginx.org/en/docs/) + +## Before You Begin + +Complete these prerequisites before installing PHP-FPM and NGINX. For initial server setup and OS installation, see the [Ubuntu Server](https://ubuntu.com/server/docs) documentation and [Akamai's Getting Started](https://techdocs.akamai.com/cloud-computing/docs/set-up-and-secure-a-compute-instance) guides. + +### Prerequisites: + +- A compute instance running Ubuntu 22.04 LTS +- SSH access to the instance with a non-root user account +- Sudo privileges for package installation and service management +- Cloud Manager access to configure firewall rules +- Basic familiarity with Linux package management (apt) + +## Akamai-Specific Considerations + +Configure platform-specific settings for your PHP-FPM deployment including firewall rules, instance sizing, and optional storage or load balancing. + +### Cloud Firewall Configuration + +Configure Cloud Firewall rules to allow web traffic to your instance. + +1. Navigate to Cloud Manager and select Firewalls from the sidebar. +2. Create a new firewall or modify an existing one. +3. Add inbound rules for HTTP and HTTPS traffic: + + - HTTP: Protocol: TCP, Port: 80, Source: All IPv4 / All IPv6 + - HTTPS: Protocol: TCP, Port: 443, Source: All IPv4 / All IPv6 +4. Apply the firewall to your compute instance. + +For detailed firewall configuration, see [Getting Started with Cloud Firewalls](https://techdocs.akamai.com/cloud-computing/docs/getting-started-with-cloud-firewalls). + +### Instance Sizing + +PHP-FPM memory requirements scale with concurrent connections. Select an instance plan based on expected traffic. + +#### Development/Testing: + +- Shared CPU (1-2 GB RAM) for low-traffic sites or development environments. + +#### Production - Low to Medium Traffic: + +- Shared CPU (4-8 GB RAM) for small to medium production sites. +- Supports 50-200 concurrent PHP-FPM processes depending on application complexity. + +#### Production - High Traffic: + +Dedicated CPU (8+ GB RAM) for high-traffic applications requiring sustained CPU performance +Eliminates resource contention for consistent PHP execution times + +Monitor CPU and memory usage through Cloud Manager after deployment and resize as needed. + +### Optional: Block Storage + +Consider attaching Block Storage volumes for user-uploaded content, application file storage exceeding local disk capacity, or separation of application data from system storage. Block Storage volumes are portable between instances and can be resized independently. See [Block Storage](https://techdocs.akamai.com/cloud-computing/docs/block-storage) documentation for setup instructions. + +### Optional: Load Balancer Configuration + +For high-availability deployments, use NodeBalancers to distribute traffic across multiple PHP-FPM instances. Configure health checks on port 80 or 443, set session persistence if application requires sticky sessions, and ensure backend nodes run identical PHP-FPM and NGINX configurations. NodeBalancer setup is beyond the scope of this guide. See [Getting Started with NodeBalancers](https://techdocs.akamai.com/cloud-computing/docs/getting-started-with-nodebalancers). + +## Install PHP-FPM + +Install PHP-FPM and NGINX packages using the Ubuntu package manager. For comprehensive PHP installation options and configuration reference, see the official [PHP-FPM](https://www.php.net/manual/en/install.fpm.php) documentation. + +Install the required packages: +```command +sudo apt update +sudo apt install nginx php8.1-fpm +``` + +Verify both services are installed and running: +```command +sudo systemctl status nginx +sudo systemctl status php8.1-fpm +``` + +### Common PHP Extensions + +Install additional PHP extensions based on application requirements: +```command +sudo apt install php8.1-mysql php8.1-xml php8.1-mbstring php8.1-curl php8.1-gd +``` + +**Common extensions**: + +- php8.1-mysql: MySQL/MariaDB database connectivity +- php8.1-xml: XML parsing and manipulation +- php8.1-mbstring: Multibyte string handling +- php8.1-curl: HTTP client functionality +- php8.1-gd: Image processing + +Install only the extensions your application requires. Restart PHP-FPM after installing extensions: + +```command +sudo systemctl restart php8.1-fpm +``` + +## Configure NGINX for PHP-FPM + +NGINX communicates with PHP-FPM through the FastCGI protocol, passing PHP requests to the PHP-FPM process manager for execution. NGINX was installed in the previous section alongside PHP-FPM. For comprehensive NGINX configuration options, see the official [NGINX](https://nginx.org/en/docs/) documentation. + +### FastCGI Communication + +NGINX forwards PHP requests to PHP-FPM via a Unix socket or TCP connection. The Unix socket method provides better performance for local communication between NGINX and PHP-FPM on the same instance. + +Verify the PHP-FPM socket location: + +```command +ls -la /run/php/php8.1-fpm.sock +``` + +The socket path must match the `fastcgi_pass` directive in the NGINX server block configuration. + +### Server Block Configuration + +Create an NGINX server block to handle PHP requests. This example assumes a site served from `/var/www/example.com`. + +Create the server block configuration file: + +```command +sudo nano /etc/nginx/sites-available/example.com +``` + +Add the following configuration: +``` +fileserver { + listen 80; + listen [::]:80; + server_name example.com www.example.com; + root /var/www/example.com; + index index.php index.html; + + location / { + try_files $uri $uri/ =404; + } + + location ~ \.php$ { + include snippets/fastcgi-php.conf; + fastcgi_pass unix:/run/php/php8.1-fpm.sock; + } +} +``` +Key directives: + +- listen: Defines ports for IPv4 and IPv6 +- server_name: Domain names for this server block +- root: Document root directory +- fastcgi_pass: Socket path for PHP-FPM communication +- include snippets/fastcgi-php.conf: Standard FastCGI parameters + +Enable the server block and test the configuration: + +```command +sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/ +sudo nginx -t +``` + +Reload NGINX to apply changes: + +```command +sudo systemctl reload nginx +``` + +### Configure PHP-FPM + +PHP-FPM uses pool configuration files to define how the process manager handles requests. The default pool configuration is located at `/etc/php/8.1/fpm/pool.d/www.conf`. For comprehensive configuration options and tuning guidance, see the official PHP-FPM configuration documentation. + +### Verify Socket Configuration + +Confirm the PHP-FPM socket path matches the NGINX server block configuration. + +Open the pool configuration file: + +```command +sudo nano /etc/php/8.1/fpm/pool.d/www.conf +``` +Locate the `listen` directive: + +```file +listen = /run/php/php8.1-fpm.sock +``` + +This socket path must match the `fastcgi_pass` directive in your NGINX server block. The default configuration is correct for most deployments. + +### Process Manager Configuration + +PHP-FPM's process manager controls how worker processes are spawned and managed. The `pm` directive defines the process management strategy. + +Key process manager directives in `/etc/php/8.1/fpm/pool.d/www.conf`: + +```file +pm = dynamic +pm.max_children = 5 +pm.start_servers = 2 +pm.min_spare_servers = 1 +pm.max_spare_servers = 3 +``` + +**Process manager settings:** + +- **pm = dynamic**: Spawns child processes based on demand +- **pm.max_children**: Maximum concurrent PHP-FPM processes +- **pm.start_servers**: Processes created at startup +- **pm.min_spare_servers**: Minimum idle processes +- **pm.max_spare_servers**: Maximum idle processes + +### Performance Tuning Considerations + +Adjust `pm.max_children` based on available memory and expected traffic. Each PHP-FPM process typically consumes 20-50 MB of RAM depending on application complexity. + +**Memory calculation:** +``` +pm.max_children = (Available RAM - System RAM) / Average Process Memory +``` + +For a 4 GB instance with 1 GB reserved for system processes and 30 MB per PHP process: +``` +pm.max_children = (4096 MB - 1024 MB) / 30 MB ≈ 100 +``` +Monitor actual memory usage after deployment and adjust accordingly. Exceeding available memory causes swapping and degrades performance. + +Restart PHP-FPM to apply configuration changes: +```command +sudo systemctl restart php8.1-fpm +``` + +### Test the Deployment + +Verify PHP-FPM and NGINX are correctly configured by creating a test PHP file and accessing it through a web browser. + +### Create Test File + +Create a PHP info file in your document root: +```command +sudo nano /var/www/example.com/info.php +``` + +Add the following content: +```file + +``` + +Set appropriate permissions: + +```command +sudo chown www-data:www-data /var/www/example.com/info.php +``` + +### Verify PHP Execution + +Access the test file through your web browser using your server's IP address or domain name: + +``` +http://example.com/info.php +``` + +A page displaying PHP configuration information confirms PHP-FPM is processing requests correctly. The page shows the PHP version, loaded extensions, and configuration directives. + +Verify the Server API line shows `FPM/FastCGI`, confirming NGINX is communicating with PHP-FPM rather than using an alternative PHP handler. + +### Remove Test File + +Delete the info file after verification to prevent exposing system configuration: + +```command +sudo rm /var/www/example.com/info.php +``` + +The `phpinfo()` function displays sensitive server information including file paths, loaded modules, and environment variables. Remove this file immediately after testing. + +## Basic Security Hardening + +Apply foundational security measures to protect your PHP-FPM deployment. These settings address common vulnerabilities without requiring application-specific configuration. + +### Disable Dangerous PHP Functions + +Restrict PHP functions that can execute system commands or access the filesystem in ways that pose security risks. + +Edit the PHP configuration file: + +```command +sudo nano /etc/php/8.1/fpm/php.ini +``` +Locate the `disable_functions` directive and add potentially dangerous functions: + +```file +disable_functions = exec,passthru,shell_exec,system,proc_open,popen,curl_exec,curl_multi_exec,parse_ini_file,show_source +``` + +Restart PHP-FPM to apply changes: + +```command +sudo systemctl restart php8.1-fpm +``` +Test your application after disabling functions to ensure required functionality remains intact. Some applications legitimately require these functions. + +### Configure File Permissions + +Set appropriate ownership and permissions for web files to prevent unauthorized modification. + +Set ownership to the web server user: + +```command +sudo chown -R www-data:www-data /var/www/example.com +``` +Set directory permissions: +```command +sudo find /var/www/example.com -type d -exec chmod 755 {} \; +``` +Set file permissions: +```command +sudo find /var/www/example.com -type f -exec chmod 644 {} \; +``` + +Files should be readable by the web server but writable only by the owner. Directories require execute permissions for traversal. + +### Enable HTTPS + +Configure TLS/SSL certificates to encrypt traffic between clients and your server. HTTPS prevents credential interception and protects session data. + +For TLS/SSL certificate configuration on Akamai cloud compute, see [Enable TLS for HTTPS](??????????). + +### Remove Default Content + +Delete default NGINX welcome pages and example files to reduce information disclosure: + +```command +sudo rm /var/www/html/index.nginx-debian.html +``` + +Remove or disable the default NGINX server block if not in use: + +```command +sudo rm /etc/nginx/sites-enabled/default +``` +Reload NGINX after removing default content: + +```command +sudo systemctl reload nginx +``` + +### Production Environment Considerations + +Disable PHP error display in production to prevent exposing system information through error messages. + +Edit the PHP configuration file: + +```command +sudo nano /etc/php/8.1/fpm/php.ini +``` +Set the following directives: + +```file +display_errors = Off +log_errors = On +error_log = /var/log/php-fpm/error.log +``` + +Errors are logged to `/var/log/php-fpm/error.log` for debugging without exposing details to users. Restart PHP-FPM after making changes. + +Never deploy `phpinfo()` or similar diagnostic scripts to production environments. These scripts expose configuration details including file paths, loaded modules, and environment variables. + +## Logging and Monitoring + +Monitor NGINX and PHP-FPM through log files and system metrics to identify errors, performance issues, and security events. + +### NGINX Logs + +NGINX stores access and error logs in `/var/log/nginx/` by default. + +**Log locations**: + +- Access log: /var/log/nginx/access.log - Records all requests +- Error log: /var/log/nginx/error.log - Records server errors and warnings + +View recent NGINX errors: + +```command +sudo tail -f /var/log/nginx/error.log +``` + +Configure custom log locations in server block configurations using the `access_log` and `error_log` directives. + +### PHP-FPM Logs + +PHP-FPM logs process manager events and PHP errors separately from NGINX. + +**Log locations**: + +- PHP-FPM process log: /var/log/php8.1-fpm.log - Pool manager events +- PHP error log: Configured in php.ini via the error_log directive + +View PHP-FPM process events: + +```command +sudo tail -f /var/log/php8.1-fpm.log +``` + +PHP application errors appear in the location specified by the 1error_log1 directive in `/etc/php/8.1/fpm/php.ini`. + +### Performance Monitoring + +Monitor CPU, memory, and network usage through Cloud Manager's built-in metrics dashboard. Track PHP-FPM process counts and memory consumption to identify resource constraints. + +Key metrics to monitor: + +- **CPU usage**: Sustained high CPU indicates insufficient instance sizing or inefficient code +- **Memory usage**: Approaching total RAM triggers swapping and performance degradation +- **PHP-FPM process count**: Reaching `pm.max_children` indicates configuration adjustments needed + +For advanced monitoring, integrate with external observability platforms. See the [NGINX](https://nginx.org/en/docs/http/ngx_http_stub_status_module.html) monitoring documentation for enabling the stub status module. + +## Troubleshooting + +Resolve common issues with PHP-FPM and NGINX deployments. Each section identifies symptoms and provides diagnostic steps. + +### NGINX Gateway Errors + +**Symptom**: Browser displays "502 Bad Gateway" or "504 Gateway Timeout" errors when accessing PHP pages. + +**Causes and solutions: + +PHP-FPM not running**: + +Check PHP-FPM service status: + +```command +sudo systemctl status php8.1-fpm +``` + +Start the service if stopped: + +```command +sudo systemctl start php8.1-fpm +``` +**Socket path mismatch**: + +Verify the socket path in NGINX configuration matches PHP-FPM pool configuration: + +```command +grep "fastcgi_pass" /etc/nginx/sites-available/example.com +grep "listen" /etc/php/8.1/fpm/pool.d/www.conf +``` + +Both values must be identical. Restart both services after correcting mismatches. +**Insufficient PHP-FPM workers**: + +Check if `pm.max_children` limit is reached: +```command +sudo grep "max_children" /var/log/php8.1-fpm.log +``` + +Increase `pm.max_children` in `/etc/php/8.1/fpm/pool.d/www.conf` if processes are hitting the limit. + +### File Permission Issues + +**Symptom**: "Permission denied" errors in NGINX error log or blank pages when accessing PHP files. + +**Solution**: + +Verify NGINX can read PHP files: + +```command +sudo -u www-data test -r /var/www/example.com/index.php && echo "Readable" || echo "Permission denied" +``` + +Set correct ownership: + +```command +sudo chown -R www-data:www-data /var/www/example.com +``` + +Ensure directories are executable and files are readable: + +```command +sudo find /var/www/example.com -type d -exec chmod 755 {} \; +sudo find /var/www/example.com -type f -exec chmod 644 {} \; +``` + +### Firewall Configuration + +**Symptom**: Cannot access website from external network, or connection times out. + +**Solution**: + +Verify Cloud Firewall allows HTTP/HTTPS traffic: + +1. Navigate to Cloud Manager > Firewalls +2. Select the firewall attached to your instance +3. Confirm inbound rules allow TCP ports 80 and 443 + +Check local firewall rules if using UFW or iptables: + +```command +sudo ufw status +``` + +Allow HTTP and HTTPS if blocked: + +```command +sudo ufw allow 80/tcp +sudo ufw allow 443/tcp +``` + +### AppArmor Restrictions + +**Symptom**: PHP-FPM fails to start or access specific files despite correct permissions. + +Ubuntu 22.04 uses AppArmor for mandatory access control. Check AppArmor status: + +```command +sudo aa-status +``` + +Review AppArmor denials in system log: + +```command +sudo grep "apparmor" /var/log/syslog +``` + +PHP-FPM's AppArmor profile is located at `/etc/apparmor.d/php-fpm`. Modify the profile only if legitimate application requirements conflict with default restrictions. Reload AppArmor after profile changes: + +```command +sudo systemctl reload apparmor +``` + +## Next Steps + +Expand your PHP-FPM deployment with database connectivity, advanced performance tuning, and high-availability configurations. + +### Database Integration + +Connect your PHP application to a database server: + +- [MySQL on Ubuntu 22.04](https://www.linode.com/docs/???) - Install and configure MySQL for PHP applications +- [PostgreSQL on Ubuntu 22.04](https://www.linode.com/docs/???) - Deploy PostgreSQL database server +- [Akamai Managed Databases](https://techdocs.akamai.com/cloud-computing/docs/aiven-database-clusters) - Fully managed database clusters + +### Performance Optimization + +Advanced tuning for production workloads: + +- [NGINX Performance Tuning](https://nginx.org/en/docs/http/ngx_http_core_module.html???) - Worker processes, connection limits, and buffer sizing +- [PHP-FPM Performance](https://www.php.net/manual/en/install.fpm.configuration.php) - Process manager optimization and OPcache configuration +- [PHP OPcache Configuration](https://www.php.net/manual/en/opcache.configuration.php) - Bytecode caching for improved performance + +### Security Hardening + +Additional security measures beyond basic hardening: + +- [PHP Security Best Practices](https://www.php.net/manual/en/security.php) - Official PHP security guidance +- [NGINX Security Configuration](https://nginx.org/en/docs/http/ngx_http_ssl_module.html) - TLS/SSL configuration and security headers + +### High Availability + +Scale your deployment across multiple instances: + +- [Getting Started with NodeBalancers](https://techdocs.akamai.com/cloud-computing/docs/getting-started-with-nodebalancers) - Load balancing for PHP-FPM instances +- [Cloud Firewall Advanced Configuration](https://techdocs.akamai.com/cloud-computing/docs/manage-firewall-rules) - Security rules for multi-instance deployments \ No newline at end of file From be806ca2e6c84e5c5cede330c6524a4f0e6602cc Mon Sep 17 00:00:00 2001 From: Dianna Hoober Date: Tue, 17 Feb 2026 10:14:21 -0800 Subject: [PATCH 03/19] Fixed linting check missing space --- docs/guides/web-servers/nginx/php-fpm-nginx/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/guides/web-servers/nginx/php-fpm-nginx/index.md b/docs/guides/web-servers/nginx/php-fpm-nginx/index.md index a6fd62860a1..b27cd371788 100644 --- a/docs/guides/web-servers/nginx/php-fpm-nginx/index.md +++ b/docs/guides/web-servers/nginx/php-fpm-nginx/index.md @@ -6,7 +6,7 @@ authors: ["Akamai"] contributors: ["Akamai"] published: 2026-03-22 keywords: ["php", "php-fpm", "nginx", "web servers", "linux"] -tags:["web-servers", "nginx", "php", "serve"] +tags: ["web-servers", "nginx", "php", "serve"] license: '[CC BY-ND 4.0](https://creativecommons.org/licenses/by-nd/4.0)' external_resources: - [PHP-FPM documentation](https://www.php.net/manual/en/install.fpm.php) From 393ca356a5f78a999d16ed7dbde76813d02eef7a Mon Sep 17 00:00:00 2001 From: Dianna Hoober Date: Tue, 17 Feb 2026 12:34:11 -0800 Subject: [PATCH 04/19] Made metadata formatting consistent --- .../guides/web-servers/nginx/php-fpm-nginx/index.md | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/docs/guides/web-servers/nginx/php-fpm-nginx/index.md b/docs/guides/web-servers/nginx/php-fpm-nginx/index.md index b27cd371788..53c7a6c3881 100644 --- a/docs/guides/web-servers/nginx/php-fpm-nginx/index.md +++ b/docs/guides/web-servers/nginx/php-fpm-nginx/index.md @@ -1,12 +1,12 @@ --- slug: php-fpm-nginx -title: "Modern PHP-FPM and NGINX Configuration" +title: 'Modern PHP-FPM and NGINX Configuration' description: 'Install and configure PHP-FPM and NGINX using current upstream best practices and Akamai-specific considerations.' -authors: ["Akamai"] -contributors: ["Akamai"] -published: 2026-03-22 -keywords: ["php", "php-fpm", "nginx", "web servers", "linux"] -tags: ["web-servers", "nginx", "php", "serve"] +authors: ['Akamai'] +contributors: ['Akamai'] +published: 2026-02-20 +keywords: ['php', 'php-fpm', 'fpm', 'nginx', 'web servers', 'linux'] +tags: ['web-servers', 'nginx', php', 'serve', 'fpm'] license: '[CC BY-ND 4.0](https://creativecommons.org/licenses/by-nd/4.0)' external_resources: - [PHP-FPM documentation](https://www.php.net/manual/en/install.fpm.php) @@ -275,7 +275,6 @@ sudo chown www-data:www-data /var/www/example.com/info.php ### Verify PHP Execution Access the test file through your web browser using your server's IP address or domain name: - ``` http://example.com/info.php ``` From b5d6510459646d5b23229464d654106086dccea4 Mon Sep 17 00:00:00 2001 From: Dianna Hoober Date: Tue, 17 Feb 2026 12:42:53 -0800 Subject: [PATCH 05/19] Added a single quote --- docs/guides/web-servers/nginx/php-fpm-nginx/index.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/guides/web-servers/nginx/php-fpm-nginx/index.md b/docs/guides/web-servers/nginx/php-fpm-nginx/index.md index 53c7a6c3881..c722a8eeb3a 100644 --- a/docs/guides/web-servers/nginx/php-fpm-nginx/index.md +++ b/docs/guides/web-servers/nginx/php-fpm-nginx/index.md @@ -1,12 +1,12 @@ --- -slug: php-fpm-nginx +slug: 'php-fpm-nginx' title: 'Modern PHP-FPM and NGINX Configuration' description: 'Install and configure PHP-FPM and NGINX using current upstream best practices and Akamai-specific considerations.' authors: ['Akamai'] contributors: ['Akamai'] published: 2026-02-20 keywords: ['php', 'php-fpm', 'fpm', 'nginx', 'web servers', 'linux'] -tags: ['web-servers', 'nginx', php', 'serve', 'fpm'] +tags: ['web-servers', 'nginx', 'php', 'serve', 'fpm'] license: '[CC BY-ND 4.0](https://creativecommons.org/licenses/by-nd/4.0)' external_resources: - [PHP-FPM documentation](https://www.php.net/manual/en/install.fpm.php) From 384ede343722d470e3c588c682ed340ac1ced2dd Mon Sep 17 00:00:00 2001 From: Dianna Hoober Date: Tue, 17 Feb 2026 14:49:47 -0800 Subject: [PATCH 06/19] Finalized troubleshooting section --- .../web-servers/nginx/php-fpm-nginx/index.md | 78 +++++++++---------- 1 file changed, 35 insertions(+), 43 deletions(-) diff --git a/docs/guides/web-servers/nginx/php-fpm-nginx/index.md b/docs/guides/web-servers/nginx/php-fpm-nginx/index.md index c722a8eeb3a..c90e35cc9bf 100644 --- a/docs/guides/web-servers/nginx/php-fpm-nginx/index.md +++ b/docs/guides/web-servers/nginx/php-fpm-nginx/index.md @@ -26,7 +26,11 @@ For complete documentation and configuration options see the official: ## Before You Begin -Complete these prerequisites before installing PHP-FPM and NGINX. For initial server setup and OS installation, see the [Ubuntu Server](https://ubuntu.com/server/docs) documentation and [Akamai's Getting Started](https://techdocs.akamai.com/cloud-computing/docs/set-up-and-secure-a-compute-instance) guides. +Complete these prerequisites before installing PHP-FPM and NGINX. + +Create and configure your instance using Akamai's [Creating a Compute Instance](https://techdocs.akamai.com/cloud-computing/docs/create-a-compute-instance) and [Set Up and Secure a Compute Instance](https://techdocs.akamai.com/cloud-computing/docs/set-up-and-secure-a-compute-instance) guides. + +For OS-level documentation, see the [Ubuntu Server](https://ubuntu.com/server/docs) documentation. ### Prerequisites: @@ -139,15 +143,15 @@ The socket path must match the `fastcgi_pass` directive in the NGINX server bloc Create an NGINX server block to handle PHP requests. This example assumes a site served from `/var/www/example.com`. -Create the server block configuration file: +Next, create the server block configuration file: ```command sudo nano /etc/nginx/sites-available/example.com ``` Add the following configuration: -``` -fileserver { +```nginx +server { listen 80; listen [::]:80; server_name example.com www.example.com; @@ -343,7 +347,7 @@ Files should be readable by the web server but writable only by the owner. Direc Configure TLS/SSL certificates to encrypt traffic between clients and your server. HTTPS prevents credential interception and protects session data. -For TLS/SSL certificate configuration on Akamai cloud compute, see [Enable TLS for HTTPS](??????????). +For TLS/SSL certificate configuration on Akamai cloud compute, see [Use Certbot to Enable HTTPS with NGINX on Ubuntu](https://www.linode.com/docs/guides/enabling-https-using-certbot-with-nginx-on-ubuntu/). ### Remove Default Content @@ -412,8 +416,8 @@ PHP-FPM logs process manager events and PHP errors separately from NGINX. **Log locations**: -- PHP-FPM process log: /var/log/php8.1-fpm.log - Pool manager events -- PHP error log: Configured in php.ini via the error_log directive +- PHP-FPM process log: `/var/log/php8.1-fpm.log` - Pool manager events +- PHP error log: Configured in php.ini via the `error_log` directive View PHP-FPM process events: @@ -421,11 +425,11 @@ View PHP-FPM process events: sudo tail -f /var/log/php8.1-fpm.log ``` -PHP application errors appear in the location specified by the 1error_log1 directive in `/etc/php/8.1/fpm/php.ini`. +PHP application errors appear in the location specified by the 1`rror_log` directive in `/etc/php/8.1/fpm/php.ini`. ### Performance Monitoring -Monitor CPU, memory, and network usage through Cloud Manager's built-in metrics dashboard. Track PHP-FPM process counts and memory consumption to identify resource constraints. +Monitor CPU, memory, and network usage through [Cloud Manager's built-in metrics dashboard](https://techdocs.akamai.com/cloud-computing/docs/monitor-and-maintain-a-compute-instance). Track PHP-FPM process counts and memory consumption to identify resource constraints. Key metrics to monitor: @@ -443,60 +447,54 @@ Resolve common issues with PHP-FPM and NGINX deployments. Each section identifie **Symptom**: Browser displays "502 Bad Gateway" or "504 Gateway Timeout" errors when accessing PHP pages. -**Causes and solutions: - -PHP-FPM not running**: +--- -Check PHP-FPM service status: +**Cause**: PHP-FPM service is not running. +**Solution**: Check the service status and start it if stopped: ```command sudo systemctl status php8.1-fpm -``` - -Start the service if stopped: - -```command sudo systemctl start php8.1-fpm ``` -**Socket path mismatch**: -Verify the socket path in NGINX configuration matches PHP-FPM pool configuration: +--- + +**Cause**: Socket path mismatch between NGINX and PHP-FPM configurations. +**Solution**: Verify both paths are identical: ```command grep "fastcgi_pass" /etc/nginx/sites-available/example.com grep "listen" /etc/php/8.1/fpm/pool.d/www.conf ``` -Both values must be identical. Restart both services after correcting mismatches. -**Insufficient PHP-FPM workers**: +Correct any mismatch and restart both services. + +--- -Check if `pm.max_children` limit is reached: +**Cause**: Insufficient PHP-FPM worker processes. + +**Solution**: Check whether `pm.max_children` is being reached: ```command sudo grep "max_children" /var/log/php8.1-fpm.log ``` -Increase `pm.max_children` in `/etc/php/8.1/fpm/pool.d/www.conf` if processes are hitting the limit. +If the limit is being hit, increase `pm.max_children` in `/etc/php/8.1/fpm/pool.d/www.conf`. ### File Permission Issues **Symptom**: "Permission denied" errors in NGINX error log or blank pages when accessing PHP files. -**Solution**: - -Verify NGINX can read PHP files: - +**Solution**: Verify NGINX can read PHP files: ```command sudo -u www-data test -r /var/www/example.com/index.php && echo "Readable" || echo "Permission denied" ``` Set correct ownership: - ```command sudo chown -R www-data:www-data /var/www/example.com ``` Ensure directories are executable and files are readable: - ```command sudo find /var/www/example.com -type d -exec chmod 755 {} \; sudo find /var/www/example.com -type f -exec chmod 644 {} \; @@ -506,22 +504,18 @@ sudo find /var/www/example.com -type f -exec chmod 644 {} \; **Symptom**: Cannot access website from external network, or connection times out. -**Solution**: - -Verify Cloud Firewall allows HTTP/HTTPS traffic: +**Solution**: Verify Cloud Firewall allows HTTP/HTTPS traffic: 1. Navigate to Cloud Manager > Firewalls 2. Select the firewall attached to your instance 3. Confirm inbound rules allow TCP ports 80 and 443 Check local firewall rules if using UFW or iptables: - ```command sudo ufw status ``` Allow HTTP and HTTPS if blocked: - ```command sudo ufw allow 80/tcp sudo ufw allow 443/tcp @@ -531,20 +525,17 @@ sudo ufw allow 443/tcp **Symptom**: PHP-FPM fails to start or access specific files despite correct permissions. -Ubuntu 22.04 uses AppArmor for mandatory access control. Check AppArmor status: - +**Solution**: Ubuntu 22.04 uses AppArmor for mandatory access control. Check AppArmor status: ```command sudo aa-status ``` Review AppArmor denials in system log: - ```command sudo grep "apparmor" /var/log/syslog ``` PHP-FPM's AppArmor profile is located at `/etc/apparmor.d/php-fpm`. Modify the profile only if legitimate application requirements conflict with default restrictions. Reload AppArmor after profile changes: - ```command sudo systemctl reload apparmor ``` @@ -557,15 +548,15 @@ Expand your PHP-FPM deployment with database connectivity, advanced performance Connect your PHP application to a database server: -- [MySQL on Ubuntu 22.04](https://www.linode.com/docs/???) - Install and configure MySQL for PHP applications -- [PostgreSQL on Ubuntu 22.04](https://www.linode.com/docs/???) - Deploy PostgreSQL database server +- [MySQL on Ubuntu 22.04](https://www.linode.com/docs/guides/install-and-configure-mysql-on-ubuntu-22-04/) - Install and configure MySQL for PHP applications +- [PostgreSQL on Ubuntu 22.04](https://www.postgresql.org/download/linux/ubuntu/) - Deploy PostgreSQL database server - [Akamai Managed Databases](https://techdocs.akamai.com/cloud-computing/docs/aiven-database-clusters) - Fully managed database clusters ### Performance Optimization Advanced tuning for production workloads: -- [NGINX Performance Tuning](https://nginx.org/en/docs/http/ngx_http_core_module.html???) - Worker processes, connection limits, and buffer sizing +- [NGINX Performance Tuning: Tips and Tricks](https://blog.nginx.org/blog/performance-tuning-tips-tricks) - Worker processes, connection limits, and buffer sizing - [PHP-FPM Performance](https://www.php.net/manual/en/install.fpm.configuration.php) - Process manager optimization and OPcache configuration - [PHP OPcache Configuration](https://www.php.net/manual/en/opcache.configuration.php) - Bytecode caching for improved performance @@ -581,4 +572,5 @@ Additional security measures beyond basic hardening: Scale your deployment across multiple instances: - [Getting Started with NodeBalancers](https://techdocs.akamai.com/cloud-computing/docs/getting-started-with-nodebalancers) - Load balancing for PHP-FPM instances -- [Cloud Firewall Advanced Configuration](https://techdocs.akamai.com/cloud-computing/docs/manage-firewall-rules) - Security rules for multi-instance deployments \ No newline at end of file +- [Cloud Firewall Advanced Configuration](https://techdocs.akamai.com/cloud-computing/docs/manage-firewall-rules) - Security rules for multi-instance deployments + From 75bf0c10608b6c0c7200ac8fed3bfbf045697b69 Mon Sep 17 00:00:00 2001 From: Dianna Hoober Date: Wed, 18 Feb 2026 08:31:14 -0800 Subject: [PATCH 07/19] Fixed metadata in a totally unrelated file --- .../nginx/build-nginx-with-pagespeed-from-source/index.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/guides/web-servers/nginx/build-nginx-with-pagespeed-from-source/index.md b/docs/guides/web-servers/nginx/build-nginx-with-pagespeed-from-source/index.md index 6e22f0069cf..50947efa315 100644 --- a/docs/guides/web-servers/nginx/build-nginx-with-pagespeed-from-source/index.md +++ b/docs/guides/web-servers/nginx/build-nginx-with-pagespeed-from-source/index.md @@ -1,13 +1,13 @@ --- slug: build-nginx-with-pagespeed-from-source -title: 'Build NGINX with PageSpeed From Source' -description: 'This guide provides you with step-by-step instructions for compiling the Nginx web server from scratch so you can use Google''s PageSpeed moduleon your website.' +title: "Build NGINX with PageSpeed From Source" +description: "This guide provides you with step-by-step instructions for compiling the Nginx web server from scratch so you can use Google''s PageSpeed module on your website." authors: ["Linode"] contributors: ["Linode"] published: 2019-02-01 modified: 2018-02-12 keywords: ["nginx","pagespeed","optimization"] -license: '[CC BY-ND 4.0](http://creativecommons.org/licenses/by-nd/4.0)' +license: "[CC BY-ND 4.0](http://creativecommons.org/licenses/by-nd/4.0)" aliases: ['/web-servers/nginx/install-nginx-pagespeed-module-on-ubuntu1604/','/web-servers/nginx/nginx-with-pagespeed-on-ubuntu-14-04/','/web-servers/nginx/install-nginx-pagespeed-module-on-ubuntu1804/','/web-servers/nginx/build-nginx-with-pagespeed-from-source/'] dedicated_cpu_link: true tags: ["web server","nginx"] From ee3ead63744b11b2d5270ca2e4d4ac4b357c5c16 Mon Sep 17 00:00:00 2001 From: Dianna Hoober Date: Wed, 18 Feb 2026 09:57:21 -0800 Subject: [PATCH 08/19] Fixed metadata on several unrelated files that were causing blueberry to choke --- .../configuring-load-balancer-sticky-session/index.md | 2 +- .../index.md | 2 +- .../nginx/how-to-configure-http-2-on-nginx/index.md | 2 +- .../how-to-install-and-use-nginx-on-ubuntu-20-04/index.md | 8 ++++---- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/docs/guides/web-servers/nginx/configuring-load-balancer-sticky-session/index.md b/docs/guides/web-servers/nginx/configuring-load-balancer-sticky-session/index.md index 94ebc8f4935..c6e9e55dd9b 100644 --- a/docs/guides/web-servers/nginx/configuring-load-balancer-sticky-session/index.md +++ b/docs/guides/web-servers/nginx/configuring-load-balancer-sticky-session/index.md @@ -7,7 +7,7 @@ og_description: "When a web application needs to maintain state from one request authors: ["Martin Heller"] contributors: ["Martin Heller"] published: 2021-02-23 -keywords: [‘loadbalancer sticky session'] +keywords: ['loadbalancer sticky session'] tags: ['nginx','networking'] license: '[CC BY-ND 4.0](https://creativecommons.org/licenses/by-nd/4.0)' --- diff --git a/docs/guides/web-servers/nginx/getting-started-with-nginx-part-2-advanced-configuration/index.md b/docs/guides/web-servers/nginx/getting-started-with-nginx-part-2-advanced-configuration/index.md index b5fe5abc417..3ee97d94520 100644 --- a/docs/guides/web-servers/nginx/getting-started-with-nginx-part-2-advanced-configuration/index.md +++ b/docs/guides/web-servers/nginx/getting-started-with-nginx-part-2-advanced-configuration/index.md @@ -11,7 +11,7 @@ keywords: ["nginx", "web server", "nginx configuration", "multiple sites", "conf license: '[CC BY-ND 4.0](https://creativecommons.org/licenses/by-nd/4.0)' aliases: ['/web-servers/nginx/configure-nginx-for-optimized-performance/','/web-servers/nginx/slightly-more-advanced-configurations-for-nginx/','/websites/nginx/configure-nginx-for-optimized-performance/', '/guides/slightly-more-advanced-configurations-for-nginx/'] tags: ["web server","nginx"] -image: Getting-Started-with-NGINX-Part-2-smg.jpg +image: "Getting-Started-with-NGINX-Part-2-smg.jpg" --- ![Getting Started with NGINX - Part 2](Getting-Started-with-NGINX-Part-2-smg.jpg) diff --git a/docs/guides/web-servers/nginx/how-to-configure-http-2-on-nginx/index.md b/docs/guides/web-servers/nginx/how-to-configure-http-2-on-nginx/index.md index e7c9d7cde50..e92609a990a 100644 --- a/docs/guides/web-servers/nginx/how-to-configure-http-2-on-nginx/index.md +++ b/docs/guides/web-servers/nginx/how-to-configure-http-2-on-nginx/index.md @@ -10,7 +10,7 @@ published: 2021-07-16 keywords: ['nginx http2'] tags: ['web server', 'nginx'] license: '[CC BY-ND 4.0](https://creativecommons.org/licenses/by-nd/4.0)' -image: HowtoConfigureHTTP-2onNGINX.jpg +image: "HowtoConfigureHTTP-2onNGINX.jpg" --- [*HTTP/2*](https://en.wikipedia.org/wiki/HTTP/2) updates the original *Hypertext Transfer Protocol* (HTTP) specification to offer improvements in efficiency and latency. The new version includes several other new features while maintaining compatibility with older browsers. Due to the clear advantages of HTTP/2, web servers should be upgraded to use the new version. This guide explains how to configure, use, and test HTTP/2 with an [*NGINX*](https://www.nginx.com/) server. For a deep-dive into the HTTP/2 protocol see our [An Introduction to HTTP/2](/docs/guides/introducing-http-2/) guide. diff --git a/docs/guides/web-servers/nginx/how-to-install-and-use-nginx-on-ubuntu-20-04/index.md b/docs/guides/web-servers/nginx/how-to-install-and-use-nginx-on-ubuntu-20-04/index.md index 2adc9dcf94c..bdd091d8f4b 100644 --- a/docs/guides/web-servers/nginx/how-to-install-and-use-nginx-on-ubuntu-20-04/index.md +++ b/docs/guides/web-servers/nginx/how-to-install-and-use-nginx-on-ubuntu-20-04/index.md @@ -12,10 +12,10 @@ license: '[CC BY-ND 4.0](https://creativecommons.org/licenses/by-nd/4.0)' external_resources: - '[NGINX Documentation](https://nginx.org/en/docs/)' relations: - platform: - key: how-to-install-nginx - keywords: - - distribution: Ubuntu 20.04 + platform: + key: how-to-install-nginx + keywords: + - "distribution: Ubuntu 20.04" aliases: ['/web-servers/nginx/installation/ubuntu-10.04-lucid/','/web-servers/nginx/installation/ubuntu-12.04-precise-pangolin/'] --- From 883b379a77e5e3bf7d6d3b4ced2d4dc5d1604ae9 Mon Sep 17 00:00:00 2001 From: Dianna Hoober Date: Wed, 18 Feb 2026 10:22:44 -0800 Subject: [PATCH 09/19] Minor punctuation correction --- docs/guides/web-servers/nginx/php-fpm-nginx/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/guides/web-servers/nginx/php-fpm-nginx/index.md b/docs/guides/web-servers/nginx/php-fpm-nginx/index.md index c90e35cc9bf..217443fb280 100644 --- a/docs/guides/web-servers/nginx/php-fpm-nginx/index.md +++ b/docs/guides/web-servers/nginx/php-fpm-nginx/index.md @@ -15,7 +15,7 @@ external_resources: The PHP FastCGI Process Manager (PHP-FPM) manages PHP processes independent of the web server as a modern FastCGI implementation with NGINX. -Use PHP-FPM with NGINX when you need process isolation, independent PHP and web server scaling, or improved resource management for PHP applications compared to mod_php or CGI implementations +Use PHP-FPM with NGINX when you need process isolation, independent PHP, and web server scaling, or improved resource management for PHP applications compared to mod_php or CGI implementations This guide demonstrates how to deploy PHP-FPM and NGINX on Akamai cloud compute infrastructure. It covers installation of both components on a supported Linux distribution, NGINX configuration for FastCGI proxy, PHP-FPM pool setup, deployment testing, and application of basic security hardening. It addresses Akamai-specific requirements for instance sizing, firewall configuration through Cloud Manager, and performance tuning. From 2d6756cd8e045406aae7cad452bf6b100ae85af9 Mon Sep 17 00:00:00 2001 From: Dianna Hoober Date: Wed, 18 Feb 2026 10:38:02 -0800 Subject: [PATCH 10/19] Trying to get the repo working --- docs/guides/web-servers/nginx/php-fpm-nginx/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/guides/web-servers/nginx/php-fpm-nginx/index.md b/docs/guides/web-servers/nginx/php-fpm-nginx/index.md index 217443fb280..6beb58a8554 100644 --- a/docs/guides/web-servers/nginx/php-fpm-nginx/index.md +++ b/docs/guides/web-servers/nginx/php-fpm-nginx/index.md @@ -15,7 +15,7 @@ external_resources: The PHP FastCGI Process Manager (PHP-FPM) manages PHP processes independent of the web server as a modern FastCGI implementation with NGINX. -Use PHP-FPM with NGINX when you need process isolation, independent PHP, and web server scaling, or improved resource management for PHP applications compared to mod_php or CGI implementations +Use PHP-FPM with NGINX when you need process isolation, independent PHP, and web server scaling or improved resource management for PHP applications compared to mod_php or CGI implementations This guide demonstrates how to deploy PHP-FPM and NGINX on Akamai cloud compute infrastructure. It covers installation of both components on a supported Linux distribution, NGINX configuration for FastCGI proxy, PHP-FPM pool setup, deployment testing, and application of basic security hardening. It addresses Akamai-specific requirements for instance sizing, firewall configuration through Cloud Manager, and performance tuning. From 8e0e7c22f63a50b307a3a618a3a75ee22e47e264 Mon Sep 17 00:00:00 2001 From: Dianna Hoober Date: Wed, 18 Feb 2026 11:38:01 -0800 Subject: [PATCH 11/19] Trigger workflow --- docs/guides/web-servers/nginx/php-fpm-nginx/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/guides/web-servers/nginx/php-fpm-nginx/index.md b/docs/guides/web-servers/nginx/php-fpm-nginx/index.md index 6beb58a8554..d7c47e03c85 100644 --- a/docs/guides/web-servers/nginx/php-fpm-nginx/index.md +++ b/docs/guides/web-servers/nginx/php-fpm-nginx/index.md @@ -17,7 +17,7 @@ The PHP FastCGI Process Manager (PHP-FPM) manages PHP processes independent of t Use PHP-FPM with NGINX when you need process isolation, independent PHP, and web server scaling or improved resource management for PHP applications compared to mod_php or CGI implementations -This guide demonstrates how to deploy PHP-FPM and NGINX on Akamai cloud compute infrastructure. It covers installation of both components on a supported Linux distribution, NGINX configuration for FastCGI proxy, PHP-FPM pool setup, deployment testing, and application of basic security hardening. It addresses Akamai-specific requirements for instance sizing, firewall configuration through Cloud Manager, and performance tuning. +This guide demonstrates how to deploy PHP-FPM and NGINX on Akamai cloud compute infrastructure. It covers installation of both components on a supported Linux distribution, NGINX configuration for FastCGI proxy, PHP-FPM pool setup, deployment testing, and application of basic security hardening. It addresses Akamai-specific requirements for instance sizing, firewall configuration through Cloud Manager as well as performance tuning. For complete documentation and configuration options see the official: From b43b6c8d780c237459ddf601d318c4d16aaa2c81 Mon Sep 17 00:00:00 2001 From: Dianna Hoober Date: Wed, 18 Feb 2026 17:31:03 -0800 Subject: [PATCH 12/19] Fixed metadata for quotes and no quotes --- docs/guides/web-servers/nginx/php-fpm-nginx/index.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/guides/web-servers/nginx/php-fpm-nginx/index.md b/docs/guides/web-servers/nginx/php-fpm-nginx/index.md index d7c47e03c85..c3bd60e17d2 100644 --- a/docs/guides/web-servers/nginx/php-fpm-nginx/index.md +++ b/docs/guides/web-servers/nginx/php-fpm-nginx/index.md @@ -1,13 +1,13 @@ --- -slug: 'php-fpm-nginx' -title: 'Modern PHP-FPM and NGINX Configuration' -description: 'Install and configure PHP-FPM and NGINX using current upstream best practices and Akamai-specific considerations.' +slug: php-fpm-nginx +title: "Modern PHP-FPM and NGINX Configuration" +description: "Install and configure PHP-FPM and NGINX using current upstream best practices and Akamai-specific considerations." authors: ['Akamai'] contributors: ['Akamai'] published: 2026-02-20 -keywords: ['php', 'php-fpm', 'fpm', 'nginx', 'web servers', 'linux'] -tags: ['web-servers', 'nginx', 'php', 'serve', 'fpm'] -license: '[CC BY-ND 4.0](https://creativecommons.org/licenses/by-nd/4.0)' +keywords: ['php','php-fpm','fpm','nginx','web servers','linux'] +tags: ['web-servers','nginx','php','serve','fpm'] +license: [CC BY-ND 4.0](https://creativecommons.org/licenses/by-nd/4.0) external_resources: - [PHP-FPM documentation](https://www.php.net/manual/en/install.fpm.php) - [NGINX](https://nginx.org/en/docs/) From 65d581f7de9a4bd412c6825afb873768451b0302 Mon Sep 17 00:00:00 2001 From: Dianna Hoober Date: Thu, 19 Feb 2026 10:36:18 -0800 Subject: [PATCH 13/19] Metadata correction --- .../nginx/configuring-load-balancer-sticky-session/index.md | 2 +- .../index.md | 2 +- .../web-servers/nginx/how-to-configure-http-2-on-nginx/index.md | 2 +- .../nginx/how-to-install-and-use-nginx-on-ubuntu-20-04/index.md | 2 +- .../web-servers/nginx/serve-php-php-fpm-and-nginx/index.md | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/guides/web-servers/nginx/configuring-load-balancer-sticky-session/index.md b/docs/guides/web-servers/nginx/configuring-load-balancer-sticky-session/index.md index c6e9e55dd9b..8232d669cc3 100644 --- a/docs/guides/web-servers/nginx/configuring-load-balancer-sticky-session/index.md +++ b/docs/guides/web-servers/nginx/configuring-load-balancer-sticky-session/index.md @@ -9,7 +9,7 @@ contributors: ["Martin Heller"] published: 2021-02-23 keywords: ['loadbalancer sticky session'] tags: ['nginx','networking'] -license: '[CC BY-ND 4.0](https://creativecommons.org/licenses/by-nd/4.0)' +license: [CC BY-ND 4.0](https://creativecommons.org/licenses/by-nd/4.0) --- ## What is Load Balancing and Why is it Necessary? diff --git a/docs/guides/web-servers/nginx/getting-started-with-nginx-part-2-advanced-configuration/index.md b/docs/guides/web-servers/nginx/getting-started-with-nginx-part-2-advanced-configuration/index.md index 3ee97d94520..74b8b506a5f 100644 --- a/docs/guides/web-servers/nginx/getting-started-with-nginx-part-2-advanced-configuration/index.md +++ b/docs/guides/web-servers/nginx/getting-started-with-nginx-part-2-advanced-configuration/index.md @@ -8,7 +8,7 @@ contributors: ["Linode"] published: 2018-02-09 modified: 2021-12-29 keywords: ["nginx", "web server", "nginx configuration", "multiple sites", "configure caching"] -license: '[CC BY-ND 4.0](https://creativecommons.org/licenses/by-nd/4.0)' +license: [CC BY-ND 4.0](https://creativecommons.org/licenses/by-nd/4.0) aliases: ['/web-servers/nginx/configure-nginx-for-optimized-performance/','/web-servers/nginx/slightly-more-advanced-configurations-for-nginx/','/websites/nginx/configure-nginx-for-optimized-performance/', '/guides/slightly-more-advanced-configurations-for-nginx/'] tags: ["web server","nginx"] image: "Getting-Started-with-NGINX-Part-2-smg.jpg" diff --git a/docs/guides/web-servers/nginx/how-to-configure-http-2-on-nginx/index.md b/docs/guides/web-servers/nginx/how-to-configure-http-2-on-nginx/index.md index e92609a990a..a70f2ec9040 100644 --- a/docs/guides/web-servers/nginx/how-to-configure-http-2-on-nginx/index.md +++ b/docs/guides/web-servers/nginx/how-to-configure-http-2-on-nginx/index.md @@ -9,7 +9,7 @@ contributors: ["Jeff Novotny"] published: 2021-07-16 keywords: ['nginx http2'] tags: ['web server', 'nginx'] -license: '[CC BY-ND 4.0](https://creativecommons.org/licenses/by-nd/4.0)' +license: [CC BY-ND 4.0](https://creativecommons.org/licenses/by-nd/4.0) image: "HowtoConfigureHTTP-2onNGINX.jpg" --- diff --git a/docs/guides/web-servers/nginx/how-to-install-and-use-nginx-on-ubuntu-20-04/index.md b/docs/guides/web-servers/nginx/how-to-install-and-use-nginx-on-ubuntu-20-04/index.md index bdd091d8f4b..5de53c1201e 100644 --- a/docs/guides/web-servers/nginx/how-to-install-and-use-nginx-on-ubuntu-20-04/index.md +++ b/docs/guides/web-servers/nginx/how-to-install-and-use-nginx-on-ubuntu-20-04/index.md @@ -8,7 +8,7 @@ contributors: ["Nathaniel Stickman"] published: 2021-07-09 keywords: ['nginx','web server'] tags: ['ubuntu', 'nginx', 'web server'] -license: '[CC BY-ND 4.0](https://creativecommons.org/licenses/by-nd/4.0)' +license: [CC BY-ND 4.0](https://creativecommons.org/licenses/by-nd/4.0) external_resources: - '[NGINX Documentation](https://nginx.org/en/docs/)' relations: diff --git a/docs/guides/web-servers/nginx/serve-php-php-fpm-and-nginx/index.md b/docs/guides/web-servers/nginx/serve-php-php-fpm-and-nginx/index.md index 10d4328c9a9..16b304ddae6 100644 --- a/docs/guides/web-servers/nginx/serve-php-php-fpm-and-nginx/index.md +++ b/docs/guides/web-servers/nginx/serve-php-php-fpm-and-nginx/index.md @@ -8,7 +8,7 @@ published: 2018-02-19 modified: 2021-12-29 keywords: ["php", "php-fpm", "fastcgi"] tags: ["web server","ubuntu","php","nginx"] -license: '[CC BY-ND 4.0](https://creativecommons.org/licenses/by-nd/4.0)' +license: [CC BY-ND 4.0](https://creativecommons.org/licenses/by-nd/4.0) aliases: ['/web-servers/nginx/serve-php-php-fpm-and-nginx/','/websites/nginx/install-and-configure-nginx-and-php-fastcgi-on-ubuntu-16-04/','/web-servers/nginx/install-and-configure-nginx-and-php-fastcgi-on-ubuntu-16-04/','/web-servers/nginx/nginx-phpfastcgi-ubuntu-14-04/','/web-servers/nginx/php-fastcgi/ubuntu-12-04-precise-pangolin/'] image: serve-php-with-phpfpm-and-nginx-smp.jpg external_resources: From c521cea7906603dd216c4411e67462b93ae9f3db Mon Sep 17 00:00:00 2001 From: Dianna Hoober Date: Thu, 19 Feb 2026 12:55:23 -0800 Subject: [PATCH 14/19] Readded quotes to license metadata --- .../nginx/build-nginx-with-pagespeed-from-source/index.md | 2 +- .../nginx/configuring-load-balancer-sticky-session/index.md | 2 +- .../index.md | 2 +- .../how-to-install-and-use-nginx-on-ubuntu-20-04/index.md | 4 ++-- docs/guides/web-servers/nginx/php-fpm-nginx/index.md | 6 +++--- .../web-servers/nginx/serve-php-php-fpm-and-nginx/index.md | 2 +- 6 files changed, 9 insertions(+), 9 deletions(-) diff --git a/docs/guides/web-servers/nginx/build-nginx-with-pagespeed-from-source/index.md b/docs/guides/web-servers/nginx/build-nginx-with-pagespeed-from-source/index.md index 50947efa315..345da56117e 100644 --- a/docs/guides/web-servers/nginx/build-nginx-with-pagespeed-from-source/index.md +++ b/docs/guides/web-servers/nginx/build-nginx-with-pagespeed-from-source/index.md @@ -6,7 +6,7 @@ authors: ["Linode"] contributors: ["Linode"] published: 2019-02-01 modified: 2018-02-12 -keywords: ["nginx","pagespeed","optimization"] +keywords: ["nginx", "pagespeed", "optimization"] license: "[CC BY-ND 4.0](http://creativecommons.org/licenses/by-nd/4.0)" aliases: ['/web-servers/nginx/install-nginx-pagespeed-module-on-ubuntu1604/','/web-servers/nginx/nginx-with-pagespeed-on-ubuntu-14-04/','/web-servers/nginx/install-nginx-pagespeed-module-on-ubuntu1804/','/web-servers/nginx/build-nginx-with-pagespeed-from-source/'] dedicated_cpu_link: true diff --git a/docs/guides/web-servers/nginx/configuring-load-balancer-sticky-session/index.md b/docs/guides/web-servers/nginx/configuring-load-balancer-sticky-session/index.md index 8232d669cc3..e98b836a02f 100644 --- a/docs/guides/web-servers/nginx/configuring-load-balancer-sticky-session/index.md +++ b/docs/guides/web-servers/nginx/configuring-load-balancer-sticky-session/index.md @@ -9,7 +9,7 @@ contributors: ["Martin Heller"] published: 2021-02-23 keywords: ['loadbalancer sticky session'] tags: ['nginx','networking'] -license: [CC BY-ND 4.0](https://creativecommons.org/licenses/by-nd/4.0) +license: "[CC BY-ND 4.0](https://creativecommons.org/licenses/by-nd/4.0)" --- ## What is Load Balancing and Why is it Necessary? diff --git a/docs/guides/web-servers/nginx/getting-started-with-nginx-part-2-advanced-configuration/index.md b/docs/guides/web-servers/nginx/getting-started-with-nginx-part-2-advanced-configuration/index.md index 74b8b506a5f..403301963f4 100644 --- a/docs/guides/web-servers/nginx/getting-started-with-nginx-part-2-advanced-configuration/index.md +++ b/docs/guides/web-servers/nginx/getting-started-with-nginx-part-2-advanced-configuration/index.md @@ -8,7 +8,7 @@ contributors: ["Linode"] published: 2018-02-09 modified: 2021-12-29 keywords: ["nginx", "web server", "nginx configuration", "multiple sites", "configure caching"] -license: [CC BY-ND 4.0](https://creativecommons.org/licenses/by-nd/4.0) +license: "[CC BY-ND 4.0](https://creativecommons.org/licenses/by-nd/4.0)" aliases: ['/web-servers/nginx/configure-nginx-for-optimized-performance/','/web-servers/nginx/slightly-more-advanced-configurations-for-nginx/','/websites/nginx/configure-nginx-for-optimized-performance/', '/guides/slightly-more-advanced-configurations-for-nginx/'] tags: ["web server","nginx"] image: "Getting-Started-with-NGINX-Part-2-smg.jpg" diff --git a/docs/guides/web-servers/nginx/how-to-install-and-use-nginx-on-ubuntu-20-04/index.md b/docs/guides/web-servers/nginx/how-to-install-and-use-nginx-on-ubuntu-20-04/index.md index 5de53c1201e..2cc3f17ac68 100644 --- a/docs/guides/web-servers/nginx/how-to-install-and-use-nginx-on-ubuntu-20-04/index.md +++ b/docs/guides/web-servers/nginx/how-to-install-and-use-nginx-on-ubuntu-20-04/index.md @@ -6,9 +6,9 @@ description: "Learn the basics of installing and configuring NGINX on your Ubunt authors: ["Nathaniel Stickman"] contributors: ["Nathaniel Stickman"] published: 2021-07-09 -keywords: ['nginx','web server'] +keywords: ['nginx', 'web server'] tags: ['ubuntu', 'nginx', 'web server'] -license: [CC BY-ND 4.0](https://creativecommons.org/licenses/by-nd/4.0) +license: "[CC BY-ND 4.0](https://creativecommons.org/licenses/by-nd/4.0)" external_resources: - '[NGINX Documentation](https://nginx.org/en/docs/)' relations: diff --git a/docs/guides/web-servers/nginx/php-fpm-nginx/index.md b/docs/guides/web-servers/nginx/php-fpm-nginx/index.md index c3bd60e17d2..d53c2cd6e32 100644 --- a/docs/guides/web-servers/nginx/php-fpm-nginx/index.md +++ b/docs/guides/web-servers/nginx/php-fpm-nginx/index.md @@ -5,9 +5,9 @@ description: "Install and configure PHP-FPM and NGINX using current upstream bes authors: ['Akamai'] contributors: ['Akamai'] published: 2026-02-20 -keywords: ['php','php-fpm','fpm','nginx','web servers','linux'] -tags: ['web-servers','nginx','php','serve','fpm'] -license: [CC BY-ND 4.0](https://creativecommons.org/licenses/by-nd/4.0) +keywords: ['php', 'php-fpm', 'fpm', 'nginx', 'web servers', 'linux'] +tags: ['web-servers', 'nginx', 'php', 'serve', 'fpm'] +license: "[CC BY-ND 4.0](https://creativecommons.org/licenses/by-nd/4.0)" external_resources: - [PHP-FPM documentation](https://www.php.net/manual/en/install.fpm.php) - [NGINX](https://nginx.org/en/docs/) diff --git a/docs/guides/web-servers/nginx/serve-php-php-fpm-and-nginx/index.md b/docs/guides/web-servers/nginx/serve-php-php-fpm-and-nginx/index.md index 16b304ddae6..e4e8c5d131f 100644 --- a/docs/guides/web-servers/nginx/serve-php-php-fpm-and-nginx/index.md +++ b/docs/guides/web-servers/nginx/serve-php-php-fpm-and-nginx/index.md @@ -8,7 +8,7 @@ published: 2018-02-19 modified: 2021-12-29 keywords: ["php", "php-fpm", "fastcgi"] tags: ["web server","ubuntu","php","nginx"] -license: [CC BY-ND 4.0](https://creativecommons.org/licenses/by-nd/4.0) +license: "[CC BY-ND 4.0](https://creativecommons.org/licenses/by-nd/4.0)" aliases: ['/web-servers/nginx/serve-php-php-fpm-and-nginx/','/websites/nginx/install-and-configure-nginx-and-php-fastcgi-on-ubuntu-16-04/','/web-servers/nginx/install-and-configure-nginx-and-php-fastcgi-on-ubuntu-16-04/','/web-servers/nginx/nginx-phpfastcgi-ubuntu-14-04/','/web-servers/nginx/php-fastcgi/ubuntu-12-04-precise-pangolin/'] image: serve-php-with-phpfpm-and-nginx-smp.jpg external_resources: From 833d0309e693b91f0815a32c860a56819e44a635 Mon Sep 17 00:00:00 2001 From: Dianna Hoober Date: Fri, 20 Feb 2026 08:47:54 -0800 Subject: [PATCH 15/19] Readded quotes to license metadata in one file --- .../web-servers/nginx/how-to-configure-http-2-on-nginx/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/guides/web-servers/nginx/how-to-configure-http-2-on-nginx/index.md b/docs/guides/web-servers/nginx/how-to-configure-http-2-on-nginx/index.md index a70f2ec9040..327c225fcc2 100644 --- a/docs/guides/web-servers/nginx/how-to-configure-http-2-on-nginx/index.md +++ b/docs/guides/web-servers/nginx/how-to-configure-http-2-on-nginx/index.md @@ -9,7 +9,7 @@ contributors: ["Jeff Novotny"] published: 2021-07-16 keywords: ['nginx http2'] tags: ['web server', 'nginx'] -license: [CC BY-ND 4.0](https://creativecommons.org/licenses/by-nd/4.0) +license: "[CC BY-ND 4.0](https://creativecommons.org/licenses/by-nd/4.0)" image: "HowtoConfigureHTTP-2onNGINX.jpg" --- From 9274cccff9a90623626de027d6a7c489a941f294 Mon Sep 17 00:00:00 2001 From: Dianna Hoober Date: Fri, 20 Feb 2026 08:56:47 -0800 Subject: [PATCH 16/19] Readded quotes to metadata in one file --- docs/guides/web-servers/nginx/php-fpm-nginx/index.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/guides/web-servers/nginx/php-fpm-nginx/index.md b/docs/guides/web-servers/nginx/php-fpm-nginx/index.md index d53c2cd6e32..45c69f3e1cb 100644 --- a/docs/guides/web-servers/nginx/php-fpm-nginx/index.md +++ b/docs/guides/web-servers/nginx/php-fpm-nginx/index.md @@ -9,8 +9,8 @@ keywords: ['php', 'php-fpm', 'fpm', 'nginx', 'web servers', 'linux'] tags: ['web-servers', 'nginx', 'php', 'serve', 'fpm'] license: "[CC BY-ND 4.0](https://creativecommons.org/licenses/by-nd/4.0)" external_resources: -- [PHP-FPM documentation](https://www.php.net/manual/en/install.fpm.php) -- [NGINX](https://nginx.org/en/docs/) +- "[PHP-FPM documentation](https://www.php.net/manual/en/install.fpm.php)" +- "[NGINX](https://nginx.org/en/docs/)" --- The PHP FastCGI Process Manager (PHP-FPM) manages PHP processes independent of the web server as a modern FastCGI implementation with NGINX. From e1cd46b186b8c86996561364ab10682154f3bf9b Mon Sep 17 00:00:00 2001 From: Dianna Hoober Date: Fri, 20 Feb 2026 09:27:15 -0800 Subject: [PATCH 17/19] Added new terms to dictionary --- ci/vale/dictionary.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ci/vale/dictionary.txt b/ci/vale/dictionary.txt index 67342db7119..c401d91be9b 100644 --- a/ci/vale/dictionary.txt +++ b/ci/vale/dictionary.txt @@ -735,6 +735,7 @@ failsafes falko fanout fastcgi +fastcgi_pass Fastify fastmail fastopen @@ -2317,6 +2318,7 @@ serv server1 serverless servername +server_name serverpassword serverspec servlet From 45216a862c1fba0db4598d20966c259dd643946a Mon Sep 17 00:00:00 2001 From: Dianna Hoober Date: Fri, 20 Feb 2026 10:21:32 -0800 Subject: [PATCH 18/19] Removed erroneous line for keywords under platform --- .../nginx/how-to-install-and-use-nginx-on-ubuntu-20-04/index.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/docs/guides/web-servers/nginx/how-to-install-and-use-nginx-on-ubuntu-20-04/index.md b/docs/guides/web-servers/nginx/how-to-install-and-use-nginx-on-ubuntu-20-04/index.md index 2cc3f17ac68..a2dd6b8de5b 100644 --- a/docs/guides/web-servers/nginx/how-to-install-and-use-nginx-on-ubuntu-20-04/index.md +++ b/docs/guides/web-servers/nginx/how-to-install-and-use-nginx-on-ubuntu-20-04/index.md @@ -14,8 +14,6 @@ external_resources: relations: platform: key: how-to-install-nginx - keywords: - - "distribution: Ubuntu 20.04" aliases: ['/web-servers/nginx/installation/ubuntu-10.04-lucid/','/web-servers/nginx/installation/ubuntu-12.04-precise-pangolin/'] --- From c8ea5972ead943ce9f9e2eee177bf08d9f51321f Mon Sep 17 00:00:00 2001 From: Dianna Hoober Date: Fri, 20 Feb 2026 15:03:46 -0800 Subject: [PATCH 19/19] Redid TS section --- .../web-servers/nginx/php-fpm-nginx/index.md | 118 +++++++----------- 1 file changed, 48 insertions(+), 70 deletions(-) diff --git a/docs/guides/web-servers/nginx/php-fpm-nginx/index.md b/docs/guides/web-servers/nginx/php-fpm-nginx/index.md index 45c69f3e1cb..9936f6a836a 100644 --- a/docs/guides/web-servers/nginx/php-fpm-nginx/index.md +++ b/docs/guides/web-servers/nginx/php-fpm-nginx/index.md @@ -13,16 +13,11 @@ external_resources: - "[NGINX](https://nginx.org/en/docs/)" --- -The PHP FastCGI Process Manager (PHP-FPM) manages PHP processes independent of the web server as a modern FastCGI implementation with NGINX. +PHP FastCGI Process Manager (PHP-FPM) runs PHP processes independently of the web server, enabling process isolation, independent scaling, and better resource management than mod_php or CGI implementations. -Use PHP-FPM with NGINX when you need process isolation, independent PHP, and web server scaling or improved resource management for PHP applications compared to mod_php or CGI implementations +This guide shows how to deploy PHP-FPM with NGINX on Akamai cloud compute, including installation, FastCGI proxy configuration, PHP-FPM pool setup, and security hardening for Akamai infrastructure. -This guide demonstrates how to deploy PHP-FPM and NGINX on Akamai cloud compute infrastructure. It covers installation of both components on a supported Linux distribution, NGINX configuration for FastCGI proxy, PHP-FPM pool setup, deployment testing, and application of basic security hardening. It addresses Akamai-specific requirements for instance sizing, firewall configuration through Cloud Manager as well as performance tuning. - -For complete documentation and configuration options see the official: - -- [PHP-FPM documentation](https://www.php.net/manual/en/install.fpm.php) -- [NGINX](https://nginx.org/en/docs/) +For full configuration options, see the official [PHP-FPM](https://www.php.net/manual/en/install.fpm.php) and [NGINX](https://nginx.org/en/docs/) documentation. ## Before You Begin @@ -425,7 +420,7 @@ View PHP-FPM process events: sudo tail -f /var/log/php8.1-fpm.log ``` -PHP application errors appear in the location specified by the 1`rror_log` directive in `/etc/php/8.1/fpm/php.ini`. +PHP application errors are written to the file defined by the `error_log` directive in `/etc/php/8.1/fpm/php.ini`. ### Performance Monitoring @@ -441,104 +436,87 @@ For advanced monitoring, integrate with external observability platforms. See th ## Troubleshooting -Resolve common issues with PHP-FPM and NGINX deployments. Each section identifies symptoms and provides diagnostic steps. - -### NGINX Gateway Errors +If your PHP-FPM and NGINX configuration isn't working as expected, use the following steps to diagnose and resolve common issues. PHP, PHP-FPM, and NGINX each log different types of errors, so identifying which component is failing helps you choose the right log and to interpret the issue correctly. -**Symptom**: Browser displays "502 Bad Gateway" or "504 Gateway Timeout" errors when accessing PHP pages. - ---- +1. Check the NGINX Error Log -**Cause**: PHP-FPM service is not running. +NGINX logs routing, FastCGI, and upstream connection issues. Common symptoms include: +- 502 Bad Gateway → NGINX cannot reach PHP FPM +- 403 or 404 errors → incorrect root path or permissions +- PHP file downloads instead of executing → PHP module not loaded -**Solution**: Check the service status and start it if stopped: +View the log: ```command -sudo systemctl status php8.1-fpm -sudo systemctl start php8.1-fpm +sudo tail -f /var/log/nginx/error.log ``` ---- - -**Cause**: Socket path mismatch between NGINX and PHP-FPM configurations. +2. Check the PHP FPM Service Log -**Solution**: Verify both paths are identical: +PHP FPM logs process level issues such as pool misconfiguration, socket failures, crashes, or resource exhaustion. ```command -grep "fastcgi_pass" /etc/nginx/sites-available/example.com -grep "listen" /etc/php/8.1/fpm/pool.d/www.conf +sudo tail -f /var/log/php8.1-fpm.log +``` +Restart PHP FPM if needed: +```command +sudo systemctl restart php8.1-fpm ``` -Correct any mismatch and restart both services. - ---- - -**Cause**: Insufficient PHP-FPM worker processes. +3. Check PHP Application Errors -**Solution**: Check whether `pm.max_children` is being reached: +PHP application level errors (syntax errors, fatal errors, exceptions) are written to the file defined by the `error_log` directive in: ```command -sudo grep "max_children" /var/log/php8.1-fpm.log +/etc/php/8.1/fpm/php.ini ``` -If the limit is being hit, increase `pm.max_children` in `/etc/php/8.1/fpm/pool.d/www.conf`. +Some frameworks override this setting. If the file is empty, check your application’s log directory or the NGINX error log. -### File Permission Issues +4. Verify the PHP FPM Socket or Port -**Symptom**: "Permission denied" errors in NGINX error log or blank pages when accessing PHP files. +If NGINX cannot reach PHP FPM, you may see: -**Solution**: Verify NGINX can read PHP files: -```command -sudo -u www-data test -r /var/www/example.com/index.php && echo "Readable" || echo "Permission denied" -``` +- 502 Bad Gateway +- Connection refused +- No such file or directory -Set correct ownership: +Confirm the socket exists: ```command -sudo chown -R www-data:www-data /var/www/example.com +ls -l /run/php/php8.1-fpm.sock ``` -Ensure directories are executable and files are readable: +If your configuration uses TCP instead of a socket: ```command -sudo find /var/www/example.com -type d -exec chmod 755 {} \; -sudo find /var/www/example.com -type f -exec chmod 644 {} \; +fastcgi_pass 127.0.0.1:9000; ``` -### Firewall Configuration - -**Symptom**: Cannot access website from external network, or connection times out. +Ensure PHP FPM is listening on that address. -**Solution**: Verify Cloud Firewall allows HTTP/HTTPS traffic: +5. Check File and Directory Permissions -1. Navigate to Cloud Manager > Firewalls -2. Select the firewall attached to your instance -3. Confirm inbound rules allow TCP ports 80 and 443 - -Check local firewall rules if using UFW or iptables: +Incorrect ownership or permissions can prevent PHP FPM from reading or executing files. A safe baseline for most deployments: ```command -sudo ufw status +sudo chown -R www-data:www-data /var/www/example.com +sudo find /var/www/example.com -type d -exec chmod 755 {} \; +sudo find /var/www/example.com -type f -exec chmod 644 {} \; ``` -Allow HTTP and HTTPS if blocked: +AppArmor Restrictions (Ubuntu Only) + +If you’re using custom directories or non standard paths, AppArmor may block PHP FPM from reading files even when permissions are correct. Check for denials: ```command -sudo ufw allow 80/tcp -sudo ufw allow 443/tcp +sudo journalctl -xe | grep DENIED ``` -### AppArmor Restrictions - -**Symptom**: PHP-FPM fails to start or access specific files despite correct permissions. +If AppArmor is the cause, update the PHP FPM AppArmor profile or place your files in approved locations. -**Solution**: Ubuntu 22.04 uses AppArmor for mandatory access control. Check AppArmor status: -```command -sudo aa-status -``` +6. Reload or Restart Services -Review AppArmor denials in system log: +After making configuration changes: ```command -sudo grep "apparmor" /var/log/syslog +sudo systemctl reload nginx +sudo systemctl restart php8.1-fpm ``` -PHP-FPM's AppArmor profile is located at `/etc/apparmor.d/php-fpm`. Modify the profile only if legitimate application requirements conflict with default restrictions. Reload AppArmor after profile changes: -```command -sudo systemctl reload apparmor -``` +Reloading NGINX applies configuration changes without dropping active connections. ## Next Steps