NGINX日志分析

需要在NGINX的nginx.conf中设置

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for" $request_time';

然后需要在站点配置中开启

access_log /www_$server_port.log main;

一定要指定main这个格式名,因为上面定义了,不指定会使用默认的则没有输出时间。

#!/bin/bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH

# Check if user is root
if [ $(id -u) != “0” ]; then
echo “Error: You must be root to run this script, please use root.”
exit 1
fi

NginxLogFile=$1
if [ “${NginxLogFile}” = “” ]; then
echo “Error: must input a log’s path.”
exit 1
fi

FileName=$(basename ${NginxLogFile}|sed ‘s/\.log//’)
OutPutFileName=”Analysis_”${FileName}.txt
OutPutCSVFileName=”Analysis_”${FileName}.csv

echo “Analysis Nginx’s log : “${NginxLogFile}

# 获取最初的数据
# IP
cat ${NginxLogFile} | \
awk ‘{print $1}’ \
> a1.txt

# TIME
cat ${NginxLogFile} | \
awk ‘{print $4″]”}’ \
> a2.txt

# URL
cat ${NginxLogFile} | \
awk ‘{print $7}’ \
> a3.txt

# REQ TIME
cat ${NginxLogFile} | \
awk ‘{print $(NF)}’ \
> a4.txt

# 合并文件
paste -d ‘ ‘ a1.txt a2.txt a3.txt a4.txt > ${OutPutFileName}

# 删除临时文件
rm -rf a1.txt a2.txt a3.txt a4.txt

echo “Analysis is Success, output file name is “$(pwd)/${OutPutFileName}

# IP 访问时间 URL 响应时间
cat ${OutPutFileName} | sort | \
awk ‘$NF ~/^[0-9.]+$/ {print $1″,””\””$3″\”””,”$4}’ \
> ${OutPutCSVFileName}

echo “OK…CSV is “${OutPutCSVFileName}

微信公众号变换账户(迁移)

最近,公司的几个微信公众号合并,将不用的微信公众号都合并在一起了,诸多的麻烦,还好,腾讯还是挺贴心的。

挑选了官网相关主题比较重要的链接:

  1. 迁移条件及流程
  2. 迁移其他解答

对我们程序员最重要的是openid及unionid的问题。

10、迁移完成,原粉丝的openid会变吗?
会变化。微信用户关注不同的公众号,对应的OpenID是不一样的,迁移成功后,粉丝的OpenID以目标帐号(即新公众号)对应的OpenID为准。但开发者可以通过开发接口转换OpenID,开发文档可以参考:
提供一个openid转换的API接口,当帐号迁移后,可以通过该接口:
1. 将原帐号粉丝的openid转换为新帐号的openid。
2. 将有授权关系用户的openid转换为新帐号的openid。
3. 将卡券关联用户的openid转换为新帐号的openid。◆ 原帐号:准备要迁移的帐号,当审核完成且管理员确认后即被回收。
◆ 新帐号:用来接纳粉丝的帐号。新帐号在整个流程中均能正常使用。

一定要按照下面的步骤来操作。
1. 一定要在原帐号被冻结之前,最好是准备提交审核前,获取原帐号的用户列表。如果没有原帐号的用户列表,用不了转换工具。如果原账号被回收,这时候也没办法调用接口获取用户列表。
如何获取用户列表见这里:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140840

2. 转换openid的API接口如下,可在帐号迁移审核完成后开始调用,并最多保留15天。若帐号迁移没完成,调用时无返回结果或报错。帐号迁移15天后,该转换接口将会失效、无法拉取到数据。
◆ URL:http://api.weixin.qq.com/cgi-bin/changeopenid?access_token=xxxxx
此处token为新帐号的token
◆ 请求方式:post
◆ 请求数据:
{
“from_appid”:”xxxxxxxx”,//此处为原帐号的appid
“openid_list”:[“oEmYbwN-n24jxvk4Sox81qedINkQ”,”oEmYbwH9uVd4RKJk7ZZg6S
zL6tTo”]//需要转换的openid,即第1步中拉取的原帐号用户列表,这些必须是旧账号目前关注的才行,否则会出错;一次最多100个,不能多。
}
◆ 输出数据:
{
“errcode”: 0,
“errmsg”: “ok”,
“result_list”: [
{
“ori_openid”: “oEmYbwN-n24jxvk4Sox81qedINkQ”,
“new_openid”: “o2FwqwI9xCsVadFah_HtpPfaR-X4”,
“err_msg”: “ok”
},
{
“ori_openid”: “oEmYbwH9uVd4RKJk7ZZg6SzL6tTo”,
“err_msg”: “ori_openid error”//这个openid目前没有关注旧公众号
}
]
}
◆ 错误码:
63178:from_appid参数错误,和调用的账号并没有迁移关系
Ori_openid error:openid目前没有关注旧公众号。或者是将from_appid搞错了,用成了新帐号的appid。

