当前位置: 首页 > news >正文

Nginx七层(应用层)反向代理:UWSGI代理uwsgi_pass篇

Nginx七层(应用层)反向代理
UWSGI代理uwsgi_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/140253227
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能够灵活地处理不同类型的后端服务和应用程序。本文介绍的重点是proxy_pass。


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

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

在这里插入图片描述


1. 概述

1.1 什么是反向代理

反向代理是一种常见的服务器架构模式,它位于用户和原始服务器之间,接收用户的请求并将其转发到一个或多个后端服务器。然后,反向代理将从后端服务器获取的响应返回给用户,就好像这些内容都是由代理服务器本身直接提供的一样。

在这个过程中,用户只与反向代理服务器进行直接交互,而不知道后端服务器的存在。这种架构为系统提供了额外的抽象和控制层,使得系统管理员能够灵活地部署和管理后端资源,同时为用户提供一致的访问体验。

反向代理与正向代理有所不同。正向代理主要用于帮助客户端访问其无法直接访问的资源,而反向代理则是代表服务器接收并处理来自客户端的请求。

1.2 为什么需要反向代理

反向代理通过隐藏后端服务器的IP地址和架构细节,增强了系统安全性。管理员可以在反向代理服务器上集中实施SSL/TLS加密、访问控制和防火墙规则,从而减轻后端服务器的安全管理负担。

反向代理实现负载均衡,将请求分发到多个后端服务器。这种机制提高了系统吞吐量,能够处理更高的并发请求,同时改善响应时间。

缓存功能存储静态内容和常访问的动态内容,减少后端服务器负载,加快内容交付速度。对高流量网站,缓存降低服务器压力和带宽消耗。

内容压缩减少带宽使用,加快页面加载速度。移动用户和网络条件欠佳地区的用户从中受益。

URL重写和重定向优化路由逻辑。例如,将/api/v1的请求重写到实际后端服务路径,无需修改客户端代码,简化API设计和版本管理。

系统扩展性通过添加或移除后端服务器来调整系统容量,客户端无需感知这些变化。这种透明的扩展能力应对流量波动和系统升级。

在微服务架构中,反向代理作为API网关,统一处理认证、限流、监控等横切关注点。各个微服务的实现得以简化,开发团队专注于核心业务逻辑。

A/B测试和金丝雀发布通过配置规则,将部分流量导向新版本服务,实现功能平稳迭代和风险控制。

2. UWSGI协议简介

2.1 UWSGI协议的特点

UWSGI协议是一种二进制协议,专为Web服务器和Web应用程序之间的通信而设计。它采用二进制格式传输数据,相比文本协议如HTTP,能够更高效地处理请求和响应。

UWSGI协议使用简单的数据包结构,包含头部和主体两部分。头部包含数据包长度和变量数量等信息,主体包含实际的键值对数据。这种结构使得数据解析和处理变得快速高效。

该协议支持多种数据类型,包括字符串、整数和自定义类型,允许灵活传输不同格式的信息。它还提供了丰富的环境变量支持,可以传递请求相关的详细信息。

UWSGI协议具有可扩展性,允许添加自定义头部和变量,以满足特定应用程序的需求。这种灵活性使得它能够适应各种复杂的Web应用场景。

2.2 UWSGI vs HTTP协议

UWSGI协议与HTTP协议在设计目标和应用场景上有明显区别。HTTP协议主要用于客户端和服务器之间的通信,而UWSGI协议专注于服务器内部组件之间的通信。

性能方面,UWSGI协议通常比HTTP协议更高效。它的二进制格式减少了数据传输量,降低了解析开销。相比之下,HTTP协议的文本格式虽然人类可读,但在高并发场景下可能导致更多的处理开销。

UWSGI协议的设计更加紧凑,减少了冗余信息。它省略了HTTP协议中的一些头部字段,如用户代理和接受语言等,这些信息在服务器内部通信中通常不需要。

然而,UWSGI协议的使用范围较窄,主要限于Web服务器和应用服务器之间。HTTP协议则具有更广泛的应用,包括浏览器、移动应用和API调用等各种场景。

2.3 UWSGI在Web应用中的角色

UWSGI协议在Web应用架构中充当了Web服务器和应用服务器之间的桥梁。它允许Web服务器(如Nginx)将请求高效地传递给应用服务器(如uWSGIGunicorn)。

在典型的部署中,Nginx作为前端服务器接收客户端请求,然后通过UWSGI协议将这些请求转发给后端的PythonRubyPHP应用程序。这种架构提高了整体系统的性能和可扩展性。

UWSGI协议使得Web服务器能够更好地管理连接和请求分发。它支持长连接和请求复用,减少了连接建立和断开的开销,提高了系统的并发处理能力。

对于Python Web应用,UWSGI协议与WSGIWeb服务器网关接口)标准兼容。这意味着使用UWSGI协议的服务器可以无缝地与遵循WSGI标准的Python应用程序集成。

UWSGI协议还支持进程管理和监控功能,使得应用服务器可以动态调整工作进程数量,实现负载均衡和故障恢复。这些特性增强了Web应用的稳定性和可靠性。

3. Nginx中的uwsgi_pass指令

3.1 uwsgi_pass指令的基本语法

uwsgi_pass指令在Nginx配置中用于将请求转发到运行uWSGI协议的后端服务器。其基本语法如下:

uwsgi_pass backend;

这里的backend可以是以下几种形式:

  • IP地址加端口号:uwsgi_pass 127.0.0.1:8000;
  • Unix域套接字路径:uwsgi_pass unix:/tmp/uwsgi.sock;
  • 上游服务器组名称:uwsgi_pass myapp;

uwsgi_pass指令通常放在location块内,用于指定特定URL路径的请求处理方式。例如:

location /myapp {uwsgi_pass 127.0.0.1:8000;
}

