如何让 nginx 并发处理 fastcgi 请求?
How can I make nginx handle fastcgi requests concurrently?
在 ubuntu 18.04 上使用最小的 fastcgi/nginx 配置,看起来 nginx 一次只能处理一个 fastcgi 请求。
# nginx configuration
location ~ ^\.cgi$ {
# Fastcgi socket
fastcgi_pass unix:/var/run/fcgiwrap.socket;
# Fastcgi parameters, include the standard ones
include /etc/nginx/fastcgi_params;
}
我使用这样的 cgi 脚本来演示:
#!/bin/bash
echo "Content-Type: text";
echo;
echo;
sleep 5;
echo Hello world
使用 curl 从两个并排的命令提示符访问脚本,您将看到服务器按顺序处理请求。
如何确保 nginx 并行处理 fastcgi 请求?
为了让 Nginx 并行处理 fastcgi 请求,您需要做几件事:
- 线程池的 Nginx >= 1.7.1,并且此配置:
worker_processes N; // N as integer or auto
其中N
是进程数,auto
进程数等于内核数;如果你有很多 IO,你可能想要超过这个数字(拥有与内核一样多的 processes/threads 并不保证 CPU 会饱和)。
In terms of NGINX, the thread pool is performing the functions of the delivery service. It consists of a task queue and a number of threads that handle the queue. When a worker process needs to do a potentially long operation, instead of processing the operation by itself it puts a task in the pool’s queue, from which it can be taken and processed by any free thread.
因此,您要选择N
大于最大并行请求数。因此,即使您有 4 个内核,您也可以选择 1000;对于IO,线程只会占用一些内存,并不多CPU.
- 当您有许多具有较大延迟的 IO 请求时,您还需要在
'http'
、'server'
或 'location'
上下文中使用 aio threads
,这是一个简称:
# in the 'main' context
thread_pool default threads=32 max_queue=65536;
# in the 'http', 'server', or 'location' context
aio threads=default;
您可能会发现,在处理慢速 IO 时,从 Linux 切换到 FreeBSD 可能是一种替代方法。请参阅参考博客以获得更深入的了解。
Thread Pools in NGINX Boost Performance 9x! (www.nginx.com/blog)
Nginx 是一个非阻塞服务器,即使使用 fcgiwrap
作为后端也是如此。所以nginx进程数应该不是问题的原因。真正的解决方案是使用 -c
选项增加 fcgiwrap
进程的数量。
如果 fcgiwrap
与 -c2
一起启动,即使有一个 Nginx 工作进程,您也可以 运行 并行执行 2 个 cgi 脚本。
在 ubuntu 18.04 上使用最小的 fastcgi/nginx 配置,看起来 nginx 一次只能处理一个 fastcgi 请求。
# nginx configuration
location ~ ^\.cgi$ {
# Fastcgi socket
fastcgi_pass unix:/var/run/fcgiwrap.socket;
# Fastcgi parameters, include the standard ones
include /etc/nginx/fastcgi_params;
}
我使用这样的 cgi 脚本来演示:
#!/bin/bash
echo "Content-Type: text";
echo;
echo;
sleep 5;
echo Hello world
使用 curl 从两个并排的命令提示符访问脚本,您将看到服务器按顺序处理请求。
如何确保 nginx 并行处理 fastcgi 请求?
为了让 Nginx 并行处理 fastcgi 请求,您需要做几件事:
- 线程池的 Nginx >= 1.7.1,并且此配置:
worker_processes N; // N as integer or auto
其中N
是进程数,auto
进程数等于内核数;如果你有很多 IO,你可能想要超过这个数字(拥有与内核一样多的 processes/threads 并不保证 CPU 会饱和)。
In terms of NGINX, the thread pool is performing the functions of the delivery service. It consists of a task queue and a number of threads that handle the queue. When a worker process needs to do a potentially long operation, instead of processing the operation by itself it puts a task in the pool’s queue, from which it can be taken and processed by any free thread.
因此,您要选择N
大于最大并行请求数。因此,即使您有 4 个内核,您也可以选择 1000;对于IO,线程只会占用一些内存,并不多CPU.
- 当您有许多具有较大延迟的 IO 请求时,您还需要在
'http'
、'server'
或'location'
上下文中使用aio threads
,这是一个简称:
# in the 'main' context thread_pool default threads=32 max_queue=65536; # in the 'http', 'server', or 'location' context aio threads=default;
您可能会发现,在处理慢速 IO 时,从 Linux 切换到 FreeBSD 可能是一种替代方法。请参阅参考博客以获得更深入的了解。
Thread Pools in NGINX Boost Performance 9x! (www.nginx.com/blog)
Nginx 是一个非阻塞服务器,即使使用 fcgiwrap
作为后端也是如此。所以nginx进程数应该不是问题的原因。真正的解决方案是使用 -c
选项增加 fcgiwrap
进程的数量。
如果 fcgiwrap
与 -c2
一起启动,即使有一个 Nginx 工作进程,您也可以 运行 并行执行 2 个 cgi 脚本。