lushang 发布的文章

微信截图_20200606131522.png

引子

心血来潮想看看Nginx的access日志,然而拉下来之后,打开几十万行的文件,无从下手。于是想找一个日志分析工作,能够达成以下目的:

  • 网络流量:某个区间范围内的入站、出站流量
  • IP地址,最好可以Geolocaiton一下知道物理位置
  • 访问设备、浏览器等信息
  • 访问的路由信息,比如访问了那个URI等

搜索了一下,发现其实有非常多的运维工作能够满足需求,但是最简单的还是GoAccess的方案。

GoAccess

微信截图_20200606131350.png

官网:https://goaccess.io/

GoAccess is an open source real-time web log analyzer and interactive viewer that runs in a terminal in *nix systems or through your browser.

It provides fast and valuable HTTP statistics for system administrators that require a visual server report >on the fly.

简单来说GoAccess可以直接对Nginx等程序产生的日志进行分析,然后直接可视化。这个过程比使用诸如ELK方案来得简单快捷

GoAccess功能特征

GoAccess解析指定的Web日志文件并将数据输出到X终端。功能包括:

  • 完全实时,所有面板和指标定时在终端输出上每200 ms更新一次,在HTML输出上每秒更新一次。
  • 跟踪应用程序响应时间,如果您想跟踪减慢网站速度的网页,会非常有用。
  • 支持几乎所有Web日志格式, GoAccess允许任何自定义日志格式字符串。
  • 支持增量日志处理,GoAccess能够通过磁盘上的B + Tree数据库逐步处理日志,保持数据持久性。
  • 可定制配色方案,Tailor GoAccess以适合您自己的色彩品味/方案。
  • 支持大型数据集,GoAccess 为大型数据集提供磁盘B +树存储,无法将所有内容都安装在内存中。
  • Docker支持,能够从上游构建GoAccess的Docker镜像。

安装和配置

安装

安装GoAccess的话,官网有非常详细的教程,可以点击这里(download)查看详情,这里以Ubuntu 16.04/18.04为例:

不要使用Ubuntu官方源, 使用GoAccess官方源:

$ echo "deb http://deb.goaccess.io/ $(lsb_release -cs) main" | sudo tee -a /etc/apt/sources.list.d/goaccess.list
$ wget -O - https://deb.goaccess.io/gnugpg.key | sudo apt-key add -
$ sudo apt-get update
$ sudo apt-get install goaccess

配置

基本上不用配置,可以略去

简单使用和部署

在终端输出

定位到access.log所在文件夹,比如/var/log/nginx, 然后执行

# goaccess access.log -c

如果提示没有权限打开access.log文件,则需要使用sudo等命令提权

输出为静态报告

定位到access.log所在文件夹,比如/var/log/nginx, 然后执行

# goaccess access.log -o report.html --log-format=COMBINED

如果提示没有权限打开access.log文件,则需要使用sudo等命令提权

输出为动态报告

定位到access.log所在文件夹,比如/var/log/nginx, 然后执行

# goaccess access.log -o report.html --log-format=COMBINED

如果提示没有权限打开access.log文件,则需要使用sudo等命令提权

这样我们打开report.html即可以看到可视化的报告

多个日志文件的分析

Nginx一般会有多个日志文件,有得还gz压缩了,这时候需要使用:

$ sudo zcat -f access.log* | sudo goaccess -o /var/www/monitor/report.html --log-format=COMBINED --real-time-html

这种方式,将多个日志文件传入GoAccess

这样我们打开report.html即可以看到可视化的报告,我这里把html页面放在了web server上,可以直接通过web server访问

通过网络可以访问的实时日志记录

1. 配置Nginx

location /report.html {
    alias /var/www/html/report.html;
    # 下面三行是为了实现websocket
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
}

2. 使用Daemon模式启动GoAccess

# sudo zcat -f access.log* | sudo goaccess access.log* -o /var/www/html/report.html --real-time-html --time-format='%H:%M:%S' --date-format='%d/%b/%Y' --log-format=COMBINED --daemonize

我们加--daemonize参数是为了后台执行,执行这个的前提是有--real-time-html这个参数。如果我们是https的还需要添加--ssl-cert=crt文件目录 --ssl-key=key文件目录这两个参数才可以实现wss

原文章:ssh证书登录(实例详解)

前言

本文基于实际Linux管理工作,实例讲解工作中使用ssh证书登录的实际流程,讲解ssh证书登录的配置原理,基于配置原理,解决实际工作中,windows下使用SecureCRT证书登录的各种问题,以及实现hadoop集群部署要求的无密码跳转问题。