xargs与tar合并查询文件并打包问题检查

今天在整理服务器上的日志的时候,希望能将日志打包保存之后再删除,然后就出现了问题了。

find /debugLog -mmin +21600 -type f -print | xargs tar cvf /debugLog_$(date +”%Y%m%d%H%M%S”).tar

会出现提示:

tar: Exiting with failure status due to previous errors

大意是上一步中存在错误,怎么查看错误是啥?

查一下,在《Linux常见问题解答–如何修复“tar:Exiting with failure status due to previous errors”》找到答案,只需要将v参数去掉就行。

使用下面的命令查看:

find /debugLog -mmin +21600 -type f -print | xargs tar cf /debugLog_$(date +”%Y%m%d%H%M%S”).tar

然后打印出好多的错误信息了:

tar: Removing leading `/’ from member names
tar: /debugLog/efast/20171204_b2c_apiv_apis_response_goods: Cannot stat: No such file or directory
tar: -: Cannot stat: No such file or directory
tar: get_all_list.txt: Cannot stat: No such file or directory
tar: /debugLog/wxauth/20180103_wxauth_115.239.174.134,: Cannot stat: No such file or directory
tar: 10.53.26.130.txt: Cannot stat: No such file or directory
tar: /debugLog/wxauth/20180103_wxauth_115.239.174.134,: Cannot stat: No such file or directory
tar: 10.53.29.194.txt: Cannot stat: No such file or directory
tar: Exiting with failure status due to previous errors

对于第一行的错误,百度了一下,在《“tar: Removing leading `/’ from member names”的错误》找到答案,这个因为是相对路径的缘故,需要增加P参数。

命令改为:

# find /debugLog -mmin +21600 -type f -print | xargs tar cfP /debugLog_$(date +”%Y%m%d%H%M%S”).tar

然后,继续出现下面的错误了:

tar: /debugLog/efast/20171204_b2c_apiv_apis_response_goods: Cannot stat: No such file or directory
tar: -: Cannot stat: No such file or directory
tar: get_all_list.txt: Cannot stat: No such file or directory
tar: /debugLog/wxauth/20180103_wxauth_115.239.174.134,: Cannot stat: No such file or directory
tar: 10.53.26.130.txt: Cannot stat: No such file or directory
tar:/debugLog/wxauth/20180103_wxauth_115.239.174.134,: Cannot stat: No such file or directory
tar: 10.53.29.194.txt: Cannot stat: No such file or directory
tar: Exiting with failure status due to previous errors

根据实际查看错误的文件名发现,这两个文件其实都有特殊:

/debugLog/efast/20171204_b2c_apiv_apis_response_goods – get_all_list.txt

/debugLog/wxauth/20180103_wxauth_115.239.174.134, 10.53.29.194.txt

因为xargs默认分割符是空格,所以,上面的就被分为5个文件了。

/debugLog/efast/20171204_b2c_apiv_apis_response_goods

get_all_list.txt

/debugLog/wxauth/20180103_wxauth_115.239.174.134,

10.53.29.194.txt

所以,我们需要将分割符换一下,代码改为下面形式就OK了~

find /debugLog -mmin +21600 -type f -print0 | xargs -0 tar cfP /debugLog_$(date +”%Y%m%d%H%M%S”).tar

完美解决,如果你需要压缩完毕后就直接删除文件,则需要增加参数

find /debugLog -mmin +21600 -type f -print0 | xargs -0 tar cfP /debugLog_$(date +”%Y%m%d%H%M%S”).tar –remove-files

就可以了。

介于上面的文件名问题,我比较不赞同直接增加参数,毕竟,架不住有时候文件名里面出现个/被解析为根目录呢?

