Flask + Uwsgi + Nginx 部署到服务器上

nginx 与 uwsgi的关系

uwsgi 与 Flask 应用的关系


上传Flask 应用代码

我是利用FlashFXP上传

连接类型选择SFTP over SSH
并输入云空间的url或ip地址,用户名,和密码
_PS_:除Ubuntu系统用户为ubuntu外,其余系统均为root,我这里用的是ubuntu系统
登录后可以将整个项目文件夹上传到云空间上,上传后如下图所示

安装Flask 应用的运行环境

推荐利用虚拟环境来安装,避免不同应用的互相影响

###打开项目文件夹:

1
cd flask_test

安装虚拟环境

1
2
pip install virtualenv
virtualenv venv

安装成功后,项目根目录下会出现venv文件夹

启动虚拟环境

1
source venv/bin/activate

关闭虚拟环境是:

1
deactivate

安装Flask 应用所需插件(一定要在虚拟环境下安装)

打开requirements.txt(可能名称不同)文件所在目录

1
pip install -r requirements.txt

配置mysql数据库

安装mysql数据库服务器

1
sudo apt-get install mysql-server

安装mysql数据库客户端

1
2
sudo apt-get install mysql-client
sudo apt-get install libmysqlclient-dev

检查数据库服务是否正常运行

1
netstat -tap|grep mysql

配置mysql数据库
配置字符编码(建议将全部的字体编码设为utf8)

下面说配置方法,在我的ubuntu上安装mysql后,发现在/etc/mysql.下的my.cnf文件只有如下几行代码

1
2
!includedir /etc/mysql/conf.d/
!includedir /etc/mysql/mysql.conf.d/

这跟网上说的不同,我的做法是,把 conf.d目录下的mysql.cnfmysql.conf.d目录下的mysqld.cnf内容全复制到my.cnf,并同时对这三个文件进行修改。

1
2
3
4
5
6
7
8
[mysql]
default-character-set=utf-8
[client]
default-character-set=utf8
[mysqld]
character-set-server=utf8
collation-server=utf8_general_ci
#bind-address = 127.0.0.1 #将`bind-address = 127.0.0.1`注释掉

以上全部设置完后,重启mysql

1
sudo /etc/init.d/mysql restart

检查MySQL服务器占用端口

1
netstat -nlt|grep 3306

如果显示如下内容,则表示MySQL已经允许远程登陆访问。

1
tcp        0      0 0.0.0.0:3306            0.0.0.0:*               LISTEN

如果显示

1
tcp        0      0 127.0.0.1:3306            0.0.0.0:*               LISTEN

则说明你没有将bind-address = 127.0.0.1注释掉

新建数据库

切记要在修改好数据库字符编码后再新建数据库

1
create database flask CHARACTER SET utf8

在建好数据库后,查看下字符编码
按照以上方法配置后,进入mysql控制台,输入

1
2
use flask     #选择数据库
show variables like "%char%"

如果出现以下信息,说明数据库配置成功

注意:在运行flask 应用时,需要先把数据库更新一下。

安装Uwsgi(安装在虚拟环境中)

1
pip install uwsgi

配置Uwsgi

在项目根目录中,新建文件·config.ini·

1
2
3
4
5
6
7
8
9
10
[uwsgi]
socket= 127.0.0.1:3031 #作为内部地址,供nginx和uwsgi使用
master = true
home = venv #虚拟环境名称
wsgi-file = manage.py #项目的启动文件
callable = app # Flask 的application类
processes = 4
threads = 2
buffer-size = 32768
stats = 127.0.0.1:9191 #状态检测地址

如果socket 配置为 :3031(即0.0.0.0:3031),则通过uwsgi config.ini 可以使我们通过输入外网地址访问应用

输入以下命令测试是否配置成功:

1
uwsgi config.ini

如果没有提示出错信息,则说明配置成功(如果提示no internal routing support ,rebuild with pcre support !!!)无视就可以。

安装supervisor

安装supervisor来启动Uwsgi

1
sudo apt-get install supervisor

配置supervisor

/etc/supervisor/conf.d目录下新建文件flask_test_supervisor.conf


1
2
3
cd /  
cd /etc/supervisor/conf.d
sudo vi flask_test_supervisor.conf

flask_test_supervisor.conf文件内容:

1
2
3
4
5
6
7
[program:flask_test]
command=/home/ubuntu/flask_test/venv/bin/uwsgi /home/ubuntu/flask_test/config.ini
directory=/home/ubuntu/flask_test
user=ubuntu
autostart=true #自动启动
autorestart=true #自动重启
stdout_logfile=/home/ubuntu/flask_test/logs/uwsgi_supervisor.log #存放log文件路径,我是自己新建log文件夹和uwsgi_supervisor.log文件

启动supervisor

1
sudo service supervisor start

安装Nginx

1
sudo apt-get install nginx

###配置Nginx
配置文件在/etc/nginx/sites-available中的default中,将其替换掉即可。新的default文件内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
server {
listen 80 ;
server_name 115.159.213.132; #云空间ip地址(外网ip)
location / {

include uwsgi_params;
uwsgi_pass 127.0.0.1:3031; # 指向uwsgi 所应用的内部地址,所有请求将转发给uwsgi
uwsgi_param UWSGI_PYHOME /home/ubuntu/flask_test/venv; #虚拟环境目录
uwsgi_param UWSGI_CHDIR /home/ubuntu/flask_test; #网站根目录
uwsgi_param UWSGI_SCRIPT manage:app; #启动程序名称
uwsgi_read_timeout 100;
}

}

重启Nginx

1
sudo service nginx restart

测试网站是否可以访问

输入云空间公网ip地址即可访问

如果出现内部网关错误,请查看一下是否网站能否在本地运行起来

本文标题:Flask + Uwsgi + Nginx 部署到服务器上

文章作者:定。

发布时间:2017年3月9日 - 16时03分

本文字数:3,339字

原始链接:http://cocofe.cn/2017/03/09/Flask应用部署到服务器上/

许可协议: Attribution-NonCommercial 4.0

转载请保留以上信息。