因为新的项目是基于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
~~~