nginx详解

#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 </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详解)