由于自己的项目需要,写了一个基于flask_restful
框架的后台应用,但是部署的时候遇到了很多坑,再次记录一下.
配置
- 服务器: 1核1G基础服务器
- 操作系统: UBuntu16.04LTS
- 部署框架:
Nginx
,uWSGI
python
:python3.6
好吧,让我们开始吧,首先如果是一台全新的服务器,需要安装 Python
的环境,一个是 Python
的虚拟环境virtualenv
,一个是python
下的安装工具easy_install
,顺便由于自己使用的是 mac系统,强烈推荐一个好用的ssh
连接应用shuttle:传送门
安装需要工具与环境
安装pip
1
sudo apt-get install pip
安装VirtualEnv
1
sudo pip install virtualenv
安装 Nginx
1
sudo apt-get install nginx
剩下的还有uWSGI
没有安装,这个最好在虚拟环境下安装,但是由于uWSGI
十个一基于C语言的框架,还需要安装他的依赖包
1
2
3
4
5
# 因为我使用的是 Python3 所以这里安装的是 Python3 的依赖包
sudo apt-get install build-essential python3-dev
# 如果报错可以试着安装这个
sudo apt-get install build-essential python-dev
安装完uWSGI
的依赖包以后,创建虚拟环境
1
2
3
4
5
virtualenv venv #创建虚拟环境
source venv/bin/activate #激活虚拟环境
# 安装自己项目所需要的依赖包,比如
# (venv)pip3 install -r requirements.txt
安装完uWSGI
1
(venv)pip install uwsgi
环境配置
部署项目需要项目文件,这里以flask
最简单的7行示例代码来完成部署,首先,使用ssh
连接服务器,使用命令创建一个项目,并打开:
1
2
3
4
5
6
mkdir my_flask_app
cd my_flask_app
touch hello.py
touch run.py
touch helloflask_nginx.conf #nginx 配置文件
touch helloflask_uwsgi.ini #uwsgi 配置文件
hello.py
文件内容如下:
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello World!'
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5001)
run.py
文件内容如下:
from hello import app
if __name__ == '__main__' :
app.run(host='0.0.0.0',port=5001)
helloflask_nginx.conf
文件内容如下:
server {
listen 80;
server_name xxx.xxx.xx.xxx;
location / {
include uwsgi_params; #uwsgi 需要参数,不需要改动
uwsgi_pass 127.0.0.1:3031;
}
}
参数意义:
listen
: 监听端口 80(默认)server_name
: 部署服务器ip地址,或者域名uwsgi_pass
: Nginx 与 uwsgi本地通讯地址
helloflask_uwsgi.ini
文件内容如下:
[uwsgi]
master = true
home = /home/ubuntu/my_flask_app/venv
chdir = /home/ubuntu/my_flask_app
wsgi-file = run.py
callable = app
socket = 127.0.0.1:3031
processes = 4
threads = 2
buffer-size = 32768
stats = 127.0.0.1:9091
参数意义:
home
: 虚拟环境路径chdir
: 项目文件路径wsgi-file
: 项目启动文件callable
: 项目启动实例,这个项目就是app = Flask(__name__)
里面的这个app
socket
: Nginx 与 uwsgi本地通讯地址processes
:进程数buffer-size
:缓存大小stats
:状态检测地址
helloflask_nginx.conf
文件中需要重点介绍的是uwsgi_pass
,也是配置成功的重点,这个是地方的地址,需要与helloflask_uwsgi.ini
文件中的socket
地址保持一致,这个是他们之间用于通信的端口地址,当然有的教程里面会把这个配置我一个.sock
文件的样子,这个也是可以的,但我个人还是比较倾向于上面的端口配置。
当一个请求从 app发起后,首先它会通过80端口到达nginx
,然后nginx
通过设置的本地端口将请求转发给uwsgi
,最后由uwsgi
分发给应用服务器完成请求的处理,实现一个完成的请求流程。
启动配置
首先,删除nginx
的默认配置文件:具体参数可以查看官方文档,本文仅提供最简单的配置:传送门
1
sudo rm /etc/nginx/sites-enabled/default
使用软连接将项目配置文件连接到nginx
的工作目录中
1
sudo ln -s /home/my_flask_app/helloflask_nginx.conf /etc/nginx/conf.d/
重启 Nginx:
1
sudo /etc/init.d/nginx restart
如果这个时候您刷新自己服务器,浏览器应该会报一个502的错误,这说明nginx
已经启动成功,最后让我们来启动uwsgi
,运行命令:
1
uwsgi --ini helloflask_uwsgi.ini & # & 后台运行
如果一切顺利,再次刷新,应该可以看到一切的起源Hello World!
,到此,项目部署完成!恭喜你!
但是,如果需要更加稳定,还需要使用Supervisor
来监听程序,当它发现uwsgi
或者 Nginx
挂了会自动将其重启,所以….让我们继续吧。
安装Supervisor
1
sudo apt-get install supervisor
一般情况,Supervisor
的全局的配置文件位置在:
1
/etc/supervisor/supervisor.conf
但我们不需要去对其作出改动,添加一个新的配置文件*.conf
在该目录:(该项目文件名为:my_flask_supervisor.conf
)
1
/etc/supervisor/conf.d/
my_flask_supervisor.conf
文件内容如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
[program:my_flask]
# 启动命令入口
command=/home/ubuntu/my_flask_app/helloflask_uwsgi.ini
# 命令程序所在目录
directory=/home/ubuntu/my_flask_app
#运行命令的用户名
user=root
autostart=true
autorestart=true
#日志地址
stdout_logfile=/home/ubuntu/my_flask_app/logs/uwsgi_supervisor.log
启动服务
1
2
$ sudo service supervisor start
# $ sudo service supervisor stop 停止服务命令
完成,收工!