【异常】OS X 10.11( EI )上 Nginx 的 https moudle

开笔

自 OS X 10.11 起,Apple 对 OS X 系统的安全做了全新的升级,增加了诸多限制,如 我们再也不能 ln 自己编译安装的软件到 /usr/bin/usr/sbin 了;自带的 openssl不再有 libssl-deve 的库了。

笔者在使用 nginx 第三方库 nginx-upload-module的时候无法绕开 https编译库。使用了 brew 安装 libssl-devel 失败、使用源码编译 openssl 也没找到办法连接或者配置lib的路径。最终选择with-openssl选项编译。

具体问题

在 Mac 上做过源码编译安装 openssl 开发者一定知道知道,需要手动指定64位。否则贼会出现如下警告:

1
2
WARNING! If you wish to build 64-bit library, then you have to
invoke ‘./Configure darwin64-x86_64-cc’ *manually*.

因此,在 openssl 的编译配置中,使用 ./Configure darwin64-x86_64-cc ,即可顺利安装。

这个不难,但是,笔者在使用做 nginx 源码编译安装时,源码编译的 openssl (prefix 配置到 /usr/local/openssl) nginx 依然无法找到 ssl lib 的路径;

在 10.10 及其之前的 OS X 版本 prefix 不配置即可(默认 /usr/local),是可以找到 ssl lib 的。但这个在 10.11 版本系统中无法使用。

解决步骤

  1. 使用源码编译,分别下载nginx,openssl,pcre
  2. 准备编译nginx,记住先只进行 config ,不要急着 make

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    ./configure \
    --prefix=/usr/local/nginx \
    --user=Jiafan \
    --group=staff \
    --with-http_ssl_module \
    --with-http_realip_module \
    --with-http_ssl_module \
    --with-http_realip_module \
    --with-http_addition_module \
    --with-http_sub_module \
    --with-http_dav_module \
    --with-http_flv_module \
    --with-http_gzip_static_module \
    --with-http_stub_status_module \
    --with-mail \
    --with-mail_ssl_module \
    --with-pcre=/* source path to pcre */ \
    --with-openssl=/* source path to openssl */ \
    --add-module=/* source path to nginx upload module */
  3. 如果直接编译,openssl 会报错:

    1
    2
    WARNING! If you wish to build 64-bit library, then you have to
    invoke ‘./Configure darwin64-x86_64-cc’ *manually*.

如果你不停止编译就会出错。这个问题应该是 openssl/config脚本猜对你的系统是64位,但是 会根据$KERNEL_BITS来判断是否开启x86_64编译,默认 是不开启的(很奇怪的设置,虽然会给你5秒时间停止编译并手动开启),所以你生成的openssl库文件是32位的,最后静态链接到nginx会出错。目前看来没有很好的方法把x86_64的参数传到openssl配置文件中 (openssl/config 猜测os架构,设置编译的参数是32位还是64位,默认是32位,然后调用openssl/Configure生成Makefile)

4.进入nginx目录,手动修改 objs/Makefile:

1
./config –prefix=/Users/xxx/Downloads/openssl-1.0.1e/.openssl no-shared no-threads

改成

1
./Configure darwin64-x86_64-cc –prefix=/Users/xxx/Downloads/openssl-1.0.1e/.openssl no-shared no-threads

收工

后面进行 make 和 make install

PS

欢迎来到我github上的空间:https://jiafan.github.io

App版本号的制定与利用

文章目录
  1. 开笔
  2. 范式
  3. 应用移动应用
    1. iOS
    2. Android
      1. 版本意义
      2. 版本设置
    3. 意义
  4. PS

开笔

工作这几年以来,印象中 App 的版本时常被 一拍脑袋 就定了,以前总忍不住说几句,现在似乎逐渐习惯了。但总还是想说点什么,有些惯例或者说范式,遵循一下,还是有长久的好处的。

范式

主版本号.次版本号.修订版本号

范例:2.0.0

  1. 主版本号:接口做了不支持向下兼容的更改,升级主版本号;
  2. 次版本号:做了功能性升级,支持向下兼容,老版本依然正常使用;
  3. 修订号:做问题修正,通常修复缺陷

应用移动应用

iOS

在苹果的应用版本体系中,版本号+编译号 一同唯一标识 AppStore 中的一个特定的提交。
Xcode中的版本号

Android

安卓(Android)版本号涉及到两个:versionCodeversionName

