Nginx进阶-常见配置(二)

一、nginx 日志配置

nginx 日志介绍

nginx 有一个非常灵活的日志记录模式,每个级别的配置可以有各自独立的访问日志, 所需日志模块 ngx_http_log_module 的支持,日志格式通过 log_format 命令来定义,日志对于统计和排错是非常有利的,下面总结了 nginx 日志相关的配置 包括 access_loglog_formatrewrite_logerror_log

Nginx主配置文件/etc/nginx/nginx.conf中配置
# 设置访问日志
access_log path;
# 关闭访问日志
access_log off; 
  • path 指定日志的存放位置。

作用域:

可以应用access_log指令的作用域分别有httpserverlocation,也就是说,在这几个作用域外使用该指令,Nginx会报错。

access_log /var/logs/nginx-access.log

该例子指定日志的写入路径为/var/logs/nginx-access.log,日志格式使用默认的combined

log_format日志格式

预定义格式

Nginx 预定义了名为 combined 日志格式,如果没有明确指定日志格式默认使用该格式:

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

如果不想使用Nginx预定义的格式,可以通过log_format指令进行自定义。

自定义格式

语法:log_format name [escape=default|json] string ...;
- name 格式名称。在 access_log 指令中引用。
- escape 设置变量中的字符编码方式是`json`还是`default`,默认是`default`。
- string 要定义的日志格式内容。该参数可以有多个。参数中可以使用Nginx变量。

常用日志格式字段

$remote_addr            客户端IP地址
$http_x_forwarded_for   通过代理服务器时,客户端的真实IP地址。
$remote_user            客户端用户名
$request                请求方法、请求URL和HTTP协议版本
$status                 HTTP状态码,显示请求状态
$body_bytes_sent        发送给客户端的响应正文字节数,不包括响应头的大小
$bytes_sent             发送给客户端的总字节数
$connection             连接的序列号
$connection_requests    当前通过一个连接获得的请求数量。
$msec                   日志写入时间。单位为秒,精度是毫秒。
$http_referer       访问当前页面的来源页面的URL地址,根据该参数进行防盗链设置
$http_user_agent    客户端浏览器相关信息
$request_length     请求的长度(包括请求行,请求头和请求正文)。
$request_time       完成请求所花费的总时间(单位秒,精度毫秒);从读入客户端的第一个字节开始,到把最后一个字符发送给客户端后进行日志写入为止。
$time_iso8601       ISO 8601标准格式的时间戳
$time_local         通用日志格式的本地时间。

access_log指令

自定义日志格式的使用

语法:access_log path format [parameters];

​path -指定访问日志文件的路径。
format -指定日志格式的名称,应与 log_format 指令中定义的格式相匹配,如下:
log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                  '$status $body_bytes_sent "$http_referer" '
                  '"$http_user_agent" "$http_x_forwarded_for"';
parameters:可选的参数用用于进一步控制日志行为。
    off: 关闭日志记录。
    buffered: 将日志记录缓冲起来,直到缓冲区满或定时刷新。
    gzip: 开启Gzip压缩。
    gzip_comp_level: Gzip压缩级别。
    flush: 设置缓冲区刷新的频率。
    if: 指定条件,只有当条件满足时才记录日志。
    escape: 指定如何转义日志字段中的特殊字符。
    merge: 控制是否合并日志记录。

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

示例
#条件日志记录,只记录HTTP状态码为404的请求
access_log  /var/log/nginx/access.log main if=$status=404; 
#日志缓冲,设置16KB的缓冲区大小,并每分钟刷新一次:
access_log  /var/log/nginx/access.log main buffered=16k flush=1m;
#日志压缩,开启Gzip压缩,并设置压缩级别为6
access_log  /var/log/nginx/access.log main gzip=on gzip_comp_level=6;

使用log_format指令定义了一个main的格式,并在access_log指令中引用了它。客户端发起请求访问:http://192.168.246.154/,看一下请求的日志记录:

10.0.105.207 - - [01/Jul/2019:10:44:36 +0800] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36" "-"

