首页 > Python基础教程 >
-
带你认识 flask linux 部署(3)
[program:microblog]
command=/home/ubuntu/microblog/venv/bin/gunicorn -b localhost:8000 -w 4 microblog:app
directory=/home/ubuntu/microblog
user=ubuntu
autostart=true
autorestart=true
stopasgroup=true
killasgroup=true
command
,directory
和user
设置告诉supervisor如何运行应用程序。如果计算机启动或崩溃,autostart
和autorestart
设置会使microblog自动重新启动。 stopasgroup
和killasgroup
选项确保当supervisor需要停止应用程序来重新启动它时,它仍然会调度成顶级gunicorn进程的子进程。
编写此配置文件后,必须重载supervisor服务的配置才能导入它:
$ sudo supervisorctl reload
像这样,这个gunicorn web服务器就已经启动和运行,并处于监控之中!
10
设置 nginx
由gunicorn启动的microblog应用服务器现在运行在本地端口8000。我现在需要做的是将应用程序暴露给外部世界,为了使面向公众的web服务器能够被访问,我在防火墙上打开了两个端口(80和443)来处理应用程序的Web通信。
我希望这是一个安全的部署,所以我要配置端口80将所有流量转发到将要加密的端口443。我将首先创建一个SSL证书。创建一个自签名SSL证书,这对于测试是可以的,但对于真正的部署不太好,因为Web浏览器会警告用户,证书不是由可信证书颁发机构颁发的。创建microblog的SSL证书的命令是:
$ mkdir certs
$ openssl req -new -newkey rsa:4096 -days 365 -nodes -x509 \
-keyout certs/key.pem -out certs/cert.pem
该命令将要求你提供关于应用程序和你自己的一些信息。这些信息将包含在SSL证书中,如果用户请求查看它,Web浏览器则会向用户显示它们。上述命令的结果将是名为key.pem和cert.pem的两个文件,我将其放置在Microblog根目录的certs子目录中。
要有一个由nginx服务的网站,你需要为它编写配置文件。在大多数nginx安装中,这个文件需要位于 /etc/nginx/sites-enabled 目录中。Nginx在这个位置安装了一个我不需要的测试站点,所以我将首先删除它:
$ sudo rm /etc/nginx/sites-enabled/default
下面你可以看到Microblog的nginx配置文件,它在 /etc/nginx/sites-enabled/microblog 中:
/etc/nginx/sites-enabled/microblog:Nginx配置
server {
# listen on port 80 (http)
listen 80;
server_name _;
location / {
# redirect any requests to the same URL but on https
return 301 https://$host$request_uri;
}
}
server {
# listen on port 443 (https)
listen 443 ssl;
server_name _;
# location of the self-signed SSL certificate
ssl_certificate /home/ubuntu/microblog/certs/cert.pem;
ssl_certificate_key /home/ubuntu/microblog/certs/key.pem;
# write access and error logs to /var/log
access_log /var/log/microblog_access.log;
error_log /var/log/microblog_error.log;
location / {
# forward application requests to the gunicorn server
proxy_pass http://localhost:8000;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
location /static {
# handle static files directly, without forwarding to the application
alias /home/ubuntu/microblog/static;
expires 30d;
}
}
Nginx的配置不易理解,但我添加了一些注释,至少你可以知道每个部分的功能。如果你想获得关于特定指令的信息,请参阅nginx官方文档。
添加此文件后,你需要告诉nginx重新加载配置以激活它:
$ sudo service nginx reload
现在应用程序应该部署成功了。在你的Web浏览器中,可以键入服务器的IP地址(如果使用的是Vagrant VM,则为192.168.33.10),然后该服务器将连接到应用程序。由于你使用的是自签名证书,因此将收到来自Web浏览器的警告,你必须解除该警告。
使用上述说明为自己的项目完成部署之后,我强烈建议你将自签名证书替换为真实的证书,以便浏览器不会在用户访问你的网站时发出警告。为此,你首先需要购买域名并将其配置为指向你的服务器的IP地址。一旦你有一个域名,你可以申请一个免费的Let's Encrypt SSL证书。我在博客上写了一篇关于如何通过HTTPS运行你的Flask应用程序的详细文章
11
部署应用更新
我想讨论的基于Linux的部署的最后一个主题是如何处理应用程序升级。应用程序源代码通过git
安装在服务器中,因此,无论何时想要将应用程序升级到最新版本,都可以运行git pull
来下载自上次部署以来的新提交。
当然,下载新版本的代码不会导致升级。当前正在运行的服务器进程将继续运行,旧代码已被读取并存储在内存中。要触发升级,你必须停止当前的服务器并启动一个新的服务器,以强制重新读取所有代码。
进行升级通常比重新启动服务器更为复杂。你可能需要应用数据库迁移或编译新的语言翻译,因此实际上,执行升级的过程涉及一系列命令:
(venv) $ git pull # download the new version
(venv) $ sudo supervisorctl stop microblog # stop the current server
(venv) $ flask db upgrade # upgrade the database
(venv) $ flask translate compile # upgrade the translations
(venv) $ sudo supervisorctl start microblog # start a new server
12
树莓派托管
树莓派是一款革命性低成本的小型Linux计算机,功耗非常低,因此它是托管家庭在线服务器的理想设备,可以全天候在线而无需捆绑你的台式电脑或笔记本电脑。 有几个Linux发行版可以在树莓派上运行。 我的选择是Raspbian,这是树莓派基金会的官方发行版。
为了准备树莓派的环境,我要安装一个新的Raspbian版本。 我将使用2017年9月版的Raspbian Stretch Lite,但在阅读本文时,可能会有更新的版本,请查看官方下载页面获得最新版本。
Raspbian镜像需要安装在SD卡上,然后插入树莓派,以便它启动时可以识别到。 在树莓派站点上可以查看到从Windows,Mac OS X和Linux将Raspbian镜像复制到SD卡的方法。
当你第一次启动树莓派时,请在连接到键盘和显示器时进行操作,以便你可以进行设置。 至少应该启用SSH,以便你可以从计算机登录并方便地执行部署任务。
和Ubuntu一样,Raspbian也是Debian的衍生产品,所以上面针对的Ubuntu Linux的说明,大部分都可以在树莓派上生效。 但是,如果你计划在家庭网络上运行小型应用程序而无需外部访问时,则可以跳过某些步骤。 例如,你可能不需要防火墙或无密码登录。 你可能想在这样一台小型的计算机上使用SQLite而不是MySQL。 你可以选择不使用nginx,并且让gunicorn服务器直接监听来自客户端的请求。 你可能只想要一个gunicorn worker进程。 Supervisor服务对于确保应用程序始终处于运行状态非常有用,因此我建议你仍然在树莓派上使用它