Nginx之日志,location,反向代理,负载均衡讲解

文章目录

  • 1 nginx日志
    • 1.1 日志配置
    • 1.2 日志切分
      • 1.2.1 切分日志的shell脚本
      • 1.2.2 定时任务调度
  • 2 location配置
    • 2.1 location文件
      • 2.1.1 uri定位
      • 2.1.2 语法
  • 3 正向与反向代理
    • 3.1 正反代理区别
      • 3.1.1 位置不同
      • 3.1.2 代理对象不同
    • 3.2 配置反向代理
      • 3.2.1 只获得代理ip
      • 3.2.2 获得客户端真实ip
  • 4 负载均衡
    • 4.1 负载均衡配置文件
    • 4.2 使用负载均衡

1 nginx日志

1.1 日志配置

./configure --prefix=path指定的path中切换进去,找到log文件夹,进去后找到都是对应的日志文件
Nginx之日志,location,反向代理,负载均衡讲解_第1张图片
其中的nginx.pid是当前nginx的进程号,当使用ps -ef | grep nginx获得就是这个nginx.pid的值

nginx.conf中定义的日志格式如下:

#定义日志main 的格式
log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
#定义日志access.log的地址
access_log  logs/access.log  main;

局部日志:在每个server中都配置单独的日志文件
全局日志:在http那里配置的是全局日志

1.2 日志切分

第一:如何实现日志切分,编写shell脚本
第二:定时任务对脚本进行调度:crontab -e

1.2.1 切分日志的shell脚本

#!/bin/sh
BASE_DIR=/usr/local/nginx
BASE_FILE_NAME=access.log
CURRENT_PATH=$BASE_DIR/logs
BAK_PATH=$BASE_DIR/datalogs
CURRENT_FILE=$CURRENT_PATH/$BASE_FILE_NAME
#假设是每分钟都要备份一次的
BAK_TIME=`/bin/date -d yesterday +%Y%m%d%H%M`
BAK_FILE=$BAK_PATH/$BAK_TIME-$BASE_FILE_NAME
echo $BAK_FILE
$BASE_DIR/sbin/nginx -s stop
mv $CURRENT_FILE $BAK_FILE
$BASE_DIR/sbin/nginx

1.2.2 定时任务调度

执行crontab -e后:

*/1 * * * * sh /usr/local/nginx/sbin/log.sh

crontab语法 :
crontab [-e [UserName]|-l [UserName]|-r [UserName]|-v [UserName]|File ]
说明 :
crontab 是用来让使用者在固定时间或固定间隔执行程式之用,换句话说,也就是类似使用者的时程表。-u user 是指设定指定 user 的时程表,这个前提是你必须要有其权限(比如说是 root)才能够指定他人的时程表。如果不使用-u user的话,就是表示设定自己的时程表。
crontab参数 :

  • -e [UserName]: 执行文字编辑器来设定时程表,内定的文字编辑器是 VI
  • -r [UserName]: 删除目前的时程表
  • -l [UserName]: 列出目前的时程表
  • -v [UserName]:列出用户cron作业的状态

crontab时程表的格式如下 :

  • f1 f2 f3 f4 f5 program
  • 其中 f1 是表示分钟,f2 表示小时,f3 表示一个月份中的第几日,f4 表示月份,f5 表示一个星期中的第几天,program 表示要执行的程式
  • f1*时表示每分钟都要执行 program,f2 为 * 时表示每小时都要执行程式,其余类推
  • f1a-b时表示从第 a 分钟到第b 分钟这段时间内要执行,f2a-b 时表示从第a 到第 b 小时都要执行,其余类推
  • f1*/n 时表示每 n 分钟个时间间隔执行一次,f2*/n表示每n 小时个时间间隔执行一次,其余类推
  • f1a, b, c,...时表示第 a, b, c,...分钟要执行,f2 为 a, b, c,... 时表示第 a, b, c...个小时要执行,其余类推

