Nginx七层(应用层)反向代理:SCGI代理scgi_pass篇

Nginx七层(应用层)反向代理
SCGI代理scgi_pass篇

- 文章信息 - Author: 李俊才 (jcLee95)
Visit me at CSDN: https://jclee95.blog.csdn.net
My WebSitehttp://thispage.tech/
Email: 291148484@163.com.
Shenzhen China
Address of this article:https://blog.csdn.net/qq_28550263/article/details/140253307
HuaWei:https://bbs.huaweicloud.com/blogs/XXXXXXXXXX

【介绍】:Nginx提供了多种应用层反向代理支持,包括proxy_pass、uwsgi_pass、fastcgi_pass和scgi_pass等。其中,proxy_pass指令可以接受一个URL参数,用于实现对HTTP/HTTPS协议的反向代理;uwsgi_pass用于代理到uWSGI应用服务器;fastcgi_pass用于代理到FastCGI服务器;而scgi_pass则用于代理到SCGI(Simple Common Gateway Interface)应用。这些指令使Nginx能够灵活地处理不同类型的后端服务和应用程序。本文介绍的重点是scgi_pass。


相关文章:
Nginx七层反向代理:HTTP反向代理proxy_pass篇

Nginx七层反向代理:UWSGI代理uwsgi_pass篇
Nginx七层反向代理:SCGI代理scgi_pass篇
Nginx七层反向代理:FastCGI代理fastcgi_pass篇

在这里插入图片描述


1. 概述

1.1 什么是SCGI

SCGI(Simple Common Gateway Interface)代理是Nginx支持的一种重要的反向代理方式之一。其中,SCGI是一种简化版的CGI(Common Gateway Interface)协议,旨在提供一种更高效的方法来连接Web服务器和应用程序。与传统的CGI相比,SCGI通过使用持久连接和简化的协议格式,显著减少了每个请求的开销。

SCGI协议定义了一种标准化的方式,用于Web服务器与应用程序之间传递请求信息和接收响应。它使用简单的文本格式来传输请求头信息,随后是请求体(如果有的话)。这种设计使得SCGI既易于实现,又能提供良好的性能。

1.2 SCGI在的应用场景

Web应用架构中,SCGI充当了Web服务器(如Nginx)和后端应用程序之间的桥梁。当Nginx接收到客户端的HTTP请求时,它可以将这些请求转换为SCGI格式,然后通过SCGI协议发送给后端的应用服务器。

这种方式特别适合于那些原生支持SCGI协议的编程语言和框架,如Python的某些Web框架(例如Flup)或Ruby的某些应用服务器(如Unicorn)。通过使用SCGI,这些应用可以避免HTTP解析的开销,直接处理来自Web服务器的请求,从而提高整体性能。

在实际应用中,SCGI的使用场景包括但不限于:

  1. 高性能Web应用:对于需要处理大量并发请求的应用,SCGI可以提供比传统CGI更好的性能。

  2. 长时间运行的进程:某些需要保持状态或长时间运行的应用程序可以通过SCGIWeb服务器保持持久连接。

  3. 特定语言的优化:某些编程语言或框架可能在使用SCGI时表现出更好的性能或更简单的实现。

通过在Nginx中使用scgi_pass指令,管理员可以轻松地将HTTP请求转发到支持SCGI的后端应用服务器。这不仅简化了配置过程,还为优化Web应用的性能提供了灵活性。

2. SCGI协议简介

2.1 SCGI协议的特点

SCGI(Simple Common Gateway Interface)协议是一种简化的CGI协议,专门设计用于Web服务器和应用程序之间的通信。它具有以下几个显著特点:

简单性:SCGI协议采用了简单的文本格式来传输请求头信息,这使得协议的实现和调试变得相对容易。协议的设计理念是保持简单,同时提供足够的功能性。

持久连接:与传统的CGI不同,SCGI支持持久连接。这意味着一个SCGI服务器可以处理多个请求,而无需为每个请求创建新的进程或线程。这大大减少了系统资源的开销,提高了整体性能。

低开销:由于SCGI协议的设计简洁,它在请求处理过程中产生的额外开销很小。这使得SCGI特别适合处理高并发的Web应用场景。

灵活性:SCGI协议允许传输任意的头信息,这为开发者提供了极大的灵活性。开发者可以根据需要自定义头信息,以满足特定应用的要求。

