记一次编译安装python服务

文章目录

  • 背景
  • 编译安装python
  • 创建虚拟工作环境
  • 编译安装lxml的依赖库
  • 打包即部署
    • supervisor配置环境变量
  • 参考

背景

  • 有一个利用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的依赖库

参考:Python安装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业务代码
      记一次编译安装python服务_第1张图片
  • 此压缩包直接解压 和 配置 环境变量后,即可运行:/opt/server/venv_server/bin/python /opt/server/sanic_server_code/main.pymain.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 用法及环境变量

你可能感兴趣的:(运维,Linux,Python)