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