注意:新创建的 cron 任务,不会马上执行,至少要过2分钟后才可以,当然你可以重启 cron 来马上执行

2 location配置

2.1 location文件

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

2.1.1 uri定位

location语法:表示uri方式定位:

  • location = pattern{} :精准定位(=
  • location pattern{} :一般匹配(字符串
  • location ~ pattern{} :正则匹配(~),比如:location ~ test{}只匹配带有test的请求,并且在请求的文件夹下有包含test的文件
  • location ^~ pattern{}^~开头表示uri以某个常规字符串开头,理解为匹配 url路径即可(nginx不对url做编码)
  • location ~* pattern{}~* 开头表示不区分大小写的正则匹配
  • location !~ pattern{}!~为区分大小写不匹配的正则
  • location !~* pattern{}!~*为不区分大小写不匹配 的正则

2.1.2 语法

if(条件为:= ~ ~*)、returnbreakrewrite~*表示忽略大小写的正则匹配)
-f: 是否为文件、-d:是否为目录、-e:是否存在

#如下为if条件
location ~ test{
 if($remote_addr = 192.168.0.1 ){ #如果来访者ip和这个相同那么就返回去了
  return 401;
 }
 root html;
 index index.html;
}

# 判断浏览器类型的语法
location ~ testAgent{
 if($http_user_agent ~* firefox ){ #如果来访者浏览器不区分大小写包含Firefox就重定向
   rewire ^.*$ /firefox.html; #重定向到firefox.html
   break;  #因为重定向后又是字母,可能还会进这个if方法而无限重定向
 }
 root html;
 index index.html;
}

3 正向与反向代理

3.1 正反代理区别

3.1.1 位置不同

正向代理:架设在客户端与目标主机之间
反向代理:架设在服务器端

3.1.2 代理对象不同

正向代理:代理客户端,服务器不知道实际发起请求的客户端
反向代理:代理服务器端,客户端不知道实际提供服务的服务端
类似于在前端和后端服务之间的中介,中间倒了一把手

3.2 配置反向代理

3.2.1 只获得代理ip

找到conf/nginx.conf文件,在相应的server中添加关键字proxy_pass,这样可以隐藏web端访问地址,而后端服务获得的是代理后的nginxip地址

# 把任何后缀为jsp的都用https://192.168.1.2::8080地址为代理
location ~ \.jsp$ {   # \.中的\是转义点符号
   	proxy_pass https://192.168.1.2::8080;
}

3.2.2 获得客户端真实ip

如果想让后端得到真正的web端地址添加如下:

# nginx的配置如下
location ~ \.jsp$ {   
   #proxy_set_header 是把正是ip放到请求头中 X-real-ip是自定义的变量名
   proxy_set_header X-real-ip $remote_addr;
   proxy_pass http://192.168.1.2::8080;
}

# 后端配置如下,就可以得到真正的ip
request.getHeader("X-real-ip");

4 负载均衡

找到conf/nginx.conf文件,在http之内,但是在server之外的,是和server平级的,使用upstream关键字

4.1 负载均衡配置文件


upstream myapp{
	server 192.168.1.10:8080 weight=1 max_fails=2 fail_timeout=30s;
	server 192.168.1.11:8080 weight=1 max_fails=2 fail_timeout=30s;
}

配置说明:

  • 必须以upstream关键字打头,myapp是自定义名字
  • server:服务器,这个关键字必须要有
  • weight:权重,其值越大,走的可能性也越大,若值一样那么就分一半的访问量
  • max_fails:如果两次进来都在fail_timeout时间内连接不通,就认为这个服务器挂了
  • fail_timeout:连接失败时间

4.2 使用负载均衡

server {
        listen       80;
        server_name  localhost jingzh.com;
		location / {
           proxy_pass http://myapp; #此处的myapp就是自定义的负载均衡
        }
}

你可能感兴趣的:(Dubbo)