Contents
  1. 1. 开发技术栈
    1. 1.1. Python3
    2. 1.2. Flask
    3. 1.3. MySQL
  2. 2. 开发环境
    1. 2.1. Unix-like
    2. 2.2. Vim
  3. 3. 部署环境
    1. 3.1. Ubuntu
    2. 3.2. Nginx
    3. 3.3. uWSGI
    4. 3.4. Supervisord
  4. 4. 测试工具
    1. 4.1. unittest(单元测试)
    2. 4.2. curl(脚本测试)
  5. 5. 遇到的问题
    1. 5.1. pymysql无法使用localhost连接MySQL的解决方法
    2. 5.2. MySQL的问题以及解决过程
      1. 5.2.1. The problem
      2. 5.2.2. Debug
      3. 5.2.3. Fix up
      4. 5.2.4. improve

系统架构为BS架构,基于Flask和React的web应用

项目地址 (托管于Github)

开发技术栈

Python3

osx下安装python3

brew install python3

ubuntu下安装python3(自带3.4版本)

apt-get install python3

Python, 是一种面向对象的解释型计算机程序设计语言,由荷兰人Guido van Rossum于1989年发明,第一个公开发行版发行于1991年。

为什么在这个项目选择Python而不是nodejs,因为使用Python开发快,语言简洁,没那么多技巧,所以读起来很清楚容易。加上Python标准库确实很庞大。它可以帮助你处理各种工作,包括正则表达式、文档生成、单元测试、线程、数据库、网页浏览器、CGI、FTP、电子邮件、XML、XML-RPC、HTML、WAV文件、密码系统、GUI(图形用户界面)、Tk和其他与系统有关的操作。记住,只要安装了Python,所有这些功能都是可用的。而且构架选择多,开源社区活跃。缺点是国内文档基本没有,需要自己看懂。

Flask

安装flask

pip3 install flask

Flask是一个使用 Python 编写的轻量级 Web 应用框架。优点是小,定制性高,能让开发人员从0开始享受折腾的结果。缺点也就是重复造轮子,不过flask插件多,能提高开发效率。

MySQL

osx下安装mysql

brew install mysql

ubuntu下安装mysql

1. sudo apt-get install mysql-server
2. apt-get isntall mysql-client
3. sudo apt-get install libmysqlclient-dev

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下产品。MySQL 最流行的关系型数据库管理系统,在 WEB 应用方面MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件之一。

MySQL是一种关联数据库管理系统,关联数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。

对我来说,sql型数据库与其说是成熟,不如说是历史遗留问题,用拼接字符串组成sql语句的执行方式,不但留下了注入式攻击漏洞,而且本身也让人多了额外的学习成本,来学习一些奇奇怪怪的语法。nosql不仅完美与JSON贴合,而且因为本身键值对的数据结构,可以放心的进行删除、插入操作,不用担心什么外键的问题。抹去一个人的数据,其所有子数据都会消除,就不用再一条条的到别的表去查找删除。尤其的表多了的时候。

选择MySQL的原因一部分是因为没有办法,很多公司还是用的这种数据库,MySQL是开源的这点还是值得肯定的。针对MySQL的问题有很多在社区中得到了解决。

开发环境

Unix-like

不管如何,linux永远是最适合开发的系统环境。其对用户最小开发程度的限制,能让你高度定制你的生产环境。只要是一台Linux的终端,你就可以从0开始把它完全复原成你所用过的那台Linux的环境。有很多问题,不像win,你可以从系统层次上去解决这类问题,例如启动项,进程管理这一类。我们可以写一些简单脚本来做到一下很酷的事情。

Vim

下载

apt-get install vim

vim像是一杯酒,越酿越醇,在unix-like上使用nvim,在一些插件的辅助下,已经成为unix-like下的最强大的编译器。

部署环境

Ubuntu

Ubuntu下能快速搭建工作环境,安装系统后,跑个脚本,把自己开发需要的环境,工具(git/vim和自己的配置)什么的一通自动安装好,一切简单快捷。

Ubuntu有开源的第三方软件安装,因此漏洞少,开源反而安全。

Nginx

下载

apt-get install nginx

Nginx (“engine x”) 是一个高性能的HTTP和反向代理服务器。拥有负载均衡的功能,但是在单台服务器上无法体现。

uWSGI

下载

pip3 install uwsgi

uWSGI是一个Web服务器,它实现了WSGI协议、uwsgi、http等协议。Nginx中HttpUwsgiModule的作用是与uWSGI服务器进行交换。

Supervisord

下载

pip install supervisor

Supervisor是一个客户/服务器系统,它可以在类Unix系统中管理控制大量进程。Supervisor使用python开发,有多年历史,目前很多生产环境下的服务器都在使用Supervisor。

测试工具

unittest(单元测试)

