Why does php-fpm show nginx's IP while they are on different containers?
-
I am trying to set up an Nginx server for the purpose of load balancing between 4 Php-fpm servers. You can access my docker configuration files from https://github.com/sajjadhesami/sampleDockerNginxLoadBalancer .
My containers' network configurations are as below:
"Containers": { "17e57fd1126d99bcd0cba4dde930181b0b240cea54e6d7f9b31bce3dbda416a6": { "Name": "my_app_container_3", "EndpointID": "d71c4f7965c51f1202c518172f8ef04b8d6304200000c61b8651b8d72b7a78ed", "MacAddress": "02:42:ac:12:00:04", "IPv4Address": "172.18.0.4/16", "IPv6Address": "" }, "256e89ae5bcd4acaed1c621075fa4541af781731300dfc742b1a5f9a719dd87a": { "Name": "my_app_container_2", "EndpointID": "1491bec10a1f56a146ddb78da186c59bebda7d8bcd2a580414827987ce3d1964", "MacAddress": "02:42:ac:12:00:03", "IPv4Address": "172.18.0.3/16", "IPv6Address": "" }, "814a7eb51e9a8ed7b2231dc6e33cb23f497224228d3cb9abfa36ae1eb8766ae7": { "Name": "phpmyadmin_container", "EndpointID": "c6db79bd7775e1fc684ffc083d92ffe0d503695333dff5cd265af567a4ce625f", "MacAddress": "02:42:ac:12:00:07", "IPv4Address": "172.18.0.7/16", "IPv6Address": "" }, "83daac9add189960af858bf7a16fc2b6b1592268f10da37ae87babe67c36b9d5": { "Name": "container_mysql", "EndpointID": "6bb1f812020a445d3210611d66febccb45b49b887e8c1f176310fe7ef01c3d18", "MacAddress": "02:42:ac:12:00:02", "IPv4Address": "172.18.0.2/16", "IPv6Address": "" }, "ac0f65cc4948578a7a056d2a27e4771bccb94ce08da87f262edba423a1d3caa0": { "Name": "nginx_container", "EndpointID": "4fb3adf6ad5a1f6ad0ee8af816386fe731087230a651140f6b714071e3df74ee", "MacAddress": "02:42:ac:12:00:08", "IPv4Address": "172.18.0.8/16", "IPv6Address": "" }, "cb17b123ff02035f23fcf44895db0dfea8d1337bf3278a71392abd153c0a07a1": { "Name": "my_app_container_4", "EndpointID": "e03291091e859e08c7c5a7c78ae188e0a3cac117abe8cf351f81fbe8d63d12e0", "MacAddress": "02:42:ac:12:00:06", "IPv4Address": "172.18.0.6/16", "IPv6Address": "" }, "f7fcf98941d12cd5d7fda36f77413d8278e129d5769daa1e6cdc400f342a44b1": { "Name": "my_app_container_1", "EndpointID": "bc82184499842d089473049dcd0e22bdb8b777bc38e11072f58efdff73407946", "MacAddress": "02:42:ac:12:00:05", "IPv4Address": "172.18.0.5/16", "IPv6Address": "" } },
In my Php file, I have a simple line of code to show the IP address of the server:
This request is handeled by the server working on
Now that my PHP interpreters are running on different containers, I expect to see different IP addresses whenever I refresh the page. Interestingly though, it always prints out the IP of the Nginx server despite the fact that the code is being interpretted in another container.
Could you explain to me why it is so?
-
The
SERVER_ADDR
is a FastCGI variable that is being set inside thefastcgi_params
file asfastcgi_param SERVER_ADDR $server_addr;
The https://nginx.org/en/docs/http/ngx_http_core_module.html#var_server_addr nginx variable description says it contains an address of the server which accepted a request, which is obviously an nginx server address. If you want to determine an address of upstream server that is chosen to handle the request, you can try to pass an additional FastCGI variable to your PHP-FPM backend using the https://nginx.org/en/docs/http/ngx_http_upstream_module.html#var_upstream_addr nginx internal variable value, e.g.
fastcgi_param UPSTREAM_ADDR $upstream_addr;
and check its value via the
$_SERVER['UPSTREAM_ADDR']
array item value (I didn't check if this would work, so if you'd check it, any positive or negative feedback is welcome).Alternatively you can check https://stackoverflow.com/a/17053582/7121513 StackOverflow answer.