使用下面命令麻烦了点,但是稍微比较保险,你说呢?

find /debugLog -mmin +21600 -type f -print -exec rm -rf {} \;

nginx-400 Bad Request Request Header Or Cookie Too Large

400 Bad Request
Request Header Or Cookie Too Large
nginx

今天尝试开启NGINX负载均衡,将公司的服务器连接在一起提供服务,结果,一直出现这个提示。

网上找了一圈,看到的答案都是不正确的,没办法,需要靠自己了。

下面是NGINX的配置:

upstream backend {
#server 10.*.*.*:80;
#server 10.*.*.*:8081;
#server 10.*.*.*:8082;
#server 10.*.*.*::8083;
server 127.0.0.1:80;
#server 127.0.0.1:8081;
#server 127.0.0.1:8082;
#server 127.0.0.1:8083;
}

仔细看了一下发现开启的测试的服务器是本机的80端口,然后80端口就是测试的主机,然后就不断的死循环了……

去掉就好了,好吧,不能太懒,也要注意小细节。

Linux-yum:File “/usr/bin/yum”, line 30 except KeyboardInterrupt, e: SyntaxError: invalid syntax

自从上次更新服务器开始,yum就不能用,老麻烦了,提示错误信息如下:

File “/usr/bin/yum”, line 30
except KeyboardInterrupt, e:
^
SyntaxError: invalid syntax

这个错误从网上搜出来的原因是python版本问题,是正确的,但是没有说明怎么升级yum,不懂,还好之前备份了旧版本的python了,要不就完蛋了。

vim /usr/bin/yum

将第一行的python改为旧版本的执行程序就行。

我服务器上的是python2.6

记录一下,省的忘记,还要思考怎么解决。

电商-京东平台促销活动的优惠券领取的链接是什么

今天,负责京东平台的同仁来找我,需要从促销活动页面获取优惠券的链接,好用于其他地方客户的领取。

简单的说就是:

需要优惠券领取地址,方便运营活动页面的设计。

提供了两个网址:

  • 活动页面
    https://pro.m.jd.com/mall/active/33PhyFfqMfMWfVLSn5UHUp7SfC8X/index.html?utm_source=pdappwakeupup_20170001
  • 早期优惠券领取入口
    http://coupon.m.jd.com/coupons/show.action?key=24cdda93b39d4133a3464809cda970f4&roleId=10127994&to=https://sale.jd.com/m/act/GYor7n5HsE6OljKu.html

分析过程

从早期优惠券领取的入口,我们知道这个链接需要传入三个参数:

  1. key
  2. roleId
  3. to

我们需要从活动页面获取这三个值。

在活动页面内,我们找了一下基本没有很明显的迹象可以让我们直接获取上面的三个值,那么一般我们都是需要将正常流程走一遍,获取一些数据来作分析的。

点击领取优惠券,我们在“网络”中捕获了:

https://api.m.jd.com/client.action?functionId=newBabelAwardCollection&body=%7B%22activityId%22%3A%2233PhyFfqMfMWfVLSn5UHUp7SfC8X%22%2C%22from%22%3A%22H5node%22%2C%22scene%22%3A%221%22%2C%22args%22%3A%22key%3D618376500fad492b8e02db7418b531e3%2CroleId%3D10233358%22%2C%22mitemAddrId%22%3A%22%22%2C%22geo%22%3A%7B%22lng%22%3A%22%22%2C%22lat%22%3A%22%22%7D%7D&client=wh5&clientVersion=1.0.0&sid=1f3a6d7ad52bb790fee8a22156f2c689&uuid=15087419827841016776661&area=&_=1516760674531&callback=jsonp3

这么一大串,经过转码,我们会很明显的发现蛛丝马迹:

上面就是我们转码之后的数据,很明显body就是我们期待的内容了。

将上面的key=618376500fad492b8e02db7418b531e3,roleId=10233358分别带入:

http://coupon.m.jd.com/coupons/show.action?key=618376500fad492b8e02db7418b531e3&roleId=10233358&to=https://sale.jd.com/m/act/GYor7n5HsE6OljKu.html

然后,OK了,正确。

简单吧。

2018.01.31 京东运营找我学,我就简单的写了一个步骤,看到这边的福利哈