ssh有密码登录和证书登录,初学者都喜欢用密码登录,甚至是root账户登录,密码是123456。但是在实际工作中,尤其是互联网公司,基本都是证书登录的。内网的机器有可能是通过密码登录的,但在外网的机器,如果是密码登录,很容易受到攻击,真正的生产环境中,ssh登录都是证书登录。

证书登录的步骤

  1. 客户端生成证书:私钥和公钥,然后私钥放在客户端,妥当保存,一般为了安全,访问有黑客拷贝客户端的私钥,客户端在生成私钥时,会设置一个密码,以后每次登录ssh服务器时,客户端都要输入密码解开私钥(如果工作中,你使用了一个没有密码的私钥,有一天服务器被黑了,你是跳到黄河都洗不清)。
  2. 服务器添加信用公钥:把客户端生成的公钥,上传到ssh服务器,添加到指定的文件中,这样,就完成ssh证书登录的配置了。假设客户端想通过私钥要登录其他ssh服务器,同理,可以把公钥上传到其他ssh服务器。

真实的工作中:员工生成好私钥和公钥(千万要记得设置私钥密码),然后把公钥发给运维人员,运维人员会登记你的公钥,为你开通一台或者多台服务器的权限,然后员工就可以通过一个私钥,登录他有权限的服务器做系统维护等工作,所以,员工是有责任保护他的私钥的,如果被别人恶意拷贝,你又没有设置私钥密码,那么,服务器就全完了,员工也可以放长假了。

客户端建立私钥和公钥

在客户端终端运行命令

ssh-keygen -t rsa

rsa是一种密码算法,还有一种是dsa,证书登录常用的是rsa。

假设用户是blue,执行 ssh-keygen 时,才会在我的home目录底下的 .ssh/ 这个目录里面产生所需要的两把 Keys ,分别是私钥 (id_rsa) 与公钥 (id_rsa.pub)。

另外就是私钥的密码了,如果不是测试,不是要求无密码ssh,那么对于passphrase,不能输入空(直接回车),要妥当想一个有特殊字符的密码。

ssh服务端配置

ssh服务器配置如下:

vim /etc/ssh/sshd_config
#禁用root账户登录,非必要,但为了安全性,请配置
PermitRootLogin no

# 是否让 sshd 去检查用户家目录或相关档案的权限数据,
# 这是为了担心使用者将某些重要档案的权限设错,可能会导致一些问题所致。
# 例如使用者的 ~.ssh/ 权限设错时,某些特殊情况下会不许用户登入
StrictModes no

# 是否允许用户自行使用成对的密钥系统进行登入行为,仅针对 version 2。
# 至于自制的公钥数据就放置于用户家目录下的 .ssh/authorized_keys 内
RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile      %h/.ssh/authorized_keys

#有了证书登录了,就禁用密码登录吧,安全要紧
PasswordAuthentication no

配置好ssh服务器的配置了,那么我们就要把客户端的公钥上传到服务器端,然后把客户端的公钥添加到authorized_keys

在客户端执行命令

scp ~/.ssh/id_rsa.pub blue@<ssh_server_ip>:~
在服务端执行命令

cat  id_rsa.pub >> ~/.ssh/authorized_keys
如果有修改配置/etc/ssh/sshd_config,需要重启ssh服务器

/etc/init.d/ssh restart

客户端通过私钥登录ssh服务器

ssh命令

ssh -i /blue/.ssh/id_rsa blue@<ssh_server_ip>
scp命令

scp -i /blue/.ssh/id_rsa filename blue@<ssh_server_ip>:/blue
每次敲命令,都要指定私钥,是一个很繁琐的事情,所以我们可以把私钥的路径加入ssh客户端的默认配置里

修改/etc/ssh/ssh_config

#其实默认id_rsa就已经加入私钥的路径了,这里只是示例而已
IdentityFile ~/.ssh/id_rsa
#如果有其他的私钥,还要再加入其他私钥的路径
IdentityFile ~/.ssh/blue_rsa

其他应用场景

SecureCRT密钥key远连接程ssh证书登录Linux
国内大部分人用的系统是windows,而windows下有很多ssh客户端图形工作,最流行,功能最强大的就是SecureCRT了,所以我会单独针对SecureCRT简单讲下实现ssh证书登录Linux的要点,步骤如下:

  1. 在SecureCRT创建私钥和公钥:主菜单->工具->创建公钥->选择RSA->填写私钥的密码->密钥长度填为1024->点击完成,生成两个文件,默认名为identity和identity.pub
  2. 把私钥和公钥转换为OpenSSH格式:主菜单->工具->转换私钥到OpenSSH格式->选择刚生成私钥文件identity->输入私钥的密码->生成两个文件,指定为id_rsa,id_rsa.pub
  3. 把公钥id_rsa.pub上传到ssh服务器,按照之前配置服务器端的证书,再配置一次。

