说明

  • 操作系统:Windows 10
  • Python 版本:3.7x
  • 虚拟环境管理器:virtualenv
  • 代码编辑器:VS Code

实验目标

通过 Windows 的 WSL,将我们的项目网站部署到 Ubuntu 16.04 上面

操作

运行环境搭建

打开 WSL,执行下述操作

  • 安装 Python3 pip3 以及虚拟环境管理工具 virtualenv
  1. sudo apt-get install python3
  2. sudo apt-get install python3-pip
  3. pip3 install virtualenv
  • 安装并启动 Mysql

安装完成之后需要进入 Mysql 的 Shell 中创建我们程序需要实验的的数据库 todo

略,具体可参考:Flask 系列之 SQLAlchemy

  • 安装并启动 Nginx
  1. # 安装并启动 Nginx
  2. sudo apt-get install nginx
  3. sudo service nginx start
  4. sudo service nginx stop

注:执行完毕后可尝试访问:http://127.0.0.1, 看是否正常。

代码打包与上传


  1. pip freeze > requirements.txt
  2. cp -R /mnt/c/Users/hippieZhou/Desktop/Flask_todolist /home/hippie/todolist
  3. cd /home/hippie/todolist
  4. # 创建虚拟环境
  5. python -m virtualenv venv
  6. # 激活虚拟环境
  7. source venv/bin/activate
  8. # 安装项目依赖包
  9. pip3 install -r requirements.txt
  10. # 测试网站是否能正常初始化和运行
  11. flask initdb
  12. flask admin
  13. flask run

上传代码之前可以先将我们现有的虚拟环境对于的文件目录 venv 删除掉,因为我们之前的虚拟环境是基于 Windows 创建的,在 Ubuntu 不适用,需要重新创建。

使用 gunicorn

进入当前项目的虚拟环境执行下述操作

  1. # 安装
  2. pip install gunicorn
  3. # 查看帮助
  4. gunicorn -h
  5. # 直接运行
  6. gunicorn 运行文件名称:Flask 程序实例名
  7. # 测试运行
  8. # -w 4 :以 4 个进程来启动
  9. # -b 127.0.0.1:5000 :绑定到本地的 127.0.0.1:5000 来运行
  10. # -D :以守护进程的方式运行
  11. # --access-logfile ./logs/log :将当前访问的日志信息记录到当前目录下的 logs/log 文件中,注:logs 文件夹需要提前创建
  12. # manage:app :manage 代表入口函数对应的文件名称;app 为 Flask 对象
  13. gunicorn -w 4 -b 127.0.0.1:5000 -D --access-logfile ./logs/log manage:app
  14. # 查看当前运行的后台进程, 通过此方法可查询到有 5 个进程,其中一个是主进程,另外 4 个是子进程
  15. ps aux | grep gunicorn
  16. # 通过上述命令查看主进程的 pid 退出该后台进程
  17. kill -9 pid

配置 Nginx

  1. # 备份 Nginx 的原始配置文件
  2. sudo cp /etc/nginx/sites-available/default /etc/nginx/sites-available/default.bak
  3. # 编辑我们的网站对应的配置文件
  4. sudo vim /etc/nginx/sites-available/default
  5. # 配置完成之后执行下述操作检查配置是否正常
  6. sudo nginx -t
  7. # 重启 Nginx
  8. sudo service nginx restart

Nginx 的配置如下所示:

  1. server {
  2. listen 80;
  3. server_name hippiezhou.fun *.hippiezhou.fun;
  4. access_log /var/log/nginx/access.log;
  5. error_log /var/log/nginx/error.log;
  6. location / {
  7. proxy_pass http://127.0.0.1:5000/; #此处和你gunicore的ip和端口一致
  8. proxy_redirect off;
  9. proxy_set_header Host $host;
  10. proxy_set_header X-Real-IP $remote_addr;
  11. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  12. proxy_set_header X-Forwarded-Proto $scheme;
  13. }
  14. }

基于最简配置原则,我们只需修改第一个 server 中的 location 结点,并且需要屏蔽掉里面的 try_files 字段即可。

此时,如果之前我们的网站已经通过 gunicorn 运行着的话,那么我们重启一下我们的 Nginx 服务,即可通过 127.0.0.1 访问我们的网站了。

Nginx 对应的错误日志位于 /var/log/nginx 目录下,通过查看相关日志可以排查问题。

配置 HTTPS

登陆到远程服务器上,执行下述 bash 操作:

  1. sudo apt-get update
  2. sudo apt-get install software-properties-common
  3. sudo add-apt-repository universe
  4. sudo add-apt-repository ppa:certbot/certbot
  5. sudo apt-get update
  6. sudo apt-get install certbot python-certbot-nginx
  7. sudo certbot --nginx
  8. # sudo certbot renew --dry-run
  9. sudo ufw allow https
  10. sudo systemctl restart nginx

修改之后的 Nginx 配置如下图所示:

使用 crontab 定期更新证书

  1. # 每个月凌晨 0:0:0 更新证书
  2. crontab 0 0 1 * * /usr/bin/certbot renew --force-renewal
  3. # 每个月凌晨 0:0:5 更新 Nginx
  4. crontab 5 0 1 * * /usr/sbin/service nginx restart