版本意义

  • verisonCode 是作为一个内部版本号,必须是整型。用来区分版本的新旧,版本号越大,代表距当前越近的发布版本。这个数字不是给用户使用的,是给开发者内部使用的
  • versionName 是向用户战士的版本号,必须是字符串,这个版本号就是我们可以用来遵循规范的位置,可以作为版本比较的,判断是否需要提示更新、是否需要强制更新的依据。

版本设置

目前两大开发IDE:Eclipse 、Android Studio 设置版本号在不同的位置。

  • Eclipse 在 manifest 里面配置;
  • Android Studio 在 Gradle Scripts 下面的 build.gradle 配置

Android Version

意义

统一规范版本号,虽然大家沟通的时候,都是一个号码,但在做软件更新升级的时候还是方便很多的。后台版本更新接口,版本检测一套逻辑,简洁干净。

PS

欢迎来到我github上的空间:https://jiafan.github.io

Big Data for BI - 数据采集常见关键字

文章目录
  1. UUID
  2. UV
  3. PV
  4. AR
  5. DAU
  6. CPA
  7. CPP

UUID

通用唯一标识符(universally unique identifier)是软件工程中使用的标识符标准。 UUID是一个简单的一个128位的值。每一位的意义由任何几个变种限定。对于人类可读显示,许多系统使用一个规范的格式使用十六进制文本插入连字符。 例如:

de305d54-75b4-431b-adb2-eb6b9e546014

在做数据采集时,遇到做设备唯一标识的时候经常遇到,目前在做 iOS、Android设备唯一标识时,获取的都是符合这一格式的标识,通常在建立表的时候,字段长度可以确定为 36个字节

UV

唯一访客(Unique visitor), 实际指标是唯一访客数(Unique visitors),统计在一定时期内访问页面、网站或者客户端的不同用户数,唯一访客长久以来都是网站用户行为的一项重要指标。

这个依据能采集到的数据不同,可以使用用户ID区分或者设备ID区分统计。

PV

页面访问(page view or page impression) 是互联网网站web页面的一次加载。页面访问一直以来也都是网站用户行为的一项重要指标

AR

逃出率(Abandonment Rate) ,标识用户在使用过程中各个环节中,用户离开的比例。

DAU

日活跃(Daily Active Users),每日活跃用户数。

CPA

每行动成本(Cost Per Action),即广告主为每个行动所付出的成本。

其计算公式为:CPA =总成本 总成本 /转化次数

CPP

每交易成本(Cost per Purchase),每次交易背后的广告成本。

广告主为规避广告费用风险,只有在网络用户点击旗帜广告并进行在线交易后,才按销售笔数付给广告站点费用。

【异常】OS X-EI-目录权限

开笔

自 OS X 10.11 起,Apple 对 OS X 系统的安全做了全新的升级,增加了诸多限制.系统文件被做了特殊保护标记,纵然使用 sudo 也无法做更改。 这样以来,我们再也不能 ln 自己编译安装的软件到 /usr/bin/usr/sbin 了。还有,自带的 openssl 也不再有 libssl-deve 的库了。

肇事者:SIP