此配置将所有/myapp路径的请求转发到本地8000端口的uWSGI服务器。

3.2 uwsgi_pass vs proxy_pass

uwsgi_passproxy_pass都是Nginx中用于请求转发的指令,但它们针对不同的协议和应用场景。

uwsgi_pass专门用于与使用uWSGI协议的后端服务器通信。它理解并处理uWSGI协议的特定格式和头部,适用于PythonRuby等使用uWSGI服务器的应用。

proxy_pass是一个通用的反向代理指令,主要用于HTTP协议。它可以将请求转发到任何支持HTTP的后端服务器,包括其他Web服务器、应用服务器或API服务。

使用uwsgi_pass时,Nginx会自动添加必要的uWSGI协议头部,而proxy_pass则保持原始的HTTP请求格式。

在性能方面,对于支持uWSGI协议的应用,uwsgi_pass通常比proxy_pass更高效,因为它避免了HTTPuWSGI的协议转换开销。

3.3 uwsgi_pass的工作原理

Nginx接收到客户端请求后,uwsgi_pass指令触发以下处理流程:

Nginx解析客户端的HTTP请求,提取相关信息如URL、请求方法、头部等。

Nginx将这些信息转换为uWSGI协议格式,包括创建uWSGI数据包头部和正文。

Nginx通过配置的后端地址(TCP套接字或Unix域套接字)建立与uWSGI服务器的连接。

Nginx将转换后的uWSGI请求发送给后端服务器。

后端uWSGI服务器处理请求并生成响应。

Nginx接收uWSGI服务器的响应,将其转换回HTTP格式。

Nginx将转换后的HTTP响应发送给客户端。

这个过程中,Nginx充当了HTTPuWSGI协议之间的转换器,使得客户端和uWSGI应用服务器能够无缝通信。uwsgi_pass指令还处理连接池管理、超时控制、错误处理等细节,确保高效可靠的请求转发。

4. 配置Nginx使用uwsgi_pass

4.1 基本配置示例

Nginx中使用uwsgi_pass的基本配置示例展示了如何将请求转发到运行uWSGI协议的后端服务器。这个配置通常包含在Nginx的服务器块或位置块中。例如:

server {listen 80;server_name example.com;location / {uwsgi_pass 127.0.0.1:8000;include uwsgi_params;}
}

在这个例子中,server块定义了一个监听80端口的虚拟主机,域名为example.comlocation /块指定了对根路径的请求处理方式。

uwsgi_pass 127.0.0.1:8000;指令告诉Nginx将请求转发到本地运行在8000端口的uWSGI服务器。这里使用的是TCP套接字连接。

include uwsgi_params;指令包含了一个预定义的配置文件,其中包含了一系列uWSGI参数。这些参数确保Nginx正确地将HTTP请求转换为uWSGI格式。

对于使用Unix域套接字的情况,配置可以修改如下:

location / {uwsgi_pass unix:/tmp/uwsgi.sock;include uwsgi_params;
}

这里,uwsgi_pass指向一个Unix域套接字文件,通常提供比TCP套接字更好的性能,特别是在同一台机器上运行NginxuWSGI服务器时。

如果需要对静态文件进行特殊处理,可以添加额外的位置块:

location /static {alias /path/to/static/files;
}location / {uwsgi_pass 127.0.0.1:8000;include uwsgi_params;
}

这个配置将/static路径下的请求直接映射到服务器上的静态文件目录,而其他请求则转发到uWSGI服务器。

对于需要设置特定uWSGI参数的情况,可以在位置块中直接指定:

location / {uwsgi_pass 127.0.0.1:8000;include uwsgi_params;uwsgi_param UWSGI_SCHEME $scheme;uwsgi_param UWSGI_CHDIR /path/to/your/project;uwsgi_param UWSGI_SCRIPT your_wsgi_module_name:application;
}

这里,uwsgi_param指令用于设置额外的uWSGI参数,如项目目录和WSGI脚本位置。

4.2 upstream模块的使用

Nginx的upstream模块允许定义一组服务器,可用于负载均衡和故障转移。在使用uwsgi_pass时,upstream模块特别有用,因为它可以将请求分发到多个uWSGI后端服务器。

upstream块通常定义在Nginx配置文件的http上下文中,位于server块之外。基本语法如下:

upstream backend_name {server backend1.example.com:8000;server backend2.example.com:8000;server backend3.example.com:8000;
}

在这个例子中,"backend_name"是自定义的上游服务器组名称,后面列出了三个后端服务器。

定义好upstream后,可以在uwsgi_pass指令中引用它:

location / {uwsgi_pass backend_name;include uwsgi_params;
}

这样,Nginx会自动在定义的后端服务器之间分发请求。

upstream模块支持多种负载均衡算法。默认情况下,Nginx使用加权轮询算法。可以通过在server指令后添加参数来调整权重:

upstream backend_name {server backend1.example.com:8000 weight=3;server backend2.example.com:8000;server backend3.example.com:8000;
}

在这个配置中,backend1的权重为3,而其他服务器的默认权重为1。这意味着backend1将接收大约60%的请求。

除了轮询,Nginx还支持其他负载均衡方法。例如,最少连接数方法:

upstream backend_name {least_conn;server backend1.example.com:8000;server backend2.example.com:8000;server backend3.example.com:8000;
}

least_conn指令指示Nginx将请求发送到当前活动连接数最少的服务器。

对于需要会话一致性的应用,可以使用ip_hash方法:

upstream backend_name {ip_hash;server backend1.example.com:8000;server backend2.example.com:8000;server backend3.example.com:8000;
}

ip_hash确保来自同一IP地址的请求总是被发送到同一个后端服务器,除非该服务器不可用。

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

upstream backend_name {server backend1.example.com:8000 max_fails=3 fail_timeout=30s;server backend2.example.com:8000 max_fails=3 fail_timeout=30s;server backend3.example.com:8000 max_fails=3 fail_timeout=30s;
}

