自从我第一次浪漫地接触 Python 已经过去了大约十年。这部特别的浪漫喜剧不知何故完全错过了“一见钟情”的比喻——我发现学习 Python 的过程令人愤怒。我担心的不是语言本身,而是地球上每个活着的软件开发人员。
从我的角度来看,“软件”中的人似乎只有两种原型,两者都不是特别可口。光谱的一端被我的新手占据,他们似乎很高兴地被限制在可爱的 REPL 环境中编程,无论哪个训练营为他们提供了阻止他们提问的蓝色药丸。在光谱的另一端是其他人:有能力的工程师在我眼中也可能是天才。我知道这些人有知识回答我能提出的每一个问题,但不知何故被证明完全无能以任何身份有用。当时我并不清楚经验丰富的工程师是否是故意的精英混蛋,或者新人是否真的无助。我唯一清楚的是,这两个人口都不会为我的近期目标提供价值。回想起来,这种挫败感可能是推动这个博客存在的原因)。
我确信没有什么值得构建的,除非它运行在 Linux 服务器上,在一个真实的域后面,全世界都可以访问。这在 2020 年听起来可能是一个合理的观点,但这是 2010 年:没有 Docker,没有 Heroku,没有 DigitalOcean。Nginx 主要是由“俄罗斯的一些家伙”创建的边缘网络服务器,为互联网上 10% 的网站提供动力,而 Apache 则为 90%。基于 Web 的 Python 以前依赖于一个名为mod-python 的 Apache 模块。Mod-python 突然(并且任意地?)被认为是“死的”,取而代之的是一个名为mod-wsgi 的未记录的 Apache 模块。这是 Graham Dumpleton 的创意,除了我自己之外,他也可能是世界上唯一一个试图运行该死的 Python 网络应用程序的人. 我能成功地做到这一点真是一个奇迹。
输入 uWSGI
首字母缩略词“WSGI”代表Web 服务器网关接口,这是一种深奥的说法,即“网络服务器如何与 Python 通信”。uWSGI 及其前身是一种中间件形式,供 Nginx 等网络服务器为 Python 应用程序提供服务。
在 2020 年,有很多选择可以为 Python Web 应用程序提供服务,但 uWSGI 在客观上比 Gunicorn 等替代方案要好。如果你对我们为什么要使用 uWSGI有任何疑问,我从这个人的博客中偷来的这些精心挑选的图表肯定会解决问题:
网关接口的性能比较。
在我们开始之前,我要对你说实话:这些东西有时会让人觉得很深奥。当有一键式解决方案可以完全避免所有这些时,看着这个过程并说“去他的”是很诱人的,但我要告诉你一个秘密:这些解决方案很糟糕。Heroku 是一个糟糕的 AWS 经销商,它销售具有更友好界面的垃圾 EC2 实例。Docker 是开发人员躲避 Linux 细微差别的一种手段,以至于我们会安装整个虚拟机,而不是学习。我已经准备好对这些言论嗤之以鼻,但我的观点仍然存在:如果您有兴趣超越供应商锁定并构建运行速度更快的应用程序,那么您来对地方了。
开始设置
我们需要在 Ubuntu(或其他)上安装一堆 Python 开发包才能使 uWSGI 工作。即使这条线看起来很熟悉,也不要跳过这部分(就像我一样)。几乎可以肯定,您缺少以下至少一个包:
<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code>$ apt update
$ apt upgrade -y
$ sudo apt install python3.8 python3.8-dev python3-distutils uwsgi uwsgi-src uuid-dev libcap-dev libpcre3-dev python3-pip python3.8-venv
</code></span></span>
安装所有 Python 开发依赖项。
安装uwsgi-plugin-python3是一个重要的步骤,值得特别注意。uWSGI 传统上是一个Python 包,因此您可能希望我们运行它pip install uWSGI
。如果我们要通过 pip 安装 uWSGI,uWSGI 将是一个 Python 包,属于我们机器上碰巧安装的 Python3 的系统默认版本。我们的项目可能会使用Python 3.6.9以外的 Python 版本(Ubuntu 18.04 默认),因此我们需要一个超越 Python 版本的 uWSGI 版本。这就是uwsgi-plugin-python3 的用武之地:
安装uwsgi-plugin-python3是一个重要的步骤,值得特别注意。uWSGI 传统上是一个Python 包,因此您可能希望我们pip install uWSGI
在某个时候运行。相反,如果我们通过 pip 安装 uWSGI&