Python3 Flask下连接MySQL异常

根据《Flask Web开发》书中的例子学习Python-Web时,使用Mysql数据库替换了书中使用的Sqlite数据库,中间发生一些波折,在此记录

第一版代码:

from flask import Flask
from flask.ext.sqlalchemy import SQLAlchemy


app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://user:pwd@localhost/routebase'
app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = True


db = SQLAlchemy(app)


class Route(db.Model):
    __tablename__ = 'route'
    id = db.Column(db.Integer, primary_key=True)
    hash = db.Column(db.String(45), unique=True)
    url = db.Column(db.Text, nullable=False)

在此安装了flask和SQLAlchemy,运行后提示如下错误:

ImportError: No module named 'MySQLdb'

此处是因为未安装 mysql-python模块,但是安装后依然提示如上异常。此处异常是因为python3目前不支持mysql-python模块,因此安装pymysql模块

pip3 install PyMySQL

并修改代码中的Mysql连接字符串如下:

mysql+pymysql://user:pwd@localhost/routebase

连接字符串中添加了“pymysql”,使用pymysql模块连接MySQL数据库

完整的代码如下:

from flask import Flask
from flask.ext.sqlalchemy import SQLAlchemy


app = Flask(__name__)
    app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://user:pwd@localhost/routebase'
app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = True


db = SQLAlchemy(app)


class Route(db.Model):
    __tablename__ = 'route'
    id = db.Column(db.Integer, primary_key=True)
    hash = db.Column(db.String(45), unique=True)
    url = db.Column(db.Text, nullable=False)

测试:

//引入数据库对象
from database import db
//引入实体对象
from database import Route
//新建实体对象
newroute = Route(hash='ds', url='we')
//插入对象
db.session.add(newroute)
//提交事物
db.session.commit()

 

CentOS 6安装Softether VPN

虽然使用Shadowsocks可以很方便的进行穿越,不过由于iOS系统后台任务管理机制的特殊性,Shadowsocks没有完美的体验(当Shadowsocks应用退至后台时,一般5分钟后就会被系统暂停退出,其它应用就无法持续穿越网络;即使使用后台播放无声文件的方式,当使用youtube等影音应用时依然悲剧;笔者后来又发现可以通过后台定位的方式常开后台,可是耗电量依然感人),因此使用标准通用的VPN网络可以完美解决iOS系统的穿越需求(当然你可以选择传说中的Surge客户端)。

本文全程参考“Install SoftEther VPN Server on CentOS”,感谢原作者。

XQS根据这篇文章搭建时遇到一些奇怪的问题也会在后面记录。

本文中的搭建环境依然适用VULTR提供的最低配日本节点VPS,配置如下:1CPU,768MB内存,1000GB的流量。VULTR日本节点的速度非常好,可以完美支持1080P的油管(youtube),可以点击这里去购买(我的推广链接Y(^_^)Y)

配置系统环境

首先我们还是SSH连接至VPS,然后使用如下命令更新系统软件环境:

yum update -y

然后安装开发工具包:

yum groupinstall "Development Tools" -y

安装DNS服务(dnsmasq):

yum install dhcp dnsmasq -y

修改系统设置开启路由(ip转发)功能,首先编辑文件/etc/sysctl.conf:

vi /etc/sysctl.conf

在文件中找到“net.ipv4.ip_forward”字段,修改值为“1”:

net.ipv4.ip_forward = 1

然后编辑文件/etc/sysconfig/dhcpd,打开仅对VPN客户端开启DHCP服务:

vi /etc/sysconfig/dhcpd

设置DHCPDARGS字段为tap_vpn:

DHCPDARGS=tap_vpn

修改DHCP的配置文件,设置分配给VPN客户端的ip、网关或DNS等信息:

vi /etc/dhcp/dhcpd.conf

粘入以下内容:

option domain-name "机器的域名";
option domain-name-servers 192.168.250.1, 8.8.8.8;

default-lease-time 600;
max-lease-time 7200;

subnet 192.168.250.0 netmask 255.255.255.0 {
      range 192.168.250.10 192.168.250.100;
      option routers 192.168.250.1;
      option router-solicitation-address 192.168.250.1;
}

在这里可以修改DNS:

#
# DHCP Server Configuration file.
#   see /usr/share/doc/dhcp*/dhcpd.conf.sample
#   see 'man 5 dhcpd.conf'
#
option domain-name "机器的域名";
option domain-name-servers 208.67.222.222 ,208.67.220.220;