这个配置指定如果一个服务器在30秒内失败3次,它将被标记为不可用30秒。

对于需要备用服务器的情况,可以使用backup参数:

upstream backend_name {server backend1.example.com:8000;server backend2.example.com:8000;server backend3.example.com:8000 backup;
}

标记为backup的服务器只有在其他服务器都不可用时才会接收请求。

通过合理配置upstream模块,可以显著提高Web应用的可用性、性能和可扩展性。它使得Nginx能够智能地分发请求,处理后端服务器的故障,并优化资源利用。

4.3 Unix socket vs TCP socket

在配置Nginx使用uwsgi_pass时,我们可以选择使用Unix域套接字或TCP套接字来连接后端的uWSGI服务器。这两种方式各有优缺点,选择哪种方式取决于具体的部署环境和性能需求。

Unix域套接字是一种进程间通信机制,它使用文件系统中的特殊文件作为通信端点。在Nginx配置中,Unix域套接字的使用方式如下:

uwsgi_pass unix:/path/to/your/uwsgi.sock;

Unix域套接字的主要优势在于其性能。由于它们不需要经过网络协议栈,因此在同一台机器上的进程间通信时,Unix域套接字通常比TCP套接字更快。它们减少了数据复制和上下文切换的次数,从而降低了延迟并提高了吞吐量。

另一个优点是安全性。Unix域套接字文件可以使用文件系统权限来控制访问,这提供了一个额外的安全层。只有具有适当权限的进程才能连接到套接字。

然而,Unix域套接字也有其局限性。它们只能用于同一台机器上的进程间通信,不能跨网络使用。这意味着如果NginxuWSGI服务器需要运行在不同的机器上,就不能使用Unix域套接字。

相比之下,TCP套接字使用IP地址和端口号作为通信端点。在Nginx配置中,TCP套接字的使用方式如下:

uwsgi_pass 127.0.0.1:8000;

TCP套接字的主要优势是灵活性。它们可以用于本地和远程通信,允许NginxuWSGI服务器运行在不同的机器上。这种灵活性使得系统更容易扩展,因为可以轻松地添加更多的后端服务器。

TCP套接字还提供了更好的负载均衡能力。使用Nginx的upstream模块,可以轻松地在多个后端服务器之间分发请求,这在使用Unix域套接字时较难实现。

然而,TCP套接字的性能通常略低于Unix域套接字,特别是在高并发场景下。这是因为TCP通信涉及更多的系统调用和数据复制操作。

在选择使用哪种套接字时,需要考虑几个因素。如果NginxuWSGI服务器运行在同一台机器上,并且性能是首要考虑因素,那么Unix域套接字可能是更好的选择。如果需要跨机器通信或者系统可能需要横向扩展,那么TCP套接字会更合适。

在实际部署中,可以通过性能测试来确定哪种方式更适合特定的应用场景。有时,即使NginxuWSGI在同一台机器上,使用TCP套接字也可能更方便管理和监控。

无论选择哪种方式,都应确保正确设置权限和安全措施。对于Unix域套接字,要注意设置适当的文件权限。对于TCP套接字,考虑使用防火墙规则限制访问,并在可能的情况下使用SSL/TLS加密通信。

5. uwsgi_pass的高级配置

5.1 超时设置

Nginx中配置uwsgi_pass时,合理设置超时参数对于保证系统的稳定性和性能至关重要。超时设置可以防止长时间运行的请求占用过多资源,同时也能在后端服务器无响应时快速失败,提高用户体验。

uwsgi_read_timeout指令用于设置NginxuWSGI服务器读取响应的超时时间。默认值为60秒。如果在指定时间内Nginx没有从uWSGI服务器接收到数据,连接将被关闭,并向客户端返回错误。例如,设置5分钟的读取超时:

uwsgi_read_timeout 300s;

uwsgi_send_timeout指令控制NginxuWSGI服务器发送请求的超时时间。这个超时同样默认为60秒。如果在指定时间内Nginx无法将请求发送完毕,连接将被关闭。可以这样设置2分钟的发送超时:

uwsgi_send_timeout 120s;

uwsgi_connect_timeout指令定义了NginxuWSGI服务器建立连接的超时时间。默认值为60秒。如果在这个时间内无法建立连接,Nginx将尝试下一个服务器或返回错误。例如,设置30秒的连接超时:

uwsgi_connect_timeout 30s;

这些超时设置可以在http、server或location块中配置,根据需要选择合适的作用域。通常,在处理复杂请求或大文件上传时,可能需要增加这些超时值。例如,对于文件上传接口,可以这样配置:

location /upload {uwsgi_pass backend;uwsgi_read_timeout 300s;uwsgi_send_timeout 300s;client_max_body_size 50m;
}

这里将读取和发送超时都设置为5分钟,并允许最大50MB的上传文件大小。

对于需要长时间处理的API请求,可以单独设置更长的超时:

location /api/long-running {uwsgi_pass backend;uwsgi_read_timeout 600s;
}

这个配置为特定的API端点设置了10分钟的读取超时。

在设置超时时,需要考虑应用程序的特性和用户体验。过短的超时可能导致正常请求被中断,而过长的超时则可能造成资源浪费。理想的做法是根据应用程序的实际需求和性能特征来调整这些值。

此外,还应该考虑与uWSGI服务器端的超时设置保持一致。如果Nginx的超时设置比uWSGI服务器的短,可能会导致一些请求在uWSGI服务器处理完成前就被Nginx中断。

在生产环境中,建议监控这些超时事件的发生频率。如果发现特定类型的请求经常触发超时,可能需要优化应用程序的性能或调整超时设置。通过日志分析和性能监控,可以不断优化这些参数,以达到最佳的平衡点。

5.2 缓冲区配置