操作步骤:
1.先打开活动页,获取活动页的网址(类似pro.m.jd.com)。
2.用火狐或者其他的现代浏览器(按F12打开开发者工具),打开上面的页面。
3.在开发者工具内点击“网络”,再点击右边的垃圾桶清除。
4.点击“活动页面中的优惠券领取按钮”
5.在网络页面会出现很多的网址,找到以“https://api.m.jd.com/client.action?”开头的链接。
6.点击上面的链接,在消息头中,点击编辑和重发,在“查询字符串”找到body开头的字符串,复制里面的内容。
7.将上面复制的“key=字符串,roleId=数字”这样子的字眼的,代入下面的网址中。
8.
http://coupon.m.jd.com/coupons/show.action?key=字符串&roleId=数字&to=第一步内的网址

MySQL-information_schema数据库的说明及延伸的用法

我们安装完MySQL后,使用客服端查看的时候,都会看到information_schema这个库,那么这个库是做什么的呢?

下面就来分享一下。

数据库表说明:

官方开发文档:information-schema

表名 用途说明
SCHEMATA 提供了当前mysql实例中所有数据库的信息。是show databases的结果取之此表。
TABLES 提供了关于数据库中的表的信息(包括视图)。详细表述了某个表属于哪个schema,表类型,表引擎,创建时间等信息。是show tables from schemaname的结果取之此表。
COLUMNS 提供了表中的列信息。详细表述了某张表的所有列以及每个列的信息。是show columns from schemaname.tablename的结果取之此表。
STATISTICS 提供了关于表索引的信息。是show index from schemaname.tablename的结果取之此表。
USER_PRIVILEGES 用户权限表给出了关于全程权限的信息。该信息源自mysql.user授权表。是非标准表。
SCHEMA_PRIVILEGES 方案权限表给出了关于方案(数据库)权限的信息。该信息来自mysql.db授权表。是非标准表。
TABLE_PRIVILEGES 表权限表给出了关于表权限的信息。该信息源自mysql.tables_priv授权表。是非标准表。
COLUMN_PRIVILEGES 列权限表给出了关于列权限的信息。该信息源自mysql.columns_priv授权表。是非标准表。
CHARACTER_SETS 字符集表提供了mysql实例可用字符集的信息。是SHOW CHARACTER SET结果集取之此表。
COLLATIONS 提供了关于各字符集的对照信息。
COLLATION_CHARACTER_SET_APPLICABILITY 指明了可用于校对的字符集。这些列等效于SHOW COLLATION的前两个显示字段。
TABLE_CONSTRAINTS 描述了存在约束的表。以及表的约束类型。
KEY_COLUMN_USAGE 描述了具有约束的键列。
ROUTINES 提供了关于存储子程序(存储程序和函数)的信息。此时,ROUTINES表不包含自定义函数(UDF)。名为“mysql.proc name”的列指明了对应于INFORMATION_SCHEMA.ROUTINES表的mysql.proc表列。
VIEWS 给出了关于数据库中的视图的信息。需要有show views权限,否则无法查看视图信息。
TRIGGERS 提供了关于触发程序的信息。必须有super权限才能查看该表。

都是保存跟我们的数据库及表相关的数据,那么我们平时怎么利用他呢?

    • 一、TABLES
      1. 获取库中的全部表SELECT
        TABLE_NAME
        FROM
        information_schema.tables
        WHERE
        table_schema = ‘ecs_backup’
      2. 获取库中的创建时间(create_time)早于/晚于/等于某个时间的表SELECT
        TABLE_NAME
        FROM
        information_schema.tables
        WHERE
        table_schema = ‘ecs_backup’
        AND
        create_time < ‘2018-01-09’
      3. 获取库中的更新时间(update_time)早于/晚于/等于某个时间的表SELECT
        TABLE_NAME
        FROM
        information_schema.tables
        WHERE
        table_schema = ‘ecs_backup’
        AND
        update_time < ‘2018-01-09’
    • 二、COLUMNS
      1. 获取表的必填(IS_NULLABLE)字段
        SELECT
        COLUMN_NAME,COLUMN_DEFAULT,DATA_TYPE,CHARACTER_SET_NAME,COLUMN_KEY,COLUMN_TYPE,COLUMN_COMMENT
        FROM
        `information_schema`.`COLUMNS`
        WHERE
        TABLE_SCHEMA=’ecs’
        AND
        `TABLE_NAME` = ‘b2c_orders’
        AND
        IS_NULLABLE=’NO’
        ORDER BY ORDINAL_POSITION ASC
    • 三、STATISTICS
      1. 获取表的索引
        SELECT
        INDEX_NAME,COLUMN_NAME
        FROM
        `information_schema`.`STATISTICS`
        WHERE
        TABLE_NAME = ‘sdb_b2c_orders’
        AND
        INDEX_SCHEMA = ‘ecstore’

