Nginx常用基础模块

1、Nginx软件功能模块说明
模块名称解释说明
ngx_http_core_module包括一些核心的http参数配置,对应Nginx的配置为http区块部分
ngx_http_access_module访问控制模块,用来控制网站用户对Nginx的访问
ngx_http_gzip_module压缩模块,对Nginx返回的数据压缩,属于性能优化模块
ngx_http_fastcgi_modulefastcgi模块,和动态应用相关的模块,例如PHP
ngx_http_proxy_moduleproxy代理模块
ngx_http_upstream_module负载均衡模块,可以实现网站的负载均衡功能及节点的健康检查
ngx_http_rewrite_moduleURL地址重写模块
ngx_http_limit_conn_module限制用户并发连接数及请求书模块
ngx_http_limit_req_module根据定义的key限制Nginx请求过程的速率
ngx_http_log_module访问日志模块,以指定的格式记录Nginx客户访问日志等信息
ngx_http_auth_basic_moduleWeb认证模块,设置Web用户通过账号密码访问Nginx
ngx_http_ssl_modulessl模块,用户加密的http连接,如https
ngx_http_stub_status_module记录Nginx基本访问状态信息等模块

nginx的第三方模块:https://www.nginx.com/resources/wiki/modules/index.html

2、Nginx 站点目录浏览功能

需要在server或location段里添加上autoindex on 来启用浏览功能。
https://mirrors.aliyun.com/centos/7.9.2009/isos/x86_64/ #结尾/斜线不要丢

server{
  listen 80;
  server_name mirrors.shnne.com;
  charset utf-8;
  autoindex on;    #红花
  #autoindex_exact_size off;    #绿叶,默认on
  #autoindex_localtime on;    #绿叶,默认off
  location / {
    root /data/;
  }
}

403三个原因:
1)没有首页,并且禁止目录浏览功能
2)站点目录没有访问权限
3)通过访问控制限制了访问

类似阿里云配置

server{
  listen 80;
  server_name mirrors.shnne.com;
  charset utf-8;
  root html;
  location / {
    index index.html;
  }
  #yum仓库目录
    location /centos/ {
      autoindex on;
  }
}
3、Nginx访问控制功能

ngx_http_access_module 访问控制模块,用来控制网站用户对Nginx的访问

Syntax:    allow address | CIDR | unix: | all;
Default:    —
Context:    http, server, location, limit_except
Allows access for the specified network or address. If the special value unix: is specified (1.5.1), allows access for all UNIX-domain sockets.

Syntax:    deny address | CIDR | unix: | all;
Default:    —
Context:    http, server, location, limit_except
Denies access for the specified network or address. If the special value unix: is specified (1.5.1), denies access for all UNIX-domain sockets.
#先允许后拒绝,生产场景常用
server{
  listen 80;
  server_name mirrors.shnne.com;
  charset utf-8;
  root html;
  location / {
    index index.html;
  }
  #yum仓库目录,限制/centos目录
    location /centos/ {
      autoindex on;
      allow 10.0.0.7;    #允许单个IP地址
      allow 10.0.0.0/24;    #允许网段地址
      deny all;                #拒绝所有
  }
}
#拒绝测试
server{
  listen 80;
  server_name mirrors.shnne.com;
  charset utf-8;
  root html;
  location / {
    index index.html;
  }
  #yum仓库目录,限制/centos目录
    location /centos/ {
      autoindex on;
      deny 10.0.0.7;    #拒绝单个IP地址
      deny 10.0.0.0/24;    #拒绝网段地址
      allow all;        #允许所有
  }
}

在nginx反向代理后面的节点机器,如何获取最终网站用户的客户端机器IP?
解答:X_FORWARD_FOR

ngx_http_auth_basic_module Web认证模块,设置Web用户通过账号密码访问Nginx

yum -y install httpd-tools
[root@web01 ~]$rpm -ql httpd-tools
/usr/bin/ab    #压测工具
/usr/bin/htpasswd #生成密码工具
[root@web01 ~]$htpasswd -b -c /etc/nginx/auth_pass oldboy 123456
Adding password for user oldboy