default-lease-time 600;
max-lease-time 7200;

subnet 192.168.250.0 netmask 255.255.255.0 {
range 192.168.250.10 192.168.250.100;
option routers 192.168.250.1;
option router-solicitation-address 192.168.250.1;
}

 

注:
1、这里的域名如果没有可以填写主机的反向DNS名称
2、相比引用教程,增加了“router-solicitation-address”配置,不配置此项VPN客户端可能无法获得网关(至于为什么还求高人解答)

然后我们来配置系统的防火墙,输入以下编辑防火墙配置:

vi /etc/sysconfig/iptables

在防火墙配置文件中添加以下条目,其中53为DNS端口,443是VPN的管理端口,500、4500和1701是VPN端口:

# Generated by iptables-save v1.4.7 on Sun Jul 31 10:38:07 2016
*nat
:PREROUTING ACCEPT [242:20052]
:POSTROUTING ACCEPT [0:0]
:OUTPUT ACCEPT [21:1490]
-A POSTROUTING -s 192.168.250.0/24 -o eth0 -j MASQUERADE
-A POSTROUTING -j MASQUERADE
COMMIT
# Completed on Sun Jul 31 10:38:07 2016
# Generated by iptables-save v1.4.7 on Sun Jul 31 10:38:07 2016
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [274:29195]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -p udp -m udp --dport 53 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 53 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 443 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 1194 -j ACCEPT
-A INPUT -p udp -m state --state NEW -m udp --dport 1701 -j ACCEPT
-A INPUT -p udp -m state --state NEW -m udp --dport 500 -j ACCEPT
-A INPUT -p udp -m state --state NEW -m udp --dport 4500 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 8388 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -d 192.168.250.0/24 -j ACCEPT
-A FORWARD -s 192.168.250.0/24 -j ACCEPT
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
# Completed on Sun Jul 31 10:38:07 2016

以上Softether VPN的初始运行环境配置完毕

安装Softether VPN

点击这里打开SoftetherVPN的下载中心,按配置选择安装的服务端版本,如下图:

屏幕快照 2016-08-22 下午1.45.53

在下方的版本列表中复制最新的rtm(正式版)安装包链接即可,然后回到SSH中,输入以下命令:

wget http://www.softether-download.com/files/softether/v4.20-9608-rtm-2016.04.17-tree/Linux/SoftEther_VPN_Server/64bit_-_Intel_x64_or_AMD64/softether-vpnserver-v4.20-9608-rtm-2016.04.17-linux-x64-64bit.tar.gz

解压安装包:

tar zxvf softether-vpnserver-v4.20-9608-rtm-2016.04.17-linux-x64-64bit.tar.gz

进入解压后的vpnserver目录:

cd vpnserver/

运行编译:

make

返回vpnserver的上级目录:

cd ..

移动vpnserver目录到程序运行目录:

mv vpnserver /usr/local

切换到运行目录:

cd /usr/local/vpnserver/

运行语句修改运行权限:

chmod 600 *
chmod 700 vpnserver
chmod 700 vpncmd

接下来检查VPS服务器网卡的名称,在SSH中输入以下命令:

ifconfig

一般在VPS中名称为“eth0”;如果没有,一般服务器上带有供VPN访问ip地址的设备名称即是网卡名称

配置Linux VPN本地服务脚本,首先新建脚本文件:

vi /etc/init.d/vpnserver

根据上面获得的网卡名称,和配置的DHCP参数,修改下面的脚本文件后粘入:

#!/bin/sh
# chkconfig: 2345 99 01
# description: SoftEther VPN Server
DAEMON=/usr/local/vpnserver/vpnserver
LOCK=/var/lock/subsys/vpnserver
test -x $DAEMON || exit 0
case "$1" in
start)
$DAEMON start
touch $LOCK
sleep 3
ifconfig tap_vpn 192.168.250.1
iptables -t nat -A POSTROUTING -s 192.168.250.0/24 -o eth0 -j MASQUERADE
service dhcpd restart
service dnsmasq restart
;;
stop)
iptables -t nat -D POSTROUTING -s 192.168.250.0/24 -o eth0 -j MASQUERADE
$DAEMON stop
rm $LOCK
;;
restart)
iptables -t nat -D POSTROUTING -s 192.168.250.0/24 -o eth0 -j MASQUERADE
$DAEMON stop
sleep 3
$DAEMON start
sleep 3
ifconfig tap_vpn 192.168.250.1
iptables -t nat -A POSTROUTING -s 192.168.250.0/24 -o eth0 -j MASQUERADE
service dhcpd restart
service dnsmasq restart
;;
*)
echo "Usage: $0 {start|stop|restart}"
exit 1
esac
exit 0

