发表于: 2017-09-04 22:12:00

1 1177


今天完成的事情:重新看了一下linux的一些基本概念 来解答自己遇到的一些问题的原理

学习了nginx的设置 一些基本概念 正向代理 反向代理

以及有关的配置文件 做一个反向代理 

从头看把 我的nginx的安装是按照上一篇日报来的

是解压到文件夹后 /configure make make install的 

使用的全是默认配置 所以安装到了 /usr/local/nginx 里面

这里先强调三个文件 一个是 sbin下的nginx这是个二进制文件 可以执行

一个是conf下的nginx.conf 这个是它的配置文件

还有一个是logs 下的文件 都是日志文件 默认的是acess.log error.log 两个文件一个正确日志 

一个错误日志  这里日志文件是可以自行配置的

我们主要是对nginx.conf 进行配置 配置好了然后nginx -s reload  

注意这里是ngnix了 与之前不同 具体的下面谈

这里先谈一下nginx.conf配置 很重要 有很多可以配置的 这里我也是参考了很多 

有了一些自己简单的理解  贴图吧反向代理这里很简单

其实不难 只需要以下的短短几句话 

这里mkwjw.cn 是我买的域名 已经解析了 

以下命令就是当访问mkwjw.cn:8090时 反向代理到8080 也就是默认的resin界面

但实际操作中是遇到了一些问题 后面再谈

再看看别的设置 这里我都是改好的

下面这个log_format main 是日志输出类型 原来是#注释掉的 

这里很多都是原有的 第二行是我自己加的 包括响应时间 请求时间 请求长度 剩下三行后面再解释

access_log 这个下面这个就是他的日志输出到哪里 输出日志的名字

最后nginx -s reload  不要忘了 如果出现问题直接在这里会显示

这步如果出现问题看了一下日志里和这里是一样的内容 

都搞定了 tail -f access.log 实时监控日志的内容

测试发现 使用我们的无线连接都是一个ip 然而居然还有别的ip发送过请求 所以不用还是把这些关了吧 

这里贴一下 这个是日志文件

看着挺混乱的 从111.132.104.2开始看就可以

回到我们原来的配置 这是一一对应的

$remote_addr 客户端(用户)IP地址 对应111.132.104.2

- $remote_user [$time_local] 访问时间 对应[04/.......]

 $request '.请求对应 "GET  /resin-doc......."

 $upstream_response_time响应时间 $request_time '请求时间 都是0.005 默认秒精度毫秒

额 后面应该是287  200 中间应该有空格 不知道该怎麽设置 就少个空格

前面是请求长度 后面是请求的状态码 200大家都喜欢

$body_bytes_sent.请求页面大小,默认为B(byte)

 "$http_referer" '来源页面,即从哪个页面转到本页,专业名称叫做“referer”。这里没有

"$http_user_agent" ';用户浏览器其他信息,浏览器版本、浏览器类型等

最后一个是记录客户端ip地址 这个是设置负载均衡时用的

如果nginx位于负载均衡器,squid,nginx反向代理之后,web服务器无法直接获取到客户端真实的IP地址了。 $remote_addr获取反向代理的IP地址。反向代理服务器在转发请求的http头信息中,可以增加X-Forwarded-For信息,用来记录 客户端IP地址和客户端请求的服务器地址

还有很多不同的块的配置 暂时没用到就有时间在学习吧

这些解读完了 要把响应时间提取出来

看了一下grep命令 以及正则表达式的东西 

分析一下需求 和原理 来写个脚本 

首先 我们要提取日志文件  然后对日志文件进行处理 把响应时间提取出来 挺简单的 

#!/bin/bash 脚本开头

cat /usr/local/nginx/logs/access.log |grep '111.132.104.2'>>logtime.txt

先要把这个日志文件打出来 然后根据管道命令把是我们自己地ip访问的取出来 放到这个文件中 避免无关数据干扰

因为上面提到过 还有莫名其妙的ip的记录 可能是爬虫

先自己执行单条命令 尝试一下

可以看到相关数据 现在要统计次数 可以直接用grep -c 来统计出现111.....的次数

cat logtime.txt |grep -c '111.132.104.2'   出来130

想一想还可以用别的命令吗 我想根据行数来判断 然而这里有的一条数据有三行有的有四行

这个一条命令到底算几行在计算机的认知里面呢 

用学的命令来尝试

打印第一行数据 出来了三行 计算机认为这是一行 再用别的命令看 用下正则表达式

恩 果然如此 而且最后直接是130 果然是130行   看来打印行数也可以统计数字啊

突然想到如果我这里不止一个111......的ip登录 除去无关数据还有有效ip登录  我还想分别统计他们的登陆次数  

grep -c 可以直接从总数据中取   wc打印行号不行 不对 也可以 但是要分别取出太麻烦

再换一种方法 根据原始文件的解读 可以用cut去选第一列  sort排序 再 uniq来试试 主要是复习一下学的命令

先从总数据里选一个其他的ip  就决定是你了 妙蛙种子 139.162.108.53来跑

然后 

恩 全部都打出来了 太多了 再用正则表达式选取一下

这里犯了很多错误 一点点尝试 终于完成 暂时就先尝试到这里 其实还有很多命令 可以尝试

最后再来统计相应延时 还是先分析原始数据 只需要取出相应的字段 原理一样啊 

先用命令尝试一下 思路