语言无关性:SCGI协议的设计是与编程语言无关的。这意味着它可以被任何编程语言实现,使得开发者可以选择最适合其项目需求的语言来开发SCGI服务器。

2.2 SCGI vs HTTP协议

虽然SCGIHTTP都是用于Web通信的协议,但它们在设计目的和使用场景上有着显著的差异:

目标用户:HTTP协议主要用于客户端(如浏览器)和Web服务器之间的通信,而SCGI协议则专注于Web服务器和后端应用程序之间的通信。

协议复杂度:HTTP协议相对复杂,包含了大量的头信息和方法,以支持各种Web交互场景。相比之下,SCGI协议更加简单,仅包含必要的信息来传递请求和响应。

性能考虑:在Web服务器和应用程序之间使用SCGI而不是HTTP可以减少协议解析的开销,因为SCGI的格式更加简单直接。这在高并发场景下可能带来显著的性能提升。

连接管理:HTTP/1.1引入了持久连接的概念,但在Web服务器和应用程序之间使用HTTP仍可能需要额外的连接管理。SCGI天生支持持久连接,简化了这一过程。

使用场景:HTTP是互联网的基础协议,适用于各种Web通信场景。SCGI则主要用于Web服务器和后端应用的内部通信,特别是在需要高性能处理的场景中。

2.3 SCGI vs FastCGI

SCGIFastCGI都是CGI的改进版本,旨在提高Web应用的性能。它们有一些相似之处,但也存在一些关键差异:

协议复杂度:SCGI协议比FastCGI更简单。SCGI使用简单的文本格式传输头信息,而FastCGI使用二进制格式。这使得SCGI更容易实现和调试,但可能在某些情况下略逊于FastCGI的性能。

  1. 多路复用:FastCGI支持在单个连接上处理多个请求(多路复用),而SCGI通常每个连接只处理一个请求。这意味着在某些高并发场景下,FastCGI可能表现得更好。

  2. 记录类型:FastCGI定义了多种记录类型(如STDINSTDOUTSTDERR等),允许更细粒度的控制。SCGI则采用更简单的方法,主要关注请求和响应的传输。

  3. 语言支持:由于FastCGI存在的时间更长,它在各种编程语言和框架中的支持可能更广泛。然而,SCGI的简单性使得它在某些语言中的实现可能更加直接。

  4. 性能:在大多数情况下,SCGIFastCGI的性能差异并不显著。选择使用哪种协议通常取决于特定的应用需求、开发语言的支持情况以及个人偏好。

3. Nginx中的scgi_pass指令

3.1 scgi_pass指令的基本语法

Nginx配置中,scgi_pass指令是用于将请求传递给SCGI服务器的关键指令。它定义了Nginx应该将请求转发到哪个SCGI服务器或服务器组。

scgi_pass指令的基本语法如下:

scgi_pass address;

其中,address可以是以下几种形式:

  1. 域名或IP地址加端口号:

例如:scgi_pass localhost:9000;

在这种情况下,Nginx会将请求转发到运行在本地主机上、监听9000端口的SCGI服务器。

  1. Unix域套接字路径:

例如:scgi_pass unix:/tmp/scgi.socket;

这里,Nginx会通过指定的Unix域套接字与SCGI服务器通信。这种方式通常用于SCGI服务器与Nginx运行在同一台机器上的情况,可以提供更好的性能。

  1. 上游服务器组名称:

例如:scgi_pass scgi_backend;

在这种用法中,scgi_backend是一个在Nginx配置文件中预先定义的上游服务器组。这允许您实现负载均衡和故障转移等高级功能。

scgi_pass指令通常在location块中使用,用于处理特定的URL路径。例如:

location /scgi/ {
    scgi_pass localhost:9000;
    include scgi_params;
}

在这个例子中,所有以/scgi/开头的请求都会被转发到本地的9000端口上运行的SCGI服务器。

include scgi_params;语句包含了一个预定义的配置文件,其中设置了一系列SCGI参数。这些参数定义了Nginx如何将HTTP请求信息转换为SCGI请求。

值得注意的是,scgi_pass指令可以与其他Nginx指令结合使用,以实现更复杂的配置。例如,您可以使用if条件语句来根据不同的条件选择不同的SCGI服务器:

