本文大体说下一个网站从开发到部署的流程,里面会说起用到的或者可能会被用到的技术,这些东西在平时用到的也比较多,因此应该能给后端学习提供一些具体的参考。python
这里我创建一个简单的 Flask 应用,让它能处理简单的请求。nginx
新建项目目录 flask_appgit
$ mkdir flask_app
复制代码
切到项目目录github
$ cd flask_app
复制代码
使用 Pipenv 为项目初始化一个 Python 3.6 的环境sql
$ pipenv --python 3.6.0
复制代码
若是报相似下面的错误shell
Warning: Python 3.6 was not found on your system...
复制代码
可参考 3.3 小节的内容解决。数据库
若是须要查看虚拟环境所在目录,可使用下面的命令flask
$ pipenv --venv
复制代码
安装 Flaskvim
$ pipenv install flask==1.0.2
复制代码
可能会出现相似下面的问题后端
TypeError: 'module' object is not callable
复制代码
这是因为 pip 版本致使,安装这个版本就好了
$ pipenv run pip install pip==18.0
复制代码
而后从新装下 Flask 就 OK 了。
新建文件 app.py
from flask import Flask
app = Flask(__name__)
@app.route('/', defaults={'query_path': 'index'})
@app.route('/<path:query_path>')
def match_path(query_path):
return f'Query path: {query_path}'
复制代码
到这里,应用就创建好了,咱们运行测试一下。
为了方便,咱们使用下面的命令进入虚拟环境
$ pipenv shell
复制代码
若是后面须要退出该虚拟环境,能够这样
$ exit
复制代码
而后
$ export FLASK_APP=app.py
$ flask run -h 0.0.0.0 -p 8080
复制代码
最后在浏览器中访问 http://127.0.0.1:8080/book/1
,看到以下内容
Query path: book/1
复制代码
说明应用已经 OK。
涉及技术:
后续开发可能用到的
为了解决多人协做、版本回溯等问题,咱们须要一个代码管理工具,这里咱们使用 Git。
下面演示将本地代码保存到 GitHub,固然,若是是公司等私有项目的话,你可使用 GitHub 付费服务或者自建托管服务。
首先在项目目录下初始化一个 Git 仓库
$ git init
复制代码
添加忽略文件 .gitignore
,将 IDE 配置文件忽略(根据你本身的状况进行配置)
.idea/
复制代码
将当前代码提交到版本库
$ git add .
$ git commit -m "init"
复制代码
而后登录 GitHub 新建一个空的仓库 flask_app,复制其 SSH 地址,将其添加到本地客户端中
$ git remote add origin git@github.com:kevinbai-cn/flask_app.git
复制代码
最后提交代码到仓库
$ git push origin master
复制代码
若是其它项目成员须要使用项目或者要在服务器上进行部署,克隆一份代码便可
$ git clone git@github.com:kevinbai-cn/flask_app.git
复制代码
涉及的技术
后续开发可能用到的
这里我使用 Flask + Gunicorn(独角兽) + Nginx 的方式进行部署。
有的人可能会疑惑,Gunicorn 裸跑就能提供服务了,为何还要加一层 Nginx 呢?个人考虑主要有负载均衡、静态文件缓存、IP 访问频率控制等,相对来讲,Nginx 做为服务器支持得更全面一些。
注意:当前服务器系统为新装的 Ubuntu 16.04,有些须要使用的软件会安装一次,因此记录得稍细一点
因为系统已经有了 pip,咱们将 pipenv 安装至咱们的用户目录
# pip install --user pipenv
复制代码
查看用户基础目录
# python -m site --user-base
/root/.local
复制代码
pipenv 安装后就在 /root/.local/bin
目录下,将其添加到 Path 中,打开 /root/.bashrc
# vim /root/.bashrc
复制代码
在最后添加
export PATH=$PATH:/root/.local/bin
复制代码
让配置生效
# source /root/.bashrc
复制代码
测试一下 pipenv 是否能找到
# pipenv --version
pipenv, version 2018.7.1
复制代码
OK,至此安装完成。
使用 apt 进行安装
# apt update
# apt install git
复制代码
Git 配置用户名与邮箱
# git config --global user.name "kevinbai"
# git config --global user.email "kevinbai.cn@gmail.com"
复制代码
生成 SSH key,键入下面的命令,一路回车就行
# ssh-keygen -t rsa -C "kevinbai.cn@gmail.com"
复制代码
执行时,你会看到 Key 保存的位置,通常是在 ~/.ssh
目录下。
而后在 GitHub 上配置 SSH 公钥:settings -> SSH and GPG keys -> New SSH key,Title 能够随意填写,好比我填的 server-ssh-rsa
,Key 填写 .ssh/id_rsa.pub
中的内容,以后保存就 OK 了。
克隆项目代码到服务器
# mkdir -p /data/htdocs
# cd /data/htdocs
# git clone git@github.com:kevinbai-cn/flask_app.git
复制代码
依赖包安装
# cd flask_app
# pipenv install
复制代码
发现报下面的错误
Warning: Python 3.6 was not found on your system...
复制代码
咱们须要先安装 Python 3.6,为了方便,咱们使用 pyenv。
安装 pyenv
# curl -L https://raw.github.com/yyuu/pyenv-installer/master/bin/pyenv-installer | bash
复制代码
打开 ~/.bashrc
# vim ~/.bashrc
复制代码
在最后添加
export PATH="/root/.pyenv/bin:$PATH"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"
复制代码
让配置生效
# source ~/.bashrc
复制代码
安装 Python 3.6.0
# pyenv install 3.6.0
复制代码
若是构建出错,通常是基础工具不全的问题,使用下面命令进行安装,而后再试一次就好了
# apt install make build-essential libssl-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev
复制代码
从新安装依赖包
# pipenv install
复制代码
这里我不打算将 gunicorn 写入 Pipfile,因此使用下面的命令进行安装
# pipenv run pip install gunicorn==19.9.0
复制代码
而不用
# pipenv install gunicorn==19.9.0
复制代码
测试一下,看能不能正常运行
# pipenv run gunicorn -w 5 -b 0.0.0.0:8080 app:app -D
复制代码
回车后没有报错,说明启动成功。
安装 Nginx
# apt install nginx
复制代码
备份默认配置
# cp /etc/nginx/sites-available/default /etc/nginx/sites-available/default.bak
复制代码
打开配置文件
# vim /etc/nginx/sites-available/default
复制代码
文件内容修改成
server {
listen 80;
server_name _;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_redirect off;
proxy_set_header Host $http_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;
}
}
复制代码
启动 Nginx
# /etc/init.d/nginx start
复制代码
若是须要关闭,使用下面的命令
# /etc/init.d/nginx stop
复制代码
而后浏览器访问 http://your_ip
,若是看到下面内容
Query path: index
复制代码
则部署成功。
须要注意的是,若是是阿里云的 ECS 服务器,须要在控制台中去设置安全规则才能访问指定端口。
涉及技术:
后续开发可能用到的
https://jiayi.space/post/flask-gunicorn-nginx-bu-shu
复制代码
本文首发于公众号「小小后端」。