Nginx日志切割,相关参数,以及如何获取Nginx源地址

##################
“线程池”旨在减少创建和销毁线程的频率,其维持一定合理数量的线程,并让空闲的线程重新承担新的执行任务。“连接池”维持连接的缓存池,尽量重用已有的连接、减少创建和关闭连接的频率。这两种技术都可以很好的降低系统开销,都被广泛应用很多大型系统,如websphere、tomcat和各种数据库等
##################

#########################################################

web请求处理机制

1、多进程方式:服务器每接受到一个客户端请求就有服务器的主进程生成一个子进程响应客户端,
直到用户关闭连接,这样的优势是处理速度快,子进程之间相互独立,但是如果访问过大会导致服务器资源耗尽而无法提供请求
2、多线程方式:与多进程方式类似,
但是每收到一个客户端请求会有服务进程派生出一个线程来个客户方进行交互,
一个线程的开销远远小于一个进程,因此多线程方式在很大程度减轻了web服务器对系统资源的要求,
但是多线程也有自己的缺点,即当多个线程位于同一个进程内工作的时候,可以相互访问同样的内存地址空间,
所以他们相互影响,一旦主进程挂掉则所有子线程都不能工作了,IIS服务器使用了多线程的方式,
需要间隔一段时间就重启一次才能稳定

同步和异步、阻塞与非阻塞:

1、同步与异步:主要是针对应用程序与内核的交互方式而言的:
同步:进程发出数据后,等内核返回响应以后才继续下一个请求,即如果内核一直不返回数据,那么进程就一直等,直到天荒地老,死机error。
异步:进程发出数据后,不等内核返回响应,接着处理下一个请求,Nginx是异步的

2.阻塞与非阻塞
可以理解为内核与IO设备的交互方式,当内核收到进程请求IO数据时候的处理方式
也可以简单理解为内核需要做一件事能不能立即得到返回应答,如果不能立即获得返回,需要等待,那就阻塞了,否则就可以理解为非阻塞
阻塞:IO调用不能立即返回结果,即一个进程发起的IO请求不能得到立即满足时,进程就要一直等到内核响应,内核要把数据从IO设备复制到内核空间,再返回给进程,这是阻塞。
非阻塞:IO调用可以立即返回结果,一个进程发起的IO进程不能立即满足时,不在等待,而是一遍一遍的轮训查看IO是否完成

在这里插入图片描述在这里插入图片描述

I/O多路复用

如果一个I/O流进来,我们就开启一个进程处理这个I/O流。那么假设现在有一百万个I/O流进来,
那我们就需要开启一百万个进程一一对应处理这些I/O流(——这就是传统意义下的多进程并发处理)。
思考一下,一百万个进程,你的CPU占有率会多高,这个实现方式及其的不合理。
所以人们提出了I/O多路复用这个模型,一个线程,通过记录I/O流的状态来同时管理多个I/O,可以提高服务器的吞吐能力

水平触发 如果你一直不去读写,它会一直通知你
边沿触发 它只会通知你一次

在这里插入图片描述在这里插入图片描述在这里插入图片描述

nginx

nginx大部分常用模块,编译时./configure --help以--without开头的都默认安装。

