分类 默认分类 下的文章

OpenSSL 基本知识

  1. 目的/作用? PKI的一部分

  2. 实现架构/组件/组成 key, cert, CA, CA chain

  3. OpenSSL 包含 cryptographic library and an SSL/TLS toolkit;

  4. 一个 SSL/ TLS的实现, 一个de facto standard;

  5. Privacy-Enhanced Mail (PEM) format;

  6. 背景: 开源 广泛使用 高性能;

  7. 带命令行工具 方便调试

$ openssl version
OpenSSL 1.0.2g  1 Mar 2016
$ openssl version -a
OpenSSL 1.0.2g  1 Mar 2016
built on: reproducible build, date unspecified
platform: debian-amd64
options:  bn(64,64) rc4(16x,int) des(idx,cisc,16,int) blowfish(idx)
compiler: cc -I. -I.. -I../include  -fPIC -DOPENSSL_PIC ... -DECP_NISTZ256_ASM
**OPENSSLDIR: "/usr/lib/ssl"**
$ls /usr/lib/ssl -la  //配置文件路径
lrwxrwxrwx  1 root root   14 Jun 20  2018 certs -> /etc/ssl/certs
drwxr-xr-x  2 root root 4096 Jan 10 10:55 misc  //各种工具脚本
lrwxrwxrwx  1 root root   20 Dec  4 13:07 openssl.cnf -> /etc/ssl/openssl.cnf
lrwxrwxrwx  1 root root   16 Jun 20  2018 private -> /etc/ssl/private

 $openssl help

$man ciphers
$ openssl genrsa -aes128 -out fd.key 2048 //生成key 文件
$ openssl rsa -text -in fd.key //读取key 文件
$ openssl rsa -in fd.key -pubout -out fd-public.key //通过private key 生成public key;

$openssl s_client -showcerts  -connect www.ebay.com:443
$openssl s_client -debug  -connect www.ebay.com:443

<Exploring ES6> 读书笔记 - New number and Math features

  1. New integer literals, 直接可以二进制, 八进制, 十六进制了

    0xFF // ES5: hexadecimal
    255
    0b11 // ES6: binary
    3
    0o10 // ES6: octal
    8

  2. New Number properties

    Number.isInteger(num)
    Number.isSafeInteger(number)
    Number.MIN_SAFE_INTEGER
    Number.MAX_SAFE_INTEGER
    Number.isNaN(num)
    Number.isFinite
    Number.parseFloat
    Number.parseInt

  3. New Math methods

    Math.sign(-8) // -1
    Math.trunc(3.1)
    Math.log10(100)

SRE - performance

General

  1. warm up requests;
  2. zip the big request/response for API;

Java

  1. Full GC after server startup;
  2. Thread pool/Connection pool;

最简单的基于 nginx 的下载服务器

有时候, 有些地方不能从互联网下载东西, 但是可以上传一些内部的 docker image, 比如 生产环境, 一般是连不上外网的, 及时使用代理, 很有可能也不允许下载很大的东西. 这个时候, 可以做个 docker image 上传上去, 然后供生产环境使用. 下面是一个基于 nginx 的最简单 web 服务器.

需要2个文件, 里面的 mat.zip 和 那个 jdk 的 exe 是我需要下载的东西.
Dockerfile (去除下面的所有注释)