其实都是 SIP 搞得鬼,就是对 SIP(System Integrity Protection 对系统所涉及的,下面的目录列表,只能被系统本身写:

  • /bin
  • /sbin
  • /usr
  • /System

当然,Apple 也为开发者开放了如下目录:

  • /usr/local
  • /Applications
  • [~]/Library

可以看得出来, /usr 目录下,除了 /usr/local 之外目录,都被限制保护了。

解决步骤

  1. 进入恢复模式
    进入恢复模式

  2. 工具箱
    工具箱

  3. 打开控制台
    控制台

  4. 在控制台执行命令

    csrutil disable

    回车

  5. 重启电脑
  6. 在做了相应的更改之后,建议再如上进入恢复模式,命令行开启 csrutil

    csrutil enable

参考文档

Apple System Integrity Protection Guid

Apple 关于如何开关 SIP

数据同步 - rsync

文章目录
  1. 开笔
    1. 背景(废话)
    2. 概述
  2. 安装
  3. 使用
    1. 基本语法
    2. 本地拷贝
    3. 远程拷贝
    4. 使用ssh
    5. 其他高级选项
  4. 优势和特点(可看可不看)

开笔

背景(废话)

做接口服务端,基本上都会使用负载均衡来保证后台的可用性,做负载均衡有很多方法,有硬负载,也有软负载,但负载均衡的后面,就是我们的应用服务,一般都是几台硬件配置相似的,应用服务完全相同的机器。当我们要为这几台机器部署完全相同的应用服务,并维护和更新这几台机器上的应用服务,自然就遇到最直接的数据(包括服务)同步的问题,笔者就是遇到这个问题,才想办法,研究怎么优雅的解决这个问题。

当然,数据同步的场景包含笔者所描述的,但不仅限于此。

概述

rsync 是一款快速并多样的异地文件拷贝工具。具备通过远程脚本或者远程rsync进程来实现本地和远程主机间拷贝的能力。提供丰富的控制选项和灵活多样拷贝的权限控制,因增量拷贝闻名,广泛地用于 备份和镜像,以及作为升级版本的拷贝命令使用。rsync 一个命令行工具,若要用它,首先得对命令行有一定的了解。

总而言之:rsync 是一款 高效的、通用的拷贝、备份、同步数据(文件或者文件夹)工具,可以是本地的、远程的,夸目录、夸磁盘亦或是夸机器,他的高效来自于能够做到增量同步。

安装

在部分 Linux 发行版本中,rsync 是默认已经安装的,为确认是否已经安装,可以查看机器中是否已经安装这几个软件:

  • rsync
  • xinetd
  • ssh

没有的话请自行安装(yum 或者 apt-get 等等).

使用

基本语法

1
rsync options source destination

具体有那些选项的话,我们不妨执行man rsync看看。

本地拷贝

1
rsync -z ~/test.txt /Data/backup/

rsync-local

远程拷贝

1
rsync -zvz route root@jiafan.net:/backup/

rsync-remote

使用ssh

rsync-remote-ssh

其他高级选项

优势和特点(可看可不看)

  • 高效的远程拷贝和同步文件的工具
  • 支持 拷贝链接、设备、所有权、所属组和权限
  • 比scp更快:基于 远程更新协议(remote-update protocol),从而具备增量拷贝技能
  • 低带宽消耗:传输前压缩,传输后解压

日志管理- Logrotate 日志切割和转存

文章目录
  1. 开笔
    1. 背景(废话)
    2. 基础知识
  2. logrotate 是如何工作的
  3. 配置
    1. 系统配置
    2. 应用配置
  4. 参考文档
  5. ps

开笔

背景(废话)

最近在做与数据相关的东西,需要处理大量日志文件。服务器日志的重要性,这里不需要赘述,nginx日志就是其中一种必须处理的。nginx的日志文件理论上是成线性持续增长的,那我们要处理这写数据,又该如何做,经过调研,笔者找到了 Linux 系统提供的服务 logrotate 。

logrotate 就是为管理会生成大量日志的系统而设计诞生的。它具备 自动轮转、压缩、搬迁 和 邮件通知到日志系统的多想功能。每一个日志文件都可以按照 每天、每周、每月周期性处理,亦或是 增长到多大而触发处理。

基础知识

日志轮转指的是实现对当前日志归档,开始新的日志,删除早期的日志。而日志,通常是应用程序记录的一些对系统管理员或者程序开发者有用的信息的文件,诸如正在执行什么、发生了什么错误等一系列信息。

当我们需要跟踪应用的使用过程或是解决应用的异常,日志便是最理想的工具。不幸的是日志记录越多的信息,就意味着需要越多的硬盘空间,随着时间推移,硬盘总有一天被耗光。日志如果不做轮转,就会无收敛地疯涨下去,长此下去,必然会导致多方面拖累系统运行。

logrotate 是如何工作的

通常,logrotate 是作为 corn 的一个每日任务,周期性执行的.在大部分的 Linux 发布版本系统里 (Centos 、Ubuntu、Fedora),我们都能找到

/etc/cron.daily/logrotate

如果您需要调整 logrotate 执行的频率,可以到 cron 配置中调整。如果有需要也可以看看 我关于 cron 的一篇文章。

配置

系统配置

在目录 /etc 中可以看到关于 logrotate 的配置文件和对应目录,你也可以自己查看一些:

ls -al|grep logrotate

应该会发现 /etc/logrotate.conf 这个主配置文件,还有 /etc/lograte.d 这个目录。在这个目录里也许可以找到针对一个应用级别的logrotate配置,这取决于你安装了那些服务和安装方式。一般,通过包管理工具安装的应用服务,会同时创建配置文件到 /etc/logrotate.d目录。
基本上,在这个目录都会看到一个 syslog 服务的配置文件,它是用于 logrotate 轮转系统日志的配置。

应用配置

针对每一个应用服务,都可以有自己的日志轮转配置.笔者以一个web服务器的access日志作为例子:

  1. nginx 安装在 /usr/local/nginx 目录
  2. nginx 配置了 access_log 到 /var/log/nginx/access.log
  3. 轮转需要求:按小时轮转 access 日志。

我们为这个需求创建一个配置文件:/etc/logrotate.d/nginx-access.conf文件内容如下:

1
2
3
4
5
6
7
8
9
/var/log/nginx/access.log {
size 2M
create 777 www web
rotate 65535
copytruncate
compress
nomail
olddir /var/log/nginx/old-logs/
}

紧接着,在cron服务中配置为每小时执行就实现了,如此简单,若有cron配置不清楚的地方,可以查看笔者关于 cron 的另一篇分享。

  1. crontab -e
  2. 01 logrotate -f /etc/logrotate.d/nginx-access.conf
  3. crond restart

至此,您就已经可以利用logrotate 来便捷的管理nginx服务器的日志了。在此基础上,您可以根据自己的具体需要,管理任何日志文件。更具体和详细的帮助可以使用:

man logrotate

命令查看。

参考文档

centos-logroate-cron

ps

偶然发现 logrotate-github(点这里) 居然被放到github上了

Linux 定时任务

文章目录
  1. 开笔
  2. cron服务查看
  3. cron服务管理
  4. 配置 corn 服务权限
  5. 编辑cron任务

开笔

最近在做数据收集涉及到一些日志文件轮转切割,笔者想用一个定时任务来实现定时轮转。调研后决定使用 Linux 系统的 cron 服务。

Cron 是Uninx系(Linux) 操作系统的后台驻留程序,系统管理员用得相对多一些。Cron 可以被设置为开机启动,在 centos 中默认就是开机启动的服务。

在使用 cron 服务的时候,往往我们都需要 先确认cron服务本身是否开启,处于运行状态,确认当前用户是否有权限正常使用cron,编辑下发cron计划任务,确认我们的计划任务是否如约按照计划执行。本篇笔者就和大家一起看看:

  1. 查看当前系统cron服务状态
  2. 管理 cron 服务
  3. 配置 corn 服务权限
  4. 编辑下发 cron 计划任务
  5. 查看 任务是否按照计划执行

cron服务查看

除了可以用 ps 命令查看 cron 服务进程运行状态,还可以查看正在运行的cron服务调度本身的状态。通过 crontab 命令对cron服务的设置。用:

man crontab

查看一下crontab命令,发现,crontab 有4个可选参数:

  • -u:设定某个用户的cron服务,一般root用户在执行这个命令的时候需要此参数
  • -l:列出某个用户cron服务的详细内容
  • -r:删除某个用户的cron服务
  • -e:编辑某个用户的cron服务

cron服务管理

如果经过查看,我们发现cron并不是你要的状态,那么就开始管理它吧。作为后台服务,cron有着与我们熟知的服务程序相似地基本管理命令:启动、停止、重启、重新载入配置(需要稍微注意一点,这里是crond 而不是 cron):

  • 启动服务:

    1
    /sbin/service crond star
  • 关闭服务

    1
    /sbin/service crond stop
  • 重启服务

    1
    /sbin/service crond restart
  • 重新载入配置

    在每一次重新修改过cron配置文件,请务必重新载入一下配置:

    1
    /sbin/service crond reload

配置 corn 服务权限

在 Linux 操作系统中,对用户使用cron服务的权限控制在 /etc/cron.allow 和 /etc/cron.deny 两个文件中配置实现,但 /etc/cron.allow 文件非必须存在的。

如果 /etc/cron.allow 文件存在,则所有需要运行 crontab 命令的用户必须在这个文件被列举出来;如果 /etc/cron.allow 文件不存在,但
/etc/cron.deny 文件存在,则所有需要运行 crontab 命令的用户必须在这个文件不被列举出来。当这两个文件都不存在的情况下,在一些 Linux 系统(如 Ubuntu、Debian ,但不是所有)允许所有用户运行 crontab 命令。

需要注意的是,系统中,不在 /etc/shadow 文件所列的用户,是没有权限使用 crontab 命令。

编辑cron任务

  1. 语法

    1
    2
    3
    4
    5
    6
    7
    8
    * * * * * Command_to_execute
    - – – – -
    | | | | |
    | | | | +—– Day of week (0–6) (Sunday=0) or Sun, Mon, Tue,…
    | | | +———- Month (1–12) or Jan, Feb,…
    | | +————-— Day of month (1–31)
    | +——————– Hour (0–23)
    +————————- Minute (0–59)
  2. 示例

    每天凌晨轮转nginx的access日志

    1
    01 00 * * * /usr/sbin/logrotate /etc/logrotate.d/nginx-access-log.conf

    系统便会在每天凌晨壹分的时刻执行 /usr/sbin/logrotate /etc/logrotate.d/nginx-access-log.conf 命令,实际就是每天凌晨进行日志轮转