Nginx中配置uwsgi_pass时,合理设置缓冲区参数对于优化性能和资源利用至关重要。缓冲区配置允许Nginx在将响应发送给客户端之前,先从uWSGI服务器接收并存储响应内容。这种机制可以提高大型响应的处理效率,减少网络延迟对性能的影响。

uwsgi_buffering指令控制Nginx是否对uWSGI响应进行缓冲。默认情况下,该指令是启用的。可以通过以下方式显式设置:

uwsgi_buffering on;

当缓冲开启时,Nginx会尽可能快地从uWSGI服务器读取响应,并将其存储在内存或磁盘上。这允许uWSGI进程快速释放,以处理新的请求,而Nginx则负责将缓冲的响应逐步发送给客户端。

uwsgi_buffers指令用于设置用于读取uWSGI响应的缓冲区数量和大小。其语法为:

uwsgi_buffers number size;

例如,设置8个4k大小的缓冲区:

uwsgi_buffers 8 4k;

这意味着Nginx将分配8个4KB的缓冲区来存储uWSGI响应。总缓冲大小为32KB。

对于大型响应,Nginx可能需要使用更多的缓冲区。uwsgi_buffer_size指令设置用于读取uWSGI响应头的缓冲区大小:

uwsgi_buffer_size 4k;

如果响应头超过这个大小,Nginx会分配一个更大的缓冲区。

当内存中的缓冲区不足以存储整个响应时,Nginx会将部分响应写入临时文件。uwsgi_max_temp_file_size指令控制这些临时文件的最大大小:

uwsgi_max_temp_file_size 1024m;

这里设置了1GB的最大临时文件大小。如果将此值设为0,Nginx将禁用临时文件的使用,所有响应都将存储在内存中。

uwsgi_temp_file_write_size指令控制写入临时文件的数据块大小:

uwsgi_temp_file_write_size 8k;

这个设置可以影响磁盘I/O性能,特别是在处理大型响应时。

对于某些特殊情况,可能需要禁用特定位置的缓冲。例如,对于实时流媒体应用:

location /stream {uwsgi_pass backend;uwsgi_buffering off;
}

禁用缓冲后,Nginx会立即将从uWSGI服务器接收到的数据转发给客户端,这对于需要低延迟的应用很有用。

5.3 连接池管理

连接池管理是优化NginxuWSGI服务器之间通信的关键策略。通过有效管理连接池,可以显著提高系统性能,减少资源消耗,并增强整体稳定性。

Nginx提供了keepalive指令来管理与上游服务器的持久连接。这个指令通常在upstream块中配置,用于指定每个工作进程应该保持的空闲keepalive连接的最大数量。例如:

upstream backend {server 127.0.0.1:8000;keepalive 32;
}

在这个配置中,Nginx将为每个工作进程维护最多32个空闲的keepalive连接。这些连接可以被重复使用,避免了频繁建立和关闭连接的开销。

为了充分利用keepalive连接,需要在location块中设置uwsgi_keepalive_requests指令。这个指令定义了在关闭连接之前,可以通过一个keepalive连接处理的最大请求数。例如:

location / {uwsgi_pass backend;uwsgi_keepalive_requests 100;
}

这个配置允许每个keepalive连接处理最多100个请求,之后连接将被关闭,Nginx会创建一个新的连接。

uwsgi_http_version指令也在连接池管理中扮演重要角色。将其设置为1.1可以启用HTTP/1.1的持久连接特性:

uwsgi_http_version 1.1;

此外,uwsgi_next_upstream指令允许在特定条件下将请求传递给下一个服务器。这对于处理连接失败或服务器错误非常有用:

uwsgi_next_upstream error timeout invalid_header http_500;

这个配置指示Nginx在遇到错误、超时、无效头部或HTTP 500错误时尝试下一个上游服务器。

为了防止在服务器出现问题时过度重试,可以使用uwsgi_next_upstream_triesuwsgi_next_upstream_timeout指令:

uwsgi_next_upstream_tries 3;
uwsgi_next_upstream_timeout 30s;

这限制了Nginx最多尝试3次或在30秒内进行重试。

在管理连接池时,还需要考虑uwsgi_read_timeoutuwsgi_send_timeout指令。这些超时设置影响NginxuWSGI服务器之间的通信:

uwsgi_read_timeout 60s;
uwsgi_send_timeout 60s;

这些设置确保了在通信出现问题时,连接不会无限期地保持打开状态。

对于需要处理大量并发连接的高流量网站,可以考虑增加Nginx工作进程的数量。这可以通过worker_processes指令来实现:

worker_processes auto;

设置为"auto"允许Nginx根据可用的CPU核心自动调整工作进程数量。

通过精心配置这些参数,以创建一个高效的连接池管理策略。这可以提高性能,增强系统的可靠性和可扩展性。

6. 关于安全性

在配置Nginxuwsgi_pass时,合理的安全措施不仅能保护后端服务器免受潜在攻击。这章仅作为顺带提一下,关于安全性方面内容已另外独立成多篇单独的文章已经或将在后续发布于我的博客。

6.1 SSL/TLS配置

实施SSL/TLS加密是保护数据传输安全的基础。在Nginx中配置SSL/TLS需要首先获取有效的SSL证书。可以使用免费的证书或购买商业证书。获得证书后,在Nginx配置文件中添加以下内容:

server {listen 443 ssl;server_name example.com;ssl_certificate /path/to/fullchain.pem;ssl_certificate_key /path/to/privkey.pem;ssl_protocols TLSv1.2 TLSv1.3;ssl_ciphers HIGH:!aNULL:!MD5;location / {uwsgi_pass backend;include uwsgi_params;}
}

这个配置启用了HTTPS,并指定了SSL证书和私钥的位置。ssl_protocols指令限制了允许的TLS版本,而ssl_ciphers指定了加密算法。

