在阿里云部署 Flask 应用

在阿里云部署 Flask 应用

本文简单记录在阿里云部署 Flask 应用的过程。由于我的应用是业余的,Demo 性质的(在简书中有说明过初衷),很多操作也是现搜现用,怎么方便怎么来,所以并不适合真正的生产要求。这更有点像是知乎问题“自己拥有一台服务器可以做哪些很酷的事情?”的一个稍稍跑题的回答吧。

云服务器购买

双十二时以 1 折(¥799.00/3年起)购买了一台ECS共享型n4服务器。操作系统选择了 ubuntu_18_04_64,因为 Ubuntu 比 CentOS 更适合“把玩”。

环境搭建

前期准备

  1. 安装本地 SSH 客户端

我本地是 Windows 系统,可以选择的有 SecureCRT,Putty,Bitvise SSH 等。最后我选择的是 Bitvise SSH,个人用户免费,界面也友好。可以在官网下载(速度慢),也可以在 CSDN 资源下载

  1. 添加安全组规则

在阿里云控制台,添加“入方向”的安全组规则,端口范围:80/80,授权对象:0.0.0.0/0。这样才能通过 80 端口访问你的 Web 应用程序。

添加安全组规则

  1. 域名解析

我的域名也是在阿里云注册的,可以在域名控制台进行域名解析设置。主机记录填写“@”或“www”域名前缀,效果是“http://example.com/”或“http://www.example.com/”。记录值填写云服务器外网 IP。

域名解析配置

软件安装

在安装软件前,先通过 SSH 客户端连接到云服务器,更新系统软件源。没有通过更新系统软件源的话,可能无法通过apt install安装我们需要用到的软件 :

$ sudo apt update 
$ sudo apt upgrade

安装 Python 虚拟环境管理工具

Python 虚拟环境管理也有很多工具,如 pyenv + virtualenv/venv + virtualenvwrapper 等。我平时主要是在 Windows 下工作,习惯了 Anaconda,所以在服务器上也选择 Anaconda。但对于常规的 Python 开发来说,Anaconda 太重了,而且主要面向科学计算领域,但是精简版的 Miniconda 却是一个很好的 Python 版本和虚拟环境管理工具。可以根据官方文档Installing on Linux进行安装,不过在官网下载安装文件有可能很慢,在清华大学开源软件镜像站下载就快很多了。

安装 Gunicorn

在安装完 Miniconda 后创建 Python 虚拟环境,然后在虚拟环境中安装 Gunicorn:pip install gunicorn

安装 Nginx

除了源码编译,如果想方便,用简单的apt命令就可以安装了,apt install nginx,安装完毕可以用curl测试是否成功,curl IP,如果不是返回...Failed to connect to...字样的信息则是成功了。

安装 Supervisor

Supervisor 是一个进程管理工具,当进程中断的时候 Supervisor 能自动重新启动。同样可以用apt命令安装,apt install supervisor

应用部署

在安装完必须的软件后就可以开始正式部署了,首先上传应用文件到云服务器,可以直接 FTP 上传,也可以先上传到 GitHub,然后通过 git clone下载。然后安装应用依赖,进入 Python 虚拟环境执行命令:pip install -r requirements.txt

配置 Gunicorn

Gunicorn 支持以 Python 文件配置,更详细的配置可参考官方文档http://docs.gunicorn.org/en/stable/settings.html#settings,以下是我自己的配置,gconfig.py:

from gevent import monkey
monkey.patch_all()
import multiprocessing
debug = False
loglevel = 'debug'
bind = 'localhost:5002' # 绑定与Nginx通信的端口
pidfile = 'log/gunicorn.pid'
logfile = 'log/debug.log'
workers = multiprocessing.cpu_count() * 2 + 1 # 开启的进程数
worker_class = 'gevent' # worker 进程的工作方式
reload = True

配置 Nginx

先备份 /etc/nginx/sites-available/default 文件,修改为 default_old,然后再创建 default 文件。

mv default default_old
vim default

然后输入以下内容,这是我的配置具体根据实际情况不同修改,需要注意的是要和前面 Gunicorn 绑定的端口号要一致:

server {
        listen 80; 
        root /www/ebox001;
        server_name mfzxs.com;
        location / {
            proxy_set_header x-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header Host $http_host;
            proxy_pass http://localhost:5002/; # Gunicorn 绑定的端口号
        }
        # 配置static的静态文件:
        location ~ ^\/static\/.*$ {
            root /www/ebox001;
        }
}

修改配置文件后用nginx -t检查文件,最后重新加载配置文件nginx -s reload

配置 Supervisor

/etc/supervisor/conf.d/目录下创建控制进程的配置文件,并以.conf结尾,这样将会自动应用到主配置文件当中,创建后添加如下的配置内容,[program:ebox001]ebox001是进程名,gconfig.py是 Gunicorn 的配置文件:

[program:ebox001]
command=/www/ebox001/venv/bin/gunicorn -c /www/gconfig.py run:app
directory=/www/ebox001  //项目目录
user=root
autorestart=true //设置自动重启
startretries=3  //重启失败3次

保存配置文件之后,我们需要通过命令来更新配置文件:supervisorctl update,然后通过supervisorctl进行管理,start ebox001这时 Gunicorn 服务器应用就已经启动了。可以通过curl IP进行测试,或者直接在浏览器上输入域名访问,譬如我的应用是:http://www.mfzxs.com/news_at_zhihu

原域名为企业备案,现以迁移到个人备案站点 ebox001 :https://www.ebox001.com/news_at_zhihu 数据也放在了 GitHub 上,仓库地址:https://github.com/JeetChan/history_json_daily_zhihu

访问 Flask 应用

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章