pyenv+pipenv+flask+gunicorn+nginx+supervisor 部署笔记

因为新的项目是基于flask来搭建的一个后台服务,而当前的环境是基于python3.5的。而最新的这个服务是基于python3.6的。所有有必要的进行新环境的安装和虚拟环境的搭建。相关的 详细的:pyenv+pipenv的使用可以参考:
https://www.jianshu.com/p/89483a9350fb
以下的相关的笔记,仅为个人的记录使用。

本来打算事使用uwsgi部署的,但是再配置的过程中出现无法找到解析器的问题,相关的虚拟环境的解析器的位置我也加上,可是还是不行,所以暂时不考虑

yum search vim uwsgi-plugin-python

基础包的安装:

yum -y install gcc make patch gdbm-devel openssl-devel sqlite-devel readline-devel zlib-devel bzip2-devel
yum -y install git 

一 :pyenv篇

1:pyenv的安装:

$ curl -L https://raw.githubusercontent.com/pyenv/pyenv-installer/master/bin/pyenv-installer | bash

遇到的问题有:


[root@iz2ze6gyftbukastv4abocz ~]# curl -L https://raw.githubusercontent.com/pyenv/pyenv-installer/master/bin/pyenv-installer | bash
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  2454  100  2454    0     0   7608      0 --:--:-- --:--:-- --:--:--  7621
pyenv: Git is not installed, can't continue

直接再安装git

yum -y install git

完整的完整:pyenv-installer.sh文件

#!/usr/bin/env bash
 
set -e
[ -n "$PYENV_DEBUG" ] && set -x
 
if [ -z "$PYENV_ROOT" ]; then
  PYENV_ROOT="${HOME}/.pyenv"
fi
 
colorize() {
  if [ -t 1 ]; then printf "\e[%sm%s\e[m" "$1" "$2"
  else echo -n "$2"
  fi
}
 
# Checks for `.pyenv` file, and suggests to remove it for installing
if [ -d "${PYENV_ROOT}" ]; then
  { echo
    colorize 1 "WARNING"
    echo ": Can not proceed with installation. Kindly remove the '${PYENV_ROOT}' directory first."
    echo
  } >&2
    exit 1
fi
 
shell="$1"
if [ -z "$shell" ]; then
  shell="$(ps c -p "$PPID" -o 'ucomm=' 2>/dev/null || true)"
  shell="${shell##-}"
  shell="${shell%% *}"
  shell="$(basename "${shell:-$SHELL}")"
fi
 
failed_checkout() {
  echo "Failed to git clone $1"
  exit -1
}
 
checkout() {
  [ -d "$2" ] || git clone --depth 1 "$1" "$2" || failed_checkout "$1"
}
 
if ! command -v git 1>/dev/null 2>&1; then
  echo "pyenv: Git is not installed, can't continue." >&2
  exit 1
fi
 
if [ -n "${USE_GIT_URI}" ]; then
  GITHUB="git://github.com"
else
  GITHUB="https://github.com"
fi
 
checkout "${GITHUB}/pyenv/pyenv.git"            "${PYENV_ROOT}"
checkout "${GITHUB}/pyenv/pyenv-doctor.git"     "${PYENV_ROOT}/plugins/pyenv-doctor"
checkout "${GITHUB}/pyenv/pyenv-installer.git"  "${PYENV_ROOT}/plugins/pyenv-installer"
checkout "${GITHUB}/pyenv/pyenv-update.git"     "${PYENV_ROOT}/plugins/pyenv-update"
checkout "${GITHUB}/pyenv/pyenv-virtualenv.git" "${PYENV_ROOT}/plugins/pyenv-virtualenv"
checkout "${GITHUB}/pyenv/pyenv-which-ext.git"  "${PYENV_ROOT}/plugins/pyenv-which-ext"
 
if ! command -v pyenv 1>/dev/null; then
  { echo
    colorize 1 "WARNING"
    echo ": seems you still have not added 'pyenv' to the load path."
    echo
  } >&2
 
  case "$shell" in
  bash )
    profile="~/.bashrc"
    ;;
  zsh )
    profile="~/.zshrc"
    ;;
  ksh )
    profile="~/.profile"
    ;;
  fish )
    profile="~/.config/fish/config.fish"
    ;;
  * )
    profile="your profile"
    ;;
  esac
 
  { echo "# Load pyenv automatically by adding"
    echo "# the following to ${profile}:"
    echo
    case "$shell" in
    fish )
      echo "set -x PATH \"${PYENV_ROOT}/bin\" \$PATH"
      echo 'status --is-interactive; and . (pyenv init -|psub)'
      echo 'status --is-interactive; and . (pyenv virtualenv-init -|psub)'
      ;;
    * )
      echo "export PATH=\"${PYENV_ROOT}/bin:\$PATH\""
      echo "eval \"\$(pyenv init -)\""
      echo "eval \"\$(pyenv virtualenv-init -)\""
      ;;
    esac
  } >&2