退出后,运行下面命令确定文件夹锁被创建:

mkdir /var/lock/subsys

对VPN服务脚本文件授权:

chmod 755 /etc/init.d/vpnserver

设置开机自动启动VPN服务:

chkconfig --add vpnserver

然后启动VPN服务:

service vpnserver start

启动时,启动日志会显示如图错误,这里不必担心,稍后会对其进行配置:

配置SoftehterVPN

首先进入SoftetherVPN的安装目录:

cd /usr/local/vpnserver

运行vpn命令工具:

./vpncmd

在功能列表中选择“1”,“1. Management of VPN Server or VPN Bridge ”,这时会让输入vpn服务器ip和默认hub名称,这里无需输入,直接按两次“enter”键进入(默认本机)

输入以下命令,设置管理员密码,此密码将用于管理员登陆,牢记此密码:

ServerPasswordSet

然后运行exit退出vpn命令工具:

exit

目前基本的配置工作进行完毕,将到windows系统上使用远程管理工具继续配置vpnserver

SoftetherVPN下载中心获得windows管理软件,选项如下:

屏幕快照 2016-08-22 下午2.28.09

下载安装后,双击“vpnsmgr.exe”启动管理程序,点击“新设置”按钮添加新建的VPN服务器,输入服务器的地址和上文设置的密码,点击确定:QQ图片20160822154535

由于是第一次进入管理软件,会弹出安装向导,不用理会,关闭即可。如果在HUB列表中有“Default”默认的HUB也删除即可。

点击“创建虚拟HUB”按钮继续:

18C8B3C6DFAE60BA5EE80F414255119E

在“虚拟HUB名”中输入“vpn”,点击“确定”按钮继续:46F4D88CA099B58253D78568C4321E88

在HUB列表中,双击新建的“vpn”行项,点击“管理用户”后继续:

CE0AB3AF9C4CF17290EB4F942760F678

点击“新建”按钮继续:

C03BAF1A9E050EE1EE4045418B7BA143

在“验证类型”中选择“密码验证”,输入“用户名”、“密码”后,点击确定后,新用户建立。

22257F53E17D7BB71BB4774137A4F5D4

关闭所有上层界面后回到管理器的主界面,开始进行本地网桥的设置,点击“本地网桥设置”按钮:

860EFAAD97F5C00424B5A11AD0F03628

进入界面后,在“虚拟HUB”中选择“vpn”,“创建类型”选择“新tap设备的桥接”,“新tap设备名称”输入“vpn”,如图配置,然后点击“创建本地桥”按钮:

44B562FC893FFE9A6F3E7DF1A9E7DFCF

创建后如下图显示,状态为“运行中”,点击“关闭”后继续:

QQ截图20160825220449

至此,SoftetherVPN的网络配置已经完成,不过目前还无法使用VPN服务,接下来将配置L2TP VPN服务,回到管理器的主界面,点击“IPsec/L2TP 设置”按钮继续。选择“启用L2TP服务器功能”,并在下方输入“IPSec预共享密钥”,点击“确定”按钮结束:

55A5DC1742A7DC410D2E9B8A9FA98D0F

至此,SoftetherVPN的所有配置均配置完毕,回到SSH重启整个系统即可。

 

Debian 7 安装ServerSpeeder锐速

使用锐速(ServerSpeeder)可以优化VPS的TCP传输(因此使用UDP协议的VPN是没有效果的),非常适合作为梯子的Shadowsocks服务。本文介绍了如果通过热心网友提供的一键安装脚本在Debian7下安装锐速。

一键安装 ServerSpeeder 锐速

脚本作者的原文地址:锐速Linux一键自动安装包,感谢作者91yun


安装前提:

  • ServerSpeeder不支持OpenVZ架构的VPS
  • ServerSpeeder对Linux内核也有要求,作者安装时对应的系统是Debian 7.11,可以正常安装。其它版本请参考脚本作者原文的内核建议

安装过程:

输入以下脚本进行安装:

wget -N --no-check-certificate https://raw.githubusercontent.com/91yun/serverspeeder/master/serverspeeder-all.sh && bash serverspeeder-al

