uWSGI的配置及使用

简介: uWSGI是一个功能强大的Web服务器和应用服务器,主要用于实现Python Web应用与Web服务器之间的通信。它遵循WSGI(Web Server Gateway Interface)规范,作为桥梁连接Web服务器(如Nginx)与Python应用(如Django、Flask)。相比开发环境中的简易服务器(如Django的runserver或Flask的Werkzeug),uWSGI在生产环境中具备更强的并发处理能力和更多高级特性,例如负载均衡、缓存等。通过支持多种启动方式(命令行或配置文件)及丰富参数配置,uWSGI可灵活部署于实际项目中,满足高性能需求。

1. 什么是uWSGI?

uWSGI(官方写法为"uWSGI")是一个Web服务器和应用服务器,用于将Web应用程序和Web服务器之间进行通信。它充当Web服务器和Python Web应用程序之间的桥梁,实现了WSGI协议(Web Server Gateway Interface)的处理。

2. uwsgi、uWSGI和WSGI辨析

WSGI(Web Server Gateway Interface):
WSGI是Python Web应用程序与Web服务器之间的接口规范。它定义了Web应用程序如何与Web服务器进行通信,以便能够处理HTTP请求并生成HTTP响应。WSGI规范旨在提供一种标准的方式来连接Web应用程序和Web服务器,使不同的Web框架和Web服务器能够无缝协作。

uWSGI(官方写法为"uWSGI"):
uWSGI是一个用于实现WSGI协议的Web服务器和应用服务器。它是一个独立的软件项目,提供了一个功能强大且灵活的服务器,用于将Web服务器(如Nginx或Apache)与Python Web应用程序(如Django或Flask)连接起来。uWSGI可以处理大量并发连接,并提供了各种高级功能,如负载均衡、缓存、自动扩展等。

uwsgi(小写的"uwsgi"):
uwsgi是uWSGI服务器的一种通信协议,用于定义uWSGI服务器与Web服务器之间的数据传输格式。uwsgi协议是uWSGI服务器与Web服务器之间进行通信的一种标准化协议。uWSGI服务器可以通过uwsgi协议与Web服务器进行通信,从而实现Web应用程序的处理。

总结来说,WSGI是Python Web应用程序与Web服务器之间的接口规范,uWSGI是一个实现了WSGI协议的Web服务器和应用服务器,而uwsgi是uWSGI服务器与Web服务器之间的通信协议。它们共同构成了将Python Web应用程序与Web服务器进行连接和通信的基础架构。

3. 为什么需要uWSGI?

在生产环境中部署Python Web项目时,uWSGI负责处理Nginx转发的动态请求,并与我们的Python应用程序沟通,同时将应用程序返回的响应数据传递给Nginx。

客户端 <-> Nginx <-> uWSGI <-> Python应用程序(Django, Flask)

Nginx本身就是Web服务器,我们为什么还需要uWSGI这个Web服务器呢?Django不是自带runserver服务器?Flask不是自带Werkzeug吗?答案是Nginx处理静态文件非常优秀,却不能直接与我们的Python Web应用程序进行交互。Django和Flask本身是Web框架,并不是Web服务器,它们自带的runserver和Werkzeug也仅仅用于开发测试环境,生产环境中处理并发的能力太弱。

为了解决Web 服务器与应用程序之间的交互问题,就出现了Web 服务器与应用程序之间交互的规范。最早出现的是CGI,后来又出现了改进 CGI 性能的FasgCGI,Java 专用的 Servlet 规范。在Python领域,最知名的就是WSGI规范了。

WSGI 全称是 Web Server Gateway Interface,也就是 Web 服务器网关接口,是一个web服务器(如uWSGI服务器)与web应用(如用Django或Flask框架写的程序)通信的一种规范。WSGI包含了很多自有协议,其中一个是uwsgi,它用于定义传输信息的类型。

4. uWSGI 的安装及使用

pip install uwsgi