fi

2:pyenv配置:

[root@localhost ~]# nano ~/.zshrc 

添加对于的内容为:

export PATH=$HOME/.pyenv/bin:$PATH
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"

完成后直接进行保存退订,再执行生效的命令

[root@localhost ~]# source ~/.zshrc
[root@localhost ~]#

然后再编辑 ~/.bash_profile 文件

[root@localhost ~]# nano ~/.bash_profile

添加以下的脚本:

export PYENV_ROOT="/root/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
if command -v pyenv 1>/dev/null 2>&1; then
  eval "$(pyenv init -)"
fi

3:pyenv安装检查:

[root@localhost ~]# pyenv doctor
Cloning /root/.pyenv/plugins/pyenv-doctor/bin/.....

BUILD FAILED (CentOS Linux 7 using python-build 1.2.13)

Problem(s) detected while checking system.

See https://github.com/pyenv/pyenv/wiki/Common-build-problems for known solutions.
[root@localhost ~]# 

4:pyenv版本:

[root@localhost ~]#  pyenv -v
pyenv 1.2.13
[root@localhost ~]# 

二:pipenv篇

1:pipenv安装

有必要的情况下升级一下当前pip
pip install --upgrade pip
安装:
pip install pipenv

2:pipenv配置

为项目创建虚拟环境
说明:默认的情况,虚拟环境创建目录是在:~/.local/share/virtualenvs
如果是需要指定再每个项目根目录下创建和保持虚拟环境目录(.venv)的话,需要再 .bashrc 或 .bash_profile 中配置配置 相关的信息:

nano ~/.bash_profile
export PIPENV_VENV_IN_PROJECT=1

PS:等号不能有空格:
不然会报:

-bash: export: `=1': not a valid identifier

然后执行下 source ~/.bashrc或者 source ~/.bash_profile即可生效!

3:pipenv 安装虚拟环境

设置当前的项目使用的py版本
# pyenv local 3.6.6 
ce 到你的项目下
pipenv --python 3.6.6 创建基于3.6.6虚拟环境

安装过程:

Pipfile: /data/www/youbaoapi_test/Pipfile
Using /root/.pyenv/versions/3.7.3/bin/python3.7 (3.7.3) to create virtualenv…
⠴ Creating virtual environment...Already using interpreter /root/.pyenv/versions/3.7.3/bin/python3.7
Using base prefix '/root/.pyenv/versions/3.7.3'
New python executable in /data/www/youbaoapi_test/.venv/bin/python3.7
Also creating executable in /data/www/youbaoapi_test/.venv/bin/python
Installing setuptools, pip, wheel...
done.
Running virtualenv with interpreter /root/.pyenv/versions/3.7.3/bin/python3.7

✔ Successfully created virtual environment! 
Virtualenv location: /data/www/youbaoapi_test/.venv
Creating a Pipfile for this project…


PS:Virtualenv location: /data/www/youbaoapi_test/.venv 这里是虚拟环境的路径

4:激活 pipenv

ce 到你的项目下
pipenv shell

运行 pipenv下运行项目

pipenv run flask starter.py 

三:pipenv 安装 gunicorn

pipenv install  gunicorn

四:上传项目(最好事包含了Pipfile,从git上传)

pipenv install  gunicorn

或者:

项目生成requirements.txt
pip freeze > requirements.txt
安装
pipenv install -r path/to/requirements.txt

使用pipevn安装相关依赖时候回遇到非常慢的问题可以更喜欢一下源:
pipenv换镜像源

python -c "s='https://mirrors.aliyun.com/pypi/simple';fn='Pipfile';pat=r'(\[\[source\]\]\s*url\s*=\s*\")(.+?)(\")';import re;fp=open(fn, 'r+');ss=fp.read();fp.seek(0);fp.truncate();fp.write(re.sub(pat, r'\1{}\3'.format(s), ss));fp.close();print('Done! Pipfile source switch to:\n'+s)"

替换方法:
在当前的目录下:

sed -i 's|pypi.org|mirrors.aliyun.com/pypi|g' Pipfile

测试运行相关项目

pipenv run python kkkk.py

PS:

如果你不想每次运行Python时都输入这么多,你可以在shell中设置一个别名,例如,

alias prp="pipenv run python"

四:使用gunicorn 运行 flask项目

PS:(starter: 是应用实例的入口py文件,app:是应用实例对象 5003  是配置的端口,)
pipenv run gunicorn -w 4 -b 0.0.0.0:5003 starter:app

pipenv得其他操作备注

pipenv --three 会使用当前系统的Python3创建环境

pipenv --python 3.6 指定某一Python版本创建环境

pipenv shell 激活虚拟环境

pipenv --where 显示目录信息
/home/jiahuan/pipenvtest

pipenv --venv 显示虚拟环境信息
/home/jiahuan/.local/share/virtualenvs/pipenvtest-9KKRH3OW

pipenv --py 显示Python解释器信息(到对应得虚拟目录下执行可以找到对应得虚拟机得解析器路径)
/home/jiahuan/.local/share/virtualenvs/pipenvtest-9KKRH3OW/bin/python

pipenv install requests 安装相关模块并加入到Pipfile

pipenv install django==1.11 安装固定版本模块并加入到Pipfile

pipenv graph 查看目前安装的库及其依赖

pipenv uninstall --all  卸载当前环境下所有包

pipenv  update  --更新当前环境下所有包,升级到最新版本

pipenv --rm                    删除虚拟环境

pipenv --py                    列出虚拟环境的Python可执行文件

pipenv run python [pyfile]     运行py文件

pipenv --where                 列出本地工程路径
pipenv --venv                  列出虚拟环境路径
pipenv --py                    列出虚拟环境的Python可执行文件
pipenv install                 创建虚拟环境
pipenv isntall [moduel]        安装包
pipenv install [moduel] --dev  安装包到开发环境
pipenv uninstall[module]       卸载包
pipenv uninstall --all         卸载所有包
pipenv graph                   查看包依赖
pipenv lock                    生成lockfile
pipenv run python [pyfile]     运行py文件
pipenv --rm                    删除虚拟环境

五:使用nginx代理转发到这个5003 端口上

upstream xxxxxxx_api {
    server 127.0.0.1:5003 weight=1 max_fails=0 fail_timeout=12s;
}


server {
    listen      5002;
    charset     utf-8;
    root        /data/www/xxx-xx---xxx;
    server_name xxxxxxx;
    

    location /favicon.ico {  
        log_not_found off;
        access_log off;
    } 
    

    
    location / {
        add_header 'Access-Control-Allow-Origin' '*';
        add_header 'Access-Control-Allow-Credentials' 'true';
        index  login.html Index.html index.html;
    }
    
    location ~* ^/(v1|cms|api)/ {
        proxy_pass    http://lin_cms_flask_36_api;
        add_header 'Access-Control-Allow-Origin' '*';
        add_header 'Access-Control-Allow-Credentials' 'true';
        proxy_set_header   Host    $host;  
        proxy_set_header   X-Real-IP   $remote_addr;   
        proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_connect_timeout      300; #nginx跟后端服务器连接超时时间(代理连接超时)
        proxy_send_timeout         300; #后端服务器数据回传时间(代理发送超时)
        proxy_read_timeout         300; #连接成功后,后端服务器响应时间(代理接收超时)
    }
    
    access_log  off;
}

六:使用supervisor 管理进程

PS:使用进程管理的时候出现错误提示:

xxxx_api_5003            FATAL     can't find command 'pipenv'

说明当前安装pipenv的的时候没有全局的安装,导致找不到,所以需要再全局的安装一下pipenv ,而不是在pyevn locot 的项目下安装

[program:xxxx_5000]
command=pipenv run gunicorn -w 4 -b 0.0.0.0:5003 starter:app    ; supervisord将要执行的运行python服务的命令
directory=/data/www/xxxxxxx
stdout_logfile=/data/logs/supervisord/xxxxxxx_supervisord.log    ; supervisord当前这个test服务运行产生的日志存储路径,方便我们查看运行情况
socket-timeout=3
autostart=true
autorestart=true
redirect_stderr=true
stopsignal=QUIT

查看进程情况:

pstree -ap|grep gunicorn
~~~
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,686评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,668评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,160评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,736评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,847评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,043评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,129评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,872评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,318评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,645评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,777评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,470评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,126评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,861评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,095评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,589评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,687评论 2 351

推荐阅读更多精彩内容