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

如何使nginx同时处理fastcgi请求?,nginx,fastcgi,Nginx,Fastcgi,在Ubuntu18.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/f

在Ubuntu18.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请求?

您可以查看在服务器上配置
worker\u processs
指令,这将允许更多进程同时处理请求。在中,建议将此设置为计算机拥有的CPU内核数,因此如果您有一个四核处理器,可以将其设置为
4
,我想对于带有SMT的四核处理器(有时称为超线程),将此设置为
8
,也可以正常工作。您还可以将其设置为
auto
,并让NGINX为您处理

默认情况下,此值设置为
1
,因此,如果未指定指令,则可以对其进行改进。您需要在
nginx.conf
的顶部执行此操作,而不是在
服务器{
块中


我敢说,在上,您将看到一些关于如何进一步提高性能的指南。

您可以查看在服务器上配置
worker\u进程
指令,这将允许更多进程同时处理请求。建议在中将其设置为计算机拥有的CPU核数,因此如果如果有一个四核处理器,您可以将其设置为
4
,我猜对于使用SMT(有时称为超线程)的四核处理器,将其设置为
8
也会很好。您还可以将其设置为
auto
,并让NGINX为您处理

默认情况下,此值设置为
1
,因此,如果未指定该指令,这是可以改进的。您需要在
nginx.conf
的顶部执行此操作,而不是在
服务器{
块中


我敢说,在上,您将看到一些关于如何进一步提高性能的指南。

为了让Nginx并行处理fastcgi请求,您需要以下几点:

  • 对于线程池,Nginx>=1.7.1,此配置:
  • 其中
    N
    是进程数,
    auto
    进程数将等于内核数;如果您有许多IO,您可能希望超出此数(拥有与内核一样多的进程/线程并不保证CPU将饱和)

    就NGINX而言,线程池正在执行传递服务的功能。它由一个任务队列和处理该队列的多个线程组成。当工作进程需要执行一个可能很长的操作时,它会将一个任务放在池的队列中,而不是单独处理该操作,并从中获取和处理该任务被任何自由的线所束缚

    因此,您希望选择大于最大并行请求数的
    N
    。因此,您可以选择1000,即使您有4个内核;对于IO,线程将只占用一些内存,而不占用太多CPU

  • 当您有许多具有较大延迟的IO请求时,您还需要在
    'http'
    'server'
    'location'
    上下文中使用
    aio线程,它是以下内容的缩写:
  • 您可能会看到,在处理较慢的IO时,从Linux切换到FreeBSD是一种替代方法。有关更深入的理解,请参阅参考博客


    为了让Nginx并行处理fastcgi请求,您需要做以下几件事:

  • 对于线程池,Nginx>=1.7.1,此配置:
  • 其中
    N
    是进程数,
    auto
    进程数将等于内核数;如果您有许多IO,您可能希望超出此数(拥有与内核一样多的进程/线程并不保证CPU将饱和)

    就NGINX而言,线程池正在执行传递服务的功能。它由一个任务队列和处理该队列的多个线程组成。当工作进程需要执行一个可能很长的操作时,它会将一个任务放在池的队列中,而不是单独处理该操作,并从中获取和处理该任务被任何自由的线所束缚

    因此,您希望选择大于最大并行请求数的
    N
    。因此,您可以选择1000,即使您有4个内核;对于IO,线程将只占用一些内存,而不占用太多CPU

  • 当您有许多具有较大延迟的IO请求时,您还需要在
    'http'
    'server'
    'location'
    上下文中使用
    aio线程,它是以下内容的缩写:
  • 您可能会看到,在处理较慢的IO时,从Linux切换到FreeBSD是一种替代方法。有关更深入的理解,请参阅参考博客


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

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

    worker_processes N; // N as integer or auto
    
    # in the 'main' context
    thread_pool default threads=32 max_queue=65536;
    
    # in the 'http', 'server', or 'location' context
    aio threads=default;