location / {
    if ($request_method = POST) {
        scgi_pass localhost:9001;
    }
    scgi_pass localhost:9000;
    include scgi_params;
}

在这个例子中,POST请求会被转发到9001端口,而其他所有请求则转发到9000端口。

3.2 scgi_pass vs proxy_pass

scgi_passproxy_pass都是常用的反向代理指令,都将请求转发到后端服务器。

其中,scgi_pass专门用于与支持SCGI协议的后端服务器通信。SCGI是一种简化的CGI协议,设计用于Web服务器和应用程序之间的高效通信。相比之下,proxy_pass是一个更通用的指令,可以用于代理各种协议,包括HTTPHTTPSFastCGI等。

在使用scgi_pass时,Nginx会将接收到的HTTP请求转换为SCGI格式,然后发送给后端的SCGI服务器。这个过程中,Nginx会处理协议的转换,确保后端服务器能够正确理解和处理请求。而proxy_pass则通常用于将请求原封不动地转发给后端服务器,不进行协议转换。

另一个重要的区别在于配置方式。scgi_pass通常需要配合scgi_param指令使用,以设置SCGI协议所需的参数。例如:

location /app/ {
    scgi_pass localhost:9000;
    include scgi_params;
    scgi_param SCRIPT_FILENAME /path/to/app$fastcgi_script_name;
}

在这个例子中,include scgi_params引入了预定义的SCGI参数,而scgi_param指令用于设置额外的参数。

相比之下,proxy_pass的配置通常更加简单直接:

location /api/ {
    proxy_pass http://backend_server;
}

在性能方面,scgi_passproxy_pass各有优势。对于专门设计使用SCGI协议的应用程序,scgi_pass可能会提供更好的性能,因为它避免了HTTP协议的开销。然而,proxy_pass的通用性使其更加灵活,可以适应各种后端服务器和协议。

安全性也是需要考虑的一个方面。由于scgi_pass专门用于SCGI协议,它可能在某些情况下提供更好的安全性,因为它限制了与后端服务器的通信方式。而proxy_pass由于其通用性,可能需要额外的配置来确保安全性,特别是在处理敏感数据时。

在实际应用中,选择使用scgi_pass还是proxy_pass主要取决于后端应用程序的特性和需求。如果后端应用程序专门设计为使用SCGI协议,那么scgi_pass可能是更好的选择。如果后端是一个标准的Web服务器或应用程序,不支持或不需要SCGI,那么proxy_pass可能更为合适。

3.3 scgi_pass的工作原理

scgi_pass指令是Nginx中用于处理SCGI(Simple Common Gateway Interface)请求的核心指令。它的工作原理涉及多个步骤,从接收客户端请求到将处理后的响应返回给客户端。

首先,当Nginx接收到一个客户端的HTTP请求时,它会根据配置文件中的规则来决定如何处理这个请求。如果请求匹配到了使用scgi_pass指令的位置块,Nginx就会启动SCGI处理流程。

SCGI处理流程中,Nginx首先会建立与SCGI服务器的连接。这个连接可以是TCP套接字或Unix域套接字,具体取决于scgi_pass指令中指定的地址。如果使用了上游服务器组,Nginx还会根据配置的负载均衡算法选择一个特定的服务器。

连接建立后,Nginx会将HTTP请求转换为SCGI格式。这个过程包括创建SCGI请求头和请求体。SCGI请求头包含了一系列键值对,这些键值对提供了关于请求的元数据,如请求方法、路径、查询字符串、客户端IP地址等。这些信息大多来自原始的HTTP请求头,但也可能包括通过scgi_param指令额外设置的参数。

SCGI请求头的格式是特定的:它以一个表示整个头部长度的数字开始,后跟一个冒号,然后是一系列以空字符结束的键值对,最后以一个逗号结束。例如,一个简化的SCGI请求头可能看起来像这样:

70:CONTENT_LENGTH27SCGI1REQUEST_METHODGETquery_string,

在这个例子中,"70"表示头部的总长度,后面跟着三个键值对:CONTENT_LENGTHSCGIREQUEST_METHOD

在发送完请求头后,Nginx会发送请求体(如果有的话)。对于GET请求,通常没有请求体,但对于POSTPUT请求,请求体可能包含表单数据或其他类型的内容。

SCGI服务器接收到请求后,会处理这个请求并生成响应。响应通过同一个连接发送回NginxSCGI响应的格式相对简单,它包括响应头和响应体,中间用一个空行分隔。