我们看到最终的日志记录中$remote_user$http_referer$http_x_forwarded_for都对应了一个-,这是因为这几个变量为空。

面试时:注意日志里面的ip地址一定要在第一列。

error_log 指令

错误日志在Nginx中是通过error_log指令实现的。该指令记录服务器和请求处理过程中的错误信息。配置段: http, server, location作用域。

语法:配置错误日志文件的路径和日志级别。

语法:error_log path [level];
path 日志存放路径
level 参数指定日志的级别。level可以是debug, info, notice, warn, error, crit, alert,emerg中的任意值。取值范围是按紧急程度从低到高排列的。
示例:error_log logs/error.log error; 
只有日志的错误级别等于或高于level指定的值才会写入错误日志中。默认值是error
扩展日志级别:
 debug级别:最低级别,记录调试信息,如变量的值、函数的调用等。一般在开发和调试过程中使用。
 info级别:一般级别,记录常规信息,如Nginx的启动、关闭、reload等操作。
 notice:稍高级别,记录需要注意的信息,如非严重错误或警告信息。一般生产环境中使用这个级别可以满足大部分需求。
 warning:警告级别,记录需要提醒的错误或警告信息。如请求出现了错误或异常情况,但并不会导致服务中断。
 err和error 错误级别,记录普通错误信息。如请求的URL不存在、请求的方法不支持等。
 crit: 临界级别,记录严重错误信息。如内存分配失败、磁盘IO错误等。比较严重了
 alert:警报级别,记录需要立即采取措施的错误信息。例如硬件故障、进程崩溃等。告警,很严重
 emerg:紧急(恐慌)级别,级别最高,记录需要立即采取紧急措施的错误信息。例如系统崩溃、进程异常终止等。 

示例

error_log /var/logs/nginx/nginx-error.log

例子中指定了错误日志的路径为:/var/logs/nginx/nginx-error.log,日志级别使用默认的 error。只会记录错误级别及以上的错误信息,并将错误日志记录到指定的文件中。

nginx 日志配置总结

Nginx中通过access_logerror_log指令配置访问日志和错误日志,通过log_format我们可以自定义日志格式。

详细的日志配置信息可以参考Nginx官方文档

单独开启server的访问日志

[root@nginx-client ~]# cd /etc/nginx/conf.d/
[root@nginx-client conf.d]# vim nginx.conf
server {
    listen       80;
    server_name  localhost;
​
    charset koi8-r;
    access_log  /var/log/nginx/test.access.log  main;
​
    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }
    location /admin {
        root /usr/share/nginx/html;
        index index.html index.htm;
        }
}
[root@nginx-client conf.d]# nginx -s reload
访问
[root@nginx-client conf.d]# curl -I http://192.168.1.10

当我们访问的这个server的时候日志将会输出到test.access.log.

Nginx日志切割

日志切割作用:有效释放磁盘空间,提高日志文件读取和处理效率、备份和归档能力,方便对日志的管理和维护

编写nginx日志切割脚本

# vim nginx_log.sh #编写日志切割脚本
#!/bin/bash
date=`date +%F -d -1day`                   #取得前一天服务器时间
log_dir=/var/log/nginx/                    #日志文件目录
log_name=access.log                        #日志名
[ -d $log_dir ] && cd $log_dir || exit 1   #判断日志路径是否存在,进入日志路径
[ -f $log_name ] || exit 1                 #判断日志文件是否存在
/bin/mv $log_name $log_name_${date}        #重命名为带有日期后缀的切割日志
/usr/sbin/nginx -s reload                  #重新生成日志
tar czf $log_name.${date}.tar.gz $log_name.${date} && rm -rf $log_name_${date}
    #打包旧日志文件,并删除压缩前的日志文件
cd $log_dir || exit 1
find ./ -mtime +7 -type f -name *.log | xargs rm -rf  #清理过期日志文件(7天前)
# crontab -e                               #设置日志脚本为开机自启
0 0 * * * /opt/script/nginx_log.sh
# chmod +x /opt/script/nginx_log.sh

