I have a webserver running NGINX & PHP, with a very basic multi client test.
<?php
if(isset($_GET['query'])) {
echo "HELLO MY NAME IS WEBSERVER";
}
if(isset($_GET['sleep'])) {
sleep(10);
}
?>
If I run http://servername.com/index.php?query, I get an instant response.
If I run ?sleep then ?query together, ?query appears to be queued till ?sleep is complete.
This happens across multiple clients. Client A can request ?sleep, which will affect Client B's ?query request. Client B is a completely different machine.
Is there any method of tweaking php.ini or my nginx config to allow a separate php worker process to spawn (or something along those lines?)
Edit: For a little background, here's my config.
nginx.conf:
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9123;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
fastgci_params:
fastcgi_param QUERY_STRING $query_string;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
fastcgi_param REQUEST_URI $request_uri;
fastcgi_param DOCUMENT_URI $document_uri;
fastcgi_param DOCUMENT_ROOT $document_root;
fastcgi_param SERVER_PROTOCOL $server_protocol;
fastcgi_param REQUEST_SCHEME $scheme;
fastcgi_param HTTPS $https if_not_empty;
fastcgi_param GATEWAY_INTERFACE CGI/1.1;
fastcgi_param SERVER_SOFTWARE nginx/$nginx_version;
fastcgi_param REMOTE_ADDR $remote_addr;
fastcgi_param REMOTE_PORT $remote_port;
fastcgi_param SERVER_ADDR $server_addr;
fastcgi_param SERVER_PORT $server_port;
fastcgi_param SERVER_NAME $server_name;
# PHP only, required if PHP was built with --enable-force-cgi-redirect
fastcgi_param REDIRECT_STATUS 200;
php execution (runphp.bat):
set PATH=%cd%\php;%PATH%
start %cd%\php\php-cgi.exe -b 127.0.0.1:9123
edit 2: Ok, so it appears I need PHP-FPM, which is not available on windows:
It is important to note that FPM is not built with the windows binaries. Many of the guides you may find online rely on php-cgi.exe. Unfortunately they call it FPM but this is incorrect!
The executable php-cgi.exe that is bundled with the windows binaries is a FastCGI interface but it is *not* FPM (Fastcgi Process Manager). php-cgi.exe does not have multi-threading or concurrent request support, nor support for any of the FPM configuration options.
So, as a workaround, I'm trying the multiple php servers / processes approach:
upstream php {
server 127.0.0.1:9000;
server 127.0.0.1:9001;
server 127.0.0.1:9002;
server 127.0.0.1:9003;
}
location ~ \.php$ {
fastcgi_pass php;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
However, NGINX will not start at all in this configuration. It doesn't seem to want to accept any "upstream php {}"
Any ideas?
Thanks
As per the edits, I figured PHP-FPM isn't available in Windows. However, this can be bypassed by spawning multiple PHP processes on different ports, and configuring NGINX to load balance across them.
My "RunPHP.bat" script:
set PATH=%cd%\php;%PATH%
runhiddenconsole.exe %cd%\php\php-cgi.exe -b 127.0.0.1:9100
runhiddenconsole.exe %cd%\php\php-cgi.exe -b 127.0.0.1:9101
runhiddenconsole.exe %cd%\php\php-cgi.exe -b 127.0.0.1:9102
runhiddenconsole.exe %cd%\php\php-cgi.exe -b 127.0.0.1:9103
My nginx.conf (php bits only):
http {
upstream php_farm {
server 127.0.0.1:9100 weight=1 max_fails=1 fail_timeout=1s;
server 127.0.0.1:9101 weight=1 max_fails=1 fail_timeout=1s;
server 127.0.0.1:9102 weight=1 max_fails=1 fail_timeout=1s;
server 127.0.0.1:9103 weight=1 max_fails=1 fail_timeout=1s;
}
server {
location ~ \.php$ {
fastcgi_pass php_farm;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With