If Not True Then False

Nginx and PHP-FPM Configuration and Optimizing Tips and Tricks - Comment Page: 5

I wrote before a guide Howto install Nginx/PHP-FPM on Fedora 20/19, CentOS/RHEL 6.5/5.10, but this guide is just installation guide and many cases Nginx and PHP-FPM basic configuration is good enough, but if you want to squeeze all the juice out of your VPS or web server / servers and do your maintenance work little bit easier, then this guide might be useful. These tips are based entirely on my...
Categories:

153 Comments

Leave a Comment

Your email address will not be published. Required fields are marked *

Input your comment.
help

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

Input your name.

ethan

Do you recommend the VIRT RES or SHR column from top as the Measurement for memory usage of PHP-FPM?

reply Reply
JR

Hi ethan,

Yes VIRT, RES or SHR column from top are good info when you try measure memory usage per php-fpm processes. Actually RES is an accurate representation of how much actual physical memory a process is consuming.

reply Reply
Kahfi

The application has running well, but there’s some problem again. Between nginx and php-fpm the connection sometimes refuse and timeout. Like occur error message in error.log :

“upstream timed out (110: Connection timed out) while reading response header from upstream ”

Does anybody knows how to fix this problem ? :)

reply Reply
Aslam Multani

Thanks for Sharing such a detailed explanations. For me Nginx + Apache has worked very well. I stored cache on tmps and it works well too.

reply Reply
Mxyzptlk FishStix

You didn’t have to do that. You can eliminate Nginx and turn on Apache’s mod_cache. Or get rid of Apache and just use Nginx. There is no performance benefit in storing the cache on tmpfs. The Linux virtual memory system is smart enough to grab frequently requested files from the disk cache and store them in the VM’s page cache.

reply Reply
Mxyzptlk FishStix

Sample httpd.conf (mod_cache):

..
LoadModule cache_module modules/mod_cache.so
LoadModule cache_disk_module modules/mod_cache_disk.so

Sample mod_cache.conf:

CacheDefaultExpire 60
CacheEnable disk /
CacheDirLevels 2
CacheDirLength 1
CacheIgnoreHeaders Set-Cookie
CacheLock On
CacheLockMaxAge 5
CacheLockPath /tmp/mod_cache-lock
CacheRoot “/var/cache/apache2/”

reply Reply
Bowen Huang

Thanks for your helpfull article, you said ‘Every process eat memory and of course if site have very high traffic and server lot’s of memory then higher values are right choise’, my server has 40GB memory, so I can set the pm.max_children=512? is it too large? my site every minute PV is 30,000, the max PV is 42,000, what is the best value to set? and value for pm.max_requests?
the current configuration for my site:
pm = static
pm.max_children = 256
pm.max_requests = 1024

reply Reply
JR

Hi edward,

Could you tell little bit more about this.

What you have running, some heavy app?
PHP version?
Nginx and PHP-FPM configs?
And do you have problems with it?

~90 % memory usage is normal on Linux (when you have limited amount of ram), but if it cause problems, then you have to optimize your configs/processes or get more ram, cpu etc.

reply Reply
Mxyzptlk FishStix

“My god, man!” – Dr. Leonard “Bones” McCoy

—–

You don’t need all of those php-fpm and mysql processes.

Two php-fpm processes per cpu is more than enough.

Example php-fpm.conf (2 CPU):

[global]
error_log = /var/log/php-fpm.log
emergency_restart_threshold = 10
emergency_restart_interval = 1m
process_control_timeout = 10s

[www]
catch_workers_output = yes
listen = /var/run/php-fpm/php-fpm.sock
listen.backlog = 65536
listen.owner = apache
listen.group = apache
user = apache
group = apache
pm = static
pm.max_children = 4
pm.start_servers = 4
pm.max_requests = 1024

Configure mysql to use unix sockets and bring those connections down.

At the mysql prompt, enter the following when you’re server is at it’s heaviest usage:

“show status like ‘%max_used%’;”

Example my.cnf:
[mysqld]

max-connections = 24 # Adjust until you no longer get “‘too many connections”. Be sure to leave a small buffer above %max_used%.

socket = /var/run/mysqld/mysqld.sock

