如何让 nginx 同时处理 fastcgi 请求?

Ste*_*nov 5 fastcgi nginx

在 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;
}
Run Code Online (Sandbox Code Playgroud)

我通过使用如下所示的 cgi 脚本来演示这一点:

#!/bin/bash

echo "Content-Type: text";
echo;
echo;
sleep 5;
echo Hello world
Run Code Online (Sandbox Code Playgroud)

使用curl 从两个并排的命令提示符访问脚本,您将看到服务器按顺序处理请求。

如何确保 nginx 并行处理 fastcgi 请求?

小智 5

Nginx 是一个非阻塞服务器,即使fcgiwrap作为后端使用也是如此。所以nginx进程数应该不是问题的原因。fcgiwrap真正的解决方案是增加使用该选项的进程数量-c。如果fcgiwrap使用 启动-c2,即使只有一个 Nginx 工作进程,也可以并行运行 2 个 cgi 脚本。


Sol*_*eil 2

为了让 Nginx 并行处理 fastcgi 请求,你需要几件事:

\n\n
    \n
  1. 对于线程池,Nginx >= 1.7.1,并且此配置:
  2. \n
\n\n
\n
worker_processes N; // N as integer or auto\n
Run Code Online (Sandbox Code Playgroud)\n
\n\n

其中N是进程数,auto进程数等于核心数;如果你有很多 IO,你可能想要超过这个数字(拥有与核心一样多的进程/线程并不能保证 CPU 会饱和)。

\n\n
\n

就NGINX而言,线程池正在执行交付服务的功能。它由一个任务队列和许多处理该队列的线程组成。当工作进程需要执行可能很长的操作时,它不会自行处理该操作,而是将任务放入 pool\xe2\x80\x99s 队列中,任何空闲线程都可以从该队列中获取并处理该任务。

\n
\n\n

因此,您想要选择N大于最大并行请求数的值。因此,即使您有 4 个核心,您也可以选择 1000 个;对于IO来说,线程只会占用一些内存,而不占用太多CPU。

\n\n
    \n
  1. 当您有许多延迟较大的 IO 请求时,您还需要aio threads\'http\'\'server\'\'location\'上下文中,它是以下形式的缩写:
  2. \n
\n\n
\n
# in the \'main\' context\nthread_pool default threads=32 max_queue=65536;\n\n# in the \'http\', \'server\', or \'location\' context\naio threads=default;\n
Run Code Online (Sandbox Code Playgroud)\n
\n\n

您可能会发现,在处理缓慢的 IO 问题时,从 Linux 切换到 FreeBSD 可能是一种替代方案。请参阅参考博客以获得更深入的理解。

\n\n

NGINX 中的线程池将性能提升 9 倍!(www.nginx.com/blog)

\n