--prefix=PATH : 指定nginx的安装目录。默认 /usr/local/nginx
--conf-path=PATH : 设置nginx.conf配置文件的路径。nginx允许使用不同的配置文件启动,通过命令行中的-c选项。默认为prefix/conf/nginx.conf
--user=name: 设置nginx工作进程的用户。安装完成后,可以随时在nginx.conf配置文件更改user指令。默认的用户名是nobody。--group=name类似
--with-pcre : 设置PCRE库的源码路径,如果已通过yum方式安装,使用--with-pcre自动找到库文件。使用--with-pcre=PATH时,需要从PCRE网站下载pcre库的源码(版本4.4 - 8.30)并解压,剩下的就交给Nginx的./configure和make来完成。perl正则表达式使用在location指令和 ngx_http_rewrite_module模块中。
--with-zlib=PATH : 指定 zlib(版本1.1.3 - 1.2.5)的源码解压目录。在默认就启用的网络传输压缩模块ngx_http_gzip_module时需要使用zlib 。
--with-http_ssl_module : 使用https协议模块。默认情况下,该模块没有被构建。前提是openssl与openssl-devel已安装
--with-http_stub_status_module : 用来监控 Nginx 的当前状态
--with-http_realip_module : 通过这个模块允许我们改变客户端请求头中客户端IP地址值(例如X-Real-IP 或 X-Forwarded-For),意义在于能够使得后台服务器记录原始客户端的IP地址
--add-module=PATH : 添加第三方外部模块,如nginx-sticky-module-ng或缓存模块。每次添加新的模块都要重新编译(Tengine可以在新加入module时无需重新编译)

#1.下载nginx

#2.tar zxf nginx-1.14.0.tar.gz

#3.cd nginx-1.14.0	##讲解里面各目录的意义
1)auto目录:里面有4个子目录,cc是编译使用的,os是判断操作系统类型的,其他都是辅助configure编译的,也就是操作系统有什么特性供nginx使用

2)CHANGES:各版本的改变,bug修复等信息
  CHANGES.ru:nginx作者是俄罗斯人,这是俄罗斯版本

3)conf: 为了方便运维配置,conf目录里有示例文件,安装好后会拷贝到安装目录

4)configure:

