1月 12

iPhone 手机控制linux服务器程序源码

  将远程连接SSH和数据库MySQL开放到外网很危险。
即使密码和KEY管理后都很安全了,但是还会有不少的扫描程序来扫描浪费资源。
但是我没有机器做跳板机或代理,也没有多余的IP和资源做VPN。
所以直接用防火墙把相应服务的端口对外网服务屏蔽,然后用个隐蔽的端口做中转。
中转服务需要就开放,不需要就关闭。这个服务当然也可以不用haproxy,直接关闭或打开防火墙。
也可以用这个服务管理其它的服务器上其它程序的启停。开始着手处理。

  服务端为Linux服务器(centos7),python2.7+tornado开发。客户端用swift2开发跑在iphone6上。

haprox安装后,跳转主要配置部分。
frontend ssh
bind x.x.x.x:20000
default_backend nat_ssh

backend nat_ssh
mode tcp
option tcpka
balance roundrobin
option httpchk
server ssh 192.168.1.222:22

服务端代码需要注意的部分:
服务端存放在/program/www/mydoor下。
文件myDoorServer.py的类MyDoorHandler中使用os.popen调用系统命令,绝对路径需要确认。Listen端口自行修改。
如:
line = “cd /program/www/mydoor;/usr/bin/python mydoor.py %s %s &” % (_se, _au)

文件mydoor.py中的kk为验证使用,自行修改,但是需要与swift中的kk值对应。执行命令的绝对路径需要根据系统确认。
要管理服务的命令,修改后就可以管理不同的应用。
使用“python myDoorServer.py &”启动服务。

客户端比较简单,修改kk值后,直接编译到手机上。需要的第三方的库,Alamofire和Crypto。
启动程序,输入开放时间,点击“敲”。实验成功。
mydoor20160107

服务端源码
iPhone客户端源码

11月 29

linux 使用tornado的CLOSE_WAIT问题

pypy版本2.6.1
python版本2.7.10
tornado版本4.2.1

用tornado做了个简单的接口,使用pypy后发现大量CLOSE_WAIT。并且无法杀掉。
改动如下
系统/etc/sysctl.conf
net.ipv4.tcp_keepalive_time=60
net.ipv4.tcp_keepalive_probes=2
net.ipv4.tcp_keepalive_intvl=2

nginx的timeout配置设置为30秒。但是没有效果。

使用python后没有这个问题。原因不详。
用callback不知道能不能起作用看到一篇文章
http://www.oschina.net/question/12_17679?sort=time

11月 27

pypy2.6速度测试

主要学习环境
硬件:CPU:Intel(R) Core(TM) i7-4790 CPU @ 3.60GHz
内存:8G
系统:Debian 64位,python2.7.9
加速:pypy2.6.1
下载pypy2.6.1。国内可下,但是速度很慢。
https://bitbucket.org/pypy/pypy/downloads/pypy-2.6.1-src.tar.bz2
解包后放在/usr/local/pypy编译命令如下。
python rpython/bin/rpython -Ojit pypy/goal/targetpypystandalone.py
为了方便调用将命令链接到命令路径中。
ln -s /usr/local/pypy/pypy-c /usr/local/bin/pypy
pypy安装包使用pip管理。下载两个包依顺序用pypy安装
https://pypi.python.org/packages/source/s/setuptools/setuptools-18.3.2.tar.gz#md5=d30c969065bd384266e411c446a86623
https://pypi.python.org/packages/source/p/pip/pip-7.1.2.tar.gz#md5=3823d2343d9f3aaab21cf9c917710196
安装完毕将pypy的pip也链接到系统命令中方便使用
ln -s /usr/local/pypy/bin/pip /usr/bin/pypypip

测试脚本

# -*- coding:utf-8 -*-
# -------------------------------
# Date:        2015-11-27
# Author:      simonzhang
# Web:         www.simonzhang.net
# Email:       simon-zzm@163.com
# -------------------------------

all=xrange(1,10**7)

def check(num):
    a=list(str(num))
    b=a[::-1]
    if a==b:
        return True
    return False

def main():
    for i in all:
        if check(i):
            if check(i**2):
                print i,i**2

测试结果
python:
real 0m6.209s
user 0m6.196s
sys 0m0.008s

pypy:
real 0m1.441s
user 0m1.420s
sys 0m0.016s

结论:
效果pypy加速了4.4倍,在脚本不变的情况下效果明显。该段脚本用C和golang1.5版本都测试过。C和golang耗时
在0.5秒左右。比pypy快3倍。但是从开发速度和代码易理解的程度上说,写小型的需要快速开发的项目,
python还是非常理想的选择。
另两种语言连接http://www.simonzhang.net/?p=2789

11月 02

tornado 做 api 返回 json 编码处理

使用tornado做API服务器,返回数据为json,编码使用utf-8。但是在客户端显示为utf-8的编码,而不是中文。
效果如下:
测试内如
“测试”
直接打印的编码返回
‘\xe6\xb5\x8b\xe8\xaf\x95′
decode utf-8后的编码返回
u’\u6d4b\u8bd5’

为了终端调试方便,最好是打印中文。
data为组织成dict格式的数据,然后用json模块导入。如下处理后可以正常显示。
json_data = json.dumps(data, ensure_ascii=False)

9月 25

python 字符串型二维数组转换

  问题场景:需要rsync一批文件,每个rsync信息又是一个list。想将这部分信息以字符串的形式存到mysql中。使用pickle模块做持久化,更为智能,详见http://www.simonzhang.net/?p=598。我想方便手动在数据库里手动编写。就写了以下部分。此次测试虽然实现字符串转列表功能,但是不能处理字符串、数字型等高级问题,只是自己用着方便(重新造轮子)。

#!/bin/env python
# -*- coding:utf-8 -*-
# Date:        2015-09-23
# Author:      simonzhang
# web:         www.simonzhang.net
# Email:       simon-zzm@163.com
import sys
from string import strip

# 获得参数
a= sys.argv[1]
# 初始化一个列表
rsync_info = []
# 父级列表之间用"?"分割
# 循环处理父级的
f_list = a.split('?')
for f_num in xrange(0, len(f_list)):
    # 每次循环增加一个子列表,如果但是单个数据则直接添加
    if f_list[f_num][0] == "[":
        # 两级列表,要现增加一个新的
        rsync_info.append([])
        for s_one in f_list[f_num][1:-1].split(','):
            rsync_info[f_num].append(strip(s_one))
    else:
        rsync_info.append(f_list[f_num])
print rsync_info

执行测试成功
python test.py “[aa, 123| 4.56]?[bb, 78|9/10]?cc”