内网穿透 – Frp

去年自己攒了一个Nas服务器,放在家里,不过家里没有公网IP

于是研究了很多内网穿透的东西
1. 带花生壳的路由
2. 花生棒
3. 花生壳客户端
4. 其他类似于花生壳的穿透服务(freenas管理后台提供很多但不好用)
5. Ngrok (需要自己有公网服务器)
6. Frp (需要自己有公网服务器)

最开始买了一个花生壳提供的硬件设备 — 花生棒,不过感觉不太好用还有限制
后来开始使用Frp,感觉棒棒哒。

Frp需要有一个公网的IP,正好我有一台阿里云的机器。原理就是公网服务器上搭建Frp服务端,然后内网机器运行Frp客户端,客户端主动连接服务端,然后服务端把自己收到的请求转发给客户端。
其实花生壳的客户端也是这个原理,可惜花生壳有营收压力,开始收费了。

然后就可以各种穿透了,http,https,ssh,nas ….

服务端配置 frps.ini

[common]
bind_port = 7000
vhost_http_port = 8080
privilege_token = xxxx123456
log_file = ./frps.log

客户端配置 frpc.ini

[common]
server_addr = 106.xxx.xxx.xxx
server_port = 7000
privilege_token = xxxx123456
log_file = ./frpc.log