reply Reply
Tu Nguyen

I am using VPS 512MB and articles help me get better performance with Nginx & PHP-FPM
Thank you!

reply Reply
Qiang

Recently I find my application’s front server with too many TCP connections over 50000!!!!

~% uptime
17:02:04 up 246 days, 23:04, 1 user, load average: 3.44, 1.73, 0.97

~% netstat -an | wc -l
57118

The service has one front-load-balancer with 3 front servers.
Each of the 3 front servers with [4vCPU(3GHz)/4GB.

The sysctl.conf file is as follow:

net.ipv4.tcp_tw_recycle = 0
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 5

Some blogs tell that “tcp_tw_recycle can not be active because of using the load-balancer”.
And the top commend are with full screen php-fpm COMMEND,
Does the php-fpm setting results the too many tcp connections ?
~% top
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
23799 nginx 20 0 489m 17m 8088 S 5.3 0.5 0:45.52 php-fpm (90% are like this line….)

My php-fpm configuration is as bellow:
pm = static
pm.max_children = 380
pm.start_servers = 250
pm.min_spare_servers = 250
pm.max_spare_servers = 300
pm.max_requests = 8000

Can somebody give me some advice.
I am freshman in this,…..
Thanks !

reply Reply
Mxyzptlk FishStix

Qiang, do you really need all of those processes? That’s entirely too much. If you have Skype or another form of instant messaging, post it here so that I may contact you to see exactly what is going on.

reply Reply
Qiang

Hi Mxyzptlk!
Thanks for your reply.

I am really confused about the so many TCP connections….
If you would like to help me, that help me a lot.
My skype ID is dq881015

Thanks!

Qiang.

reply Reply
Alex

Hi, thank yuo for a good article!
But there is a couple of things i can’t realize. The first thing is nginx connections+fpm total connecntions: as i understand you have 4 worker_processes and 1024 connections per one process = 4096 connections to nginx total/sec. If you set pm.max_children = 10 and pm.max_requests = 400 (10*400=4000) only for forum, how nginx can physically accepet other connections (blog for example) to pull them to fpm? Am i right?
And a cecond thing. How can i exactly calcalate how many memory one worker uses? Thank’s ahead.

reply Reply
JR

Hello Alex and you are welcome,

Yes, nginx can accept 4096 connections at same time with that configuration, but if you really want to process/generate 4000 php page at same time, then you will need pm.max_children = 4000 and yes you will need extreme powerful server (or actually powerful PHP-FPM cluster) to keep 4000 PHP-FPM processes up and running.

From PHP documentation:

pm.max_children int
The number of child processes to be created when pm is set to static and the maximum number of child processes to be created when pm is set to dynamic. This option is mandatory.

This option sets the limit on the number of simultaneous requests that will be served. Equivalent to the ApacheMaxClients directive with mpm_prefork and to the PHP_FCGI_CHILDREN environment variable in the original PHP FastCGI.

pm.max_requests int
The number of requests each child process should execute before respawning. This can be useful to work around memory leaks in 3rd party libraries. For endless request processing specify ‘0’. Equivalent to PHP_FCGI_MAX_REQUESTS. Default value: 0.

So let’s think again that example, what this really mean.

– Nginx with 4 worker_processes and 1024 connections per one process = 4096. Correct.
– PHP-FPM with pm.max_children = 10 and pm.max_requests = 400 (10*400=4000). Wrong. PHP-FPM correct value is 10, not 4000.
This means 10 requests are served simultaneously and all other PHP requests go to queue and are served when some process is available again.

Next think how browsers work, when they load page.

– Browser sends page request to Nginx. (This request go to PHP-FPM or alternatively nginx could return it directly from cache without PHP-FPM).
– Then browser could send 100 new requests to load static content, like images, javascript, css, fonts, etc. Nginx handle all these without PHP-FPM.

So if 40 user open your site exactly same time, you might get 4000 requests to nginx, but only 40 PHP-FPM requests, which are served easily with 10 PHP-FPM processes. If you have plenty of RAM, then you could of course increase PHP-FPM processess.

If you check PHP-FPM Tip 4. – PHP-FPM Pool Process Manager (pm) Configuration you got idea how to calculate memory usage and pm. values. Normally good point to start is open top or htop and check PHP-FPM processes RES value, which tell you how much one process really use memory. Then you need to think how much memory you really have for PHP-FPM. This is easy if you have only PHP-FPM service running on this server, but if you want also run nginx, some db, ssh, mail, etc. then you need to also check how much memory all services together are using and leave some some RAM to OS. Finally you have some amount of RAM for PHP-FPM and then you divide it for PHP-FPM processes.

reply Reply
Ferri

PHP-FPM with pm.max_children = 10 and pm.max_requests = 400 (10*400=4000). Wrong. PHP-FPM correct value is 10, not 4000.
This means 10 requests are served simultaneously and all other PHP requests go to queue and are served when some process is available again.

so basically its just able to handle 10 simultaneously requests, and after each worker/children request summed up to 400, then automatically this children will respawned?

reply Reply
Ferri

I still confusing how to adjust min and max spare server, any hint?

Thanks

reply Reply
JR

Hi Ferri,

Could you tell a little more about your server(s) and what you are running?

reply Reply
Ferri

Hi JR,

My VPS has spec

Core : 4
RAM : 5120MB
SWAP : 128

Since my core was 4, then i adjust my nginx.conf like this

worker_processes 4;
worker_connections 2048;
multi_accept on;

and my php fpm

pm = dinamyc
pm.max_children = 50
pm.start_servers = 10
pm.min_spare_servers = 10
pm.max_spare_servers = 20
pm.max_requests = 250

I’ve check that each my php fpm procces took around 40MB, and i want to allocate about 2gb of my ram, so 2gb / 40mb == arounce 50 children..

I just use it for hosting some of my websites, any hint?

Thanks :)

