分类目录归档:开发dev

基于VSCode的云端IDE — code-server

code-server是基于VSCode的开源云端 IDE,可以直接在Linux开发机上启动,通过浏览器进行访问,直接浏览、编辑Linux上的代码。相比基于终端的编辑器(如vim),code-server功能更强大,支持各种语言的代码理解、跳转、补全、查错、调试等;相比于本地IDE+Samba/Ftp文件同步方式,code-server更加便捷、安全。同时它完整支持VSCode的强大的编辑器功能、丰富的插件生态。 阅读全文

python skimage图像处理

skimage即是Scikit-Image。基于python脚本语言开发的数字图片处理包,比如PIL,Pillow, opencv, scikit-image等。 PIL和Pillow只提供最基础的数字图像处理,功能有限;opencv实际上是一个c++库,只是提供了python接口,更新速度非常慢。scikit-image是基于scipy的一款图像处理包,它将图片作为numpy数组进行处理,与matlab一样。 阅读全文

LSM VS B-Tree

LSM树整个结构不是有序的,所以不知道数据在什么地方,需要从每个小的有序结构中做二分查询,找到了就返回,找不到就继续找下一个有序结构。所以说LSM牺牲了读性能。但是LSM之所以能够作为大规模数据存储系统在于读性能可以通过其他方式来提高,比如读取性能更多的依赖于内存/缓存命中率而不是磁盘读取。 阅读全文

如何搭建一个ssdb高可用集群

概述

ssdb是一个大规模持久化kv存储,类似redis,只是存储介质增加了ssd+sata,适合写入redis数据和qps规模较大,数据读取占比较小,想降低redis内存服务器购买成本,同时使读写性能上损失小些。有朋友公司使用了1T+的ssdb,想实现高可用方案,一直比较忙… 这两天终于有空研究了一下,给一个简单的多主水平分片+主从热备+读写分离代理解决方案

SSDB

SSDB 是一个 C/C++ 语言开发的高性能 NoSQL 数据库, 支持 KV, list, map(hash), zset(sorted set) 等数据结构, 用来替代或者与 Redis 配合存储十亿级别列表的数据。

特点:

1.底层的LevelDB使用LSM存储引擎,相比与关系数据库的B-Tree,写性能更好,而牺牲了部分的读性能。适合写多读少的场景,或读热key相对集中,缓存命中率较高的场景。

2.LSM树整个结构不是有序的,所以不知道数据在什么地方,需要从每个小的有序结构中做二分查询,找到了就返回,找不到就继续找下一个有序结构。在缓存命中率较低时,磁盘读取性能较差。故单个分片容量不宜过大,否则磁盘读性能不可接受

github:https://github.com/ideawu/ssdb

SSDB中文手册:http://ssdb.io/zh_cn/

SSDB入门基础:https://github.com/ideawu/ssdb-docs/blob/master/pdf/SSDB%E5%85%A5%E9%97%A8%E5%9F%BA%E7%A1%80.pdf

TwemProxy 阅读全文

nginx配置https

最近做点小程序,服务端api必须是https域名,配置方法如下:

创建ssh证书

自己生成CA证书:(自己生成的根证书浏览器不认,会提示不安全,但https可访问)
cd /home/openssl
openssl genrsa -des3 -passout pass:123456 -out test.pem 2048  #生成RSA私钥
openssl rsa -passin pass:123456 -in test.pem -out test.key  #提取密钥中的公钥
openssl req -new -key test.key -out test.csr -subj /C=CN/ST=beijing/L=beijing/O=YAN/CN=www.yanjingang.com #生成证书请求文件
openssl x509 -req -days 365 -in test.csr -signkey test.key -out test.crt  #生成自签名证书
openssl x509 -in test.crt -noout -text  #查看证书文件

阿里云、百度云有免费的单域名DV证书(下载注意选择nginx版本证书)

nginx配置

vim conf/vhost/php.conf
  listen 8080;      #监听8080端口http
  listen 8443 ssl;  #同时监听8443端口https
  #开启ssl并设置证书
  ssl on;
  ssl_certificate /home/openssl/www.yanjingang.crt;
  ssl_certificate_key /home/openssl/www.yanjingang.key;

重启nginx后使用https://www.yanjingang.com:8443端口访问即可(注:私人生成的证书会提示不安全,忽略即可)。

https端口转发

#80->8080、443->8443 端口转发
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080
iptables -t nat -A PREROUTING -p tcp --dport 443 -j REDIRECT --to-port 8443

service iptables save
iptables -L -t nat  	#查看当前nat规则
	Chain PREROUTING (policy ACCEPT)
	target     prot opt source               destination         
	REDIRECT   tcp  --  anywhere             anywhere             tcp dpt:http redir ports 8080
	REDIRECT   tcp  --  anywhere             anywhere             tcp dpt:https redir ports 8443

注:公网80、443、8080、8443等端口需要在aliyun安全组中入方向打开才可访问

使用https://www.yanjingang.com即可访问

看到这里满足需求的离开即可,遇到微信小程序TLS1.2问题的往后看。

在完成以上步骤后发现,https已经是安全的,百度小程序api调用也正常,但是微信小程序api调用提示“对应的服务器 TLS 为 TLS 1.0 ,小程序要求的 TLS 版本必须大于等于 1.2 。”

