title: flask项目部署到阿里云 ubuntu16.04

date: 2018.3.6

项目地址: 我的博客

部署思路参考: Flask Web开发》的个人部署版本,包含学习笔记。

开始之前

购买阿里云ecs一周版, 参考

购买万网域名(也是阿里家的)

过程:

  1. # apt update
  2. # apt upgrade
  3. # apt install python-virtualenv
  4. # apt install nginx git

下载源码:

  1. # git clone 我的博客源码地址 && cd 目录

创建虚拟环境(出现问题, 重新ssh后解决?):

  1. # virtualenv venv
  2. ...
  3. return _setlocale(category, locale)
  4. locale.Error: unsupported locale setting
  5. ----------------------------------------
  6. ...Installing setuptools, pkg_resources, pip, wheel...done.
  7. ...
  8. OSError: Command /root/myFlasky/venv/bin/python2 - setuptools pkg_resources pip wheel failed with error code 1
  9. # 解决locale.Error:
  10. locale-gen en_US en_US.UTF-8
  11. dpkg-reconfigure locales
  12. # 之后勾选 all 和 en_US.UTF-8

尝试:

  1. apt-get purge python-virtualenv python3-virtualenv virtualenv
  2. pip install --upgrade pip
  3. pip install virtualenv
  4. # 再次创建venv环境出现:
  5. setuptools pkg_resources pip wheel failed with error code 2
  6. # 原因, ssh超时后重新连接未发现出错:
  7. `HTTPError: 404 Client Error: Not Found for url: `
  8. File "/root/myFlasky/venv/share/python-wheels/requests-2.9.1-py2.py3-none-any.whl/requests/models.py", line 840, in raise_for_status
  9. raise HTTPError(http_error_msg, response=self)
  10. HTTPError: 404 Client Error: Not Found for url: http://mirrors.aliyun.com/pypi/simple/pkg-resources/

激活环境,安装mysql并设置编码为utf8:

  1. # source venv/bin/activate
  2. (venv) # apt install mysql-server mysql-client python-mysqldb libmysqlclient-dev
  3. (venv) # mysql -uroot -p
  4. mysql> show variables like "%character%";
  5. +--------------------------+----------------------------+
  6. | Variable_name | Value |
  7. +--------------------------+----------------------------+
  8. | character_set_client | utf8 |
  9. | character_set_connection | utf8 |
  10. | character_set_database | latin1 |
  11. | character_set_filesystem | binary |
  12. | character_set_results | utf8 |
  13. | character_set_server | latin1 |
  14. | character_set_system | utf8 |
  15. | character_sets_dir | /usr/share/mysql/charsets/ |
  16. +--------------------------+----------------------------+
  17. 8 rows in set (0.01 sec)
  18. mysql> quit
  19. Bye
  20. (venv) # vim /etc/mysql/mysql.conf.d/mysqld.cnf
  21. # 来源:https://www.douban.com/note/602158227/
  22. # 在 [mysqld] 域下加上:character-set-server=utf8
  23. # 重新启动MySQL服务
  24. (venv) # systemctl restart mysql
  25. (venv) # mysql -uroot -p
  26. mysql> show variables like "%character%";
  27. +--------------------------+----------------------------+
  28. | Variable_name | Value |
  29. +--------------------------+----------------------------+
  30. | character_set_client | utf8 |
  31. | character_set_connection | utf8 |
  32. | character_set_database | utf8 |
  33. | character_set_filesystem | binary |
  34. | character_set_results | utf8 |
  35. | character_set_server | utf8 |
  36. | character_set_system | utf8 |
  37. | character_sets_dir | /usr/share/mysql/charsets/ |
  38. +--------------------------+----------------------------+
  39. 8 rows in set (0.00 sec)
  40. mysql>

使用(venv) # pip install -r requirements.txt安装运行环境

  1. EnvironmentError: mysql_config not found
  2. ----------------------------------------
  3. Command "python setup.py egg_info" failed with error code 1 in /tmp/pip-build-Z_FMKV/MySQL-python/
  4. # 安装mysql见上
  5. build/temp.linux-x86_64-2.7/_openssl.c:501:25: fatal error: openssl/aes.h: No such file or directory
  6. compilation terminated.
  7. error: command 'x86_64-linux-gnu-gcc' failed with exit status 1
  8. # To fix this problem, you have to install OpenSSL development package
  9. 命令: # apt install libssl-dev
  10. sql.h: No such file or directory
  11. compilation terminated.
  12. error: command 'x86_64-linux-gnu-gcc' failed with exit status 1
  13. # apt install unixodbc unixodbc-dev
  14. sqlite3.h: No such file or directory
  15. compilation terminated.
  16. error: command 'x86_64-linux-gnu-gcc' failed with exit status 1
  17. # apt install libsqlite3-dev

创建数据库, CHARACTER SET 'utf8'COLLATE 'utf8_general_ci'是为了防止中文乱码:

  1. # mysql -uroot -p
  2. mysql> CREATE DATABASE blogdata
  3. -> CHARACTER SET 'utf8'
  4. -> COLLATE 'utf8_general_ci';
  5. Query OK, 1 row affected (0.00 sec)
  6. mysql> quit