reply Reply
JR

Hi Ferri,

For me this looks good. You can increase pm.max_requests or setup it to default 0 (zero), if you run good bug free code. pm.max_requests is useful work around memory leaks in 3rd party libraries.

You can fine tune your config later, but this is very good starting point based on your VPS and php-fpm process memory usage.

I assume that this pm = dinamyc is just typo and your real config have pm = dynamic.

reply Reply
MichaelL

I have an issue with php-fpm on centos 7 with php 7.0.7 and ngnix. When I went to restart php-fpm using systemctl restart php-fpm it hangs for about 90 seconds and then aborts with a time out error in the log file. This is a new install of everything.

The php-fpm log file error section is:

[30-May-2016 17:15:11] NOTICE: fpm is running, pid 19577
[30-May-2016 17:15:11] NOTICE: ready to handle connections
[30-May-2016 17:16:41] NOTICE: Terminating …
[30-May-2016 17:16:41] NOTICE: exiting, bye-bye!

nginix serves the php web pages just fine until the timeout happens. Googleing around has been no help. Any ideas would be appreciated.

reply Reply
ElenaS

Hello. Please help me.
centos 6.8 nginx+php-fpm
I upgrade php to 5.6, If i send cmd in the console php -v 5.6.* then ok, but in the browser I see 5.2 php old version. Inner path old php version /usr/local/php
How to correct config php-fpm for new php version?
Thank you for help. Sorry My English expertise is bad.

reply Reply
Sunny Chopra

Hi All,

Now these days, I am in very bad situation. We are using Nginx version 1.10.1 with PHP-FPM version 5.5.38. Also there is good configuration of two servers 4 CPU & 16GB RAM each. Everything works fine when there is only 10-15 php-fpm connections but situations comes bad when there are more than 150 requests on php-fpm & database query comes in sleep & sites becomes unresponsive. In order to resolve this, we always restart php-fpm service to kill the existing connections.

Do you have any idea, if there is configuration issue of Nginx or PHP-FPM.

reply Reply
Ahmed

If i have a 10 K concurrent user , and 8 core server process .. request size is about 4 KB , and response size is about 20 KB ,

what is the best configuration should i use .. and please how I could calculate values based on requests per server ( with nginx load balancer ) , cores and ram size

reply Reply
Vincent

fastcgi_pass 127.0.0.1:9000;
#fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;

If php-fpm and nginx are the same box, it might be better to use the socket approach (better performance, no tcp overhead)

reply Reply