如何让 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 请求,您需要做几件事:

  1. 线程池的 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.

  1. 当您有许多具有较大延迟的 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 脚本。