uWSGI 启动方式

  • 启动方式1(只是练习用):通过命令和参数形式

    这里使用一个官方的简单示例,foobar.py的文件内容为:

    def application(env, start_response):
        start_response('200 OK', [('Content-Type','text/html')])
        return [b"Hello World"]
    

    启动命令如下:

    # 简单启动:
    uwsgi --http :9090 --wsgi-file foobar.py
    
    # 增加并发:生成4个进程,每个进程有2个线程
    uwsgi --http :9090 --wsgi-file foobar.py --master --processes 4 --threads 2
    

    如果有一个django项目,那么启动命令如下:

    # 语法:uwsgi --http :8000 --module 项目名.wsgi
                 --http   # 指定http协议启动socket服务端,可以通过浏览器直接访问
                 --module # 项目入口文件;例如是django项目第二级目录下的wsgi.py文件
    uwsgi --http :8000 --module CRM_project.wsgi
    

    在生产环境中我们通常不会使用命令行启动Python Web项目,而是通常编辑好uWSGI的配置文件uwsgi.ini,然后使用如下命令启动Python Web项目。

  • 启动方式2(通过配置文件方式启动,生产环境)

    uwsgi的配置文件 uwsgi.ini

    • a. 创建配置文件

      touch uwsgi.ini
      
    • b. 配置 uwsgi.ini 文件

      [uwsgi]
      ; 虚拟环境绝对路径,Docker部署时不需要
      home=/opt/python_venv/test_project
      ; 项目的绝对路径(例:如果是django项目,填django的第一层目录)
      chdir = /opt/project/test_project
      ; 项目名
      project=flask_demo
      ; 启动路由:指定启动的协议,当你和nginx结合进行反向代理,就用unix-socket协议,这种方式无法直接访问,只能通过nginx进行反代
      socket=0.0.0.0:8000
      ; 项目启动入口文件(默认入口函数是application)
      wsgi-file=main.py
      ; 入口文件中的函数(比如flask文件中的app)
      callable=app
      ; 启用process manager,管理worker进程,worker进程都是这个master进程的子进程
      master=True
      ; 指定开启的工作进程数量,一般指定为cpu的核数即可(填cpu的4倍数量)
      processes=1
      ; 设置每个工作进程的线程数
      threads=2
      ; 设置用于uwsgi包解析的内部缓存区大小为64k。默认是4k。
      buffer-size = 32768
      ; 使进程在后台运行,并将日志打到指定的日志文件或者udp服务器
      daemonize = /var/log/test_project/uwsgi.log
      ; 设置最大日志文件大小
      ; log-maxsize = 5000000
      ; 指定pid文件的位置,记录主进程的pid号。
      pidfile=uwsgi.pid
      ; 当服务器退出的时候自动删除unix socket文件和pid文件。
      vacuum = true
      
      ; 格式化日志打印
      logformat-strftime=true
      log-date=%%Y-%%m-%%d %%H:%%M:%%S
      log-format=[%(ftime)] pid: %(pid) %(addr) => host: %(host)%(uri)(%(method)) in %(secs)s %(status) total-size: %(size) bytes
      
    • c. 指定 uwsgi.ini 配置文件启动

      uwsgi --ini uwsgi.ini # 参数 --ini是指定文件的意思
      

5. uWSGI 常用命令

# 启动uWSGI服务器
$ uwsgi --ini uwsgi.ini

# 重启uWSGI服务器
$ uwsgi --reload uwsgi.pid

# 查看所有uWSGI进程
$ ps aux | grep uwsgi

# 停止uWSGI服务器
$ uwsgi --stop uwsgi.pid  # 启动的时候会生成uwsgi.pid文件

6. uWSGI 更多配置

更多配置请查看官方配置参数文档:https://uwsgi-docs-zh.readthedocs.io/zh-cn/latest/Options.html