为了进一步增强安全性,可以添加HSTS(HTTP严格传输安全)头:

add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;

这告诉浏览器在指定时间内(这里是一年)只使用HTTPS连接。

6.2 访问控制

访问控制是限制未授权访问的关键。Nginx提供了多种方法来实现访问控制。

IP地址限制是一种基本的访问控制方法。可以使用allowdeny指令来实现:

location /admin {allow 192.168.1.0/24;deny all;uwsgi_pass backend;
}

这个配置只允许来自192.168.1.0/24网段的IP访问/admin路径。

基本身份认证也是一种常用的访问控制方法:

location /private {auth_basic "Restricted Access";auth_basic_user_file /etc/nginx/.htpasswd;uwsgi_pass backend;
}

这里使用.htpasswd文件存储用户名和密码。可以使用htpasswd命令生成这个文件。

对于更复杂的认证需求,可以使用auth_request模块,它允许将认证委托给外部服务:

location /secure {auth_request /auth;uwsgi_pass backend;
}location = /auth {internal;proxy_pass http://auth_service;proxy_pass_request_body off;proxy_set_header Content-Length "";proxy_set_header X-Original-URI $request_uri;
}

这个配置将认证请求发送到专门的认证服务。

6.3 请求限制

请求限制是防止滥用和DDoS攻击的重要手段。Nginxlimit_req_zonelimit_req指令可以用来实现请求限制:

http {limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;server {location / {limit_req zone=one burst=5;uwsgi_pass backend;}}
}

这个配置限制了每个IP地址每秒只能发送一个请求,但允许短时间的突发流量(最多5个请求)。

除了请求频率限制,还可以限制连接数:

http {limit_conn_zone $binary_remote_addr zone=addr:10m;server {location / {limit_conn addr 10;uwsgi_pass backend;}}
}

这限制了每个IP地址最多同时维持10个连接。

为了防止大文件上传导致的DoS攻击,可以限制请求体的大小:

client_max_body_size 10m;

这将限制请求体的最大大小为10MB。

此外,配置适当的超时设置也很重要:

uwsgi_read_timeout 30s;
uwsgi_send_timeout 30s;
uwsgi_connect_timeout 30s;

这些设置可以防止慢速攻击,确保资源不会被长时间占用。

7. 实际应用案例

7.1 Django应用的uwsgi_pass配置

在部署Django应用时,使用Nginx作为反向代理,配合uWSGI作为应用服务器是一种常见且高效的方案。这种配置能够充分发挥Nginx的静态文件处理能力和负载均衡特性,同时利用uWSGI高效处理Python应用的优势。

首先,确保Django项目已经正确配置并能够通过uWSGI运行。通常,uWSGI配置文件(如uwsgi.ini)可能如下所示:

[uwsgi]
chdir = /path/to/your/django/project
module = yourproject.wsgi:application
master = true
processes = 4
socket = /tmp/yourproject.sock
chmod-socket = 666
vacuum = true

这个配置指示uWSGI使用Unix套接字/tmp/yourproject.sock来通信,并运行4个工作进程。

接下来,配置Nginx以使用uwsgi_pass将请求转发到uWSGI服务器。在Nginx的配置文件中(通常位于/etc/nginx/sites-available/目录),添加以下内容:

server {listen 80;server_name example.com;location = /favicon.ico { access_log off; log_not_found off; }location /static/ {root /path/to/your/django/project;}location / {include uwsgi_params;uwsgi_pass unix:///tmp/yourproject.sock;}
}

这个配置中,server_name指定了服务器的域名。location /static/块处理静态文件请求,直接从文件系统提供服务,无需经过uWSGI

location /块使用uwsgi_pass指令将所有其他请求转发到uWSGI服务器。unix:///tmp/yourproject.sock指定了uWSGI服务器监听的Unix套接字路径,这应与uWSGI配置文件中的socket设置相匹配。

include uwsgi_params;语句包含了一组预定义的uWSGI参数,这些参数对于NginxuWSGI之间的正确通信至关重要。

对于需要处理大文件上传的Django应用,可能需要增加客户端请求体的大小限制:

client_max_body_size 10M;

这将允许上传最大10MB的文件。

如果Django应用需要处理长时间运行的请求,可能需要调整超时设置:

uwsgi_read_timeout 300s;
uwsgi_send_timeout 300s;

这将超时时间设置为5分钟,给予长时间运行的请求更多的处理时间。

对于高流量的Django站点,可以考虑启用Nginx的缓冲功能:

uwsgi_buffering on;
uwsgi_buffer_size 8k;
uwsgi_buffers 8 8k;

这些设置启用了响应缓冲,并为每个请求配置了8个8KB的缓冲区。

如果Django应用部署在多个服务器上,可以使用Nginxupstream模块实现负载均衡:

upstream django_cluster {server unix:///tmp/yourproject1.sock;server unix:///tmp/yourproject2.sock;server unix:///tmp/yourproject3.sock;
}server {location / {uwsgi_pass django_cluster;include uwsgi_params;}
}

这个配置将请求分发到三个不同的uWSGI实例,实现简单的负载均衡。

最后,为了提高安全性,建议启用HTTPS。可以使用免费的Let’s Encrypt证书:

server {listen 443 ssl;server_name example.com;ssl_certificate /path/to/fullchain.pem;ssl_certificate_key /path/to/privkey.pem;# 其他SSL相关配置...location / {uwsgi_pass unix:///tmp/yourproject.sock;include uwsgi_params;}
}

这个配置启用了HTTPS,确保客户端和服务器之间的通信是加密的。

通过这些配置,Nginx能够高效地将请求转发到Django应用,同时处理静态文件、负载均衡和SSL加密。这种设置充分利用了Nginx的强大功能,为Django应用提供了一个稳定、高性能的生产环境。

7.2 Flask应用的uwsgi_pass配置

在使用Flask框架开发Web应用时,将其与NginxuWSGI结合是一种常见且高效的部署方式。这种配置能够充分发挥Nginx的反向代理和负载均衡能力,同时利用uWSGI高效处理Python应用请求的优势。下面详细介绍如何为Flask应用配置Nginxuwsgi_pass

首先,确保Flask应用已经准备就绪,并且uWSGI已正确安装和配置。典型的Flask应用入口文件"app.py"可能如下所示:

from flask import Flaskapp = Flask(__name__)@app.route('/')
def hello():return "Hello, World!"if __name__ == '__main__':app.run()

接下来,创建一个uWSGI配置文件,通常命名为"uwsgi.ini":

[uwsgi]
module = app:app
master = true
processes = 4
socket = /tmp/uwsgi.sock
chmod-socket = 660
vacuum = true
die-on-term = true

这个配置指定了Flask应用的入口模块,设置了4个工作进程,并使用Unix域套接字/tmp/uwsgi.sock进行通信。

现在,配置Nginx服务器块以使用uwsgi_pass将请求转发到Flask应用。在Nginx配置文件中添加以下内容:

server {listen 80;server_name example.com;location / {include uwsgi_params;uwsgi_pass unix:/tmp/uwsgi.sock;}location /static {alias /path/to/your/static/files;}
}

这个配置将所有请求通过Unix域套接字转发到uWSGI服务器,除了/static路径下的静态文件请求,这些请求将直接由Nginx处理。

为了优化性能,可以在Nginx配置中添加缓冲和超时设置:

location / {include uwsgi_params;uwsgi_pass unix:/tmp/uwsgi.sock;uwsgi_read_timeout 60s;uwsgi_send_timeout 60s;uwsgi_connect_timeout 60s;uwsgi_buffers 8 16k;uwsgi_buffer_size 32k;
}

这些设置增加了读取、发送和连接的超时时间,并配置了适当的缓冲区大小,有助于处理较大的请求和响应。

如果Flask应用需要处理文件上传,可能需要增加客户端请求体的大小限制:

client_max_body_size 10M;

这将允许上传最大10MB的文件。

对于需要SSL/TLS加密的生产环境,可以配置HTTPS

server {listen 443 ssl;server_name example.com;ssl_certificate /path/to/fullchain.pem;ssl_certificate_key /path/to/privkey.pem;ssl_protocols TLSv1.2 TLSv1.3;ssl_ciphers HIGH:!aNULL:!MD5;location / {include uwsgi_params;uwsgi_pass unix:/tmp/uwsgi.sock;}
}

这个配置启用了HTTPS,并指定了SSL证书的位置。

如果Flask应用是一个API服务,可能需要处理CORS(跨源资源共享)问题。可以在Nginx配置中添加相应的头部:

location / {include uwsgi_params;uwsgi_pass unix:/tmp/uwsgi.sock;add_header 'Access-Control-Allow-Origin' '*';add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range';
}

这将允许来自任何源的跨域请求。在生产环境中,应该根据实际需求限制允许的源。

最后,为了提高安全性,可以添加一些基本的安全头部:

add_header X-Frame-Options "SAMEORIGIN";
add_header X-XSS-Protection "1; mode=block";
add_header X-Content-Type-Options "nosniff";

这些头部可以防止点击劫持、跨站脚本攻击和MIME类型嗅探。

通过以上配置,Nginx可以有效地作为反向代理服务器,将请求转发到运行Flask应用的uWSGI服务器。这种设置不仅提高了应用的性能和可扩展性,还增强了安全性。在实际部署中,可能还需要根据具体的应用需求和服务器环境进行进一步的优化和调整。

8. 总结

F. 参考文献

相关文章:

Nginx七层(应用层)反向代理:UWSGI代理uwsgi_pass篇

Nginx七层(应用层)反向代理 UWSGI代理uwsgi_pass篇 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite:http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this a…...

Effective C++笔记之二十一:One Definition Rule(ODR)

ODR细节有点复杂,跨越各种情况。基本内容如下: ●普通(非模板)的noninline函数和成员函数、noninline全局变量、静态数据成员在整个程序中都应当只定义一次。 ●class类型(包括structs和unions)、模板&…...

探索未来:Transformer模型在智能环境监测的革命性应用

探索未来:Transformer模型在智能环境监测的革命性应用 在当今数字化时代,环境监测正逐渐从传统的人工检测方式转变为智能化、自动化的系统。Transformer模型,作为深度学习领域的一颗新星,其在自然语言处理(NLP&#x…...

Nginx中文URL请求404

这两天正在搞我的静态网站。方案是:从思源笔记Markdown笔记,用MkOcs build成静态网站,上传到到Nginx服务器。遇到一个问题:URL含有中文会404,全英文URL则正常访问。 ‍ 比如: ​​ ‍ 设置了utf-8 ht…...

33. 动量法(Momentum)介绍

1. 背景知识 在深度学习的优化过程中,梯度下降法(Gradient Descent, GD)是最基本的方法。然而,基本的梯度下降法在实际应用中存在收敛速度慢、容易陷入局部最小值以及在高维空间中振荡较大的问题。为了解决这些问题,人…...

Python | Leetcode Python题解之第228题汇总区间

题目&#xff1a; 题解&#xff1a; class Solution:def summaryRanges(self, nums: List[int]) -> List[str]:def f(i: int, j: int) -> str:return str(nums[i]) if i j else f{nums[i]}->{nums[j]}i 0n len(nums)ans []while i < n:j iwhile j 1 < n …...

物联网应用,了解一点 WWAN全球网络标准

WWAN/蜂窝无线电认证&#xff0c;对跨地区应用场景&#xff0c;特别重要。跟随全球业务的脚步&#xff0c;我们像大唐先辈一样走遍全球业务的时候&#xff0c;了解一点全球化的 知识信息&#xff0c;就显得有那么点意义。 NA &#xff08;北美&#xff09;&#xff1a;美国和加…...

如何指定多块GPU卡进行训练-数据并行

训练代码&#xff1a; train.py import torch import torch.nn as nn import torch.optim as optim from torch.utils.data import DataLoader, Dataset import torch.nn.functional as F# 假设我们有一个简单的文本数据集 class TextDataset(Dataset):def __init__(self, te…...

RK3568笔记三十三: helloworld 驱动测试

若该文为原创文章&#xff0c;转载请注明原文出处。 报着学习态度&#xff0c;接下来学习驱动是如何使用的&#xff0c;从简单的helloworld驱动学习起。 开始编写第一个驱动程序—helloworld 驱动。 一、环境 1、开发板&#xff1a;正点原子的ATK-DLRK3568 2、系统&#xf…...

【智能制造-14】机器视觉软件

CCD相机和COMS相机? CCD&#xff08;Charge-Coupled Device&#xff09;相机和CMOS&#xff08;Complementary Metal-Oxide-Semiconductor&#xff09;相机是两种常见的数字图像传感器技术&#xff0c;用于捕捉和处理图像。 CCD相机&#xff1a; CCD相机使用一种称为CCD的光电…...

MVC分页

public ActionResult Index(int ? page){IPagedList<EF.ACCOUNT> userPagedList;using (EF.eMISENT content new EF.eMISENT()){第几页int pageNumber page ?? 1;每页数据条数&#xff0c;这个可以放在配置文件中int pageSize 10;//var infoslist.C660List.OrderBy(…...

webGL可用的14种3D文件格式,但要具体问题具体分析。

hello&#xff0c;我威斯数据&#xff0c;你在网上看到的各种炫酷的3d交互效果&#xff0c;背后都必须有三维文件支撑&#xff0c;就好比你网页的时候&#xff0c;得有设计稿源文件一样。WebGL是一种基于OpenGL ES 2.0标准的3D图形库&#xff0c;可以在网页上实现硬件加速的3D图…...

HybridCLR原理中的重点总结

序言 该文章以一个新手的身份&#xff0c;讲一下自己学习的经过&#xff0c;大家更快的学习HrbirdCLR。 我之前的两个Unity项目中&#xff0c;都使用到了热更新功能&#xff0c;而热更新的技术栈都是用的HybridCLR。 第一个项目本身虽然已经集成好了热更逻辑&#xff08;使用…...

昇思学习打卡-14-ResNet50迁移学习

文章目录 数据集可视化预训练模型的使用部分实现 推理 迁移学习&#xff1a;在一个很大的数据集上训练得到一个预训练模型&#xff0c;然后使用该模型来初始化网络的权重参数或作为固定特征提取器应用于特定的任务中。本章学习使用的是前面学过的ResNet50&#xff0c;使用迁移学…...

软件开发面试题C#,.NET知识点(续)

1.C#中的封装是什么&#xff0c;以及它的重要性。 封装&#xff08;Encapsulation&#xff09; 是面向对象编程&#xff08;OOP&#xff09;的一个基本概念。它指的是将对象的状态&#xff08;属性&#xff09;和行为&#xff08;方法&#xff09;绑定在一起&#xff0c;并且将…...

2019年美赛题目Problem A: Game of Ecology

本题分析&#xff1a; 本题想要要求从实际生物角度出发&#xff0c;对权力游戏中龙这种虚拟生物的生态环境和生物特性进行建模&#xff0c;感觉属于比较开放类型的题目&#xff0c;重点在于参考生物的选择&#xff0c;龙虽然是虚拟的但是龙的生态特性可以参考目前生物圈里存在…...

沙龙回顾|MongoDB如何充当企业开发加速器?

数据不仅是企业发展转型的驱动力&#xff0c;也是开发者最棘手的问题。前日&#xff0c;MongoDB携手阿里云、NineData在杭州成功举办了“数据驱动&#xff0c;敏捷前行——MongoDB企业开发加速器”技术沙龙。此次活动吸引了来自各行各业的专业人员&#xff0c;共同探讨MongoDB的…...

云端编码:将您的技术API文档安全存储在iCloud的最佳实践

云端编码&#xff1a;将您的技术API文档安全存储在iCloud的最佳实践 作为一名技术专业人士&#xff0c;管理不断增长的API文档库是一项挑战。iCloud提供了一个无缝的解决方案&#xff0c;允许您在所有设备上存储、同步和访问您的个人技术API文档。本文将指导您如何在iCloud中高…...

在Spring Boot项目中集成单点登录解决方案

在Spring Boot项目中集成单点登录解决方案 大家好&#xff0c;我是微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 在现代的企业应用中&#xff0c;单点登录&#xff08;Single Sign-On, SSO&#xff09;解决方案是确保用户…...

Java-常用API

1-Java API &#xff1a; 指的就是 JDK 中提供的各种功能的 Java类。 2-Scanner基本使用 Scanner&#xff1a; 一个简单的文本扫描程序&#xff0c;可以获取基本类型数据和字符串数据 构造方法&#xff1a; Scanner(InputStream source)&#xff1a;创建 Scanner 对象 Sy…...

Python从Excel表中查找指定数据填入新表

#读取xls文件中的数据 import xlrd file "原表.xls" wb xlrd.open_workbook(file) #读取工作簿 ws wb.sheets()[0] #选第一个工作表 data [] for row in range(7, ws.nrows): name ws.cell(row, 1).value.strip() #科室名称 total1 ws.cell(row, 2…...

从零开始实现大语言模型(三):Token Embedding与位置编码

1. 前言 Embedding是深度学习领域一种常用的类别特征数值化方法。在自然语言处理领域&#xff0c;Embedding用于将对自然语言文本做tokenization后得到的tokens映射成实数域上的向量。 本文介绍Embedding的基本原理&#xff0c;将训练大语言模型文本数据对应的tokens转换成Em…...

视频怎么压缩变小?最佳视频压缩器

即使在云存储和廉价硬盘空间时代&#xff0c;大视频文件使用起来仍然不方便。无论是存储、发送到电子邮件帐户还是刻录到 DVD&#xff0c;拥有最好的免费压缩软件可以确保您快速缩小文件大小&#xff0c;而不必担心视频质量下降。继续阅读以探索一些顶级最佳 免费视频压缩器选项…...

LLM - 绝对与相对位置编码 与 RoPE 旋转位置编码 源码

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://spike.blog.csdn.net/article/details/140281680 免责声明:本文来源于个人知识与公开资料,仅用于学术交流,欢迎讨论,不支持转载。 Transformer 是基于 MHSA (多头自注意力),然而,MHSA 对于位置是不敏感…...

B3917 [语言月赛 202401] 小跳蛙

OK 挠~ stop here~ 好啊&#xff0c;现在呢&#xff0c;把手头的事情先放一放啊&#xff0c;我们来做道练习 OK&#xff1f; 好啊来&#xff1a; 小跳蛙 题目描述 有 &#x1d45b;−1 只小跳蛙在池塘中&#xff0c;依次被编号为 1,2,⋯ ,&#x1d45b;−1。池塘里有 &am…...

Bash ——shell

Bash作为用户与操作系统之间的接口&#xff0c;让用户通过命令行输入各种指令来控制和操作计算机系统。 shell的两种解释&#xff1a; 1.linux命令解释器 Terminal 终端 ——》shell命令 ——》 Linux kernel &#xff08;内核&#xff09; Linux内核的作用&#xff1a; 1.…...

PyTorch复现PointNet——模型训练+可视化测试显示

因为项目涉及到3D点云项目&#xff0c;故学习下PointNet这个用来处理点云的神经网络 论文的话&#xff0c;大致都看了下&#xff0c;网络结构有了一定的了解&#xff0c;本博文主要为了下载调试PointNet网络源码&#xff0c;训练和测试调通而已。 我是在Anaconda下创建一个新的…...

分享五款软件,成为高效生活的好助手

​ 给大家分享一些优秀的软件工具,是一件让人很愉悦的事情&#xff0c;今天继续带来5款优质软件。 1.图片放大——Bigjpg ​ Bigjpg是一款图片放大软件&#xff0c;采用先进的AI算法&#xff0c;能够在不损失图片质量的前提下&#xff0c;将低分辨率图片放大至所需尺寸。无论…...

代码随想录算法训练营DAY58|101.孤岛的总面积、102.沉没孤岛、103. 水流问题、104.建造最大岛屿

忙。。。写了好久。。。。慢慢补吧。 101.孤岛的总面积 先把周边的岛屿变成水dfs def dfs(x, y, graph, s):if x<0 or x>len(graph) or y<0 or y>len(graph[0]) or graph[x][y]0:return sgraph[x][y]0s1s dfs(x1, y, graph, s)s dfs(x-1, y, graph, s)s dfs(…...

韦尔股份:深蹲起跳?

利润大增7倍&#xff0c;是反转信号还是回光返照&#xff1f; 今天我们聊聊光学半导体龙头——韦尔股份。 上周末&#xff0c;韦尔股份发布半年业绩预告&#xff0c;预计上半年净利润13至14亿&#xff0c;同比增幅高达 754%至 819%。 然而&#xff0c;回首 2023 年它的净利仅 …...

用织梦系统做网站/百度首页官网

"检查点"是 Windows Server 2012 R2 中对 Windows Server 2012 及以前版本的 Hyper-V"快照"功能的新称呼。之所以改成这个名称&#xff0c;其实和私有云有一定的关系。在私有云组件 System Center 2012 SP1 Virtual Machine Manager 中&#xff0c;它的&qu…...

网站代码优化多少钱/西安百度推广联系方式

要进入深度学习相关的领域&#xff0c;Python是一方面&#xff0c;另一方面是本身学历问题。深度学习&#xff0c;机器学习&#xff0c;人工智能这些大火的领域&#xff0c;它们目前的进入门槛其实是学历&#xff0c;然后是能力&#xff0c;不一定非要说是名校研究生&#xff0…...

修改wordpress媒体url/网络营销专业是干什么的

打开本地git bash,使用如下命令生成ssh公钥和私钥对 ssh-keygen -t rsa -C ‘xxxxxx.com’ 然后一路回车(-C 参数是你的邮箱地址) ssh-keygen -t rsa -C “morgan.zhudotonlink.com”然后打开/.ssh/id_rsa.pub文件(表示用户目录&#xff0c;比如我的windows就是C:\Users\Admi…...

wordpress 数据库连接文件/seo技术培训宁波

新建目录或文件夹。 语法 MkDir 路径 所需的_路径_参数是一个字符串表达式&#xff0c;标识的目录或文件夹创建。 _路径_可以包含驱动器。 如果未指定驱动器&#xff0c; MkDir当前的驱动器上创建新目录或文件夹。 例子 创建当前路径下的Test文件夹 1 Sub MkdirTest() 2 M…...

做网站要有什么团队/一键优化清理手机

源地址&#xff1a;http://mina.apache.org/mina-project/userguide/ch17-spring-integration/ch17-spring-integration.html 一个mina应用主要包括一下方面&#xff1a; One HandlerTwo Filter - Logging Filter and a ProtocolCodec FilterNioDatagram Socket一个mina 服务端…...

疏通下水道网站怎么做/站长网站推广

面向对象 面向对象概述&#xff1a; 类和对象的概念&#xff1a; 类 &#xff1a; 抽象名词&#xff0c;用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。 对象 &#xff1a; 具体的事物&#xff0c;通过类定义的数…...