安装完毕如下图:

7

可以通过以下脚本查看服务状态:

service serverSpeeder status

可以看到服务正在运行中:

8

ServerSpeeder使用体验:

如果VPS的网络较差,访问有丢包现象,安装锐速可以得到明显改善。不过如果你的VPS网络质量很好,那么锐速的作用非常有限

参考链接:

作者原文:锐速一键自动安装包

Debian 7 安装 & 优化shadowsocks-libev

最近使用shadowsocks-libev版本的shadowsocks服务进行穿越,发现和python版相比对系统的性能消耗更低。更是有热心网友提供的方便的一键部署脚本,安装更加方便。本位后半部分也介绍了在Debian7下如何优化shadowsocks服务。

在Debian 7下使用一键脚本安装shadowsocks-libev

引用:Debian下shadowsocks-libev一键安装脚本,感谢作者秋水逸冰

安装过程:

使用root用户SSH至远程VPS

在SSH界面中输入以下命令获取“一键安装脚本”

wget --no-check-certificate https://raw.githubusercontent.com/teddysun/shadowsocks_install/master/shadowsocks-libev-debian.sh

设置脚本运行权限

chmod +x shadowsocks-libev-debian.sh

运行脚本

./shadowsocks-libev-debian.sh 2>&1 | tee shadowsocks-libev-debian.log

安装脚本运行后,请输入shadowsocks服务器密码

输入ss密码

然后输入shadowsocks服务器的端口,如果不输入默认端口为8989

2

在此时点击任何按键就进入安装过程,在此之前可以通过Ctrl+C取消安装

3

安装完成之后,将显示shadowsocks服务器的配置信息,请保存此信息用于客户端连接

4

至此Shadowsocks服务器一键安装完毕

脚本的更多信息请关注脚本作者的页面,作者也提供了CentOS下的一键安装脚本,和其它版本Shadowsocks的安装脚本

Shadowsocks优化

通过上面脚本的安装,现在就可以使用shadowsocks进行穿越了,不过为了让服务器保持最高的性能,提供畅快的穿越体验,可以参考github的示例对shadowsocks服务进行优化

引用:github-Optimizing Shadowsocks

首先通过vi创建配置文件:

vi /etc/sysctl.d/local.conf

粘入以下配置信息:

# max open files
fs.file-max = 51200
# max read buffer
net.core.rmem_max = 67108864
# max write buffer
net.core.wmem_max = 67108864
# default read buffer
net.core.rmem_default = 65536
# default write buffer
net.core.wmem_default = 65536
# max processor input queue
net.core.netdev_max_backlog = 4096
# max backlog
net.core.somaxconn = 4096

# resist SYN flood attacks
net.ipv4.tcp_syncookies = 1
# reuse timewait sockets when safe
net.ipv4.tcp_tw_reuse = 1
# turn off fast timewait sockets recycling
net.ipv4.tcp_tw_recycle = 0
# short FIN timeout
net.ipv4.tcp_fin_timeout = 30
# short keepalive time
net.ipv4.tcp_keepalive_time = 1200
# outbound port range
net.ipv4.ip_local_port_range = 10000 65000
# max SYN backlog
net.ipv4.tcp_max_syn_backlog = 4096
# max timewait sockets held by system simultaneously
net.ipv4.tcp_max_tw_buckets = 5000
# turn on TCP Fast Open on both client and server side
net.ipv4.tcp_fastopen = 3
# TCP receive buffer
net.ipv4.tcp_rmem = 4096 87380 67108864
# TCP write buffer
net.ipv4.tcp_wmem = 4096 65536 67108864
# turn on path MTU discovery
net.ipv4.tcp_mtu_probing = 1

# for high-latency network
net.ipv4.tcp_congestion_control = hybla

# for low-latency network, use cubic instead
# net.ipv4.tcp_congestion_control = cubic

然后执行以下命令:

sysctl --system

进行到此,我们还将修改系统ulimit,可以输入以下命令查看系统当前设置,一般结果如图是1024

ulimit -n

6

通过vi修改/etc/profile文件

vi /etc/profile

在文件的末尾加入以下内容

ulimit -n 51200

然后重启系统即可

reboot

至此,安装&优化完毕,等待系统重启上线后即可使用shadowsocks服务

参考链接:

作者原文 : Debian下shadowsocks-libev一键安装脚本

github : Optimizing Shadowsocks