Nginx接收到SCGI服务器的响应后,会将其转换回HTTP响应格式。这个过程包括解析SCGI响应头,设置适当的HTTP响应头,然后将响应体原封不动地传递给客户端。

在整个过程中,Nginx还负责管理连接的生命周期。这包括处理连接超时、管理连接池(如果启用了keepalive)、处理网络错误等。如果在处理过程中发生错误,Nginx会根据配置返回适当的错误响应给客户端。

另外,scgi_pass的工作过程是非阻塞的。这意味着Nginx可以同时处理多个SCGI请求,而不需要为每个请求创建一个新的进程或线程。这种设计使得Nginx能够高效地处理大量并发连接。

4. 配置Nginx使用scgi_pass

4.1 基本配置示例

Nginx中配置scgi_pass的基本示例相对简单。这个配置将允许Nginx将特定路径的请求转发到SCGI服务器。以下是一个基本的配置示例:

首先,打开Nginx的主配置文件,通常位于/etc/nginx/nginx.conf/usr/local/nginx/conf/nginx.conf。在这个文件中,我们需要在http块内添加或修改server块。

server块内,我们将添加一个location指令来定义哪些请求应该被转发到SCGI服务器。例如,如果我们想将所有以/scgi/开头的请求转发到运行在本地9000端口的SCGI服务器,可以使用以下配置:

http {
    server {
        listen 80;
        server_name example.com;

        location /scgi/ {
            scgi_pass localhost:9000;
            include scgi_params;
        }
    }
}

在这个配置中,listen 80指令告诉Nginx监听80端口(标准HTTP端口)。server_name指令定义了这个服务器块应该响应的域名。

location /scgi/块定义了所有以/scgi/开头的URL请求都应该被处理。在这个块内,我们使用scgi_pass指令来指定SCGI服务器的地址和端口。在这个例子中,SCGI服务器运行在同一台机器上(localhost)的9000端口。

include scgi_params;语句包含了一个预定义的配置文件,其中设置了一系列SCGI参数。这些参数定义了Nginx如何将HTTP请求信息转换为SCGI请求。通常,这个文件位于/etc/nginx/scgi_params/usr/local/nginx/conf/scgi_params

如果您的SCGI服务器需要额外的参数,可以使用scgi_param指令来设置。例如,如果需要设置SCRIPT_FILENAME参数,可以这样配置:

location /scgi/ {
    scgi_pass localhost:9000;
    include scgi_params;
    scgi_param SCRIPT_FILENAME /path/to/your/scripts$fastcgi_script_name;
}

这里,SCRIPT_FILENAME参数被设置为脚本的实际路径。$fastcgi_script_name是一个Nginx变量,代表请求的脚本名称。

如果您的SCGI服务器使用Unix域套接字而不是TCP端口,可以这样配置:

location /scgi/ {
    scgi_pass unix:/tmp/scgi.socket;
    include scgi_params;
}

在这个例子中,Nginx将通过位于/tmp/scgi.socketUnix域套接字与SCGI服务器通信。

配置完成后,需要重新加载或重启Nginx以使更改生效。可以使用以下命令:

sudo nginx -s reload

或者

sudo systemctl restart nginx

这个基本配置为使用scgi_pass提供了一个良好的起点。根据您的具体需求,可能需要进行更多的调整和优化。例如,您可能需要配置缓冲、超时、或者设置上游服务器组以实现负载均衡。这些配置选项将在后续章节中详细讨论。

4.2 使用upstream模块

Nginx中,upstream模块允许我们定义一组服务器,可以用于负载均衡和故障转移。当与scgi_pass指令结合使用时,upstream模块可以大大增强SCGI代理的灵活性和可靠性。

upstream模块的基本语法如下:

upstream backend_name {
    server address1;
    server address2;
    # 更多服务器...
}

在这个配置中,backend_name是您为这组服务器指定的名称,后续可以在scgi_pass指令中引用。每个server指令定义了一个后端服务器的地址,可以是IP地址加端口号,也可以是Unix域套接字路径。

例如,我们可以定义一个名为scgi_servers的upstream组:

upstream scgi_servers {
    server 127.0.0.1:9000;
    server 127.0.0.1:9001;
    server unix:/tmp/scgi.socket;
}

定义好upstream后,我们可以在scgi_pass指令中使用它:

location /app/ {
    scgi_pass scgi_servers;
    include scgi_params;
}

这样,Nginx就会将请求分发到scgi_servers组中的服务器。

upstream模块提供了多种负载均衡算法,可以通过在server指令后添加参数来配置:

  1. 轮询(默认):按顺序将请求分配给每个服务器。

  2. 加权轮询:可以为每个服务器指定一个权重,权重越高的服务器接收到的请求越多。例如:

upstream scgi_servers {
    server 127.0.0.1:9000 weight=3;
    server 127.0.0.1:9001 weight=1;
}
  1. 最少连接:将请求发送到当前活动连接数最少的服务器。使用least_conn指令:
upstream scgi_servers {
    least_conn;
    server 127.0.0.1:9000;
    server 127.0.0.1:9001;
}
  1. IP哈希:根据客户端IP地址的哈希值来选择服务器,可以确保来自同一IP的请求总是发送到同一服务器(除非该服务器不可用)。使用ip_hash指令:
upstream scgi_servers {
    ip_hash;
    server 127.0.0.1:9000;
    server 127.0.0.1:9001;
}

upstream模块还提供了服务器健康检查和故障转移功能。例如,我们可以使用max_failsfail_timeout参数来配置故障检测:

upstream scgi_servers {
    server 127.0.0.1:9000 max_fails=3 fail_timeout=30s;
    server 127.0.0.1:9001 max_fails=3 fail_timeout=30s;
}

在这个配置中,如果一个服务器在30秒内连续失败3次,Nginx会将其标记为不可用,并在接下来的30秒内不再向其发送请求。

此外,我们还可以使用backup参数来指定备用服务器,只有当所有主服务器都不可用时,才会使用备用服务器:

upstream scgi_servers {
    server 127.0.0.1:9000;
    server 127.0.0.1:9001;
    server 127.0.0.1:9002 backup;
}

通过合理使用upstream模块,我们可以构建一个高可用、高性能的SCGI代理集群。这不仅可以提高应用的整体性能,还可以增强系统的可靠性和容错能力。在实际应用中,我们应该根据具体的需求和场景,选择合适的负载均衡策略和故障转移机制,以获得最佳的系统表现。

4.3 Unix socket vs TCP socket

在配置Nginxscgi_pass指令时,我们有两种主要的选择来指定SCGI服务器的地址:Unix域套接字和TCP套接字。这两种方法各有优缺点,选择哪种方式取决于具体的应用场景和需求。

Unix域套接字是一种进程间通信(IPC)机制,允许同一台机器上的进程进行高效通信。在Nginx配置中,Unix域套接字的地址通常表示为一个文件路径。例如:

scgi_pass unix:/tmp/scgi.socket;

使用Unix域套接字的主要优势在于其性能。由于通信发生在同一台机器上,不需要经过网络协议栈,因此Unix域套接字通常比TCP套接字更快。它们避免了TCP/IP协议带来的开销,如数据包的封装和解封装、网络拥塞控制等。这使得Unix域套接字特别适合于NginxSCGI服务器运行在同一台机器上的情况。

另一个使用Unix域套接字的优势是安全性。由于通信仅限于本地机器,它天然地避免了来自网络的攻击。此外,可以使用文件系统权限来控制对套接字文件的访问,提供了额外的安全层。

然而,Unix域套接字也有其局限性。最明显的是,它们只能用于同一台机器上的进程间通信。如果NginxSCGI服务器需要运行在不同的机器上,就无法使用Unix域套接字。

相比之下,TCP套接字使用IP地址和端口号来指定服务器地址。例如:

scgi_pass 127.0.0.1:9000;

TCP套接字的主要优势是灵活性。它们允许NginxSCGI服务器运行在不同的机器上,这对于分布式系统或需要横向扩展的应用来说是必要的。使用TCP套接字,我们可以轻松地实现负载均衡,将请求分发到多个SCGI服务器。

另一个优点是,TCP套接字更容易进行网络级别的监控和调试。使用标准的网络工具,我们可以轻松地检查通信状态、诊断问题。

然而,TCP套接字的主要缺点是性能略低于Unix域套接字。即使在同一台机器上通信,数据也需要经过完整的网络协议栈,这会带来一些额外的开销。此外,使用TCP套接字可能需要更多的安全考虑,例如设置防火墙规则、使用SSL/TLS加密等。