配置环境变量:

  1. (venv) # vim ~/os_environ.sh
  2. #! /bin/bash
  3. echo 'start!'
  4. unset MAIL_SERVER MAIL_USERNAME MAIL_PASSWORD BLOG_ADMIN BLOG_MAIL_SENDER
  5. echo 'clean!'
  6. export MAIL_SERVER=* MAIL_USERNAME=* MAIL_PASSWORD=* BLOG_ADMIN=* BLOG_MAIL_SENDER=* DATABASE='blogdata' DB_USERNAME='root' DB_PASSWORD=* FLASK_CONFIG=production
  7. echo $MAIL_SERVER $MAIL_USERNAME $MAIL_PASSWORD $BLOG_ADMIN $BLOG_MAIL_SENDER $DATABASE $DB_USERNAME $DB_PASSWORD $FLASK_CONFIG
  8. echo 'successful!'

配置nginx:

  1. (venv) # /etc/init.d/nginx start
  2. [ ok ] Starting nginx (via systemctl): nginx.service.
  3. # 备份
  4. (venv) # mv /etc/nginx/sites-enabled/default /etc/nginx/sites-enabled/.backup-default
  5. (venv) # touch /etc/nginx/sites-available/flask-blog
  6. (venv) # ln -s /etc/nginx/sites-available/flask-blog /etc/nginx/sites-enabled/flask-blog
  7. (venv) # pwd
  8. {{ url }} # 查看当前路径
  9. (venv) # vim /etc/nginx/sites-enabled/flask-blog

添加下面内容并保存:

  1. server {
  2. location / {
  3. proxy_pass http://localhost:8000;
  4. proxy_set_header Host $host;
  5. proxy_set_header X-Real-IP $remote_addr;
  6. }
  7. location /static {
  8. alias {{ url }}/app/static/;
  9. }
  10. }

由于nginx默认以自己的用户(www-data)运行, 所以访问网站时会出现静态文件无法访问的情况(403), 故需要修改nginx配置文件:

  1. # 测试nginx配置文件, 由此查看配置文件路径
  2. (venv) # nginx -t
  3. (venv) # vim */nginx.conf
  4. # 将用户改为当前用户:
  5. user *;
  6. # 重启nginx
  7. (venv) # /etc/init.d/nginx restart

创建数据库表, 并写入角色和管理员

  1. (venv) # source ~/os_environ.sh
  2. (venv) # python manage.py shell
  3. >>> db.create_all()
  4. >>> Role.insert_roles()
  5. >>> db.session.commit()
  6. >>>
  7. (venv) # python manage.py shell
  8. >>> l = Role.query.all()
  9. >>> l
  10. [<Role u'Moderator'>, <Role u'Administrator'>, <Role u'User'>]
  11. >>> admin = l[1]
  12. >>> admin
  13. <Role u'Administrator'>
  14. >>> u = User(email='*', username='*', password='*', confirmed=True, role=admin)
  15. >>> db.session.add(u)
  16. >>> db.session.commit()
  17. >>>

安装独角兽并尝试启动博客:

  1. (venv) # pip install gunicorn
  2. # manage:app 会直接运行manage.py.__main__ 并绑定到8000端口, 而nginx中已经配置proxy_pass代理转发
  3. (venv) $ gunicorn manage:app -b localhost:8000

通过supervisor启动gunicorn

  1. (venv) # pip install supervisor
  2. (venv) # echo_supervisord_conf > supervisor.conf
  3. (venv) # vim supervisor.conf
  4. (venv) # supervisord -c supervisor.conf

在最后添加:

  1. [program:flask-blog]
  2. command = gunicorn manage:app -b localhost:8000
  3. directory = *
  4. autorestart = true
  5. user = *

启动:

  1. (venv) # supervisord -c supervisor.conf

最后

网站放在阿里云是真的舒服, 之前放在vultr上ssh有时候连不上, 网站部署上去后阿里云的速度也比vultr(迈阿密)快很多, 毕竟才10+延迟, 唯一的缺点就是, 这个价格对穷学生来说有点小贵, 本来还想解析域名的, 结果发现需要备案, 先用一周看看吧

更多:

centos部署flask项目

nginx 配置之 proxy_pass 神器

nginx代理proxy_pass绝对路径和相对路径实验

使用 supervisor 管理进程