注:crontab 中有六个字段,其含义如下:

  • 第1个字段:分钟 (0-59)
  • 第2个字段:小时 (0-23)
  • 第3个字段:日期 (1-31)
  • 第4个字段:月份 (1-12 [12 代表 December])
  • 第5个字段:一周当中的某天 (0-7 [7 或 0 代表星期天])
  • /path/to/command – 计划执行的脚本或命令的名称

相关参考

Flask 系列之 部署发布的更多相关文章

  1. 运维与自动化系列④自动化部署基础与git

    运维与自动化系列④自动化部署基础与git 自动化部署基础与git 一:上一篇的代码是保存在本地,但是在生产环境当中是由版本控制进行代码管理,以便于发布代码和回滚,一般是使用gitlib比较多,另外还有 ...

  2. Git系列②之部署企业级开源仓库gitlab服务器

    Git系列②之部署企业级开源仓库gitlab服务器 上一篇我们介绍了github的常见使用方法,下面开始部署本地开源仓库gitlab GitLab 是一个用于仓库管理系统的开源项目. 1.安装配置gi ...

  3. 【Python】Flask系列-URL和视图笔记

    1.学习目标 熟悉Flask相关知识. 熟悉web开发流程. 能独立开发Flask项目. 2.环境配置 Python虚拟环境安装 因为python的框架更新迭代太快了,有时候需要在电脑上存在一个框架的 ...

  4. Flask容器化部署原理与实现

    本文将介绍Flask的部署方案:Flask + Nginx + uWSGI,并使用docker进行容器化部署,部署的实例来源 Flask开发初探,操作系统为ubuntu. Flask系列文章: Fla ...

  5. Maven-008-Nexus 私服部署发布报错 Failed to deploy artifacts: Failed to transfer file: ... Return code is: 4XX, ReasonPhrase: ... 解决方案

    我在部署构件至 maven nexus 私服时,有时会出现 Failed to deploy artifacts: Failed to transfer file: ... Return code i ...

  6. QT程序在windows下部署发布

    转载:http://www.cnblogs.com/Fan_Fan/archive/2010/05/29/1746860.html QT程序在windows下部署发布 以下包括了部分网上收集的,以及q ...

  7. Tomcat部署发布JSP应用程序的三种方法 (转)

    Tomcat部署发布JSP应用程序的三种方法     1.直接放到Webapps目录下      Tomcat的Webapps目录是Tomcat默认的应用目录,当服务器启动时,会加载所有这个目录下的应 ...

  8. 【IDEA】【2】创建Maven项目及部署发布

    正文: 1,我参考的文档1已经比较全面了,需要注意的是界面可能有点不一样,有些地方需要自己注意一下 2,project和model的概念:挺困扰人的,我目前没有多模块开发,开发多个项目的时候是开了多个 ...

  9. 关于在windows下部署发布QT程序的总结

    原文请看:http://www.cnblogs.com/javaexam2/archive/2011/05/18/2632916.html 关于在windows下部署发布QT程序的总结 2008-06 ...

随机推荐

  1. Meltdown Attack

    1. 引言 2018年1月3日,Google Project Zero(GPZ)团队安全研究员Jann Horn在其团队博客中爆出CPU芯片的两组漏洞,分别是Meltdown与Spectre. Mel ...

  2. nova vnc proxy基本原理

    先上图 VNC Proxy的功能: 将公网(public network)和私网(private network)隔离 VNC client运行在公网上,VNCServer运行在私网上,VNC Pro ...

  3. [WEB]绕过安全狗与360PHP一句话的编写

    00x01安全狗的确是让人很头痛,尤其是在上传一句话或者写入一句话的时候,会被安全狗拦截从而拿不下shell.当然,安全狗是最简单的一款waf,很容易就进行一个绕过.00x02对于绕过安全狗跟360, ...

  4. [Swift]LeetCode171. Excel表列序号 | Excel Sheet Column Number

    Given a column title as appear in an Excel sheet, return its corresponding column number. For exampl ...

  5. [Swift]LeetCode388. 文件的最长绝对路径 | Longest Absolute File Path

    Suppose we abstract our file system by a string in the following manner: The string "dir\n\tsub ...

  6. [Swift]LeetCode826. 安排工作以达到最大收益 | Most Profit Assigning Work

    We have jobs: difficulty[i] is the difficulty of the ith job, and profit[i] is the profit of the ith ...

  7. Underscore.js 源码学习笔记(上)

    版本 Underscore.js 1.9.1 一共 1693 行.注释我就删了,太长了… 整体是一个 (function() {...}());  这样的东西,我们应该知道这是一个 IIFE(立即执行 ...

  8. BBS论坛(二十二)

    22.1.七牛js上传轮播图图片 (1)common/zlqiniu.js 'use strict'; var zlqiniu = { 'setup': function (args) { var d ...

  9. css实现超出文本省略号的两个方法

    方法一:适用于定宽高; <!DOCTYPE html> <html> <head lang="en"> <meta charset=&qu ...

  10. SpringCloud中使用Hystrix

    1.  引言 一般而言,一个服务都是部署了多台机器的,那么在这种情况下,当其中一个服务挂了以后Hystrix是怎么处理的呢? 为了验证这个问题,我们准备两个服务:user-api 和 app-gate ...