nginx详解

2019-12-22  本文已影响0人  CaptainWhite
#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 
        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的日志变量:

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; 
         
}

参数:

可以使用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;
        }
上一篇下一篇

猜你喜欢

热点阅读