5)contrib:提供nginx语法检测字体
   cp -r contrib/vim/* ~/.vim	##家目录下如果没有.vim目录,手动新建

6)html:默认发布目录,50x.html是报500错误时的页面

7) src:源码目录

8) 编译完成后会生成一个中间目录objs,里面有个ngx_modules.c,表示编译进nginx的模块,可以打开看一下

9)make完成后再看objs目录,又有新文件

#4.编译
./configure --prefix=/usr/local/nginx  --with-file-aio

###################################################

1:在上一篇博客的server2做
 关闭服务
 systemctl stop memcached
2:解压ngixn,注意解压的版本
  cd nginx/--> ls
  tar zxf nginx-1.15.9.tar.gz

在这里插入图片描述

3:修改文件,关闭debug
	cd /root/nginx/nginx-1.15.9---> ls
	vim auto/cc/gcc
	  171: # debug
	  172: #CFLAGS="$CFLAGS -g"

vim src/core/nginx.h  ##删除nginx后面的版本
  #define NGINX_VER          "nginx/"

在这里插入图片描述在这里插入图片描述在这里插入图片描述4:开始编译,编译之前安装有关依赖性的软件
编译过程中,报错是什么,就解决相应的问题,或安装相应需要的软件

yum install gcc -y
./configure --prefix=/usr/local/nginx  --with-http_realip_module --with-http_image_filter_module=dynamic --with-http_ssl_module

报错: the HTTP image filter module requires the GD library
则安装gd包
cd /root/nginx
yum install gd-devel-2.0.35-26.el7.x86_64.rpm -y

在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述注意:临时换到server1进行操作,和之前的操作一模一样
在这里插入图片描述在这里插入图片描述
5:添加nginx用户

 cd /usr/local/nginx
 useradd -u 900 nginx
 id nginx

在这里插入图片描述6.修改配置文件

vim /usr/local/nginx/conf/nginx.conf
2:user  nginx nginx;

在这里插入图片描述在这里插入图片描述

7:查看cpu信息
cat /proc/cpuinfo
##查看cpu进程个数
  cat /proc/cpuinfo | grep 'processor' | wc -l
##增加cpu进程个数
  virt-manager--> 点灯泡 --> CPU ---> 4 ---> apply --->
--> shut down 

cat /proc/cpuinfo | grep 'processor' | wc -l  ## 再次查看cpu进程个数为4

cd /usr/local/nginx/conf/
ls -la  ##如果有.nginx.conf.swp,则需要删除
rm -fr .nginx.conf.swp

在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

8:修改配置文件

vim nginx.conf

3:worker_processes  4;
4:worker_cpu_affinity 0001 0010 0100 1000;

在这里插入图片描述

9:软连接

ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
nginx  ##启动nginx
ps aux 
nginx -s reload  ##加载ginx
##若重启nginx保此错误的时候
nginx: [error] open() "/usr/local/nginx/logs/nginx.pid" failed (2: No such file or directory)
解决:ps aux  ##寻找nginx的进程
     kill -9 224   ##杀掉这些进程
     kill -9 4556
nginx -s reload   ##加载成功

在这里插入图片描述在这里插入图片描述在这里插入图片描述

2.nginx日志切割

1.什么是日志切割?

日志切割就是把系统的日志以天为单位进行存放,即每一天的日志都分开放
企业当中每天都要备份昨天的日志,然后生成一个新的日志记录今天的
如果不做日志切割,当日志文件很大的时候,vim打开的时候可能卡死等等
而且排错的时候也简单,是哪天的问题查哪天的日志

2.为什么要进行日志切割?

在生产环境中每一天的日志文件都是要打包备份的
如果每天都手动的去截取日志,重命名这样就很不方便,所以我们编写一个脚本并建立一个定时任务来进行这些工作
日志切割是自动执行的,写在crotab定时任务里面,写一个脚本实现

(1)查看nginx服务器的日志都有哪些类型

日志名称 	日志类型
access.log 	存放成功访问nginx服务器的日志信息
error.log 	存放访问nginx服务器失败的日志信息
nginx.pid 	严格来说这个不算日志,里面存放的是nginx进程的pid

#因为nginx的access.log日志会保存所有客户端连接信息,普通网站每天请求量很大,所以要每天切割(可以用nginx自带的reopen)

1)先查看nginx的access.log日志大小
cd /usr/local/nginx
[root@server1 logs]# du -sh access.log 
20K	access.log

在这里插入图片描述
2)多次请求页面,再查看日志大小
[kiosk@foundation0 ~]$ ab -c 1 -n 100000 http://www.westos.org/index.html ##1个并发,100000次请求
在这里插入图片描述
在服务端再次查看日志的大小 因为访问成功请求日志变多因此访问日志变大了

[root@server1 logs]# du -sh access.log 
16M	access.log

在这里插入图片描述
4)接下来手动进行日志切割

[root@server1 logs]# mv access.log `date +%F -d -1day`_access.log	##因为第二天肯定是备份前一天的日志
[root@server1 logs]# /usr/local/nginx/sbin/nginx -s reopen
#发现重新生成了一个access.log,新的请求信息会到新日志里
#可以把命令写在crontab里,每天执行一次

在这里插入图片描述可以看到目录里面生成了一个昨天的日志,以及今天才创建的空日志文件access.log
此时再从真机请求进行压力测试
server1:
发现新生成的日志变大了。。。。

对nginx服务器上面的日志进行日志切割(脚本方式)

(1)在nginx服务的日志目录下面编写脚本

cd /usr/local/nginx/logs
vim backup.sh

在这里插入图片描述
就是俩个重命名 最后再杀死之前的进程号
此处疑问?为什么没有重新生成日志

加执行权限
在这里插入图片描述
(3)建立目录
mkdir oldlogs

(4)运行脚本
./backup.sh

cd oldlogs
ls ##发现自动生成了昨天的access.log和error.log

(5)编写定时任务,使实际企业当中的服务器每天晚上的24:00准时去进行日志切割
也可以发布定时任务 每天0点进行日志切割

crontab -e   填写任务

crontab -l 查看任务

在这里插入图片描述

nginx相关参数

1)最大连接数
worker_connections 65535	##当nginx做反向代理时,这个数字要除以2来看最大连接数

然后查看系统最大打开文件数:
sysctl -a | grep file
fs.file-max = 200603	##最大打开文件数为200603,一个连接也是一个文件(socket文件,linux思想一切皆文件)

查看系统默认打开文件数
ulimit -a
open files                      (-n) 1024	##默认1024个


然后修改系统参数:
vim /etc/security/limits.conf

nginx	-	nofile		65535	##加在最后

新建nginx用户:
useradd -M -d /usr/local/nginx -s /sbin/nologin nginx

我们经常会遇到这种情况,服务器流量异常,负载过大等等。对于大流量恶意的攻击访问,会带来带宽的浪费,服务器压力,影响业务,往往考虑对同一个ip的连接数,并发数进行限制


2)限制链接数	##看管网,docs.nginx.com --> NGINX Plus --> Admin Guide --> Security Controls --> Limiting Access to Proxied HTTP Resources

vim nginx.conf

...ls
keepalive_timeout  65;

#gzip  on;
#limit_conn_zone 用来限制同一时间连接数,即并发限制
#limit_req_zone 用来限制单位时间内的请求数,即速率限制,采用的漏桶算法 “leaky bucket” 
$binary_remote_addr是限制同一客户端ip地址
zone=one:10m表示生成一个大小为10M,名字为one的内存区域,用来存储访问的频次信息
# 定义一个名为addr的limit_conn_zone $binary_remote_addr是限制同一客户端ip地址

#以下两条语句写在server之上
limit_conn_zone $binary_remote_addr zone=addr:10m; #大小是10M内存 10M的内存来对于IP传输开销
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s; #1s中不超过一个请求

    location / {
        root   html;
        index  index.html index.htm;
    }

location /download {
    limit_conn addr 1;	##只能一个并发,多了会报错
    limit_rate 50k;	##限制带宽,每秒最多50k
}

在这里插入图片描述在这里插入图片描述
‘上面三个参数一个一个演示’

mkdir /usr/local/nginx/html/download
#给download目录里放一个vim.jpg(约400k)

在这里插入图片描述

ab -c 10 -n 1000 http://172.25.136.1/download/vim.jpg
每次发送10个并发的请求数,请求数总数为100
[root@server1 logs]# cat access.log |grep 200
172.25.0.250 - - [12/Apr/2019:23:11:29 -0400] "GET /download/vim.jpg HTTP/1.0" 200 611847 "-" "ApacheBench/2.3"
172.25.0.250 - - [12/Apr/2019:23:11:29 -0400] "GET /download/vim.jpg HTTP/1.0" 200 611847 "-" "ApacheBench/2.3"
172.25.0.250 - - [12/Apr/2019:23:11:29 -0400] "GET /download/vim.jpg HTTP/1.0" 200 611847 "-" "ApacheBench/2.3"
172.25.0.250 - - [12/Apr/2019:23:11:29 -0400] "GET /download/vim.jpg HTTP/1.0" 200 611847 "-" "ApacheBench/2.3"
172.25.0.250 - - [12/Apr/2019:23:11:29 -0400] "GET /download/vim.jpg HTTP/1.0" 200 611847 "-" "ApacheBench/2.3"
172.25.0.250 - - [12/Apr/2019:23:11:29 -0400] "GET /download/vim.jpg HTTP/1.0" 200 611847 "-" "ApacheBench/2.3"
172.25.0.250 - - [12/Apr/2019:23:11:29 -0400] "GET /download/vim.jpg HTTP/1.0" 200 611847 "-" "ApacheBench/2.3"
172.25.0.250 - - [12/Apr/2019:23:11:29 -0400] "GET /download/vim.jpg HTTP/1.0" 200 611847 "-" "ApacheBench/2.3"
	172.25.0.250 - - [12/Apr/2019:23:11:29 -0400] "GET /download/vim.jpg HTTP/1.0" 200 611847 "-" "ApacheBench/2.3"
	172.25.0.250 - - [12/Apr/2019:23:11:29 -0400] "GET /download/vim.jpg HTTP/1.0" 200 611847 "-" "ApacheBench/2.3"
	172.25.0.250 - - [12/Apr/2019:23:11:29 -0400] "GET /download/vim.jpg HTTP/1.0" 200 611847 "-" "ApacheBench/2.3"
	172.25.0.250 - - [12/Apr/2019:23:11:29 -0400] "GET /download/vim.jpg HTTP/1.0" 200 611847 "-" "ApacheBench/2.3"
	172.25.0.250 - - [12/Apr/2019:23:11:29 -0400] "GET /download/vim.jpg HTTP/1.0" 200 611847 "-" "ApacheBench/2.3"
	172.25.0.250 - - [12/Apr/2019:23:11:29 -0400] "GET /download/vim.jpg HTTP/1.0" 200 611847 "-" "ApacheBench/2.3"
	172.25.0.250 - - [12/Apr/2019:23:11:29 -0400] "GET /download/vim.jpg HTTP/1.0" 200 611847 "-" "ApacheBench/2.3"
	@@@可以看到请求成功的200数量远远少于503的请求错误

在这里插入图片描述
在这里插入图片描述在这里插入图片描述参数更改为50k
在这里插入图片描述在这里插入图片描述在这里插入图片描述

如何让nginx获取源地址

1.什么叫做nginx反向代理获取客户端的真实IP?

我们访问互联网的服务时,大多数时,客户端并不是直接访问到服务端的,而是客户端首先请求到反向代理
反向代理再转发到服务端实现服务访问,通过反向代理实现路由/负载均衡等策略
这样在服务端拿到的客户端IP将是反向代理IP,而不是真实客户端IP,因此需要想办法来获取到真实客户端IP

2.为什么服务端要解析客户端ip?

前后端分离之后,采用nginx作为静态服务器,并通过反向代理的方式来实现接口跨域的方式
在降低开发成本的的同时也带来了诸多问题,例如客户端真实ip的获取
在一些特殊场景下,比如风控和支付流程,往往需要获取用户的ip信息,但是nginx的反向代理实现跨域的同时
也彻底改变了服务器的请求来源,隔离了用户和服务器的连接这并不是我们想要的,因此对于客户端ip的解析是必要的

3.nginx中的几个变量?

  (1)remote_addr
  代表客户端的IP,但它的值不是由客户端提供的,而是服务端根据客户端的ip指定的
  当你的浏览器访问某个网站时,假设中间没有任何代理,那么网站的web服务器(Nginx,Apache等)
  就会把remote_addr设为你的机器IP,如果你用了某个代理,那么你的浏览器会先访问这个代理,然后再由这个代理转发到网站
  这样web服务器就会把remote_addr设为这台代理机器的IP,除非代理将你的IP附在请求header中一起转交给web服务器
  (2)X-Forwarded-For(简称XFF)
  X-Forwarded-For 是一个 HTTP 扩展头部,HTTP协议并没有对它的定义,它最开始是由 Squid 这个缓存代理软件引入
  用来表示 HTTP 请求端真实 IP,如今它已经成为事实上的标准,被各大 HTTP 代理、负载均衡等转发服务广泛使用
  并被写入 RFC 7239(Forwarded HTTP Extension)标准之中
  XFF的格式为
  X-Forwarded-For: client, proxy1, proxy2
  XFF 的内容由「英文逗号 + 空格」隔开的多个部分组成,最开始的是离服务端最远的设备 IP,然后是每一级代理设备的 IP
  (注意:如果未经严格处理,可以被伪造)
  如果一个 HTTP 请求到达服务器之前,经过了三个代理 Proxy1、Proxy2、Proxy3,IP 分别为 IP1、IP2、IP3,用户真实 IP 为 IP0
  那么按照 XFF 标准,服务端最终会收到以下信息
  X-Forwarded-For: IP0, IP1, IP2
  Proxy3 直连服务器,它会给 XFF 追加 IP2,表示它是在帮 Proxy2 转发请求
  列表中并没有 IP3,IP3 可以在服务端通过 Remote Address 字段获得
  (3)X-Real-IP
  这又是一个自定义头部字段,通常被 HTTP 代理用来表示与它产生 TCP 连接的设备 IP
  这个设备可能是其他代理,也可能是真正的请求端,这个要看经过代理的层级次数或是是否始终将真实IP一路传下来
  (注意:如果未经严格处理,可以被伪造)

4.利用Nginx中的realip模块获取用户的真实ip

我们将各层代理的IP排除在外,就取到了真实的用户IP,这个可以使用nginx的一个模块realip_module 来实现
从XFF中抛弃指定的代理层 IP,那么最后一个符合规则的就是用户 IP nginx realip_module
模块需要在编译nginx的时候加上参数–with-http_realip_module

#通常上网访问路径(比如说用阿里云主机): client(172.25.0.1) --> ADSL(拨号上网192.168.0.1) --> cdn(10.0.0.1) --> SLB(阿里云负载11.0.0.1) --> nginx(12.0.0.1)
'上面的ip都是举例,不是真实的'

./configure --prefix=/usr/local/nginx  --with-http_realip_module #会报错 ,因为模块没有编译
vim nginx.conf

#在配置最后添加虚拟主机
server {
        listen 80;
        server_name server1.example.org;
        set_real_ip_from 172.25.136.1;
        real_ip_header X-Forwarded-For;
        real_ip_recursive on;		##这里off就获取不到源地址,可以先改为off看效果,再打开

        location / {
                return 200 "client real ip: $remote_addr\n";
        }
}

在这里插入图片描述在这里插入图片描述在这里插入图片描述
在这里插入图片描述本地解析
在这里插入图片描述在这里插入图片描述在这里插入图片描述

#尝试访问
curl -H "X-Forwarded-For: 1.1.1.1,172.25.136.1" server1.example.org	##X-Forwarded-For可以保存每一级的ip头
结果可以获取到1.1.1.1这个ip

##深入:自己再开一台虚拟机模拟反向代理,测试这个配置是否生效
server1配置:###就写在配置文件本来的sever下面就行了
    server {
        listen       80;
        server_name  localhost;
        set_real_ip_from 172.25.0.2;
        real_ip_header X-Forwarded-For;
	real_ip_recursive on;

server2配置(做代理):
        upstream westos {
                server 172.25.0.101:80;  #上游真实服务器
        }
server {
        listen 80;
        server_name www.westos.org;

        location / {
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_pass http://westos;
        }
}

在这里插入图片描述
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述
再用物理机访问www.westos.org,然后在server1上查看access.log,可以看到请求来自172.25.136.250

在这里插入图片描述server1:查看cat access.log
查看代理是172.25.63.2访问的。
在这里插入图片描述
server1:

在这里插入图片描述server2:
server {
listen 80;
server_name www.westos.org;

location / {
#proxy_set_header X-Real-IP $remote_addr;        
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_pass http://westos;
}

在这里插入图片描述[root@foundation79 ~]# curl www.westos.org/test.html
test

就是250了

在这里插入图片描述

##2:systemd方式,nginx启动脚本
1)系统启动脚本都在/usr/lib/systemd/system目录下,但是自己配置的服务官方不建议放在此目录下,放在/etc/systemd/system目录下

2)用httpd服务启动脚本做参考

cp /usr/lib/systemd/system/httpd.service /etc/systemd/system/nginx.service

vim /etc/systemd/system/nginx.service
[Unit]
Description=The Nginx HTTP Server
After=network.target remote-fs.target nss-lookup.target

[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s stop
PrivateTmp=true

[Install]
WantedBy=multi-user.target

3)启动nginx
systemctl start nginx
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值