在选择使用Unix域套接字还是TCP套接字时,需要考虑以下因素:

  1. 性能需求:如果追求最高性能,且NginxSCGI服务器在同一台机器上,应选择Unix域套接字。

  2. 部署架构:如果NginxSCGI服务器需要运行在不同的机器上,或者需要实现负载均衡,则必须使用TCP套接字。

  3. 安全需求:如果安全是首要考虑,且不需要跨机器通信,Unix域套接字可能是更好的选择。

  4. 可扩展性:如果预计未来可能需要将SCGI服务器扩展到多台机器,使用TCP套接字会更容易进行架构调整。

  5. 调试和监控需求:如果需要使用标准网络工具进行监控和调试,TCP套接字可能更合适。

总之,Unix域套接字和TCP套接字都是有效的选择。应根据具体的应用需求、性能要求和部署环境来做出选择。在许多情况下,特别是当追求高性能且NginxSCGI服务器共存于同一台机器时,Unix域套接字可能是更优的选择。但如果需要更大的灵活性或分布式部署,TCP套接字则是不可或缺的选项。

5. scgi_pass的高级配置

本章将详细探讨scgi_pass的三个关键高级配置方面:超时设置、缓冲区配置和连接池管理。

5.1 超时设置

超时设置是确保NginxSCGI服务器之间通信可靠性的关键。适当的超时配置可以防止请求在遇到问题时无限期地挂起,同时也为慢速连接提供足够的处理时间。

Nginx提供了多个与scgi_pass相关的超时指令:

首先是scgi_connect_timeout,它定义了NginxSCGI服务器建立连接的最长等待时间。如果在指定时间内无法建立连接,Nginx将返回错误。例如:

scgi_connect_timeout 60s;

这个配置将连接超时设置为60秒。

其次,scgi_read_timeout指定了NginxSCGI服务器读取响应的超时时间。如果SCGI服务器在这段时间内没有传输任何数据,连接将被关闭。例如:

scgi_read_timeout 60s;

最后,scgi_send_timeout设置了NginxSCGI服务器发送请求的超时时间。如果在指定时间内SCGI服务器没有接收任何数据,连接将被关闭。例如:

scgi_send_timeout 60s;

这些超时设置应根据实际应用的需求进行调整。对于大多数应用来说,默认值已经足够。但对于一些长时间运行的请求,可能需要增加这些超时值。

5.2 缓冲区配置

缓冲区配置对于优化NginxSCGI服务器之间的数据传输至关重要。合理的缓冲设置可以提高响应速度,减少资源消耗。

scgi_buffer_size指令用于设置用于读取SCGI服务器响应的第一部分的缓冲区大小。这通常包含一个小的响应头。例如:

scgi_buffer_size 4k;

scgi_buffers指令定义了用于读取SCGI服务器响应的缓冲区的数量和大小。例如:

scgi_buffers 8 4k;

这个配置创建了8个4k大小的缓冲区。

如果响应无法完全放入内存,可以使用scgi_max_temp_file_size指令来限制临时文件的最大大小:

scgi_max_temp_file_size 1024m;

这将临时文件的最大大小限制为1024MB。

对于大型响应,可以使用scgi_busy_buffers_size指令来限制在忙碌状态下可用的缓冲区大小:

scgi_busy_buffers_size 8k;

这些缓冲区设置应根据您的应用特性和服务器资源进行调整,以达到最佳性能。

5.3 连接池管理

连接池管理是优化NginxSCGI服务器之间通信的另一个重要方面。通过复用连接,可以显著减少建立新连接的开销,提高整体性能。

scgi_keepalive指令用于配置到上游SCGI服务器的空闲保持连接的最大数量。例如:

scgi_keepalive 10;

这个配置允许每个工作进程保持最多10个空闲的保持活动连接。

可以使用scgi_http_version指令来指定Nginx用于与SCGI服务器通信的HTTP协议版本:

scgi_http_version 1.1;

使用HTTP/1.1可以启用长连接,这对于保持连接池的效率至关重要。

此外,可以使用scgi_next_upstream指令来控制在哪些情况下请求应该传递给下一个服务器:

scgi_next_upstream error timeout invalid_header http_500;

这个配置指定了在发生错误、超时、收到无效头部或遇到HTTP 500错误时,请求应该传递给下一个服务器。