MySQL-怎么备份数据库的表

自从使用上了阿里的RDS之后,公司的MySQL服务器就彻底的歇菜了,特别是出现重大问题的时候,我根本没办法直接用备份数据还原生产环境中的数据。

主要原因是MySQL服务器环境跟RDS的备份文件环境不符合,特意去搭建一个吧,太麻烦。

现在每次有需要使用的时候,都是使用备份克隆一个实例,数据量大了,那个克隆的速度是越来越慢了。

最近正好有空想了一下这个解决方法,记录一下吧。

我经常使用phpmyadmin来管理数据库的数据,所以,我经常会做一个操作:

要操作某个表的时候,我一定是先复制一个表,重命名后当做备份,出现问题的时候我就直接重命名就好了。

那么,我可以将重要的表及表结构给按照一定的时间自动备份吗?

当然可以了哈~定时任务怎么使用我就不多说了,就说说SQL怎么写吧。

一、复制结构,数据

CREATE TABLE `ecs_backup`.`20180109_1809-sdb_b2c_goods` AS SELECT * FROM `ecs`.`sdb_b2c_goods`

二、复制结构,数据,索引

CREATE TABLE `ecs_backup`.`20180109_1809-sdb_b2c_goods` LIKE `ecs`.`sdb_b2c_goods`;
INSERT `ecs_backup`.`20180109_1809-sdb_b2c_goods` SELECT * FROM `ecs`.`sdb_b2c_goods`;

随便挑一种适合自己的方法,只需要自动生成前缀就可以执行了。

那么这类的文件肯定会越来越多的,怎么删除呢?

简单,只需要用下面的SQL获取响应的表名,然后,执行删除操作不就行了?

SELECT TABLE_NAME FROM information_schema.tables WHERE table_schema = "ecs_backup" AND CREATE_TIME < "2018-01-09 18:19"

然后,坐等出现问题后直接改名字恢复吧。

这个方法,好处就不说了,大家自己体会吧。

MySQL-怎么知道一张表那个字段是必填的呢?

今天在开发ShopNC的功能的时候,需要插入商品表的信息,那么就有一个问题了,怎么知道这个表的字段是否必填呢?因为必填项我们没有传入数据的话,是会报错的喔。

好吧,用下面的办法就能获取必填项的信息了。

执行下面的SQL语句,然后,得到的字段清单都是必填项。

SELECT
COLUMN_NAME,COLUMN_DEFAULT,DATA_TYPE,CHARACTER_SET_NAME,COLUMN_KEY,COLUMN_TYPE,COLUMN_COMMENT
FROM `information_schema`.`COLUMNS`
WHERE TABLE_SCHEMA='ecstore' AND `TABLE_NAME` = 'sdb_b2c_orders' AND IS_NULLABLE='NO'
ORDER BY ORDINAL_POSITION ASC

快去试试看呗。

Linux-find:自动设置文件的所有人

网站程序在关键的地方有输出日志,日志文件以日期为文件名,每天一个,同时也开启了计划任务也会执行这个关键地方的代码,这就造成计划任务执行后新建日志文件后,所有者为root,结果,前台执行的时候就会发生错误,老是提示权限不足的问题(关键词Permission denied….)。

怎么办呢?老是这么提示也不是办法,那就使用定时任务,定时查询日志目录的文件权限。

# crontab -e

1 */1 * * * find /data2/ -type f -user root -exec chown www:www {} \;

然后保存,就会每小时执行一次。

如果时间不懂得设置的话,可以使用下面的工具协助设置:crontab执行时间计算

当然,你要是觉得这样子很麻烦的,其实,你还可以直接使用www账户登录设置计划任务的。