Nginx TLS 1.2配置

1.openSSL 版本需要 >= 1.0.2
  openssl version -a
2.nginx 版本为 0.7.65,0.8.19 及更高版本
  nginx -V
3.nginx是使用的openssl 1.0.2+编译的
  nginx -V |grep openssl
4.nginx tls1.2配置
  ssl_session_timeout 5m;
  ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
  ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
  ssl_prefer_server_ciphers on;

实际情况是我们的server使用内部自研开发框架,nginx编译依赖很多内部插件,且使用openssl 1.0.1编译的,所以怎么设置TLS都是1.0,nginx -V如下:

解决方法:

1.长线方案
下载内部插件源码自己使用openssl1.0.2重新编译nginx
# 更新openssl版本
cd odp/nginx/download/nginx-release.git/libs/
wget http://ftp.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz
rm openssl-1.0.1s.tar.gz
# 重新编译nginx
sh build.sh module-for-odp3.conf  
# 替换nginx
mv /home/work/odp/webserver/sbin/nginx /home/work/odp/webserver/sbin/nginx.openssl-1.0.1s
cp tmp/webserver/sbin/nginx /home/work/odp/webserver/sbin/

2.短线方案
使用外部openssl1.0.2编译的nginx做代理,将iptables端口删除,转发改为nginx代理转发
#设置nginx代理server
vim proxyserver/conf/proxy.conf
    #80->8080端口转发
    server {
        listen              80;
        server_name         _;

        access_log  /home/proxyserver/log/proxyserver.log;
        error_log  /home/proxyserver/log/proxyserver.log.wf;

        location / {
            proxy_set_header Host $http_host;
            proxy_set_header X-Host $http_host;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X_ORIG_URI $request_uri;
            proxy_set_header CLIENTIP $remote_addr;
            proxy_set_header X-Forwarded-For-Proto https;
            proxy_set_header Https 1;

            proxy_pass http://127.0.0.1:8080;

        }
    }
    #443->8080端口转发
    server {
        listen              443 ssl;
        server_name         _;

        access_log  /home/proxyserver/log/proxyserver.log;
        error_log  /home/proxyserver/log/proxyserver.log.wf;

        #开启https ssl
        ssl on;
        ssl_certificate      /home/openssl/cert-1542784817162_www.yanjingang.com.crt;
        ssl_certificate_key  /home/openssl/cert-1542784817162_www.yanjingang.com.key;
        ssl_session_timeout 5m;
        ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_prefer_server_ciphers on;

        location / {
            proxy_set_header Host $http_host;
            proxy_set_header X-Host $http_host;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X_ORIG_URI $request_uri;
            proxy_set_header CLIENTIP $remote_addr;
            proxy_set_header X-Forwarded-For-Proto https;
            proxy_set_header Https 1;

            proxy_pass http://127.0.0.1:8080;

        }
    }
#启动代理nginx
/usr/sbin/nginx -c /home/proxyserver/conf/proxy.conf

#删除iptables端口转发
iptables -t nat -D PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080
iptables -t nat -D PREROUTING -p tcp --dport 443 -j REDIRECT --to-port 8443
service iptables save
iptables -L -t nat
#删除nginx webserver的8443端口监听和ssl配置并重启

#使用https://www.yanjingang.com验证TLS1.2和小程序调用

重启小程序开发工具后测试调用成功,收工~!

yan 18.11.21 22:00

资料:

openssl 非对称加密算法RSA命令详解:https://www.cnblogs.com/gordon0918/p/5363466.html

openssl 证书请求和自签名命令req详解:https://www.cnblogs.com/gordon0918/p/5409286.html

微信小程序要求的TLS版本大于等于1.2的问题:https://www.cnblogs.com/xjnotxj/p/7252043.html

教娃学编程—1.入门概念、int变量、if判断、函数

程序概念、int变量、if判断、函数概念

#include <stdio.h>

int main()
{
	/* YJY */
	int num = 1;
	printf("%d\n", num);
	if(num == 1){
		printf("YJY\n");
	}else{
		printf("YAN\n");
	}

	/* jiafa lianxi */
	int num1 = 89;
	int num2 = 107689;
	int result = sum(num1, num2);
	printf("%d\n", result);

   
   return 0;
}

/* sum */
int sum(int num1, int num2){
	return num1+num2;
}

2018.10.20

安全加密算法选择指南

用途 推荐使用的安全的密码算法 常见的不安全的密码算法
对称加密 AES(密钥长度>=128bits) DES、3DES、RC2、RC4
哈希算法 SHA256或以上 MD5、SHA1
非对称加密 RSA(密钥长度>=2048bits) RSA(密钥长度<=1024bits)
数字签名 RSA(密钥长度>=2048bits) RSA(密钥长度<=1024bits)
密钥交换 DH(密钥长度>=2048bits) DH(密钥长度<=1024bits)

备注:

1. AES不建议使用ECB(同样的明文总是会产生相同的密文),推荐使用CBC模式。

2. 应注意编码及加密的区别,例如base64属于编码而不属于加密。

3. 加解密中建议使用安全随机数,如java.security.SecureRandom,类Unix系统 (包括OS X):  /dev/random;不安全随机数如C标准函数random(),java.util.Random()。

4. 不建议使用私有、非标准化的加解密方式。