6. Python flup web部署案例

暂待编写

6.1 步骤梳理

6.2 容器化部署

7. 总结

本文详细探讨了Nginxscgi_pass指令的应用,特别聚焦于Python应用的配置和部署。我们首先介绍了SCGI协议的特点和优势,然后深入讲解了scgi_pass指令的基本语法和高级配置选项。通过实际案例,展示如何为Python Flup框架配置scgi_pass,包括基本设置、负载均衡、连接池和缓冲区管理等方面。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/793351.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

利用Altair One 云平台,轻松实现全球企业产品研发创新与优化

在过去的几十年里,工程师和数据科学家引入了大量改变世界的技术,但他们的工作方式却出人意料地停滞不前。技术的革新也带来了效率的不断提升。 面对众多企业的同样难题,Altair整合产品,创造出了用于协作工程、数据工程和分析应用程…

数列分块<2>

本期是数列分块入门<2>。该系列的所有题目来自hzwer在LOJ上提供的数列分块入门系列。 Blog:http://hzwer.com/8053.html sto hzwer orz %%% [转载] 好像上面的链接↑打不开&#xff0c;放一个转载:https://www.cnblogs.…

【C++】C++-机房收费管理系统(源码+注释)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

RK3568平台开发系列讲解(内存篇)Linux进程内存的消耗统计

🚀返回专栏总目录 文章目录 一、VSS(Virtual Set Size)二、RSS(Resident Set Size)三、PSS(Proportional Set Size)四、USS(Unique Set Size)五、其他工具Linux 提供了多种进程内存占用的度量指标, 它们反映了不同的内存使用特征: VSS 反映进程虚拟内存总需求, 包括未…

Oracle基础以及一些‘方言’(一)

1、什么是Oracle ORACLE数据库系统是美国ORACLE公司&#xff08;甲骨文&#xff09;提供的以分布式数据库为核心的一组软件产品&#xff0c;是最流行的客户/服务器(CLIENT/SERVER)或B/S体系结构的数据库之一。 ORACLE 通常应用于大型系统的数据库产品。 ORACLE 数据库是目前世界…

企业内多个系统如何实现单点登录/SSO统一认证

背景 在现代化企业中&#xff0c;随着业务的不断扩展和技术的不断进步&#xff0c;企业通常会使用多个系统来支持其日常运营&#xff0c;如OA、HR、CRM、研发应用&#xff08;Git、Jira等&#xff09;、财务系统、档案管理系统等。然而&#xff0c;这些系统往往各自为政&#…

基于Spring Boot的高校后勤餐饮管理系统

1 项目介绍 1.1 研究背景 “互联网”时代的到来&#xff0c;既给高校后勤管理发展带来了机遇&#xff0c;也带来了更大的挑战。信息化应用已经开始普及&#xff0c;传统的高校后勤餐饮管理模式往往存在着效率低下、信息不透明、资源浪费等问题&#xff0c;已经难以满足现代高…

Chromium源码阅读(7):了解WTF的静态字符串机制

在浏览器的实现中&#xff0c;处理HTML和CSS涉及大量的字符串操作&#xff0c;这些操作通常包括字符串的比较、查找和匹配。如果使用普通的字符串对这些进行操作&#xff0c;在面临大量DOM元素和CSS规则时会导致效率低下。 例如&#xff0c;当解析CSS时&#xff0c;属性名如col…

人工智能算法工程师(中级)课程9-PyTorch神经网络之全连接神经网络实战与代码详解

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下人工智能算法工程师(中级)课程9-PyTorch神经网络之全连接神经网络实战与代码详解。本文将给大家展示全连接神经网络与代码详解&#xff0c;包括全连接模型的设计、数学原理介绍&#xff0c;并从手写数字识别到猫狗识…

Neo4j安装

下载地址&#xff1a;Neo4j Deployment Center - Graph Database & Analytics 1.安装jdk&#xff0c;Neo4j 3.0需要jdk8&#xff0c;2.3.0之前的版本建议jdk7。Neo4j最新版本5.21.2&#xff0c;对应jdk版本17 2.将下载的zip文件解压到合适路径。 3.设置环境变量NEO4J_H…

历年HW已公开漏洞合集!(目前漏洞库更新至84个,Goby持续更新...)