恩 可以看出来 用空格分隔 响应时间不一定是第九个 这里尝试过发现有问题

改变思路仔细观察原始数据 换用”作为分隔符

在这个基础上再进行处理 

注意这里最后是2 一开始用的1啥都没有 一点一点试出来的 成功 就是有一个数据当时就没抓到 所以有问题  贴图不贴了 太长了

换用akw 一样的原理啊 好吧 这个命令写出来比较简洁 

 cat logtime.txt|awk '{print $9}'

把这些组合在一起就是一个脚本了 比不过本着不实践没有发言权的原则 把它写出来跑一下 

这里因为原来日志格式与后来配置后不同 所以把日志文件进行了一下更改 所以不再是130而是100

发送一次请求后再次运行 果然发现了问题 

想了想应该是 原来提取的时候全部重新提取了一遍 100+101了

原来用的>>应该用> linux命令>和>>的区别  简单说>是覆盖,>>是追加 ,> 是定向输出到文件,如果文件不存在,就创建文件;如果文件存在,就将其清空;>>是将输出内容追加到目标文件中。如果文件不存在,就创建文件;如果文件存在,则将新的内容追加到那个文件的末尾,该文件中的原有内容不受影响。

终于完成了


明天计划的事情:再看看resin的日志 完成任务三

遇到的问题:开始 调试  nginx命令 就遇到了问题

用的昨天的安装方法 开启必须进入到/usr/local/nginx/sbin 下面 然后./nginx

太麻烦  知道是要配置环境变量 原来安装也配过很多环境变量 

这次接着linux系统 补一补基础概念 看看配环境变量的原理  也只是一些个人浅显理解

首先 谈一下 二进制文件:也就是可以运行的程序文件 就是这个sbin文件夹下的nginx

所以直接在目录下执行它 就要./nginx

所以我们要修改PATH环境变量,以能够识别此程序的二进制文件路径;

修改/etc/profile文件,在文件中 添加相关的路径

export PATH=$PATH:/path/to/somewhere#记得是可执行文件所在的目录,路径中不要包含可执行文件。

然后执行 :source /etc/profile #使我们的修改生效

这里理解环境变量的含义 以及linux里面变量的一些使用方法 就是到底写成什么样子为甚莫这样写  我这里是这样写的

其实可以写成像上面示例的那样是一句话 但是分开写这样写是方便维护

第一句定义变量NGINX_HOME的路径 虽然是我们定义的变量 但要把它声明为环境变量所以大写

第二句是增加变量PATH的内容

当变量为了增加变量内容时,可用“$变量名称”或${变量}累加内容

所以我以为这里最后的:$PATH 可以不写 测试了一下没问题

第三句 export来使变量变成环境变量让其它子进程可以执行

然后进行配置nginx文件的时候一直报错 犯了5个错误

1{}里面每一行结束要加;

2 proxy_pass 后面不能加47.... 要加上http://

3.使用./nginx -s reload重新读取配置文件,发现报nginx: [error] open() "/usr/local/nginx/logs/nginx.pid" failed (2: No such file or directory)错误,进到logs文件发现的确没有nginx.pid文件 

[root@localhost sbin]# ./nginx -s reload

nginx: [error] open() "/usr/local/nginx/logs/nginx.pid" failed (2: No such file or directory) 

解决方法:

/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf 

使用nginx -c的参数指定nginx.conf文件的位置

4 这个错误最坑 提示是某行不能放在这里 就是上面截图的location

它应该放在server里面 问题是server原有的的{与它相对应的}隔了十万八千里

我就忽视了 所以嵌套了 研究一小时无果 不知道哪里错了 还是博韬老哥稳 一句话解决

5 原本的日志命令默认是用#注释的 而且是对应的 我看错对应关系了 具体看下图

这俩是对应的 别的是别的对应的日志文件的配置 

收获:太多了 太多了 需要学的东西实在太多了 一定要抓紧时间 前一周有点松懈了

     调整状态 很多东西今天看了只是有了大致的理解和印象 还要找时间练习使用 也要抓紧时间完成任务

linux使用上下键可以调出上次的命令 很方便 

响应时间和请求时间的区别 虽然测出来一样

原来$request_time包含了用户数据接收时间,而真正程序的响应时间应该用$upstream_response_time。 下面介绍下2者的差别: 1、request_time  官网描述:request processing time in seconds with a milliseconds resolution; time elapsed between the first bytes were read from the client and the log write after the last bytes were sent to the client 。 指的就是从接受用户请求的第一个字节到发送完响应数据的时间,即包括接收请求数据时间、程序响应时间、输出 响应数据时间。 、

2、upstream_response_time  官网描述:keeps times of responses obtained from upstream servers; times are kept in seconds with a milliseconds resolution. Several response times are separated by commas and colons like addresses in the $upstream_addr variable 是指从Nginx向后端(php-cgi)建立连接开始到接受完数据然后关闭连接为止的时间。 从上面的描述可以看出,$request_time肯定比$upstream_response_time值大,特别是使用POST方式传递参数时,因为Nginx会把request body缓存住,接受完毕后才会把数据一起发给后端。所以如果用户网络较差,或者传递数据较大时,$request_time会比$upstream_response_time大很多。 所以如果使用nginx的accesslog查看php程序中哪些接口比较慢的话,记得在log_format中加入$upstream_response_time。


返回列表 返回列表
评论

    分享到