这是我的第485篇原创文章。
一、引言
unicorn (Green Unicorn) 是一个 Python WSGI HTTP 服务器(应用服务器),用于运行 Python Web 应用。
简单理解:Gunicorn 就是专门用来运行 Flask、Django 等 WSGI 应用的"发动机"
Gunicorn 是 Python Web 应用的"多进程运行器" ------ 它让你能用多个进程同时跑 Flask/Django,处理高并发请求。
二、实现过程
2.1 HTTP服务器
HTTP服务器(Hypertext Transfer Protocol Server)是运行在网络服务器上的软件(如Nginx、Gunicorn这些软件(包)),这个软件的功能是用于接收、处理和响应客户端(通常是浏览器)通过HTTP协议发送的请求。
2.2 web服务器和应用服务器
Web服务器
-
主要职责:处理HTTP/HTTPS请求,静态内容服务
-
本质:"文件服务器",直接返回HTML、CSS、JS、图片等静态资源
-
核心协议:HTTP/HTTPS
-
典型例子:Nginx、Apache、IIS
应用服务器
-
主要职责:运行动态业务逻辑,处理程序代码
-
本质:"程序执行环境",运行Java/Python/PHP等编写的应用
-
核心协议:HTTP(上层)、RMI、JMS、WebSocket等
-
典型例子 :Tomcat、JBoss/WildFly、WebLogic、WebSphere、Gunicorn
2.3 区别和联系
协议层面:都是HTTP服务器,从客户端视角看,两者都响应HTTP请求
python
import requests
# 无论是请求Nginx(Web服务器)还是Tomcat(应用服务器)
response1 = requests.get('http://nginx-server.com')
response2 = requests.get('http://tomcat-server.com:8080')
# 返回的都是HTTP响应
print(response1.status_code) # 200 OK
print(response2.status_code) # 200 OK
服务器内部处理逻辑完全不同
python
# Web服务器(Nginx)的处理逻辑
def nginx_handle_request(request):
if is_static_file(request.path): # 判断是静态文件
return read_file_from_disk(request.path) # 直接读取硬盘文件
else:
return proxy_to_backend(request) # 转发到应用服务器
# 应用服务器(Tomcat)的处理逻辑
def tomcat_handle_request(request):
servlet = find_servlet(request.path) # 查找对应的Java类
context = create_execution_context() # 创建执行环境
result = servlet.execute(request, context) # 执行Java代码
return create_http_response(result) # 包装成HTTP响应
工作流程(经典架构)
python
客户端浏览器
↓ (HTTP请求)
Web服务器 (Nginx)
↓ 静态文件?→ 直接返回
↓ 动态请求?→ 转发
应用服务器 (Tomcat)
↓ 执行代码
数据库/缓存/其他服务
↓ 返回数据
应用服务器生成响应
↓
Web服务器返回给客户端
具体示例
1、请求 https://example.com/logo.png → Nginx直接返回图片
2、请求 https://example.com/api/users → Nginx转发给Tomcat → Tomcat运行Java代码查询数据库 → 返回JSON数据
2.4 常见组合模式
| 架构模式 | 适用场景 | 示例 |
|---|---|---|
| 纯Web服务器 | 静态网站、SPA前端 | Nginx + 静态文件 |
| Web + 应用服务器 | 传统动态网站 | Nginx + Tomcat (Java) |
| 纯应用服务器 | 开发环境、简单应用 | 仅用 Tomcat/Gunicorn |
| 反向代理集群 | 高可用架构 | Nginx → 多个Tomcat |
只用Web服务器(Nginx)
-
静态官网、博客
-
前后端分离的前端部分
-
需要极高并发量的静态资源
Web + 应用服务器
-
传统企业级应用(Java EE)
-
需要负载均衡和高可用
-
安全隔离需求(Web服务器作为网关)
只用应用服务器
-
开发/测试环境
-
小型内部工具
-
Python/Node.js应用(Gunicorn/PM2)
作者简介:
读研期间发表6篇SCI数据挖掘相关论文,现在某研究院从事数据算法相关科研工作,结合自身科研实践经历不定期分享关于Python、机器学习、深度学习、人工智能系列基础知识与应用案例。致力于只做原创,以最简单的方式理解和学习,关注我一起交流成长。需要数据集和源码的小伙伴可以关注底部公众号添加作者微信。