截至2024年7月11日&#xff0c;Goby红队版已扩充以下历年HW已公开漏洞库&#xff0c;本次更新84个&#xff1a; &#xff08;后续将持续更新…) 华天动力OA 华天动力 OA getHtmlContent 文件读取漏洞华天动力OA办公系统 /OAapp/bfapp/buffalo/TemplateService 文件读取漏洞华…

在亚马逊云科技AWS利用IaC(基础设施即代码)设计和搭建云原生架构(附免费学习教程和证书)

今天小李哥为大家介绍的是利用IaC(基础设施即代码)设计和搭建亚马逊云科技AWS云原生架构。本篇文章将会介绍如何在亚马逊云科技上搭建云原生Serverless服务&#xff0c;所使用的开发服务介绍&#xff0c;并展示搭建云原生架构的cdk代码。小李哥同时会给大家分享快速学习亚马逊云…

python:sympy 求解一元五次方程式

pip install sympy 或者 本人用的 anaconda 3 自带 sympy 在北大数学训练营&#xff0c;韦东奕 用卡丹公式 巧妙 求解一元五次方程式&#xff1a; \latex $x^510*x^320*x-4 0$ from sympy import *x symbols(x) expr x**5 10*x**3 20*x -4# 用卡丹公式 尝试化简 a sym…

冒泡排序与其C语言通用连续类型排序代码

冒泡排序与其C语言通用连续类型排序代码 冒泡排序冒泡排序为交换排序的一种&#xff1a;动图展示&#xff1a;冒泡排序的特性总结&#xff1a;冒泡排序排整型数据参考代码&#xff08;VS2022C语言环境&#xff09;&#xff1a; 冒泡排序C语言通用连续类型排序代码对比较的方式更…

MVC 控制器 中Action 不能同名,参数不一样,路由器寻找不到对应的,要加特性

//1 方法不可能完全相同&#xff0c;参数不同//2 那还需要特性吗&#xff1f;需要的&#xff0c;因为MVC选择方法时&#xff0c;不是按参数选择&#xff1a;http请求发送很多数据&#xff0c;其实没法识别&#xff0c;//因为mvc找方法是通过反射来的&#xff0c;GetMethods(nam…

基于jeecgboot-vue3的Flowable流程-集成仿钉钉流程(六)仿钉钉流程的转bpmn流程图

因为这个项目license问题无法开源&#xff0c;更多技术支持与服务请加入我的知识星球。 1、转bpmn流程图接口 /*** 转为bpmn xml格式* param processModel* throws IOException*/PostMapping("/ddtobpmnxml")public Result<?> ddToBpmnXml(RequestBody Proce…

int类型变量表示范围的计算原理

文章目录 1. 了解2. 为什么通常情况下int类型整数的取值范围是-2147483648 ~ 21474836473. int类型究竟占几个字节4. 推荐 1. 了解 通常情况下int类型变量占4个字节&#xff0c;1个字节有8位&#xff0c;每位都有0和1两种状态&#xff0c;所以int类型变量一共可以表示 2^32 种状…

Javascript[ECMAScript] 新特性—1

背景 JS1.1&#xff08;1997&#xff09; 第一版基于Netscape Navigator 3.0中实现的JAVASCRIPT 1.1 JS1.2&#xff08;1999&#xff09; 基于Netscape Navigator 4.0中实现的JavaScript 1.2。添加了正则表达式、更好的字符串处理、新的控制语句、Try/Catch异常处理、更严格…

Qt/C++项目积累: 2.主机监控器 - 2.2 历史功能实现

修订历史&#xff1a; 20240711&#xff1a;初始表设计&#xff0c;采用sqlite 正文&#xff1a; 关于历史数据存储&#xff0c;考虑的是用数据库来完成&#xff0c;目前考虑使用Sqlite和mysql&#xff0c;先用sqlite来实现&#xff0c;设计表过程如下&#xff1a; 机器总览…

SpringBoot 3.3 【一】手把手讲解-使用Eclipse创建第一个SpringBoot应用程序

简单动作&#xff0c;深刻联结。在这技术海洋&#xff0c;我备好舟&#xff0c;等你扬帆。启航吧&#xff01; &#x1f31f;点击【关注】&#xff0c;解锁定期的技术惊喜&#xff0c;让灵感与知识的源泉不断涌动。 &#x1f44d;一个【点赞】&#xff0c;如同心照不宣的默契&a…