阿里云(腾讯云)部署 Flask + WSGI + Nginx 详解

写在前面的话:我用的是腾讯云来部署flask线上环境的,如果你用阿里云,也是一样的步骤和操作,我也是按着大神们的教程操作的。传送门:https://www.cnblogs.com/Ray-liang/p/4173923.html,但是完全按着教程去弄,也会遇到很多坑。有些细节我查了百度重新修改了才最终跑起来的。

  • Web 服务器采用 uwsgi host Flask
  • 用 Supervisor 引用 uwsgi 作常规启动服务
  • 基于 Nginx 作反向代理
这是我安装的服务器系统,Ubuntu自带了python3.6 ,所以python的环境就不需要再去安装了

从云后台登录,设置登录账号密码(用root登录进行接下来的操作,默认是ubuntu用户名,权限比不上root

输入 sudo passwd root 先会输入用户密码,然后提示设置root密码。需要输入两次 再输入 su 后按回车键,输入设置好的root密码,便可
看到这样的画面 就代表是root账号切换成功了

第一步:安装pip3 因为我的系统环境是python3.6 所以pip也对应3
输入命令sudo apt-get install python3-pip,这个会从国内的源下载pip3并进行自动安装。完成之后,输入pip3 -V查看pip3的版本,如果正常显示pip3的版本,说明已经成功安装。
第二步:安装虚拟环境 VirtualEnv 不同的项目可能会引用各种不同的依赖包,为了避免版本与和应用之间的冲突而造成的“依赖地狱”
[Virtualenv | https://virtualenv.readthedocs.org/en/latest/] 就是我们python 项目的必须品了。VirtualEnv 可以为每个Python应用创建独立的开发环境,使他们互不影响,Virtualenv 能够做到:
  • 在没有权限的情况下安装新套件
  • 不同应用可以使用不同的套件版本
  • 套件升级不影响其他应用
sudo pip3 install virtualenv
安装VirtualEnv 后只需要在项目目录内运行 virtualenv 目录名 就可以建立一个虚拟环境文件夹,然后启用 activate 指令即可启用该python虚拟环境,具体操作如下: 假定我的项目目录叫 /home/www/my_flask,首先安装虚拟环境 (我习惯使用的虚拟环境目录叫 venv )

这里一定要注意,需要用mkdir xxx 命令在home下新建www和my_flask文件夹,同时sudo chmod 777 ×××命令设置文件夹权限为777 这样我们才能往文件夹里读写上传修改文件

my_flask root$ virtualenv venv

>> New python executable in venv/bin/python
>> Installing setuptools, pip...done.
在项目目录下就会建立一个新的 venv 目录,里面就是运行python 的基本环境的工具与指令,和包。 然后启用该环境,使用当前命令行状态进入虚拟环境,进入虚拟环境后,一切安装python的操作都会将包和引用装在虚拟环境内,而不会影响到全局的python 环境。
my_flask root$ source venv/bin/activate 

(venv)my_flask root$ 
调用 activate 指令后命令符前就会出现 (venv) 字样。 可通过 deactivate 退出虚拟环境。
第三步:安装 uWSGI Flask 的实际生产运行环境选择并不多,比较成熟的是 [Gunicorn|http://gunicorn.org/] 和 [uWSGI|https://github.com/unbit/uwsgi] ,听说Gunicorn 的配置很简单,但可惜我一直没有配置成功过,我现采用的是 uWSGI。接下来就安装uWSGI吧。
(venv)my_flask root$ pip3 install uwsgi
这个安装很迅速,基本是秒成。安装完成后我们可以先放下 uWSGI 不表,在后面再回过来配置他,因为我们首先要将关键的 Flask环境和我们的项目文件传到服务器目录内。
第四步: 安装 Flask 我是用清单文件一次性安装Flask和他的相关依赖的,这样会更快。我的引用清单是这样的: requirements.txt
Flask==0.10.1
Flask-Login==0.2.11
Flask-Mail==0.9.1
Flask-Moment==0.4.0
Flask-PageDown==0.1.5
Flask-SQLAlchemy==2.0
Flask-Script==2.0.5
Flask-WTF==0.10.2
Flask-Cache==0.13.1
Flask-Restless==0.15.0
Flask-Uploads==0.1.3
Jinja2==2.7.3
Mako==1.0.0
Markdown==2.5.1
MarkupSafe==0.23
SQLAlchemy==0.9.8
WTForms==2.0.1
Werkzeug==0.9.6
html5lib==1.0b3
itsdangerous==0.24
six==1.8.0
awesome-slugify==1.6
可以想像,如果一个一个装非疯了不可。 安装清单文件:
(venv)my_flask root$ pip3 install -r requirements.txt

在此还是重重地提一下:一定要注意在运行这个安装之前启用了python 虚拟环境,否则会直接安装到全局去的!

第五步:把项目文件传到home/www/my_flask/ 目录下和虚拟文件同级 我用的是flashfxp上传的 选择SSH模式 22端口 root (或者ubuntu)账户名
目录结构大致如下:
www/
└── my_flask  
│   ├── logs
│   └── venv  //虚拟目录
│   │   ├── bin
│   │   │         ├── activate
│   │   │         ├── easy_install
│   │   │         ├── gunicorn
│   │   │         ├── pip
│   │   │         └── python
│   │   ├── include
│   │   │          └── python3.6 -> /usr/include/python3.6
│   │   ├── lib
│   │   │         └── python3.6
│   │   ├── local
│   │   │         ├── bin -> /home/shenye/shenyefuli/bin
│   │   │         ├── include -> /home/shenye/shenyefuli/include
│   │   │         └── lib -> /home/shenye/shenyefuli/lib
│   └── app  //Flask 程序目录
│   │           └──  app.py //主运行文件
│
│   ├── requirements.txt 
第六步: 配置 uwsgi 配置起动。我采用 .ini文件作为配置,在项目目录下创建一个 confg.ini 
(venv)my_flask root$ uwsgi config.ini
[uwsgi]

# uwsgi 启动时所使用的地址与端口
socket = 127.0.0.1:8001 

# 指向网站目录
chdir = /home/www/my_flask 

# python 启动程序文件
wsgi-file = app/app.py 

# python 程序内用以启动的 application 变量名
callable = app 

# 处理器数
processes = 4

# 线程数
threads = 2

#状态检测地址
stats = 127.0.0.1:9191
运行 uwsgi
 (venv)my_flask root$ uwsgi config.ini   

[uWSGI] getting INI configuration from config.ini   *** Starting uWSGI 2.0.8 (64bit) on [Fri Dec 19 14:34:11 2014] ***   // 此处略去那些无用的启动信息    *** Stats server enabled on 127.0.0.1:9191 fd: 15 *** 
OK, 此时已经正常启动 uwsgi 并将 Flask 项目载入其中了,ctrl+c 关闭程序。但这只是命令启动形式,要使其随同服务器启动并作为后台服务运行才是运营环境的实际所需要。因此接下来我们需要安装另一个工具来引导 uwsgi 。
第七步: 安装 Supervisor 可以同时启动多个应用,最重要的是,当某个应用Crash的时候,他可以自动重启该应用,保证可用性。
sudo apt-get install supervisor Supervisor 的全局的配置文件位置在: /etc/supervisor/supervisor.conf 正常情况下我们并不需要去对其作出任何的改动,只需要添加一个新的 *.conf 文件放在 /etc/supervisor/conf.d/ 下就可以(这里一定要设置conf.d的权限777先),那么我们就新建立一个用于启动 my_flask 项目的 uwsgi 的 supervisor 配置 (命名为:my_flask_supervisor.conf):
[program:my_flask]
# 启动命令入口
command=/home/www/my_flask/venv/bin/uwsgi /home/www/my_flask/config.ini

# 命令程序所在目录
directory=/home/www/my_flask
#运行命令的用户名
user=root
        
autostart=true
autorestart=true
#日志地址
stdout_logfile=/home/www/my_flask/logs/uwsgi_supervisor.log   

启动服务

sudo service supervisor start

终止服务

sudo service supervisor stop

第八步: 安装 Nginx 是轻量级、性能强、占用资源少,能很好的处理高并发的反向代理软件。

sudo apt-get install nginx

配置 Nginx

Ubuntu 上配置 Nginx 也是很简单,不要去改动默认的 nginx.conf 只需要将 /ext/nginx/sites-available/default 文件替换掉就可以了。(注意:设置 sites-available 文件夹权限777,删除default文件 然后重新传) 新建一个 default 文件:
 server {
      listen  80;
      server_name XXX.XXX.XXX; #公网地址
    
      location / {
        include      uwsgi_params;
        uwsgi_pass   127.0.0.1:8001;  # 指向uwsgi 所应用的内部地址,所有请求将转发给uwsgi 处理
        uwsgi_param UWSGI_PYHOME /home/www/my_flask/venv; # 指向虚拟环境目录
        uwsgi_param UWSGI_CHDIR  /home/www/my_flask; # 指向网站根目录
        uwsgi_param UWSGI_SCRIPT manage:app; # 指定启动程序
      }
    }
将default配置文件替换掉就大功告成了! 还有,更改配置还需要记得重启一下nginx:

sudo service nginx restart

=============================================================== 最后总结。都设置完后,重新运行一下 uwsgi    应该就可以了,然后打开你的网站IP地址就可以看到网站效果了。如果出现什么错误,记得检查一下,flask所依赖的那些第三方插件是否都安装上了

发表评论

邮箱地址不会被公开。 必填项已用*标注