背景
- 有一个利用sanic框架和lxml库的服务需要打包代码和环境 便于 直接 解压 就可运行服务。选择通过 编译安装 python 及 lxml依赖的libxml2和libxslt。
- 通过编译安装 及 配置环境变量,可以不用通过 apt 安装依赖,进而方便部署 及 减少占用系统盘。
编译安装python
参考:编译安装python3
- 下载python源码包:
wget https://www.python.org/ftp/python/3.6.9/Python-3.6.9.tar.xz
- 去掉.xz:
xz -d Python-3.6.9.tar.xz
- 解压
tar -xf Python-3.6.9.tar
- 进入目录:
cd /opt/Python-3.6.9
- 编译安装
- 需要相关包:
apt install gcc g++ make
等 ./configure --prefix=/opt/server/python369/
(此时还不会生成这个文件夹)make && make install
(生成 /opt/python369/)
- 需要相关包:
- 如需配置系统变量、软连接及个人配置文件(见参考资料)。
创建虚拟工作环境
此步可以省略,可以直接使用编译安装的python环境
- 利用编译安装的环境 安装virtualenv:
/opt/server/python369/bin/pip3 install virtualenv
- 创建虚拟工作环境:
/opt/server/python369/bin/virtualenv -p /opt/Python-3.6.9/bin/python3.6 /opt/server/venv_server
- 在虚拟环境中安装所需的第三方库:
- 激活虚拟环境:
source /opt/server/venv_server/bin/activate
- 安装:
pip install sanic lxml
- 安装lxml的过程中,可能需要python3.6-dev和lxml-dev等,可以暂时通过apt安装使用(因为有些包只用于安装过程,后期apt删除即可),也可以编译安装这些依赖(参考下一步)。
- 激活虚拟环境:
编译安装lxml的依赖库
-
lxml依赖libxml2和libxslt,libxslt又依赖于libxml2
-
安装libxml2
wget http://xmlsoft.org/sources/libxml2-2.9.0.tar.gz tar -xzvf libxml2-2.9.0.tar.gz ./configure --prefix=/opt/server/venv_server/ --without-python make make install
-
安装libxslt
wget http://xmlsoft.org/sources/libxslt-1.1.27.tar.gz ./configure --prefix=/opt/server/venv_server/ --without-crypto --without-python --with-libxml-prefix=/opt/server/venv_server/ make make install
-
以上的configure步骤可能报错,其中一个原因是 configure.guess太旧
- 解决:
apt install automake
,用/usr/share/automake-xxx/configure.guess
替代libxml2和libxslt解压包中的configure.guess文件。
- 解决:
-
此时,运行python报错
>>> import lxml >>> import lxml.html >>> 报错.....(错误提示,提示etree.so依赖错误!)
-
由于so文件是我们自己build的,且不在系统默认环境变量路径内,所以我们需要把path加到系统环境变量(so)路径内,如下:
- 配置环境变量(永久有效)
- 编译:
vim ~/.bashrc
,建议先备份该文件 - 在最后一行加入:
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/server/venv_server/lib
- 可能在下次登录才生效。
- 编译:
- 本次登录有效:直接在shell运行
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/server/venv_server/lib
。 - 用
export -p
检查是否添加成功
- 配置环境变量(永久有效)
打包即部署
-
整体打包
/opt/server/venv_server
-
项目结构
- python369: 编译安装的python环境
- venv_server: 虚拟工作环境
- 编译安装的lxml依赖库在lib中
- sanic_server_code为sanic业务代码
-
此压缩包直接解压 和 配置 环境变量后,即可运行:
/opt/server/venv_server/bin/python /opt/server/sanic_server_code/main.py
,main.py
为sanic服务的启动文件。
supervisor配置环境变量
参考:supervisor添加环境变量,supervisor配置环境变量(PATH)
服务往往使用supervisor运行
apt install supervisor
时,往往会依赖系统的环境变量,但是有次可能并不成功,则需给supervisor的process 配置环境变量。- 在该进程配置文件中(
/etc/supervisor/conf.d/
)
[program:sanic_server]
command = /opt/server/venv_server/bin/python /opt/server/sanic_server_code/main.py
directory = /opt/server/venv_server/
autostart = true
autorestart = true
stopsignal=INT
stopasgroup=true
user = root
redirect_stderr = true
environment=LD_LIBRARY_PATH=/opt/server/venv_server/lib/ # 配置环境变量,指定依赖库的路径
- 再启动该进程即可
参考
- 利用setup.py安装,未成功:在virtualenv中安装libxml2和libxslt
- linux中 export 用法及环境变量