事实上,你试图避免的几乎看起来像microservice architecture(Martin Fowler 文章)。基本上,它提出了最小的独立服务,这些服务被多路复用以作为一个整体,而不是一个单一的应用程序。它有其优点和缺点,但今天它被认为是更好的。至少在大规模上。
因此,设计应用程序的一种方式是微服务架构,运行多个内部服务器不是问题。请注意,这种方法中的一些复杂性转移到了基础设施上。也就是说你需要高质量的部署、监控等。
Andew 的答案的想法是正确的。但具体来说,CherryPy 是一个功能齐全的 HTTP 服务器。您通常不需要另一个中间故障点,gunicorn 左右,您可以完全避免使用 WSGI。只需使用 HTTP,即 nginx 充当 CherryPy 内部 HTTP 服务器的反向 HTTP 代理。
最简单的方式如下所示。
python 2 应用程序
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import cherrypy
config = {
'global' : {
'server.socket_host' : '127.0.0.1',
'server.socket_port' : 8080,
'server.thread_pool' : 8
},
'/' : {
'tools.proxy.on' : True
}
}
class App:
@cherrypy.expose
def index(self):
return type({}.keys()).__name__
if __name__ == '__main__':
cherrypy.quickstart(App(), '/app1', config)
python 3 应用程序
#!/usr/bin/env python3
import cherrypy
config = {
'global' : {
'server.socket_host' : '127.0.0.1',
'server.socket_port' : 8081,
'server.thread_pool' : 8
},
'/' : {
'tools.proxy.on' : True
}
}
class App:
@cherrypy.expose
def index(self):
return type({}.keys()).__name__
if __name__ == '__main__':
cherrypy.quickstart(App(), '/app2', config)
nginx 配置
server {
listen 80;
server_name ngx-test;
root /var/www/ngx-test/www;
location /app1 {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
location /app2 {
proxy_pass http://127.0.0.1:8081;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
对于成熟的 CherryPy 部署,请查看 this answer。