系统是ubuntu20.4,需要安装多个flask的后台应用,而且这些flask应用都会使用不同的python版本,必须3.8.10,3.10.0等。现在需要梳理一下在ubuntu20.4上成功独立部署的经验。
需要用到pyenv工具。
一、安装pyenv,管理python虚拟环境
1、准备环境,更新软件,和安装必须的依赖
sudo apt update && sudo apt install -y \
git curl wget make build-essential \
libssl-dev zlib1g-dev libbz2-dev \
libreadline-dev libsqlite3-dev libffi-dev
这里需要安装tk,因为我的一个flask应用依赖tk,要先安装。否则后续编译了python3.8.10仍然无法找到。
sudo apt update
sudo apt install -y tk-dev python3-tk
2、安装pyenv和virtualenv
最好使用官方的方法来安装pyenv,这样连带virtualenv也会一同安装。下面是安装pyenv。
#安装pyenv
curl https://pyenv.run | bash
# 添加到bashrc(绝对路径!)
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(pyenv init --path)"' >> ~/.bashrc
eval "$(pyenv init -)"
echo 'eval "$(pyenv virtualenv-init -)"' >> ~/.bashrc
source ~/.bashrc
如果你的服务器无法访问https://pyenv.run,只能用国内的gitee来安装,但是要单独安装virtualenv工具。
git clone https://gitee.com/mirrors/pyenv.git ~/.pyenv
# 3. 配置环境变量(同上)
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(pyenv init --path)"' >> ~/.bashrc
eval "$(pyenv init -)"
source ~/.bashrc
ps:如果你不是用官方,而是用gitee安装的pyenv,那么你需要单独安装virtualenv,并配置环境变量
======安装virtualenv
git clone https://gitee.com/mirrors/pyenv-virtualenv.git ~/.pyenv/plugins/pyenv-virtualenv
echo 'eval "$(pyenv virtualenv-init -)"' >> ~/.bashrc
3、使用pyenv安装不通用的python版本
本来直接用命令pyenv install 3.8.10 --verbose安装,但是国外的源和国内的源都容易失败,所以直接用先下载tar.xz安装包,在本地安装的方式可以100%的成功。
# 从华为云下载 Python 3.8.10
wget https://mirrors.huaweicloud.com/python/3.8.10/Python-3.8.10.tar.xz -O ~/Python-3.8.10.tar.xz
mkdir -p ~/.pyenv/cache/
mv ~/Python-3.8.10.tar.xz ~/.pyenv/cache/
# 使用 pyenv 安装(自动检测缓存)
pyenv install 3.8.10 --verbose
安装成功之后,用pyenv versions命令可以看到已经安装的python版本。
4、 创建对应的python虚拟环境
# 为app1创建环境(Python 3.8.10)
pyenv virtualenv 3.8.10 flask5000-env
# 验证环境
pyenv virtualenvs
5、使用pyenv
5.1 进入项目目录下,然后运行pyenv local env1,这样每次cd到这个目录都会自动切换为env1环境。这种情况直接删除当前目录下的rm .python-version即可推出
5.2 pyenv activate env1就可以激活虚拟环境,pyenv deactivate就可以去激活
二、配置nginx和https证书,完成部署
之前一直都是使用宝塔平台来跑,还是自己撸一个conf来跑,更省事了。现在已经跑通了,记录一下,下次直接一把跑起来。
1、注册域名、备案,并配置www和@的A记录解析
2、安装nginx
sudo apt update
sudo apt install -y nginx
sudo systemctl enable --now nginx
3、创建nginx的conf
按照规范的nginx写法是这样,先在nano /etc/nginx/sites-available/mxshuying.site这个available目录下创建一个conf,里面的内容如下
server {
listen 80;
server_name mxshuying.site;
# HTTP 强制跳转 HTTPS(可选)
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name mxshuying.site;
# SSL 证书路径(稍后生成)
ssl_certificate /etc/letsencrypt/live/mxshuying.site/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/mxshuying.site/privkey.pem;
# SSL 强化配置
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH";
# 反向代理到 Flask
location / {
proxy_pass http://0.0.0.0:5000;
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_set_header X-Forwarded-Proto $scheme;
}
# 静态文件处理(如果有)
location /static/ {
alias /path/to/your/flask/app/static/;
expires 30d;
}
}
4、将实际的conf文件,链接到enable文件夹,并验证配置文件的正确性
ln -s /etc/nginx/sites-available/mxshuying.site /etc/nginx/sites-enabled/
nginx -t
systemctl stop nginx
systemctl start nginx
5、需要获取证书(免费证书,每次能用90天)
apt install -y certbot python3-certbot-nginx
certbot certonly --standalone -d mxshuying.site -d www.mxshuying.site
证书获取成功了,再重启nginx
6、启动flask,一定要用0.0.0.0的地址
如果不指定0.0.0.0,flask会将app挂在127.0.0.1的地址上,所以一定要挂在0.0.0.0上面。
nohup flask run --host=0.0.0.0 --port=5000 &
这个命令可以在后台运行flask
7、配置静态文件的访问
如果作为小程序的服务端,是要配置一个校验文件的,需要在conf文件的最后增加静态文件的访问路径
# 小程序的校验文件
location /7rXonzV0Gr.txt {
root /var/www/mxshuying.site; # 文件存放目录
try_files $uri =404; # 防止目录遍历
expires 1d; # 缓存1天
access_log off; # 关闭日志(可选)
}
8、其它命令
查看80端口的占用:lsof -i :80
开启、重启、停用nginx服务: systemctl start/stop/reload nginx
验证https的证书:certbot certificates
查看nginx的日志: tail -f /var/log/nginx/error.log






