前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Flask+Nginx博客容器化部署

Flask+Nginx博客容器化部署

作者头像
岂不美哉Frost
发布2019-11-30 14:49:40
6570
发布2019-11-30 14:49:40
举报
文章被收录于专栏:Frost's BlogFrost's Blog

我是一个爱折腾的人,2016年才开始学会自建博客,到现在博文没写多少篇却折腾了好几回。经历了Hexo+GitHub Page,再到Flask+Heroku,现在终于用上了国内云服务+Nginx,感觉速度快了很多。总结起来,使用Flask+Nginx,好处有以下几个方面:

  • 可DIY程度高,现在我用的自己开发的Markdown引擎,非常方便扩展,在此推荐一下:Marko
  • 依靠Nginx强大的反向代理,现在我终于不用到处存图片然后贴一个巨长的URL了,直接映射到/images/下,干净整洁。
  • HTTPS支持,可以用云服务购买的免费证书,也可以用Letsencrypt,甚至可以用自签名证书。

我之前部署Flask的网站一直都用的virtualenv,现在既然切到云服务器,就干脆换成用Docker了,隔离化程度更高,我也可以用现在最新版本的Python了。博客系统可拆分为三个部分:

  • Flask应用,负责处理请求,是系统的核心
  • 数据库
  • Nginx服务器

三个部分分别独立为一个容器。从一个全新的云服务器开始(以Ubuntu Server 16.04.1为例,其余系统类似),部署步骤如下:

0x00 添加用户

使用一个非root的用户是一个好习惯,需要自己添加:

代码语言:javascript
复制
# adduser fming
# echo "fming   ALL=(ALL:ALL) NOPASSWD: ALL" >> /etc/sudoers

然后切换到fming用户登录

0x01 安装Docker

代码语言:javascript
复制
$ curl -fsSL https://get.docker.com -o get-docker.sh
$ sudo sh get-docker.sh

此脚本将自动将Docker CE安装到系统上,若安装失败,可尝试其他安装方法。安装完成后,需添加当前用户到docker组:

代码语言:javascript
复制
$ sudo usermod -aG docker $USER

0x02 安装Docker-compose

Docker-compose是一款Docker的工具,它能让你高效管理多个容器,否则需要加一大堆选项到Docker命令后。它同样提供了一个一键安装脚本(其他安装方法):

代码语言:javascript
复制
sudo curl -L "https://github.com/docker/compose/releases/download/1.22.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

0x03 创建本地环境配置

在代码根目录下(与docker-compose.yml同级)创建.env文件,主要是数据库相关的环境变量:

代码语言:javascript
复制
POSTGRES_USER=xxx
POSTGRES_PASSWORD=xxx
POSTGRES_DB=flog_db
DB_SERVICE=db
DATABASE_URL=postgresql+psycopg2://xxx:xxx@db:5432/flog_db

使用db就可以指代数据库容器的服务地址了。

注意:.env./nginx/cert(证书目录)不可提交到版本控制平台上。

0x04配置数据库

参考阮一峰的文章,讲得很清楚了。

0x05 构建静态文件

博客的后台部分用到了Vue.js + ElementUI,需要构建静态文件,使用起来也很简单:

Bash

代码语言:javascript
复制
$ cd static
$ npm i
$ npm run build:prod

0x06 Nginx配置

在上一节的配置中可以看到我把Nginx的配置文件映射到了./nginx/conf.d/default.conf中。

主站

Nginx

代码语言:javascript
复制
location / {
	proxy_pass http://web:5000;
	proxy_set_header Host $host;
	proxy_set_header X-Real-IP $remote_addr;
	proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

配置静态文件缓存

Nginx

代码语言:javascript
复制
proxy_temp_path /tmp/temp_dir;
proxy_cache_path /tmp/cache levels=1:2 keys_zone=mycache:100m inactive=1d max_size=10g;
server {
...
location /static {
	alias /opt/static;
	proxy_set_header Host $host;
	proxy_cache mycache;
	expires 30d;
}

我之前已经把静态文件映射到Nginx容器中的/opt/static了。

映射图床地址

Nginx

代码语言:javascript
复制
location ^~ /images/ {
	proxy_pass https://frostming-tencent-1252779928.cos.ap-guangzhou.myqcloud.com/;
	proxy_cache mycache;
}

这样,只要访问yourdomain.com/images/image1.jpg就能转到https://frostming-tencent-1252779928.cos.ap-guangzhou.myqcloud.com/image1.jpg了,注意location处/images/的斜杠不可缺少。

0x07 启动容器

好了,万事俱备,现在可以启动容器了!转到仓库所在目录:

代码语言:javascript
复制
docker-compose up --build -d

拉取镜像,构建镜像,启动容器,一条命令足矣!一切都没有问题的话,你的网站已经跑起来了。

请参考此博客的GitHub获取完整配置

0x08 更新博客

Flog加入新特性,想引入到你的网站中?没问题,that's easy。但分两种情况:

  1. 引入新的依赖包,也就是Pipfile, Pipfile.lock有变化,需要重新构建镜像 Bash $ docker-compose build web $ make restart
  2. 其他更新,只需要: Bash $ make restart

当然,要更新,需要把更新的文件同步到你的云服务器上。根目录下的Makefile还包括一些常用的命令,可以仿照改写一下。

0x09 HTTPS!

最近我的阿里的免费证书到期,寻思着换到LetsEncrypt, LetsEncrypt有以下几个好处:

  1. 个人免费
  2. 有效期虽只有3个月但可以通过工具自动更新证书,这样就能做到永久免费证书

官方网站提供了接入指引,非常便捷。但得益于容器化的好处,这些安装、接入步骤全都能省略!我把.docker-compose.ymlnginx容器的镜像从nginx改成了really/nginx-certbot,这个镜像甚至包括了自动每天更新证书的功能,我已经把改好后的上传到了GitHub,clone下来了就能用。只需要第一次部署后在云服务器上执行:

Bash

代码语言:javascript
复制
$ docker-compose exec nginx certbot --nginx

然后按照指引一步步填好信息就行了。以后部署不需要执行此步骤。现在,你的博客已经启用HTTPS了,地址栏前面会出现一个锁标志,可以到Qualys SSL Labs检测你的网站安全分数。

我的是A+
我的是A+
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-09-11T,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 0x00 添加用户
  • 0x01 安装Docker
  • 0x02 安装Docker-compose
  • 0x03 创建本地环境配置
  • 0x04配置数据库
  • 0x05 构建静态文件
  • 0x06 Nginx配置
    • 主站
      • 配置静态文件缓存
        • 映射图床地址
        • 0x07 启动容器
        • 0x08 更新博客
        • 0x09 HTTPS!
        相关产品与服务
        容器服务
        腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档