#重新生成日志的其他写法
if [ -f /var/run/nginx.pid ]; then
    kill -USR1 `cat /var/run/nginx.pid`
fi

使用 logrotate 实现Nginx日志切割

# vim /etc/logrotate.d/nginx 新建nginx文件
/var/log/nginx/*log   # 可以写明对具体哪几个文件进行切割
{
    su root root
    daily
    dateext
    missingok
    rotate 7
    notifempty
    compress
    create 644 www www
    sharedscripts
    postrotate
        [ -f /usr/local/nginx/logs/nginx.pid ] && kill -USR1 `cat /usr/local/nginx/logs/nginx.pid`
    endscript

# logrotate -f /etc/logrotate.d/nginx  # 手动切割检验脚本实现效果
# ls /var/log/nginx      # 查看日志路径是否成功切割
logrotate 配置项 
logrotate 的默认配置文件是 /etc/logrotate.conf,参数如下
daily–>指定转储周期为每天
weekly–>指定转储周期为每周
monthly–>指定转储周期为每月
dateext–>在文件末尾添加当前日期
compress–>通过 gzip 压缩转储以后的日志
nocompress–>不需要压缩时,用这个参数
copytruncate–>先把日志内容复制到旧日志文件后才清除日志文件内容,可以保证日志记录的连续性
nocopytruncate–>备份日志文件但是不截断
create mode owner group–>转储文件,使用指定的文件模式创建新的日志文件
nocreate–>不建立新的日志文件
delaycompress 和 compress –>一起使用时,转储的日志文件到下一次转储时才压缩
nodelaycompress–>覆盖 delaycompress 选项,转储同时压缩。
errors address–>专储时的错误信息发送到指定的 Email 地址
ifempty–>即使是空文件也转储,这个是 logrotate 的缺省选项。
notifempty–>如果是空文件的话,不转储
mail address–>把转储的日志文件发送到指定的 E-mail 地址
nomail–>转储时不发送日志文件
olddir directory–>转储后的日志文件放入指定的目录,必须和当前日志文件在同一个文件系统
noolddir–>转储后的日志文件和当前日志文件放在同一个目录下
rotate count–>指定日志文件删除之前转储的次数,0 指没有备份,5 指保留 5 个备份
tabootext [+] list 让 logrotate –> 不转储指定扩展名的文件,缺省的扩展名是:.rpm-orig, .rpmsave, v, 和 ~
size–> size 当日志文件到达指定的大小时才转储,Size 可以指定 bytes (缺省)以及 KB (sizek)或者 MB (sizem).
prerotate/endscript –>在转储以前需要执行的命令可以放入这个对,这两个关键字必须单独成行
postrotate/endscript –>在转储以后需要执行的命令可以放入这个对,这两个关键字必须单独成行

二、nginx 的平滑升级

随着 nginx 越来越流行,并且 nginx 的优势也越来越明显,nginx 的版本迭代也进入加速模式,1.9.0版本的nginx更新了许多新功能,例如 stream 四层代理功能,伴随着 nginx 的广泛应用,版本升级必然越来越快,线上业务不能停,此时 nginx 的升级就是运维的工作了

平滑升级Nginx是为了确保高可用性、无停机时间、保持连接状态和避免数据丢失。

nginx 平滑升级原理

(1)在不停掉老进程的情况下,启动新进程。
(2)老进程负责处理仍然没有处理完的请求,但不再接受处理请求。
(3)新进程接受新请求。
(4)老进程处理完所有请求,关闭所有连接后,停止。
这样就很方便地实现了平滑升级。一般有两种情况下需要升级 nginx,
一种是确实要升级 nginx 的版本,另一种是要为 nginx 添加新的模块

Nginx信号简介

查看信号
kill -l  #查看所有Nginx信号

主进程支持的信号
TERM, INT: 立刻退出
QUIT:  等待工作进程结束后再退出(平滑关闭nginx)
KILL:  强制终止进程
HUP:   平滑重载配置文件(使用新的配置启动工作进程,并逐步关闭旧进程)
USR1:  重新打开日志文件
USR2:  平滑升级到新版本。启动新的主进程,实现热升级
WINCH: 平滑地重启Nginx服务(用于热升级)

工作进程支持的信号
TERM, INT,QUIT,USR1

nginx 平滑升级具体过程

准备工作:准备新版本的nginx安装包,并解压到 /usr/local/ 下。

这里更新为1.16.0Nginx版本

​(1)查看现有的 nginx 编译参数
[root@nginx-server ~]# /usr/local/nginx/sbin/nginx -V
(2)按照原编译参数编译安装 nginx 
只需要到make,不要执行make install,如果make install 会将原来的配置文件覆盖
~]# cd /usr/local/nginx-1.16.0/   #进入新版本安装包的解压目录下
nginx-1.16.0]# ./configure --prefix=/usr/local/nginx --group=nginx --user=nginx --sbin-path=/usr/local/nginx/sbin/nginx --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --http-client-body-temp-path=/tmp/nginx/client_body --http-proxy-temp-path=/tmp/nginx/proxy --http-fastcgi-temp-path=/tmp/nginx/fastcgi --pid-path=/var/run/nginx.pid --lock-path=/var/lock/nginx --with-http_stub_status_module --with-http_ssl_module --with-http_gzip_static_module --with-pcre --with-http_realip_module --with-stream --with-http_image_filter_module
nginx-1.16.0]# make
(3)备份原 nginx 二进制文件
备份二进制文件和 nginx 的配置文件,期间nginx不会停止服务
nginx-1.16.0]# mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx_$(date +%F)
(4)复制新的nginx二进制文件,进入新的nginx源码包
nginx-1.16.0]# cp /usr/local/nginx-1.16.0/objs/nginx /usr/local/nginx/sbin/
(5)测试新版本的nginx是否正常
nginx-1.16.0]# /usr/local/nginx/sbin/nginx -t
(6)给nginx发送平滑迁移信号(若不清楚pid路径,请查看nginx配置文件)
~]# kill -USR2 `cat /var/run/nginx.pid`
(7)查看nginx pid,查看nginx.pid.oldbin文件路径
~]# ll /var/run/nginx.pid*
-rw-r--r-- 1 root root 5 Jul  1 11:29 /var/run/nginx.pid
-rw-r--r-- 1 root root 5 Jul  1 09:54 /var/run/nginx.pid.oldbin
(8)从容关闭旧的Nginx进程
~]# kill -WINCH `cat /var/run/nginx.pid.oldbin`
(9)结束工作进程,完成此次升级
~]# kill -QUIT `cat /var/run/nginx.pid.oldbin`
(10)验证Nginx是否升级成功
~]# /usr/local/nginx/sbin/nginx -V

三、nginx 错误页面配置

全局页面错误

在http上下文中使用error_page指令会为所有的虚拟主机设置一个全局的错误页面。这是最广泛的作用域,适用于需要为整个Nginx服务器设置统一错误处理的情况。

http {
    error_page 404 /404.html;
    error_page 500 502 503 504 /50x.html;

    server {
        # 服务器配置
    }

    server {
        # 另一个服务器配置
    }
}

特定虚拟主机页面错误

server上下文允许我们为特定的虚拟主机配置错误页面。这比http上下文更具体,可以为不同的域名或IP地址设置不同的错误页面。

http {
  ... 
  server {
    ...   
    location /example {
      error_page 404 /path/to/404.html;
      error_page 500 502 503 504 /path/to/50x.html;
    }
    ...
  }
  ...
}

特定URL路径页面错误

server {
    listen 80;
    server_name example.com;

    location / {
        error_page 404 /404.html;
    }

    location /api/ {
        error_page 404 /api_404.json;
    }
}

较低级别的上下文(如location)会继承较高级别上下文(如server或http)的error_page设置,除非在较低级别上下文中明确覆盖。这允许我们在全局范围内设置默认的错误页面,同时为特定的虚拟主机或URL路径提供自定义的错误处理。如下组合使用

nginx错误页面包括404 403 500 502 503 504等页面,只需要在server中增加以下配置即可:

error_page  404 403 500 502 503 504  /404.html;
location = /404.html {
     root   /usr/local/nginx/html;
}
注意:
/usr/local/nginx/html/ 路径下必须有404.html这个文件!!!​

404.html上如果引用其他文件的png或css就会有问题,显示不出来,因为其他文件的访问
也要做配置;为了简单,可以将css嵌入文件中,图片用base编码嵌入;如下:

base64 图片---转码

[root@localhost html]# vim /usr/share/nginx/html/404.html
<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8" />
        <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1" />
        <title>404</title>
        <style>
            .layout-table{display:table;height:100%;width:100%;vertical-align: middle;margin-top:150px}
            .layout-table-cell{display: table-cell;vertical-align: middle;text-align:center}
            .layout-tip{font-size:28px;color:#373737;margin: 0 auto;margin-top:16px;border-bottom: 1px solid #eee;padding-bottom: 20px;width: 360px;}
            #tips{font-size:18px;color:#666666;margin-top:16px;}
        </style>
    </head>
    <body class="layui-layout-body">
        <div class="layui-layout layui-layout-admin">
            
            <div class="layui-body">
                <div class="layout-table">
                    <div class="layout-table-cell">
                        <img src="自定义图片地址链接">
                        <p class="layout-tip">哎呀,找不到该页面啦!</p>
                        <p id="tips">请检查您的网络连接是否正常或者输入的网址是否正确</p>
                    </div>
                </div>
            </div>
        </div>
        
    </body>
</html>

展示效果;

 php页面错误配置

在访问 php 页面时,需要配置 php 中的参数,保证 fastcgi_intercept_errors是 on 的,否则 Nginx 不会处理 php 的错误信息。只要 location 中有一个 error_page ,外层的 error_page 就不管用了。

location ~ \.php$ {
  root html;
 
  error_page 500 501 502 503 /50x.php;
  error_page 404 =200 /404.php;
  fastcgi_pass unix:/var/sock/php-fpm/www.sock;
  fastcgi_index  index.php;
  fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
  include        fastcgi_params;
  fastcgi_intercept_errors on;
}

四、nginx 流量控制

流量限制 (rate-limiting),我们可以用来限制用户在给定时间内HTTP请求的数量。流量限制可以用作安全目的,比如可以减慢暴力密码破解的速率,更常见的情况是该功能被用来保护上游应用服务器不被同时太多用户请求所压垮。

1、Nginx如何限流

Nginx的”流量限制”使用漏桶算法(leaky bucket algorithm),就好比,一个桶口在倒水,桶底在漏水的水桶。如果桶口倒水的速率大于桶底的漏水速率,桶里面的水将会溢出;同样,在请求处理方面,水代表来自客户端的请求,水桶代表根据”先进先出调度算法”(FIFO)等待被处理的请求队列,桶底漏出的水代表离开缓冲区被服务器处理的请求,桶口溢出的水代表被丢弃和不被处理的请求。

2、配置基本的限流--ngx_http_limit_req_module模块实现

“流量限制”配置两个主要的指令,limit_req_zonelimit_reqlimit_req_zone指令设置流量限制和内存区域的参数,但实际上并不限制请求速率。所以需要通过添加limit_req指令启用流量限制,应用在特定的location或者server块。(示例中,对于”/login/”的所有请求)。

limit_req_zone指令通常在HTTP块中定义,它需要以下三个参数:

-Key - 定义应用限制的请求特性。
-Zone - 定义用于存储每个IP地址状态以及被限制请求URL访问频率的内存区域。
-Rate - 连接请求。

示例

Nginx 变量$binary_remote_addr,保存客户端IP地址的二进制形式。
通过zone=keyword标识区域的名字(自定义),以及冒号后面跟区域大小。
16000个IP地址的状态信息,大约需要1MB。
在示例中,速率不超过每秒1个请求。
# vim /etc/nginx/conf.d/limit.conf
limit_req_zone $binary_remote_addr zone=mylimit:10m rate=1r/s;
        upstream myweb {
                server 10.0.105.196:80 weight=1 max_fails=1 fail_timeout=1;
                }
        server {
                listen 80;
                server_name localhost;
​
                location /login {
                        limit_req zone=mylimit;
                        proxy_pass http://myweb;
                        proxy_set_header Host $host:$server_port;
                        proxy_set_header X-Real-IP $remote_addr;
                        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                        }
        }
10.0.105.196配置:
server {
        listen 80;
        server_name localhost;
        location /login {
                root    /usr/share/nginx/html;
                index   index.html index.html;
                }
}

测试

客户端安装压力测试工具
[root@nginx-yum ~]# yum install httpd-tools
[root@nginx-yum ~]# ab -n1000 -c2 http://10.0.105.196/
-n 请求数
-c 并发数
代理机器看错误日志:
[root@nginx-server ~]# tail -f /var/log/nginx/error.log 
2019/09/10 07:32:09 [error] 1371#0: *1095 limiting requests, excess: 0.390 by zone "mylimit", client: 10.0.105.196, server: localhost, request: "GET / HTTP/1.0", host: "10.0.105.196"

日志字段

- limiting requests - 表明日志条目记录的是被“流量限制”请求
- excess - 每毫秒超过对应“流量限制”配置的请求数量
- zone - 定义实施“流量限制”的区域
- client - 发起请求的客户端IP地址
- server - 服务器IP地址或主机名
- request - 客户端发起的实际HTTP请求
- host - HTTP报头中host的值
查看访问日志出现503
[root@nginx-server nginx]# tail -f /var/log/nginx/access.log 
10.0.105.196 - - [10/Sep/2019:07:32:09 +0800] "GET / HTTP/1.0" 503 197 "-" "ApacheBench/2.3" "-"

实战二

limit_req_zone $binary_remote_addr zone=mylimit:10m rate=1r/s;
        upstream myweb {
                server 10.0.105.196:80 weight=1 max_fails=1 fail_timeout=1;
                }
        server {
                listen 80;
                server_name localhost;
​
                location /login {
                        #limit_req zone=mylimit;
                        limit_req zone=mylimit burst=5;
                        #limit_req zone=mylimit burst=5 nodelay;
                        proxy_pass http://myweb;
                        proxy_set_header Host $host:$server_port;
                        proxy_set_header X-Real-IP $remote_addr;
                        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                        }
        }
burst=5 表示最大延迟请求数量不大于5。超出的请求返回503状态码。
客户端测试--burst
[root@nginx-yum ~]# ab -n1000 -c50 http://10.0.105.195/
代理机器上面看日志
[root@nginx-server ~]# tail -f /var/log/nginx/access.log
10.0.105.196 - - [10/Sep/2019:08:05:10 +0800] "GET / HTTP/1.0" 503 197 "-" "ApacheBench/2.3" "-"
10.0.105.196 - - [10/Sep/2019:08:05:11 +0800] "GET / HTTP/1.0" 200 2 "-" "ApacheBench/2.3" "-"
​
nodelay:不延迟转发请求。速度变快
客户端测试--burst
[root@nginx-yum ~]# ab -n1000 -c50 http://10.0.105.195/
[root@nginx-server ~]# head /var/log/nginx/access.log
​
总结:
如果不加nodelay只有burst的时候只会延迟转发请求超过限制的请求出现503错误
如果nodelay和burst参数都有不会延迟转发请求并且超出规定的请求次数会返回503

4、发送到客户端的错误代码

一般情况下,客户端超过配置的流量限制时,Nginx响应状态码为503(Service Temporarily Unavailable)。可以使用limit_req_status指令来设置为其它状态码(例如下面的404状态码):

limit_req_zone $binary_remote_addr zone=mylimit:10m rate=1r/s;
    upstream myweb {
            server 10.0.105.196:80 weight=1 max_fails=1 fail_timeout=1;
        }
    server {
            listen 80;
            server_name localhost;
        
            location /login {
            limit_req zone=mylimit;
            limit_req_status 404;
            proxy_pass http://myweb;
            proxy_set_header Host $host:$server_port;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            }
    }

五、nginx 访问控制

nginx 访问控制模块

(1)基于IP的访问控制:http_access_module
(2)基于用户的信任登录:http_auth_basic_module

基于IP的访问控制

1、配置语法

Syntax:allow address | all;
default:默认无
Context:http,server,location
​
Syntax:deny address | all;
default:默认无
Context:http,server,location
===================================================
allow    允许     //ip或者网段
deny    拒绝     //ip或者网段

2、配置测试

编辑/etc/nginx/conf.d/access_mod.conf内容如下:

[root@192 ~]# vim /etc/nginx/conf.d/access_mod.conf
server {
        listen 80;
        server_name localhost;
        location  / {
                root /usr/share/nginx/html;
                index index.html index.hml;
                deny 192.168.1.8;
                allow all;
                }
}
[root@192 ~]# nginx -t
[root@192 ~]# nginx -s reload
#需要注意:
1.按顺序匹配,已经被匹配的ip或者网段,后面不再被匹配。
2.如果先允许所有ip访问,在定义拒绝访问。那么拒绝访问不生效。
3.默认为allow all

宿主机IP为192.168.1.8,虚拟机IP为192.168.1.11,故这里禁止宿主机访问,允许其他所有IP访问。宿主机访问http://192.168.1.11,显示403 Forbidden。当然也可以反向配置,同时也可以使用IP网段的配置方式,如allow 192.168.1.0/24;,表示满足此网段的IP都可以访问。

3、指定location拒绝所有请求

如果你想拒绝某个指定URL地址的所有请求,只需要在location块中配置deny all指令:

[root@192 ~]# vim /etc/nginx/conf.d/access_mod.conf
server {
        listen 80;
        server_name localhost;
        location  / {
                root /usr/share/nginx/html;
                index index.html index.hml;
                deny all;    #拒绝所有
                }
}
​
[root@192 ~]# nginx -t
[root@192 ~]# nginx -s reload

基于用户的信任登录

(2)基于用户的信任登录模块:http_auth_basic_module

有时我们会有这么一种需求,就是你的网站的某些页面不希望公开,我们希望的是某些特定的客户端可以访问。那么我们可以在访问时要求进行身份认证,就如给你自己的家门加一把锁,以拒绝那些不速之客。

1、配置语法

Syntax:auth_basic string | off;
default:auth_basic off;
Context:http,server,location
​
Syntax:auth_basic_user_file file;
default:默认无
Context:http,server,location
file:存储用户名密码信息的文件。

2、配置示例

[root@192 ~]# vim /etc/nginx/conf.d/auth_mod.conf 
server {
    listen 80;
    server_name localhost;
    location ~ /admin {
        root /var/www/html;
        index index.html index.hml;
        auth_basic "Auth access test!";
        auth_basic_user_file /etc/nginx/auth_conf;
        }
}
​
[root@192 ~]# nginx -t
[root@192 ~]# nginx -s reload
[root@192 ~]# mkdir /var/www/html    #创建目录
[root@192 ~]# vim /var/www/html/index.html    #创建文件

auth_basic不为off,开启登录验证功能,auth_basic_user_file加载账号密码文件。

3、建立口令文件

[root@192 ~]# yum install -y httpd-tools #htpasswd 是开源 http 服务器 apache httpd 的一个命令工具,用于生成 http 基本认证的密码文件
[root@192 ~]# htpasswd -cm /etc/nginx/auth_conf user10 # -c 创建解密文件,-m MD5加密
[root@192 ~]# htpasswd -m /etc/nginx/auth_conf user20
[root@192 ~]# cat /etc/nginx/auth_conf 
user10:$apr1$MOa9UVqF$RlYRMk7eprViEpNtDV0n40
user20:$apr1$biHJhW03$xboNUJgHME6yDd17gkQNb0

4、访问测试

  • 11
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值