The Python unit testing framework, sometimes referred to as “PyUnit,” is a Python language version of JUnit, by Kent Beck and Erich Gamma. JUnit is, in turn, a Java version of Kent’s Smalltalk testing framework. Each is the de facto standard unit testing framework for its respective language.

下载

pip3 install unittest

curl(脚本测试)

下载

apt-get install curl

curl is a tool to transfer data from or to a server, using one of the supported protocols (DICT, FILE, FTP, FTPS, GOPHER, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, POP3, POP3S, RTMP, RTSP, SCP, SFTP, SMB, SMBS, SMTP, SMTPS, TELNET and TFTP). The command is designed to work without user interaction.

curl offers a busload of useful tricks like proxy support, user authentication, FTP upload, HTTP post, SSL connections,cookies, file transfer resume, Metalink, and more. As you will see below, the number of features will make your head spin!

curl is powered by libcurl for all transfer-related features. See libcurl(3) for details.

遇到的问题

pymysql无法使用localhost连接MySQL的解决方法

我的阿里服务器快过期了,在迁移项目的部署过程中抛了一个pymysql不能连接127.0.0.1的错误,host改成localhost也不行

源抛错代码

1
pymysql.Connect(host='127.0.0.1',user=MyConfig.USERNAME,passwd=MyConfig.PASSWORD,db='ec_forum',charset='utf8')

解决方法:使用mysql中的.sock文件进行连接,放弃通过IP匹配本地的方法。

执行

1
mysqladmin variables| grep socket

查看socket所在位置,然后尝试使用格式如下的连接

1
pymysql.Connect(user=MyConfig.USERNAME,passwd=MyConfig.PASSWORD,db='ec_forum',charset='utf8',unix_socket='/var/run/mysqld/mysqld.sock')

MySQL的问题以及解决过程

我一开始使用MySQL我就后悔了,因为我深深的体会到,在sql型数据库中,当表之间关系复杂以后,要删除一条信息是有多么的困难。而几乎所有的第三方MySQL库使用的还是原生的sql语句。且不说sql语句的拼接被x问题,sql的高阶语法本身就非常的反人类。加上我已经习惯了noSQL带来的好处(直接字典\对象操作),仿佛就从天堂到了地狱。

The problem

前台说请求报错,她那里格式正常。启动服务器简单脚本测试,发送get正常,post报pipeBroken。重启应用,好了。过了半天,一发post,跪。

Debug

get能用,post挂了,肯定是数据库问题,看了下错误类型,连接管道断了,那就是pymysql的问题。

第一反应,连接对象过期了,定期更新it,无解。

加快更新频率,无解。

启用连接池,加大连接节点数,加快更新频率,均无解。此时已过2周,暂时用无限手动重启应用的方法应付问题。

通过supervisor查应用日志,发现启动应用大约过了半天时间一发post服务器才会pipeBroken,而报错期间并没有主动断开。就是过期了啊(葛优瘫)

Fix up

经过一段时间的思考,我感觉是MySQL本身的问题,查了一会相关资料,把服务器日志pipeBroken的报文Google了一下,发现是MySQL长时间没有操作,进入睡眠了。。

进入MySQL交互界面输入

show variables like '%timeout%';

发现wait_timeout的值为28800s,相等于8小时没操作MySQL就会断开连接。于是我用最简单暴力的方法:

set global wait_timeout=2880000;

服务器再也不频繁抛错了。至于之前的那些解决方案……先留着那些代码吧

improve

修改MySQL变量不是权宜之计,MySQL休眠是因为长期没有操作,所以自动断开连接节点,而且不是所有的服务器都支持修改MySQL全局变量的,有时候root也不能改- -。所以用计时器每隔一段时间向MySQL发一次查询,重置连接时间。若还抛出错误pipeBroken的时候换一条新的管道。

实际效果:MySQL能够平稳的运行好几天,几天之内查询成功率在90%左右,仍然不太能够令人满意,但是相比以前,已经进步了很多。。

Contents
  1. 1. 开发技术栈
    1. 1.1. Python3
    2. 1.2. Flask
    3. 1.3. MySQL
  2. 2. 开发环境
    1. 2.1. Unix-like
    2. 2.2. Vim
  3. 3. 部署环境
    1. 3.1. Ubuntu
    2. 3.2. Nginx
    3. 3.3. uWSGI
    4. 3.4. Supervisord
  4. 4. 测试工具
    1. 4.1. unittest(单元测试)
    2. 4.2. curl(脚本测试)
  5. 5. 遇到的问题
    1. 5.1. pymysql无法使用localhost连接MySQL的解决方法
    2. 5.2. MySQL的问题以及解决过程
      1. 5.2.1. The problem
      2. 5.2.2. Debug
      3. 5.2.3. Fix up
      4. 5.2.4. improve