[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 8022
use_encryption = true
use_compression = true

[web]
type = http
local_port = 80
custom_domains = test.xxtime.com

最后不要忘记开启阿里云的端口-在安全组配置里
这里 我启用了8022, 8080 分别对应 ssh 和 http 服务

# 启动服务端, 在公网机器上操作
nohup ./frps -c ./frps.ini &

# 启动客户端,在内网机器上操作
nohup ./frpc -c ./frpc.ini &

内网定时检测启动脚本 (FreeBSD)
此处使用 ps auxww
如果是ps aux则在crontab下无法获取frp进程

#!/bin/bash
# 检查Frp是否启动
# 使用grep frp过滤可能会误认为目录中包含的frp符合条件,所以过滤时用 grep frpc.ini
function checkFrp() {
    count=`ps auxww | grep frpc.ini | grep -v 'grep' | wc -l`
	if [ 0 == $count ];then
		nohup /usr/local/frp/frpc -c /usr/local/frp/frpc.ini &
		echo 'Frp start at' `date` >> /usr/local/frp/cron.log
	else
		echo 'Frp is running at' `date` >> /usr/local/frp/cron.log
	fi
}

checkFrp

官方网址: https://github.com/fatedier/frp
官方文档:https://github.com/fatedier/frp/blob/master/README_zh.md

实时消息流分析系统

通常实时消息流分析系统分为3个部分

1 生产系统
2 消息流系统
3 消费系统

生产系统:
1.连接数据源
2.收集数据日志事件等
3.过滤数据转换格式
4.发布到流处理系

消息流系统
从生产者获取数据流,并保证可靠的数据,待消费者处理

消费系统
消费系统是流处理引擎,它们订阅来自数据流的数据并操作或分析数据以查找警报。

生产系统
Apache Flume, StreamSets Data Collector , Scribe, LogStash

消息流系统
Apache Kafka, MapR Streams, Kinesis

消费系统
Apache Storm , Spark Streaming , Apache Flink , Apache Apex

行业通用解决方案
flume + kafka + storm
flume + kafka + SparkSteaming

关于RSA密钥加密的一点想法

很久以前就有过这样的想法.

为什么:
1024比特的RSA 加密的数据不能超过117个字节(1024/8 – 11 = 117)
2048比特的RSA 加密的数据不能超过245个字节(2048/8 – 11 = 245)

后来看了一篇文章才恍然大悟RSA的主要作用是用来加密秘钥用的

比如AES加密的秘钥在传输过程为了避免被窃取,使用非对称RSA进行一次加密
后续的数据直接使用AES进行加密传输

当然RSA也可以对超长字节的数据进行加密,比如使用1024位的RSA密钥对超长数据进行加密
方法是:分割字符串每117(小于等于117)字节为一段,然后分段加密,最后连接到一起,
如果希望方便传输最后再来一次base64 encode

第三方账户登录的服务端验证组件xxtime/oauth-client

Oauth-client 用户第三方账户登录的服务端验证组件
支持 Google, Facebook, Weixin, Weibo 等.

我在公司的一些项目有所应用,还不错

安装

composer require xxtime/oauth-client dev-master

使用方法

$id = '{Google account id}';
$token = '{Google login account token}';
$option = [
    'clientId' => '{Google app id}'
];
try {
    $oauth = new OauthAdaptor('google', $option);
    $user = $oauth->verify($id, $token);
    print_r($user);
} catch (\Exception $e) {
    echo $e->getMessage();
}     

项目地址
https://github.com/xxtime/oauth-client

开源项目omnipay-mycard, 快速MyCard支付集成

项目地址 https://github.com/xxtime/omnipay-mycard

MyCard是台湾的一个电子支付服务商,类似于支付宝
但是MyCard的接入很烂,这是我见过所有支付集成平台最烂的接口
为了避免其他人在MyCard碰到各种坑,我就写了omnipay-mycard项目

omnipay-mycard项目是一个支付组件,使用composer就能很容易安装
目前稳定版本是 1.1.0

composer require "xxtime/omnipay-mycard:~1.1"

Omnipay是一个支持多网关支付的组件,也是The PHP League团队的旷世之作
由来自全球社区爱好者的精英们编写各个支付网关的适配器

目前国内的 支付宝 微信支付 银联支付 的适配器都囊括其中
不过支付宝的适配器写的不太规范 但用绝对没问题,我也跟其作者沟通,他希望有更多的人参与改进

好吧还是继续说omnipay-mycard吧
omnipay-mycard
支持 MyCard点卡支付,MyCard会员支付,MyCard电信类支付
支持MyCard对账

上代码吧:

// Initialize
$config = [
    'appId'  => 'MyCard_ServiceId',
    'appKey' => 'MyCard_Key'
];
$gateway = Omnipay::create('MyCard');
$gateway->initialize($config);

// Send purchase request
$response = $gateway->purchase(
    [
        'amount'        => '1.00',
        'currency'      => 'TWD',
        'description'   => 'product description',
        'transactionId' => mt_rand(100000, 999999),
    ]
)->send();

// Process response
if ($response->isRedirect()) {
    // doing something here
    // $token = $response->getToken();
    // $data = $response->getData();
    // $transactionReference = $response->getTransactionReference();
    $response->redirect();
}
elseif ($response->isSuccessful()) {
    // doing something here
    print_r($response);
}
else {
    echo $response->getMessage();
}

开源项目flysystem-aliyun-oss 阿里云OSS文件上传管理组件

项目地址 https://github.com/xxtime/flysystem-aliyun-oss

flysystem项目是 The PHP League 团队发起的用户文件上传管理等操作的项目
采用适配器的方式,支持本地文件操作,各种云操作,各种网盘,FTP,WebDAV 总之厉害了。

而我在发现没有阿里云的适配器的时候 就自己写了一个,并且已经收录到官方的适配器列表中,而且已有很多用户在使用

flysystem-aliyun-oss项目支持阿里云OSS系统的文件上传管理等操作

使用composer即可方便安装

使用方法见代码

use League\Flysystem\Filesystem;
use Xxtime\Flysystem\Aliyun\OssAdapter;

$filesystem = new Filesystem(new OssAdapter([
    'access_id'     => 'access_key_id',
    'access_secret' => 'access_key_secret',
    'bucket'        => 'bucket name',

    // 'endpoint'       => 'oss-cn-shanghai.aliyuncs.com',
    // 'timeout'        => 3600,
    // 'connectTimeout' => 10,
]));


// Write Files
$filesystem->write('path/to/file.txt', 'contents');

// Write Use writeStream
$stream = fopen('local/path/to/file.txt', 'r+');
$result = $filesystem->writeStream('path/to/file.txt', $stream);
if (is_resource($stream)) {
    fclose($stream);
}

// Update Files
$filesystem->update('path/to/file.txt', 'new contents');

// Check if a file exists
$exists = $filesystem->has('path/to/file.txt');

// Read Files
$contents = $filesystem->read('path/to/file.txt');

// Delete Files
$filesystem->delete('path/to/file.txt');

// Rename Files
$filesystem->rename('filename.txt', 'newname.txt');

// Copy Files
$filesystem->copy('filename.txt', 'duplicate.txt');


// list the contents (not support recursive now)
$filesystem->listContents('path', false);

官方项目
https://github.com/thephpleague/flysystem

开源项目Phalcon-Rest

最近我有写了一个开源项目Phalcon-Rest

Phalcon-Rest主要用来开发rest接口

项目地址  https://github.com/xxtime/phalcon-rest

特点:
使用phalcon构建的一个rest项目
高性能
支持composer
数据库支持MySql MongoDB Redis, 当然不限于此
事件监听机制
中间件功能
I18n多语言支持
调试工具whoops
各种神操作的路由写法

 

此项目的readme文档里还推荐了很多优秀的组件