FROM alpine
RUN apk update
RUN apk --no-cache add nginx   #安装 nginx
ADD nginx.conf /etc/nginx/nginx.conf  #复制本地的配置文件
RUN mkdir -p /run/nginx  #建立 nginx pid 文件需要的文件夹
ADD mat.zip /usr/share/nginx/www/  #复制本地需要复制的文件1 例子
ADD jdk-8u171-windows-x64.exe /usr/share/nginx/www/  #复制本地需要复制的文件2 例子
RUN chmod 755 /usr/share/nginx/www/*  #更改文件读权限
EXPOSE 80  #暴露80端口
CMD ["nginx", "-g", "daemon off;"]  #启动 nginx

nginx.conf

events {
  worker_connections 1024;
}

http {
  include /etc/nginx/mime.types;
  index index.html;
  default_type application/octet-stream;
  sendfile     on;

  server {
    location / {
      root /usr/share/nginx/www;
      index not_a_file;
      autoindex on;
      types {}
    }
  }
}

打包: docker build -t repo.tianxiaohui.com/xiatian/test:0.1 .
上传: docker push repo.tianxiaohui.com/xiatian/test:0.1
下载: docker pull repo.tianxiaohui.com/xiatian/test:0.1
运行: docker run -p 9191:80 repo.tianxiaohui.com/xiatian/test:0.1
使用: http://container.tianxiaophui.com:9191/

JVM 常见的启动参数 flags

//jit 编译器类型

  • -client //32位 client, 启动早, 编译不耗时
  • -server //32位 server, 启动晚, 编译耗时, 最终代码更优化,更快
  • -d64 //64位
  • -XX: TieredCompilation //必须使用 server 编译器, 先 client, 再 server 重新编译
  • -XX:InitialCodeCacheSize=N //初始 code cache 值, 可以通过 jconsole 查看
  • -XX:ReservedCodeCacheSize=N //最大 code cache 值
    //编译开始的 threshold, 不是全局累加计数, 而是移动区间计数
  • -XX:PrintComplilation //打印编译日志 可以通过 jstat 查看编译的统计信息或 jconsole
  • -XX:CompileThreshold=N //是否启动编译的 threshold (方法调用计数器 循环回边计数器)
  • -XX:OnStackReplacePercentage=N //OSR 的 threshold 值, 需要通过公式计算次数
  • -XX:CICompilerCount=N //编译器的线程数
  • -XX:Printflagsfinal 启动时打印所有标志 flags;
  • -XX:+Inline //内联 默认是 true
  • -XX:+DoEscapeAnalysis //逃逸分析 默认是 true

//GC refer: https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/collectors.html

  • -XX:+UseSerialGC
  • -XX:+UseParallelGC
  • -XX:-UseParallelOldGC
  • -XX:+UseConcMarkSweepGC
  • -XX:+UseParNewGC
  • -XX:+UseG1GC

//GC log refer: https://dzone.com/articles/enabling-and-analysing-the-garbage-collection-log

  • -XX:+PrintGC

  • -XX:+PrintGCDetails

  • -XX:+PrintGCTimeStamps

  • -XX:+PrintGCDateStamps

  • -Xloggc:

  • -XX:+PrintGCApplicationStoppedTime

  • -XX:+PrintGCApplicationConcurrentTime

  • -XX:+UseGCLogFileRotation

  • -XX:NumberOfGCLogFiles=5

  • -XX:GCLogFileSize=2000k

  • -XX:ParallelGCThreads=N //并发启动的GC 回收线程数目

  • -XX:+DisableExplicitGC

//heap related

  • -Xms //heap start eg: -Xms3000m
  • -Xmx //heap max eg: -Xmx:4000m
  • -XX:NewRatio=N //新生代和老年代占比用比率, default 2. 新生代大小=总堆大小/(1+NewRatio)
  • -Xns //Nursery Start eg: -Xns800m
  • -XX:NewSize=N //新生代初始大小
  • -XX:MaxNewSize=N //新生代最大值
  • -XX:PermSize=N //永久带初始大小
  • -XX:MaxPermSize=N //永久带最大值
  • -XX:MetaspaceSize=N //java8 元空间初始大小
  • -XX:MaxMetaSpaceSize=N //java8 元空间最大值
  • -XX:+PrintAdaptiveSizePolicy //打印自适应策略相关信息
  • -XX:+UseAdaptiveSizePolicy //使用自适应策略. 若xms,xmn,xns固定死,则不使用

//JFR

  • -XX:UnlockCommercialFeatures
  • -XX:+flightRecorder

官方文档: https://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html#PerformanceTuning

作为服务器运行的 JVM 最好设置下面这些参数:

-Xms<heap size>[g|m|k] 
-Xmx<heap size>[g|m|k]
-XX:MaxMetaspaceSize=<metaspace size>[g|m|k]
-Xmn<young size>[g|m|k]

-Xloggc:"<path to log>"
-XX:+PrintGCDetails 
-XX:+UseGCLogFileRotation 
-XX:NumberOfGCLogFiles=10 
-XX:GCLogFileSize=10M
-XX:+PrintGCDateStamps 

-Dsun.net.inetaddr.ttl=<TTL in seconds>

-XX:+HeapDumpOnOutOfMemoryError 
-XX:HeapDumpPath=<path to dump>`date`.hprof