首页 > Python基础教程 >
-
带你认识 flask linux 部署(2)
06
安装基础依赖
如果你遵循了我的建议并配置了Ubuntu 16.04发行版的服务器,那么你的系统完全支持Python 3.5,因此这是我将用于部署的Python版本
基础的Python解释器可能已经预先安装在你的服务器上,但有一些额外的软件包可能却没有,而且Python之外还有一些其他软件包可用于创建健壮的生产环境部署。对于数据库服务器,我将从SQLite切换到MySQL。Postfix包是一个邮件传输代理,我将用它来发送电子邮件。Supervisor工具将监视Flask服务器进程,并在其崩溃时自动重启,并当Supervisor服务重启后自动启动其监视的服务。Nginx服务器将接受来自外部世界的所有请求,并将它们转发给应用程序。最后,我将使用git来从git仓库下载应用程序
$ sudo apt-get -y update
$ sudo apt-get -y install python3 python3-venv python3-dev
$ sudo apt-get -y install mysql-server postfix supervisor nginx git
这些安装大部分是无人值守的,但是在运行第三条安装语句到一定进度时,系统会提示你为MySQL服务选择一个root密码,并且还会询问关于安装postfix软件包的一些问题,你可以接受他们的默认答案。
请注意,对于此部署,我选择不安装Elasticsearch。这项服务需要大量的RAM,所以只有拥有超过2GB内存的大型服务器时才可以考虑。为了避免服务器内存不足的问题,我将停用搜索功能。如果你有高配的服务器,可以从Elasticsearch站点下载官方的.deb软件包,并按照其安装说明将其添加到你的服务器。请注意,Ubuntu 16.04软件包存储库中提供的Elasticsearch软件包太旧,无法运行,你需要6.x或更高版本。
我还注意到,默认安装的postfix可能不足以在生产环境中发送电子邮件。为了避免垃圾邮件和恶意邮件,很多服务器都要求发件人服务器通过安全扩展标识自己,这意味着至少你必须拥有与你的服务器相关联的域名。如果你想了解如何完全配置电子邮件服务器以使其通过标准安全测试,请参阅以下Digital Ocean的指南:
-
Postfix Configuration
-
Adding an SPF Record
-
DKIM Installation and Configuration
07
安装应用
现在我要使用git
从我的GitHub代码库下载Microblog源代码。如果你不熟悉git源码控制,我建议你阅读git for beginners。
要将应用下载到服务器,请确保你位于ubuntu
用户的主目录中,然后运行:
$ git clone https://github.com/miguelgrinberg/microblog
$ cd microblog
$ git checkout v0.17
这会将代码克隆到你的服务器上,并将其同步到本章的内容。如果你在学习本教程的过程中维护了自己的git代码库,则可以将代码库URL更改为你的URL,在这种情况下,你可以跳过git checkout
命令。
现在我需要创建一个虚拟环境并使用所有的包依赖项来填充它,在第十五章中,我已将依赖包的列表保存到requirements.txt文件中:
$ python3 -m venv venv
$ source venv/bin/activate
(venv) $ pip install -r requirements.txt
除了requirements.txt中的包之外,我还将使用此生产部署指定的两个包,因此它们不包含在requirements.txt文件中。 gunicorn
软件包是Python应用程序的生产Web服务器。 pymysql
软件包包含MySQL驱动程序,它使SQLAlchemy能够与MySQL数据库一起工作:
(venv) $ pip install gunicorn pymysql
我需要创建一个 .env 文件,其中包含所有需要的环境变量:
/home/ubuntu/microblog/.env:环境配置
SECRET_KEY=52cb883e323b48d78a0a36e8e951ba4a
MAIL_SERVER=localhost
MAIL_PORT=25
DATABASE_URL=mysql+pymysql://microblog:<db-password>@localhost:3306/microblog
MS_TRANSLATOR_KEY=<your-translator-key-here>
这个 .env 文件与我在第十五章展示的非常类似,但是我为SECRET_KEY使用了一个随机字符串。为了生成这个随机字符串,我使用了下面的命令:
python3 -c "import uuid; print(uuid.uuid4().hex)
对于DATABASE_URL
变量,我定义了一个MySQL URL。我将在下一节中向你介绍如何配置数据库。
我需要将FLASK_APP
环境变量设置为应用程序的入口点以启用flask
命令,但在解析 .env 文件之前需要此变量,因此需要手动设置。为避免每次都设置它,我把它添加到ubuntu
帐户的 ~/.profile 文件的底部,以便每次登录时自动设置它:
$ echo "export FLASK_APP=microblog.py" >> ~/.profile
如果你注销并重新登录,现在FLASK_APP
就已经设置好了。你可以通过运行flask --help
来确认它是否已经设置好了。如果帮助信息显示应用程序已添加的translate
命令,那么你就知道应用程序已被找到。
现在flask
命令是有效的,我可以编译语言翻译:
(venv) $ flask translate compile
08
设置 MySQL
我在开发过程中使用过的sqlite数据库非常适合简单的应用程序,但是当部署可能需要一次处理多个请求的健壮Web服务器时,最好使用更强大的数据库。出于这个原因,我要建立一个名为'microblog'的MySQL数据库。
要管理数据库服务器,我将使用mysql
命令,该命令应该已经安装在你的服务器上:
$ mysql -u root -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 6
Server version: 5.7.19-0ubuntu0.16.04.1 (Ubuntu)
Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
请注意,你需要键入你在安装MySQL时选择的MySQL root密码才能访问MySQL命令提示符。
这些是创建名为microblog
的新数据库的命令,以及具有完全访问权限的同名用户:
mysql> create database microblog character set utf8 collate utf8_bin;
mysql> create user 'microblog'@'localhost' identified by '<db-password>';
mysql> grant all privileges on microblog.* to 'microblog'@'localhost';
mysql> flush privileges;
mysql> quit;
你将需要用你选择的密码来替换<db-password>
。这将是microblog
数据库用户的密码,所以不要使用你已为root用户选择的密码。 microblog
用户的密码需要与你包含在 .env 文件中的DATABASE_URL
变量中的密码相匹配。
如果你的数据库配置是正确的,你现在应该能够运行数据库迁移以创建所有的表:
(venv) $ flask db upgrade
继续下一步之前,确保上述命令成功完成且不会产生任何错误
09
设置 gunicorn 和 supervisor
当你使用flask run
运行服务器时,正在使用的是Flask附带的Web服务器。该服务器在开发过程中非常有用,但它不适合用于生产服务器,因为它不考虑性能和稳健性。取而代之,我决定使用gunicorn,它是一个纯粹的Python Web服务器,但与Flask不同,它是一个支持高并发的强大生产服务器,同时它也非常容易使用。
要在gunicorn下启动Microblog,你可以使用以下命令:
(venv) $ gunicorn -b localhost:8000 -w 4 microblog:app
-b
选项告诉gunicorn在哪里监听请求,我在8000端口上监听了内部网络接口。在没有外部访问的情况下运行Python Web应用程序通常是一个好主意,然后还需要一个非常快速的Web服务器,它可以优化来自客户端的所有静态文件的请求。这个快速的Web服务器将直接提供静态文件,并将用于应用程序的任何请求转发到内部服务器。我将在下一节中向你展示如何将nginx设置为面向公众的服务器。
-w
选项配置gunicorn将运行多少worker。拥有四个进程可以让应用程序同时处理多达四个客户端,这对于Web应用程序通常足以处理大量客户端请求,因为并非所有客户端都在不断请求内容。根据服务器的RAM大小,你可能需要调整worker数量,以免内存不足。
microblog:app
参数告诉gunicorn如何加载应用程序实例。冒号前的名称是包含应用程序的模块,冒号后面的名称是此应用程序的名称。
虽然gunicorn的设置非常简单,但从命令行运行服务器在生产服务器实际上不是一个恰当的方案。我想要做的是让服务器在后台运行,并持续监视,因为如果由于某种原因导致服务器崩溃并退出,我想确保新的服务器自动启动以取代它。而且我还想确保如果机器重新启动,服务器在启动时自动运行,而无需人工登录和启动。我将使用上面安装的supervisor包来执行此操作。
Supervisor使用配置文件定义它要监视什么程序以及如何在必要时重新启动它们。配置文件必须存储在 /etc/supervisor/conf.d 中。这是Microblog的配置文件,我将其称为microblog.conf:
/etc/supervisor/conf.d/microblog.conf:Supervisor配置