目录
相关文章
|
16天前
|
人工智能 供应链 安全
MCP Server的五种主流架构与Nacos的选择
本文深入探讨了Model Context Protocol (MCP) 在企业级环境中的部署与管理挑战,详细解析了五种主流MCP架构模式(直连远程、代理连接远程、直连本地、本地代理连接本地、混合模式)的优缺点及适用场景,并结合Nacos服务治理框架,提供了实用的企业级MCP部署指南。通过Nacos MCP Router,实现MCP服务的统一管理和智能路由,助力金融、互联网、制造等行业根据数据安全、性能需求和扩展性要求选择合适架构。文章还展望了MCP在企业落地的关键方向,包括中心化注册、软件供应链控制和安全访问等完整解决方案。
929 87
MCP Server的五种主流架构与Nacos的选择
|
13天前
|
人工智能 调度 芯片
《大模型背后的隐形战场:异构计算调度全解析》
在大模型训练中,CPU、GPU和AI芯片各司其职:CPU擅长逻辑控制,GPU专攻并行计算,AI芯片则针对特定AI任务优化。然而,实现三者的高效协同面临诸多挑战,如任务分配、通信延迟及资源管理等问题。通过动态任务分配、通信优化与资源调整等策略,可提升训练效率。未来,随着硬件进步和算法智能化,异构计算协同调度将更加高效,并结合云计算、边缘计算等技术拓展应用范围,推动人工智能技术发展。
83 15
|
26天前
|
人工智能 文件存储 数据中心
Ollama部署本地大模型并通过Infortress APP远程访问保姆级教程
本文介绍如何快速上手本地大模型部署工具Ollama及AI远程访问工具Infortress。通过Ollama,开发者可轻松部署如Llama、Deepseek等主流开源模型,仅需几行命令即可完成安装与运行。结合Infortress,用户能实现对本地大模型的远程访问,支持多设备无缝对接,同时提供便捷的模型切换与知识库管理功能。Infortress更兼具NAS软件特性,成为个人AI数据中心的理想选择。
|
14天前
|
缓存 负载均衡 算法
负载均衡相关问题详细分享一下
负载均衡相关问题详细分享
151 67
|
27天前
|
负载均衡 应用服务中间件 nginx
Nginx配置与命令
Nginx 是一款高性能的 HTTP 和反向代理服务器,其配置文件灵活且功能强大。本文介绍了 Nginx 配置的基础结构和常用指令,包括全局块、Events 块、HTTP 块及 Server 块的配置方法,以及静态资源服务、反向代理、负载均衡、HTTPS 和 URL 重写等功能实现。此外,还提供了常用的 Nginx 命令操作,如启动、停止、重载配置和日志管理等,帮助用户高效管理和优化服务器性能。
|
3天前
|
数据采集 算法 数据安全/隐私保护
【硬件测试】基于FPGA的QPSK+帧同步系统开发与硬件片内测试,包含高斯信道,误码统计,可设置SNR
本文基于FPGA实现QPSK+帧同步系统硬件测试,包含ILA在线数据采集、VIO在线SNR设置及数据源模块。通过设置不同SNR(如6dB和15dB),验证系统性能。理论部分介绍QPSK调制解调原理,将二进制数据映射为四相状态,提高传输速率与频谱效率;帧同步用于确定帧起始位置,确保正确解调。Verilog代码实现信号生成、SNR设置、QPSK调制解调及误码统计等功能,附带ILA测试结果分析。
50 32
|
15天前
|
弹性计算 Kubernetes API
Kubernetes 驱动的 IaC,Crossplane 快速入门
Crossplane 是一个开源的 Kubernetes 扩展工具,允许用户通过声明式配置直接在 Kubernetes 中管理云资源。对于阿里云开发者,借助 Crossplane 和官方提供的 provider-upjet-alibabacloud,可以像管理 Pod 一样轻松操作 ECS 实例、VPC 和 OSS Bucket 等资源。本文介绍了 Crossplane 的核心概念,并通过快速入门指南演示了如何安装 Crossplane、配置阿里云认证并创建第一个 VPC 资源。
102 37
|
18天前
|
算法 数据安全/隐私保护 异构计算
基于FPGA的2FSK+帧同步系统verilog开发,包含testbench,高斯信道,误码统计,可设置SNR
本项目基于Vivado2019.2实现FSK调制解调系统仿真,包含FSK调制/解调模块、AWGN信道模块、误码统计模块及帧同步模块等。通过设置SNR(如10dB、20dB)验证系统性能,并展示FSK调制解调过程。理论部分介绍频移键控(FSK)原理,包括相位连续与不连续特性、功率谱密度特点及其解调方法。Verilog核心程序实现调制、加噪、解调和误码计算功能,为数字通信系统设计提供参考。
91 35
|
28天前
|
机器学习/深度学习 人工智能 安全
AI的万亿商机:红杉资本眼中的人工智能新时代
AI不仅仅是不可避免的趋势,而是已经到来的现实,其市场规模将远超过去的任何一次技术变革。这不是一场可以观望的比赛,而是一场必须全力以赴参与的革命。
119 22
|
23天前
|
存储 弹性计算 人工智能
阿里云基础设施,助力企业全球化业务创新
5 月 22 日 10:30「飞天发布时刻」,阿里云弹性计算产品负责人、存储产品负责人陈起鲲(Alex Chen) 将重磅分享阿里云基础设施全面升级。