flask项目部署到阿里云 ubuntu16.04的更多相关文章

  1. Python3.6+nginx+uwsgi部署Django程序到阿里云Ubuntu16.04系统

    Python3.6+nginx+uwsgi部署Django程序到阿里云Ubuntu16.04系统 这个是写好的Django程序在本地机运行的情况,一个查询接口. 准备工作 1.首先购买一台阿里云的EC ...

  2. 阿里云ubuntu16.04安装ruby

    0x0 准备 环境:阿里云轻量服务器ubuntu16.04 目的:安装beef需要的ruby环境 更新软件 sudo apt-get update sudo apt-get upgrade sudo ...

  3. javaWeb项目部署到阿里云服务器步骤

    记录web项目部署到阿里云服务器步骤 (使用 web项目.阿里云服务器.Xftp.Xshell),敬请参考和指正 1.将要部署的项目打包成WAR文件格式,可以在MyEclipse.Eclipse都可以 ...

  4. javaWeb项目部署到阿里云服务器步骤 完整版

    记录web项目部署到阿里云服务器步骤 (使用 web项目.阿里云服务器.Xftp.Xshell),敬请参考和指正 1.将要部署的项目打包成WAR文件格式,可以在MyEclipse.Eclipse都可以 ...

  5. Java Web项目部署到阿里云服务器(ECS)

    本篇随笔只是记录博主第一次将自己的Java项目部署到阿里云服务器的大致过程,具体细节还请参考别的博文. 一.项目介绍 我做的项目是利用maven项目构建工具进行搭建基于SSM框架的代码共享管理系统,主 ...

  6. 如何把php项目部署到阿里云服务器window server2012__含公网ip访问时jquery/ajax失效解决办法

    记一次蛋疼的折腾. 弄了一晚上最后发觉是360浏览器的问题,换个浏览器就好了.垃圾360用什么IE7文档模式.导致界面和功能失效. 建议大家测试的时候用firefox或者chrome. 项目部署到服务 ...

  7. 2018.11.7 关于将Web项目部署到阿里云服务器-5个步骤搞定

    将Eclipse导出的War包部署到阿里云服务器上,提供给移动端实时的访问 1. 先登录阿里云网站注册账号,选择服务器类型(我用的是 云服务器ECS), 如果你还是在读大学生可享受优惠价,最低好像是9 ...

  8. Django项目部署到阿里云服务器无法发送邮件,发送邮件超时问题解决

    前言 今天, 博主将写了好久的一个Django小项目尝试在阿里云部署上线,由于项目中需要发送邮件,博主调用了163邮箱接口,在本地测试邮件功能正常,可是上线后,邮件功能一直超时崩溃.在百度一番查资料后 ...

  9. 将web项目部署到阿里云服务器上

    一.用eclipse将写好的项目打成war包 1.右键点击项目,选择Export 选择打包之后的路径,点击Finsh. 2.购买阿里云服务器 按下图选择 3.设置云服务器防火墙 4.远程连接云服务器 ...

随机推荐

  1. .NET平台开源项目速览(19)Power BI神器DAX Studio

    PowerBI更新频繁,已经有点更不上的节奏,一直在关注和学习中,基本的一些操作大概是没问题,更重要的是注重Power Query,M函数,以及DAX的使用,这才是核心.   上个月研究了DAX的一些 ...

  2. Python 上下文管理器和else块

    最终,上下文管理器可能几乎与子程序(subroutine)本身一样重要.目前,我们只了解了上下文管理器的皮毛--Basic 语言有with 语句,而且很多语言都有.但是,在各种语言中 with 语句的 ...

  3. opencv 离线文档下载地址在哪里?

    OpenCV 官方离线文档下载地址:http://docs.opencv.org/ 如何生成离线文档? http://docs.opencv.org/master/d4/db1/tutorial_do ...

  4. 《Android进阶之光》--Android新特性

    Android 5.0新特性 1)全新的Material Design设计风格 2)支持多种设备 3)全新的通知中心设计--按照优先级显示 4)支持64位ART虚拟机 5)多任务视窗Overview ...

  5. nyoj720 项目安排 二分+dp

    思路:dp(i)表示前i个项目的最大收益,转移方程很好写dp(i) = max{ dp(k) + val(i) },val(i)表示第i个项目的价值,dp(k)表示前k个的最佳收益,k满足ed(k) ...

  6. POJ1459 - Power Network

    原题链接 题意简述 原题看了好几遍才看懂- 给出一个个点,条边的有向图.个点中有个源点,个汇点,每个源点和汇点都有流出上限和流入上限.求最大流. 题解 建一个真 · 源点和一个真 · 汇点.真 · 源 ...

  7. 多文件工程的编译-Makefile的简便写法

    通常我们在命令行使用GCC对程序进行编译,如果对于单个或者几个文件时比较方便的,但当工程中的文件逐渐增多甚至变得十分庞大的时候,使用GCC显然力不从心,不好管理.因此我们有必要编写一个Makefile ...

  8. 机器学习中应用到的各种距离介绍(附上Matlab代码)

    转载于博客:各种距离 在做分类时常常需要估算不同样本之间的相似性度量(SimilarityMeasurement),这时通常采用的方法就是计算样本间的"距离"(Distance). ...

  9. phpexcle 导出数据 日期格式的问题

    在使用phpexcle 读取excle中日期格式的出现了问题.特此记录 gmdate("Y-m-d H:i:s", PHPExcel_Shared_Date::ExcelToPHP ...

  10. PHP解码unicode编码中文字符代码

    function replace_unicode_escape_sequence($match) { return mb_convert_encoding(pack('H*', $match[1]), ...