因工作需要,自己要开发一个django项目上线,采用架构: Nginx+uwsgi+Django
这里重点讲uwsgi的离线安装部署
阿里云ECS服务器自带的python是3.6,我本地开发环境是3.9,所以在线上环境使用anaconda管理环境。
我要解决的问题是uwsgi安装的时候报库文件not found错误。比如,第一种情况这样: 另外一种情况: 第二种情况属于缺失文件比较多的。
一开始我在部署的时候搞了很多办法,比如去这个网站找缺失的库文件;也去试过不同版本的uwsgi,uwsgi离线安装包下载地址,下面是我试过的版本:
弄来弄去,就是版本不兼容的问题,这里涉及到2种不兼容:python版本和uwsgi,uwsgi和Linux系统。
- python版本和uwsgi版本问题:因为我ECS服务器anaconda的base环境基于python 3.9,所以我想当然的去找了uwsgi-2.0.20-py39和uwsgi-2.0.19.1-py39,安装后发现还是库文件not found,直到我试了很多py39的版本包,都不行,我意识到是系统层面的问题了,当前ECS服务器不够兼容py39版的uwsgi。
- uwsgi版本和Linux系统的关系:前面讲了ECS的python版本是3.6,所以 Linux系统环境肯定是以python3.6为基础的,所以我就尝试了很多py36不同版本的uwsgi,最后让我找到了一些规律。
把这些包全部解压到文件夹里,挨个去看它们缺失哪些库文件,会发现规律: 解压缩xxx_1.tar.bz2到uwsgi_1文件夹,xxx_2.tar.bz2到uwsgi_2文件夹,以此类推。你会发现其实就是库文件版本不一样,这里有三个版本:so.58, so.64, so.67。那么,本地 Linux系统提供的环境是什么版本,看/usr/lib64/下: Linux系统提供的库文件是so.60 到这里基本上水落石出了:只要选择uwsgi版本和so.60兼容的版本就可以。,选so.58的那个版本,记住兼容永远都是向后兼容,so.60肯定兼容so.58,但它不一定能兼容so.64和so.67。思路通了,后面的操作就简单了,加软链就可以了。 ldd看一下: 搞定! 上面的就是整个解决过程,正式安装部署uwsgi的时候建议重新安装一下。 用conda离线安装方式:
1. 在 https://anaconda.org/conda-forge/uwsgi/files 下载uwsgi包,注意本地部署的python版本对应不同的安装包
2. 上传到conda install的缓存文件路径 /root/anaconda/pkgs;如果要安装到虚拟环境,对应路径为 /root/anaconda/envs/xxx/
3. 安装命令:conda install --use-local uwsgi包名
最终采用的环境是python3.6,uwsgi-2.0.18
总结一下
- 开发项目一定要注意环境。保持开发环境和部署环境一致
- 软件最新不一定是合适的。我这里用python3.9开发确实是草率了,没考虑到服务器部署的环境。一开始用uwsgi-2.0.20最新版也不靠谱,没考虑到系统环境支不支持。
- 耐心,胆大心细。发现问题就解决问题,会比较,找差异,看规律。
|