Applicable to:
- Plesk for Linux
Symptoms
- Websites that have PHP handler set as FPM application served by Apache or FPM application served by nginx at Domains > example.com > PHP Settings experience one of the following issues:
- the site is loading slowly
- there is a high load on server resources (CPU / RAM / DISK)
-
not accessible (permanently or periodically) with a 50x error in a web-browser:
PLESK_INFO: 502 Bad Gateway
PLESK_INFO: 503 Service Temporarily Unavailable
PLESK_INFO: 504 Gateway Time-out
Cloudflare 522 timeout error
-
The following message appears in the PHP-FPM error logfile
/var/log/plesk-phpXX-fpm/error.log(where XX is a PHP version used by the websites):CONFIG_TEXT: WARNING: [pool example.com] server reached max_children setting (*), consider raising it
-
The message above is usually accompanied with this error:
CONFIG_TEXT: unable to read what child say: Bad file descriptor (9)
-
-
If nginx is enabled on the server, one of the following error messages may appear in domain's error logfile
/var/www/vhosts/system/example.com/logs/proxy_error_log:CONFIG_TEXT: [error] 11456#0: *118348 connect() to unix:///var/www/vhosts/system/example.com/php-fpm.sock failed (11: Resource temporarily unavailable) while connecting to upstream, client: 203.0.113.2, server: example.com, request: "GET / HTTP/1.1", upstream: "fastcgi://unix:///var/www/vhosts/system/example.com/php-fpm.sock:", host: "example.com"
CONFIG_TEXT: [error] 20058#0: *4725139 upstream prematurely closed connection while reading response header from upstream, client: 203.0.113.2, server: example.com, request: "POST /path/to/some/file HTTP/2.0", upstream:
- Requests are being served slowly or not served at all, and therefore, the websites become inaccessible, even though the server's CPU and RAM resources are not exhausted.
Cause
The server receives a large number of requests, which leads to the PHP-FPM pm.max_children limit being reached by the website(s). This usually indicates that the server is under attack or that the number of website(s) visitors has increased sharply. Attacks or increased visitor traffic put a strain on the server's CPU, as PHP handlers that execute code begin to use the CPU more actively to process incoming requests.
Resolution
- Ensure the server isn't under attack. You can use this article to do this:
How to diagnose a DoS/DDoS attack and find websites under attack on a Plesk server - If an attack has been detected, it is necessary to take measures to protect the server from attacks as described in this article: What DDoS protection tools are available in Plesk
If no attacks are detected, proceed to the next step. - You need to monitor the server using this article: How to monitor usage of system resources in a period of time using atop
- If the CPU and memory load are not high <60%, you can increase the parameterpm.max_childrento handle more requests. You have a reserve of resources up to 80% load.
To calculate thepm.max_childrenUse this article: How to calculate pm.max_children value on a Plesk server?.
- If the server's processor or memory is loaded at 80% or more, it's necessary to increase the number of processor cores or the amount of RAM on the server, depending on which resource is overloaded.
Once the server resources have been expanded, you can begin to increase the parameterpm.max_childrenso that the server can handle more requests. To calculate thepm.max_childrenuse this article: How to calculate pm.max_children value on a Plesk server?
Note: Increasing the limit pm.max_children should only be done after a full investigation of the server using the articles provided above.
pm.max_children limit for the affected domains:
- Connect to the Plesk server via SSH
-
Find affected domains using the command below:
Note: The number on the left indicates how many times the
pm.max_childrenlimit has been reached by the website.
If a domain is using a dedicated FPM application and has a custom vhosts location, change the path /var/www/vhosts/system/ in the command below:# grep -r "server reached max_children setting" /var/log/*php*-fpm/error.log | cut -d' ' -f5 | tr -d ']' | sort | uniq -c | sort -nr
100 example.com
50 example.net
25 example.org
<...> - Log into Plesk
- Go to Domains > example.com > PHP Settings > PHP-FPM Settings.
-
Increase the
pm.max_childrenvalue for the domain and apply the changes. Increase this value for all domains listed in step 2.Note: In this example, we are setting
pm.max_childrento 20. To fine tune this setting, visit this KB article.
- Log in to Plesk.
- Go to Service Plans > plan_name > PHP Settings tab > PHP-FPM Settings section.
-
Increase the
pm.max_childrenvalue and click Update & Sync.
Note: The changes will not be applied to subscriptions if:
- A subscription is not synced with this service plan (Marked with a blue lock in the Subscriptions menu).
- If the permission Hosting performance settings management is granted in service plan settings at Service Plans > plan_name > Permissions tab.
-
Create a
php.inifile in domain's system directory/var/www/vhosts/system/example.com/conf/:# touch /var/www/vhosts/system/example.com/conf/php.ini
-
Open the
php.inifile in any text editor (for example, vi editor) and add the following records:CONFIG_TEXT: [php-fpm-pool-settings]
pm.max_children = 20 - Save the changes and close the file.
-
Run the following command to apply the changes:
# /usr/local/psa/bin/php_settings -u
This is a complex administrative task that involves planning and optimizing server resources and settings. Slow code execution often also leads to timeout errors, so additional code review and optimization by developers is a good solution.
Comments
Please sign in to leave a comment.