0%

linux下使用nginx+gunicorn+supervisor配置flask生产环境

flask自带的开环境为单线程,虽然可以开启多线程,但没有对读取目录做权限限制。所以用gunicorn起个应用服务器,再用nginx反向代理配合,搭建网站的前后端多个应用。

说下环境先:
1.ubuntu 17.04

以下步骤windows也是一样的,只是命令行和安装方式会有差异。

第一步 安装pip

先要安装pip,安装方法多样,我这直接apt-get了。

1
sudo apt-get install python-pip

第二步 安装虚拟环境

复杂的Python程序最好隔离在一个虚拟环境中,因为我是在多个平台多个环境作业的,隔离出来也保险些,环境问题往往是最浪费时间的。
方法1:

1
2
# 使用pip安装virtualenv
$ pip install virtualenv

方法2:
1
sudo apt-get install python-virtualenv

第三步 创建虚拟环境

切换到你的项目文件夹,创建虚拟环境
运行virtualenv命令。这个命令接受一个参数,作为虚拟环境的名字(同样也是它的位置)。

1
$ virtualenv venv

进入虚拟环境:

1
2
source venv/bin/activate
python --version

运行deactivate命令,你就能离开你的virtual environment,现在先别敲退出,我们要在虚拟环境下安装模块,所有的安装模块会在venv中,知道就好。

1
(venv)$ deactivate

第四步 安装各种Python库:

1
2
pip install gunicorn
pip install flask

检查gunicorn是否能起得来(关于后面的参数不多说了,是flask的对象)。

1
gunicron -w4 -b0.0.0.0:8000 run:app

值得一提的是,安装MysqlDB会有些不一样,当然也可以用其它好安装的mysql管理模块,我个人喜欢用这个而已。 pymysql真香

1
pip install pymysql

第五步 安装Nginx:

1
2
sudo apt-get install nginx
sudo cp /etc/nginx/site-avalidable/default /etc/nginx/site-avalidable/default.bak

修改defult文件,设置反向代理:

1
nano -W /etc/nginx/sites-available/default

文件底部添加如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
upstream my_server {
server 127.0.0.1:2170;
keepalive 2000;
}
server {
listen 80;
server_name 127.0.0.1;
client_max_body_size 1024M;

location /my/ {
proxy_pass http://my_server/;
proxy_set_header Host $host:$server_port;
}
}

修改nginx配置文件:

1
nano -W /etc/nginx/nginx.conf

底部添加:

1
daemon off;

第六步 安装 supervisor

这个可以页面管理服务器的平台,看个人爱好了,不装也行,可以直接看下一步。

1
2
3
pip install supervisor
echo_supervisord_conf > supervisor.conf # 生成 supervisor 默认配置文件
vim supervisor.conf # 修改 supervisor 配置文件,添加 gunicorn 进程管理

supervisor的基本使用命令

1
2
3
4
5
supervisord -c supervisor.conf                             通过配置文件启动supervisor
supervisorctl -c supervisor.conf status 察看supervisor的状态
supervisorctl -c supervisor.conf reload 重新载入 配置文件
supervisorctl -c supervisor.conf start [all]|[appname] 启动指定/所有 supervisor管理的程序进程
supervisorctl -c supervisor.conf stop [all]|[appname] 关闭指定/所有 supervisor管理的程序进程

supervisor.conf配置文件底部添加如下,这个是我的配置,路径地址需酌情更改:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
[program:run]
command=/home/chenjian/worksapce/manager-server/venv/bin/gunicorn -w4 -b0.0.0.0:2170 run:app
directory=/home/chenjian/worksapce/manager-server/ ; 项目的文件夹路径
startsecs=0 ; 启动时间
stopwaitsecs=0 ; 终止等待时间
autostart=false ; 是否自动启动
autorestart=false ; 是否自动重启

[program:nginx]
command=/usr/sbin/nginx
startsecs=0 ; 启动时间
stopwaitsecs=0 ; 终止等待时间
autostart=false ; 是否自动启动
autorestart=false ; 是否自动重启
stopsignal=KILL ; 用来杀死进程的信号


[inet_http_server] ; inet (TCP) server disabled by default
port=127.0.0.1:9001 ; (ip_address:port specifier, *:port for all iface)
username=user ; (default is no username (open server))
password=123 ; (default is no password (open server))

[supervisorctl]
serverurl=unix:///tmp/supervisor.sock ; use a unix:// URL for a unix socket
serverurl=http://127.0.0.1:9001 ; use an http:// url to specify an inet socket
username=user ; should be same as http_username if set
password=123 ; should be same as http_password if set
;prompt=mysupervisor ; cmd line prompt (default "supervisor")
;history_file=~/.sc_history ; use readline history if available

浏览器打开http://127.0.0.1:9001 就能管理自己的服务了,如果没有安装也可以通过命令行管理。

1
2
supervisord -c supervisor.conf
sudo service nginx start