美文网首页
nginx详解

nginx详解

作者: CaptainWhite | 来源:发表于2019-12-22 13:39 被阅读0次
    #user  nobody;           
    worker_processes  1;
    
    #error_log  logs/error.log;
    #error_log  logs/error.log  notice;
    #error_log  logs/error.log  info;
    
    #pid        logs/nginx.pid;
    
    
    events {
        worker_connections  1024;
    }
    
    
    http {
        #nginx支持的媒体类型库文件
        include       mime.types;
       #默认的媒体类型
        default_type  application/octet-stream;
    
        #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  logs/access.log  main;
       #开启高效传输
        sendfile        on;
        #tcp_nopush     on;
    
        #keepalive_timeout  0;
        keepalive_timeout  65;
        #gzip  on;
    
        server {
            listen       80;
            server_name  www.index.ui;
    
            #charset koi8-r;
    
            #access_log  logs/host.access.log  main;
    
            location / {
                root   html;
                index  index.html index.htm;
            }
        #出现对应的http状态码时,使用下面的页面回应客户
            error_page   500 502 503 504  /50x.html;
            location = /50x.html {
                root   html;
            }
    }
    

    基于域名的配置(核心配置如下)

     server {
            listen       80;
            server_name  www.index.ui;
            location / {
                root   html/www;
                index  index.html index.htm;
            }
    }
    

    nginx的多server规范使用

    nginx的主配置文件为/usr/local/nginx/conf/nginx.conf,并且在配置目录,我们可以新建一个目录esp用来存放各类server配置文件
    例如:/usr/local/nginx/conf/esp/www.conf

        server {
            listen       80;
            server_name  www.index.ui;
    
            location / {
                root   html/www;
                index  index.html index.htm;
            }
        }
    

    最后只需要在/usr/local/nginx/conf/nginx.conf主配置文件使用include引入即可。

    http {
        include       mime.types;
        default_type  application/octet-stream;
        sendfile        on;
        keepalive_timeout  65;
       include esp/www.conf;
     }
    

    nginx的status模块介绍

    如果想要使用status模块,需要在./configure编译时候设置--with-http_stub_status_module

    [root@localhost nginx]# sbin/nginx -V
    nginx version: nginx/1.15.4
    built by gcc 4.8.5 20150623 (Red Hat 4.8.5-28) (GCC) 
    built with OpenSSL 1.0.2k-fips  26 Jan 2017
    TLS SNI support enabled
    configure arguments: --user=nginx --group=nginx --prefix=/usr/local/nginx-1.15.4 --with-http_stub_status_module --with-http_ssl_module
    

    配置过程如下:

    1.增加配置到配置文件

        server {
            listen       80;
            server_name  status.index.ui;
    
            location / {
                stub_status on;          #打开状态信息开关
                access_log   off;
            }
        }
    

    2.添加server到主配置文件

    http {
       include       mime.types;
        default_type  application/octet-stream;
        sendfile        on;
        keepalive_timeout  65;
    
    
       include esp/www.conf;
       include esp/qwer.conf;
       include esp/status.conf;
     }
    

    3.配置host解析(在windows的C:\Windows\System32\drivers\etc\hosts目录)
    192.168.100.24 status.index.ui
    4.浏览器输入域名进行访问:http://status.index.ui/

    Active connections: 4 
    server accepts handled requests
     42 42 47 
    Reading: 0 Writing: 1 Waiting: 3 
    
    • Active connections:表示nginx正在处理的活动连接数
    • server :表示nginx启动到现在共处理了42个连接
    • accepts :nginx启动到现在共成功建立了42次握手
      丢失数=(握手数-连接数),可以看到本此状态显示没有丢失请求
    • handled requests:表示共处理了47次请求
    • Reading: 0 表示nginx读取到客户端的hander信息数
    • Writing: 1 表示nginx返回给客户端的hander信息数
    • Waiting: 3 表示nginx已经处理完正在等候下一次请求指令的驻留连接。在开启keepalive的情况下,这个值等于active-(reading+writing)
      为了安全。这个状态信息要防止外部用户查看。可以在配置中设置允许和禁止的IP段访问
            location /nginx_conf {
                stub_status on;
                access_log   off;
                allow 10.0.0.0/24;
                deny all;
            }
    

    allow和deny是设置允许和禁止的IP段访问

    nginx的错误日志

    nginx的错误日志参数名为error_log,可以放在Main区块中全局配置,也可以放置不同的虚拟主机中单独记录
    语法:error_log file level
    例如:error_log logs/error.log info;
    日志级别有:debug、info、notice、warn、error、crit、alert、emerg,级别越高,记录的信息越少。生产场景中一般是warn、error、crit这三个级别之一
    可以放置的标签段为:main、http、server、location

    nginx的访问日志

    nginx的访问日志由log_format和access_log参数控制
    nginx默认配置如下

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

    nginx记录日志默认参数配置如下

    access_log  logs/access.log  main;
    

    nginx的日志变量:

    • remote_addr :记录访问客户端的地址
    • remote_user :客户端用户名
    • time_local:记录访问时间与时区
    • time_local:用户的http请求起始行信息
    • status :http状态码,记录请求返回的状态,例如:200、404、301等
    • body_bytes_sent :服务器发送给客户端的响应body字节数
    • http_referer:记录此次请求是从哪个链接访问过来的,可以根据referer进行防盗链设置
    • http_user_agent:记录客户端访问信息,例如浏览器、手机客户端等
    • http_x_forwarded_for:当前端有代理服务器时,设置web节点记录客户端地址的配置,此参数生效的前提是代理服务器上也进行了相关的x_forwarded_for设置。

    access_log参数说明:

    access_log    off;  #关闭access_log,即不记录访问日志
    
    access_log path [format [buffer=size [flush=time]] [if=condition]];
    
    access_log path format gzip[=level] [buffer=size] [flush=time] [if=condition];
    
    access_log syslog:server=address[,parameter=value] [format [if=condition]];
    

    buffer=size #为存放访问日志的缓冲区大小

    flush=time #为缓冲区的日志刷到磁盘的时间

    gzip[=level] #表示压缩级别

    [if = condition] #表示其他条件

    nginx访问日志轮训切割

    切割脚本如下:

    #!/bin/bash
    Dateformat=`date +%Y%m%d`
    Basedir="/usr/local/nginx"
    Nginxlogdir="$Basedir/logs"
    Logname="access.log"
    [ -d $Nginxlogdir ]&&cd $Nginxlogdir||exit 1
    [ -f $Logname ]&&mv $Logname  ${Dateformat}_$Logname||exit 1
    $Basedir/sbin/nginx -s reload
    

    脚本的实质是将正在写入的nginx日志改名为带日期的格式,然后平滑重启,生成新的nginx日志。
    然后在定时任务增加每天0点执行脚本

    cat >>/var/spool/cron/root <<EOF
    cut nginx access log
    00 00 * * * /bin/bash  /root/cut_nginx_log.sh  >/dev/null 2>&1
    EOF
    

    第二种方法:使用日志轮训,直接切割指定文件日志

    新建文件:/etc/logrotate.d/nginx
    ps:此文件会被/etc/logrotate.conf引入进来进行轮训

    /usr/local/nginx/logs/access.log{
        daily
        rotate 30
        missingok
        create
        dateext
        postrotate
          /usr/local/nginx/sbin/nginx -s reload
        endscript
    }
    

    使用debug方式验证:

    logrotate -d /etc/logrotate.d/nginx

    测试没有问题的话,可以在定时任务执行前,手动执行一次

    logrotate -f /etc/logrotate.d/nginx

    试验时发现没有在0点进行轮训,是因为/etc/anacrontab 里设置的原因

    参数如下:
    RANDOM_DELAY=45 设置最大延迟时间 45分钟
    START_HOURS_RANGE=3-22 在3点到22点之间执行


    image.png

    最下面的delay in minutes是延迟时间,cron.daily是指5分钟后执行

    即使设置RANDOM_DELAY=0;START_HOURS_RANGE=0;daily的延迟时间也是0,但是还是没有执行在0点准确切割,会有一分钟的延迟
    然后执行:systemctl restart crond.service

    nginx的location

    location语法:

     location [=|~|~*|^~|@]  uri{
              .....
            }
    
    • =是完全匹配
    • ~区分大小写(大小写敏感)
    • ~*大小写不敏感
    • ^~在进行常规的字符串匹配检查后,不做正则表达式检查

    location匹配的优先顺序

    顺序 不用URI及特殊字符组合匹配 说明
    1 location = / 精确匹配/
    2 location ^~/image/ 匹配常规字符串,不做正则匹配检查
    3 location ~* .(gif|jpg|png) 正则匹配
    4 location /document/ 匹配常规字符串,如果有正则,则优先匹配正则
    5 location / 所有location都不匹配则匹配此处

    测试访问

    配置文件如下

        server {
            listen       80;
            server_name  localhost;
            location / {
              return 401;
            }
            location =/ {
              return 402;
            }
            location  /documents/ {
              return 403;
            }
            location  ^~ /images/ {
              return 404;
            }
            location ~* \.(gif|jpg|png)$ {
              return 500;
            }
        }
    

    curl 访问命令:
    curl -s -I -o /dev/null -w "%{http_code}\n" 192.168.100.148

    nginx rewrite语法

    语法:rewrite regex replacement [flag];
    默认值:none
    应用位置:server、location、if
    rewrite实现url重写,根据regex部分的内容,重定向到replacement 部分,结尾flag标记
    例如:rewrite ^/(.*)$ http://www.baidu.com/$1 permanent;

    这里^/(.*)$ 指的是以/开头,任意内容结尾,即匹配所有,匹配成功后跳转到百度,$1指括号内容。

    rewrite指令最后的flag标记说明

    last:本条规则匹配完成后,继续向下匹配新的location uri规则
    break:本条匹配规则完成即终止,不再向后匹配
    redirect:返回302临时重定向,浏览器地址会显示跳转后的url地址
    permanent:返回301永久重定向,浏览器地址栏会显示跳转后的url地址。
    last和break实现url重写,地址不变,但是在服务端访问路径改变。redirect和permanent实现url跳转,浏览器地址栏会显示跳转后url地址。
    使用alias指令时必须用last标记,使用proxy_pass指令时要使用break标记。last标记会在本条rewrite规则执行完毕后,对其所在的server{....}标签重新发起请求。而break标记则会在本条规则匹配完成后,终止匹配,不再匹配后面的规则。

    nginx访问认证

    有一些无需密码即可访问的内容,可以用nginx设置访问认证,防止信息泄露

    location / {
             auth_basic   "closed  site";  
             auth_basic_user_file /usr/local/nginx/passwd.db; 
             
    }
    

    参数:

    • auth_basic
      意思是输入信息提示
      语法:auth_basic string|off ;
      默认值auth_basic off;
      使用位置:http、server、location、limit_except
    • auth_basic_user_file
      语法:auth_basic_user_file file
      默认值:----
      使用位置:http、server、location、limit_except
      auth_basic_user_file 参数后接认证密码文件,file内容如下:
      name1:password1
      name2:password2:comment
      name3:password3

    可以使用apache自带的htpasswd和oppenssl passwd命令设置用户和密码到认证文件里,注意密码是加密的。

    生成证号密码方式如下:

    yum install -y httpd
    htpasswd -bc /usr/local/nginx/pd baihua 123456
    chmod 400 /usr/local/nginx/pd
    chown nginx /usr/local/nginx/pd

    访问出现403的条件

    1.没有首页文件

            location / {
              root html;
            }
    

    2.当前nginx启动用户对首页没有读的权限
    3.存在index首页但是首页文件不对(实质还是找不到首页)

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

    相关文章

      网友评论

          本文标题:nginx详解

          本文链接:https://www.haomeiwen.com/subject/ljtdbqtx.html