另外,如果你之前用windows的 SecureCRT的证书登录linux的,有一天你换成了linux,并希望通过原来的私钥登录公司的服务器,那么可以把id_rsa拷贝倒~/.ssh/目录下,配置ssh客户端参考上文。

备注:ssh对证书的文件和目录权限比较敏感,要么根据出错提示设置好文件和目录权限,要么是把StrictModes选项设置为no

hadoop部署的无密码ssh登录
hadoop要求master要无密码跳转到每个slave,那么master就是上文中的ssh客户端了,步骤如下

在hadoop master上,生成公钥私钥,这个场景下,私钥不能设置密码。

把公钥上传到每个slave上指定的目录,这样就完成了ssh的无密码跳转了。

总结

ssh证书登录,在实际工作才是最常用的登录方式,本人结合了真正工作的场景普及了ssh证书登录的知识,并根据流行的hadoop部署和windows下最常用的SecureCRT实例讲解了证书登录。

半连接和反链接是SOQL里面一个宝,只要用的好,天天下班早

Semi-Join | 半连接

半连接(Semi-Join)指的是在SOQL语句的对比子句里面(也就是WHERE部分),使用子查询(subquery)的情况。

可能用到半连接的情况可能有:

  1. 获取某些具有特定阶段或者截至日期Opportunity的Account下面所有Contact信息
  2. 获取具有激活的Contract的Account下面所有的Opportunity信息

写法
有两种半连接:1)使用Id字段,2)使用外键(Lookup/Master-Detail关系等)

  1. 使用Id字段的半连接例子:

    SELECT Id, Name 
    FROM Account 
    WHERE Id IN 
      ( SELECT AccountId
     FROM Opportunity
     WHERE StageName = 'Closed Lost' 
      )
  2. 使用外键的半连接例子:

    SELECT Id
    FROM Task 
    WHERE WhoId IN 
      (
     SELECT Id
     FROM Contact
     WHERE MailingCity = 'Twin Falls'
      )

Anti-Join | 反连接

反连接(Anti-Join)与半连接非常类似,只是不同于半连接使用的比较关键字为IN, 反连接使用的比较关键字为NOT IN。其余部分包括写法、限制等是一致的,不再赘述。

两种写法

  1. 使用Id字段的半连接例子:

    ELECT Id, (Select Id, Amount, CloseDate FROM Opportunities)
    FROM Account
    WHERE Id NOT IN
      (
     SELECT AccountId
     FROM Contact
     WHERE LastName LIKE 'Trump%'
      )
  2. 使用外键的半连接例子:

    SELECT Id, Name, Phone, Email
    FROM Contact
    WHERE AccountId NOT IN 
      (
     SELECT AccountId
     FROM Opportunity
     WHERE CloseDate < Last_Week
      )

限制

  1. 在主语句的WHERE分句中,不能超过2INNOT IN语句
  2. 不能在半连接或者反连接前使用NOT操作符。若有这种情况,可以考虑把半连接转换为反连接,或者反连接转换为全连接
  3. 必须是Id字段或者外键,诸如... Where Account.Id IN (...)是非法的
  4. 子查询的查询字段必须与主查询对应的字段SObject一致,是且必须是对应的外键
  5. 子查询的字段条数不受限制,但是主查询条数仍收到限制
  6. 半连接或者反连接不能嵌套使用,即不能在半连接/反连接中再使用半连接或者反连接
  7. 子查询不能使用OR
  8. 子查询不支持COUNT, 'FOR UPDATE, ORDER BY, LIMIT`
  9. 下列对象不支持:

    • ActivityHistory
    • Attachments
    • Event
    • EventAttendee
    • Note
    • OpenActivity
    • Tags (AccountTag, ContactTag, and all other tag objects)
    • Task

详情可以查看SOQL and SOSL Reference以下章节:
Semi-Joins with IN and Anti-Joins with NOT IN

这篇文章是机器学习常用基本算法文章的一个索引,具体可以参见具体的文章链接
文章状态 alpha

  1. 决策树 Decision Tree
  2. 随机森林 Random Forest
  3. 逻辑回归 Logistic Regression
  4. 支持向量机 SVM
  5. 朴素贝叶斯
  6. K最近邻算法
  7. K均值算法
  8. Adaboost 算法
  9. 神经网络
  10. 马尔可夫

参考

  1. Kaggle: Learning Machine Learning
  2. CSDN: 轻松看懂机器学习十大常用算法
  3. 伯乐在线: 10 种机器学习算法的要点 (3的翻译)
  4. Essentials of Machine Learning Algorithms
  5. A Tour of The Top 10 Algorithms for Machine Learning Newbies