#改下权限
[root@web01 ~]$chown www.www /etc/nginx/auth_pass
[root@web01 ~]$chmod 600 /etc/nginx/auth_pass
[root@web01 ~]$ll /etc/nginx/auth_pass
-rw------- 1 www www 45 Dec  8 23:35 /etc/nginx/auth_pass
server{
  listen 80;
  server_name mirrors.shnne.com;
  charset utf-8;
  autoindex on;
  #autoindex_exact_size off;
  #autoindex_localtime on;
  root /data
  
  location / {
    index index.html
  }
  
  location /admin {
  #用户名密码验证
    auth_basic "Auth access";    #这是一个提示
    auth_basic_user_file /etc/nginx/auth_pass; #指定帐号密码文件
   #来源IP限制
      #allow 10.0.0.7;
      #deny all;
  }
}
4、Nginx请求限制、并发限制、限速三个模块
  • 请求数限制:ngx_http_limit_req_module 限制某个客户端在单位时间内同时访问的Http请求数
  • 并发连接频率限制:ngx_http_limit_conn_module 限制同一时间的并发数
  • 下载限速:ngx_http_core_module 限制客户端下载资源速度

ngx_http_limit_req_module 模块
漏桶算法

Syntax:    limit_req zone=name [burst=number] [nodelay | delay=number];
Default:    —
Context:    http, server, location
# http标签段定义请求限制,rate限制速率,限制一秒钟最多一个IP请求
http {
    limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s; #这个定义只能放在http模块下
    server {
        listen 80;
        server_name mirrors.shnne.com;
        #请求超过1r/s,剩下的将被延迟处理,请求数查过burst定义的数量,则返回503
        location /search/ {
            limit_req zone=one burst=5 nodelay;
        }
   # nodelay 表示允许请求队列在排队的时候立即被处理

ngx_http_limit_conn_module

Syntax:    limit_conn zone number;
Default:    —
Context:    http, server, location
http {
    limit_conn_zone $binary_remote_addr zone=addr:10m;

    ...

    server {

        ...

        location /download/ {
            limit_conn addr 1;
        }

limit_conn 配置,通过ab测试不生效的问题。
ab -c 4 -n 100 http://mirrors.shnne.com/centos/index.html
可能是因为模拟环境的问题,可能是文件小,可以通过dd建立大文件试试。

下载速度限制ngx_http_core_module

limit_rate_after 50m;    #下载打到50m,开始限速
limit_rate 200k;        #限制速度为200k
#用法
location /flv/ {
    flv;
    limit_rate_after 500k;
    limit_rate       50k;
}
5、Nginx状态监控

ngx_http_stub_status_module 记录Nginx基本访问状态信息等模块

server {
        listen 127.0.0.1;
        location /status {
            stub_status;
        }
}

状态信息

Active connections当前活跃连接数,包括Waiting等待连接数。
accepts已接收的总TCP连接数量。
handled已处理的TCP连接数量。
requests当前总http请求数量。
Reading当前读取的请求头数量。
Writing当前响应的请求头数量。
Waiting当前等待请求的空闲客户端连接数
Zabbix监控Nginx 状态信息
https://www.cnblogs.com/bixiaoyu/p/9169319.html
6、Nginx Location

Location用来控制访问网站的uri路径

#location作用
location指令作用是可以根据用户请求URI来执行不同的应用,URI的知识前面章节已经讲解过,其实就是根据用户请求的网站的地址URL匹配,匹配成功即进行相关的操作。
#location语法
location [ = | ~ | ~* | ^~ ] uri { ... }
location @name { ... }
# 匹配符 匹配规则                  优先级
# =     精确匹配                     1 
# ^~    以某个字符串开头              2
# ~     区分大小写的正则匹配           3
# ~*    不区分大小写的正则匹配         4
# /     通用匹配,任何请求都会匹配到    5
#location优先级示例
[root@web01 conf.d]# cat location01.etiantian.org.conf 
server {
    listen 80;
    server_name location01.etiantian.org;

    location = / {
    default_type text/html;
    return 200 'location = /';
}

location / {
    default_type text/html;
    return 200 'location /';
}

location /documents/ {
    default_type text/html;
    return 200 'location /documents/';
}

location ^~ /images/ {
    default_type text/html;
    return 200 'location ^~ /images/';
}

location ~* \.(gif|jpg|jpeg)$ {
    default_type text/html;
    return 200 'location ~* \.(gif|jpg|jpeg)';
}
}

匹配顺序实践:

[root@web01 conf.d]$nginx -t && systemctl reload nginx

#(1)等号精确匹配优先,no.1
[root@web01 conf.d]# curl http://location01.etiantian.org/
location = / 
#(2)# ^~ ,以某个字符串开头no.2
[root@web01 conf.d]# curl http://location01.etiantian.org/images/1.gif
location ^~ /images/
#(3)~*    不区分大小写的正则匹配 
[root@web01 conf.d]# curl http://location01.etiantian.org/documents/1.jpg
location ~* \.(gif|jpg|jpeg)
#(4)#目录匹配
[root@web01 conf.d]# curl http://location01.etiantian.org/documents/1.html
location /documents/ #目录匹配
#(5) / 通用匹配,任何请求都会匹配到no.5
[root@web01 conf.d]# curl http://location01.etiantian.org/index.html
location /   #默认匹配最后。

#location02 @name,这样的location02不用于常规请求处理,而是用于重定向。
[root@web01 conf.d]# cat location02.etiantian.org.conf 
server {
    listen 80;
    server_name location02.etiantian.org;
    root /data;
#如果出现如下状态码,则重新从定向到@error_status
error_page 404 403 502 @error_status;
    location @error_status {
    default_type text/html;
    return 200 '你的访问出了问题,我是oldboy.';
    }
}
[root@web01 conf.d]# curl -H "host:location02.etiantian.org" http://10.0.0.7/oldboy
你的访问出了问题,我是oldboy.
7、Nginx日志

ngx_http_log_module
log_format定义日志格式语法

#配置语法: 包括: error.log access.log
Syntax: log_format name [escape=default|json] string ...;
Default: log_format combined "...";
Context: http

默认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日志格式中常用的变量

$remote_addr        # 记录客户端IP地址
$remote_user        # 记录客户端用户名
$time_local         # 记录通用的本地时间
$time_iso8601       # 记录ISO8601标准格式下的本地时间
$request            # 记录请求的方法以及请求的http协议
$status             # 记录请求状态码(用于定位错误信息)
$body_bytes_sent    # 发送给客户端的资源字节数,不包括响应头的大小
$bytes_sent         # 发送给客户端的总字节数
$msec               # 日志写入时间。单位为秒,精度是毫秒。
$http_referer       # 记录从哪个页面链接访问过来的
$http_user_agent    # 记录客户端浏览器相关信息
$http_x_forwarded_for #记录客户端IP地址
$request_length     # 请求的长度(包括请求行, 请求头和请求正文)。
$request_time       # 请求花费的时间,单位为秒,精度毫秒
# 注:如果Nginx位于负载均衡器,nginx反向代理之后, web服务器无法直接获取到客 户端真实的IP地址。
# $remote_addr获取的是反向代理的IP地址。 反向代理服务器在转发请求的http头信息中,
# 增加X-Forwarded-For信息,用来记录客户端IP地址和客户端请求的服务器地址。

#### 真实的日志内容为:
10.0.0.1- - [05/Apr/2015:12:16:00 +0800] "GET / HTTP/1.1" 200 25 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36" "-"
对应说明:
$remote_addr对应的真实日志里的10.0.0.100,即客户端的IP。
$remote_user对应的是第二个中杠“-”,没有远程用户,所以用“-”填充。
[$time_local]对应的是[05/Apr/2015:12:16:00 +0800]。
"$request"对应的是"GET / HTTP/1.1"。
$status对应的是200状态码,200是正常访问。
$body_bytes_sent对应的是25字节,响应body的大小。
"$http_referer"对应的是"-",直接打开的域名浏览,因此,referer没有值。
"$http_user_agent"对应的是"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36"。
"$http_x_forwarded_for"对应的是"-",因为Web服务没有使用代理,因此此处为"-"。

Nginx访问日志

#web服务器的访问日志是非常重要的,我们可以通过访问日志来分析用户的访问情况,也可以通过访问日志发现一些异常访问。
access_log日志配置语法。*
Syntax: access_log path [format [buffer=size] [gzip[=level]] [flush=time] [if=condition]];
access_log off;
Default: access_log logs/access.log combined;
Context: http, server, location, if in location, limit_except
#Nginx访问日志配置例
server {
    listen 80;
    server_name mirrors.etiantian.org;
    #将当前的server网站的访问日志记录至对应的目录,使用main格式
    access_log /var/log/nginx/mirrors.etiantian.org.log main;
    location / {
    root /data;
    index index.html;
    }
}

# 日志压缩
server {
    listen 80;
    server_name mirrors.etiantian.org;
    #将当前的server网站的访问日志记录至对应的目录,使用main格式
    #access_log /var/log/nginx/mirrors.etiantian.org.log main;
    access_log  /var/log/nginx/mirrors.etiantian.org.access.log.gz  main gzip=9 buffer=32k flush=5s;
    location / {
    root /data;
    index index.html;
    }
}
8、Nginx日志切割
#Nginx访问日志轮询切割
为什么Nginx访问日志轮询切割?
    1.按天好进行相关分析。
    2.单个日志过大。
#方法1:00点
mv access.log  $(date +%F -d '-1d').accss.log
systemctl reload nginx
=============================================
[root@web01 scripts]# cat cut_nginx_log.sh 
#!/bin/sh
Dateformat=`date +%Y%m%d -d -1day`
Nginxlogdir="/var/log/nginx/"
Logname="mirrors.etiantian.org.access.log.gz"
#第一关
[ -d $Nginxlogdir ] && cd $Nginxlogdir||exit 1
#第二关 
[ -f $Logname ]||exit 1
#第三关
/bin/mv $Logname ${Dateformat}_$Logname
#第四关
systemctl reload nginx
每天00点00分进行日志滚动
#####
00 00 * * *  /bin/sh /server/scripts/cut_nginx_log.sh &>/dev/null

#方法2:logrotate工具切割
/etc/logrotate.d/nginx
[root@web01 scripts]# cat  /etc/logrotate.d/nginx
/var/log/nginx/*.log.gz {
        daily    #按天数切割
        dateext    #归档旧日志文件时,文件名添加YYYYMMDD形式日期
        missingok
        rotate 52    #切割日志保留多少份
        #compress    #通过gzip压缩转储以后的日志
        delaycompress
        notifempty    #如果是空文件,不转储
        create 640 nginx adm
        sharedscripts    #表示postrotate只执行一次
        postrotate        #在转储医院后需要执行的命令
                if [ -f /var/run/nginx.pid ]; then
                        kill -USR1 `cat /var/run/nginx.pid`
                fi
        endscript
}
每天00点00分进行日志滚动
#crontab -e
00 00 * * *  /usr/sbin/logrotate -f /etc/logrotate.d/nginx &>/dev/null
9、Nginx日志过滤
*一个网站会包含很多元素,尤其是有大量的图片、js、css等静态资源。这样的请求其实可以不用记录日志。*
#访问静态资源gif、png等时,将日志丢入空
location ~* .*\.(gif|jpg|png|css|js)$ 
{
    access_log /dev/null;
}
10、Nginx错误日志

Nginx错误日志

#Nginx错误日志级别
常见的错误日志级别有debug | info | notice | warn | **error** | crit | alert | emerg
级别越高记录的信息越少,如果不定义,默认级别为error.
它可以配置在main、http、server、location段里
日志可以用json格式
#Nginx错误日志示例
error_log  /var/log/nginx/error.log crit;
#如果要想彻底关闭error_log,需要这样配置error_log /dev/null;

负载均衡日志不能开比error更低的级别
不能开iptables及firewalld防火墙(用硬件防火墙,或者开在web主机上)

nginx错误码原因以及解决方案
http://www.laoseng.net/articles/2014/12/18/1418884520679.html

#400 bad request错误的原因和解决办法**
配置nginx.conf相关设置如下.
client_header_buffer_size 16k;
large_client_header_buffers 4 64k;
根据具体情况调整,一般适当调整值就可以。
#Nginx 502 Bad Gateway错误**
proxy_next_upstream error timeout invalid_header http_500 http_503;
或者尝试设置:
large_client_header_buffers 4 32k;
#Nginx出现的413 Request Entity Too Large错误**
这个错误一般在上传文件的时候会出现,
编辑Nginx主配置文件Nginx.conf,找到http{}段,添加
client_max_body_size 10m; //设置多大根据自己的需求作调整.
如果运行php的话这个大小client_max_body_size要和php.ini中的如下值的最大值一致或者稍大,这样就不会因为提交数据大小不一致出现的错误。
post_max_size = 10M
upload_max_filesize = 2M
#解决504 Gateway Time-out(nginx)**
遇到这个问题是在升级discuz论坛的时候遇到的
一般看来, 这种情况可能是由于nginx默认的fastcgi进程响应的缓冲区太小造成的, 这将导致fastcgi进程被挂起, 如果你的fastcgi服务对这个挂起处理的不好, 那么最后就极有可能导致504 Gateway Time-out
现在的网站, 尤其某些论坛有大量的回复和很多内容的, 一个页面甚至有几百K。
默认的fastcgi进程响应的缓冲区是8K, 我们可以设置大点
在nginx.conf里, 加入: fastcgi_buffers 8 128k
这表示设置fastcgi缓冲区为8×128k
当然如果您在进行某一项即时的操作, 可能需要nginx的超时参数调大点,例如设置成60秒:send_timeout 60;
只是调整了这两个参数, 结果就是没有再显示那个超时, 可以说效果不错, 但是也可能是由于其他的原因, 目前关于nginx的资料不是很多, 很多事情都需要长期的经验累计才有结果.