查看nginx加载了哪些模块: [root@web01 ~]# nginx -V

1. Nginx目录索引

1.1 实现目录浏览下载功能

autoindex_module

实战模拟搭建企业内网YUM仓库( 生产 )
——> 详细搭建过程

nginx配置文件
[root@web01 mirror]# cat /etc/nginx/conf.d/mirror.oldhou.com.conf

  1. server {
  2. listen 80;
  3. server_name mirror.oldxu.com;
  4. charset utf-8; #设置中文字符集
  5. root /mirror; #全局设置路径
  6. location / { #这里的 / 其实就是一个相对(/mirror)路径
  7. index index.html; #提供yum源的仓库
  8. location /repo {
  9. autoindex on; #打开目录浏览功能!!!!
  10. autoindex_exact_size off; #关闭字节显示(会以MB的方式显 示)
  11. autoindex_localtime on;
  12. #打开会显示文件上传的本地的时间(默认格林威治时间-8h)
  13. }
  14. }

拉取资源同步至本地
[root@web01 mirror]# rsync -avz rsync://rsync.mirrors.ustc.edu.cn/repo/centos/ /mirror/repo/
——> 可配置定时任务 定时跟新源


2. Nginx访问控制

2.1 基于来源的IP实现访问控制

(access_module)

仅允许哪些IP可以访问
拒绝某个IP访问,其他IP都可以 正常访问

注意:deny和allow的顺序是有 影响的。   默认情况下从第一条规则开始匹配   如果匹配成功,检查规则是允许还是拒绝。但不在继续匹配下面的内容   如果匹配不成功,则继续往下匹配。

nginx配置文件
[root@web01 mirror]# cat /etc/nginx/conf.d/mirror.oldhou.com.conf

  1. server {
  2. listen 80;
  3. server_name mirror.oldxu.com;
  4. charset utf-8;
  5. location / {
  6. root /mirror;
  7. index index.html;
  8. }
  9. location /repo {
  10. root /mirror/yum;
  11. autoindex on;
  12. allow 10.0.0.1/32; #10.0.0.100 规则匹配不成功,继续往下匹配
  13. allow 10.0.0.100/32; #10.0.0.100 规则匹配成功,动作,放行,结束匹配。
  14. deny all; #放行其他用户
  15. }
  16. }

测试 curl -H http://mirror.oldhou.com 172.16.1.62 以上配置公司里可以配合VPN使用,管理员在家连接网站后台

2.2 基于用户名和密码的访问控制

(auth_basic_module)

① 准备一个密码文件
[root@web01 mirror]# yum install httpd-tools -y (安装阿帕奇工具包以便生成密码)
[root@web01 mirror]# htpasswd -cb /etc/nginx/auth_pass 【用户xxx】 【密码xxx】

-c创建 -b命令行 创建密码

② 给mirror.oldhou.com/repo的url 添加用户密码认证
#nginx配置文件
[root@web01 mirror]# cat /etc/nginx/conf.d/mirror.oldhou.com.conf

  1. server {
  2. listen 80;
  3. server_name mirror.oldxu.com;
  4. charset utf-8;
  5. root /mirror;
  6. location / {
  7. index index.html;
  8. }
  9. location /repo {
  10. autoindex on;
  11. autoindex_exact_size off;
  12. autoindex_localtime on;
  13. auth_basic "hello"; #密码框上边提示站点信息
  14. auth_basic_user_file "/etc/nginx/auth_pass"; #密码文件位置
  15. }
  16. }

报错处理: 查看root / 站点目录 是否是server层。 否则只有一个uri生效,其他报404错误。

3.Nginx的限流限速

作用于http层

3.1 请求限制

limit_req_module
[root@web01 mirror]# cat /etc/nginx/conf.d/limit.oldhou.com.con

  1. limit_req_zone   $binary_remote_addr zone=req_one:10m rate=1r/s;
  2. #开辟一个区域 针对的来源的IP地址   zone区域名称,大小10M,处理速度1个请求/s
  3. server {
  4. listen 80;
  5. server_name limit.oldxu.com;
  6. limit_req zone=req_one burst=3 nodelay;
  7. #请求超过1r/s频次的,剩下的将被延迟处理,请求数超过burst定义的数量,则返回503
  8. location / {
  9. root /limit;
  10. index index.html;
  11. }
  12. }

压测工具的使用:( 及得做本地域名解析) ab -n 10 -c2 -HHost’域名’ http://IP地址/

**

3.2 tcp连接、下载速度、访问限制

limit_conn_module)、 core_module
[root@web01 mirror]# cat /etc/nginx/conf.d/limit.oldhou.com.conf

  1. limit_conn_zone $binary_remote_addr zone=conn_od:10m;
  2. #连接限制 针对的是来源的IP 名称叫conn_od定义了一个10m内存空间
  3. server {
  4. listen 80;
  5. server_name limit.oldxu.com;
  6. limit_conn conn_od 2;
  7. limit_rate_after 100m; #100M后开始限速 (迅雷)
  8. limit_rate 200k; #限速
  9. location / {
  10. root /limit;
  11. }
  12. }

综合案例

限制web服务

请求评率被限制原理
*40. Nginx基础模块 - 图1

请求频率限速原理:倒入水的会被漏掉(请求被处理)多余的水 会在水桶等待漏掉(等待数据处理)多余的水会满出来(请求会被丢掉)

器请求数处理为1秒一个,触发值为5、 #请求限制
限制用户仅可同时下载一个文件。 #连接限制
当下载超过100M则限制下载速度为500k。如果同时下载超过2个视频,则返回提示 “请联系oldhou进行会员充值”。

nginx配置文件
[root@web01 mirror]# cat /etc/nginx/conf.d/limit.oldhou.com.conf

  1. limit_req_zone $binary_remote_addr zone=req_one:10m rate=1r/s;
  2. limit_conn_zone $binary_remote_addr zone=conn_od:10m;
  3. server {
  4. listen 80;
  5. server_name limit.oldxu.com;
  6. charset utf-8;
  7. limit_req zone=req_one burst=5 nodelay; #请求限制
  8. limit_conn conn_od 1; #连接限制
  9. limit_rate_after 100m; #100m不限速
  10. limit_rate 500k; #限速500k
  11. location / {
  12. root /limit;
  13. index index.html;
  14. }
  15. #异常页面捕捉
  16. error_page 503 @pay; #错误接收 @是一个特殊的重定向跳转自定义uri
  17. location @pay {
  18. default_type text/html;
  19. return 200 '请联系oldxu充值,联系qq:xxxxx';
  20. }
  21. }

http,server,location 层 具体具体配置在那一层,需要还要看需求 http:多个网站作配置生效 server: 整个页面做配置生效 localtion 指定的页面座配置生效


4. 状态模块

stub_status_module

监控Nginx连接 监控Nginx请求 模拟长连接和短连接效果

  1. server {
  2. ...
  3. location /status { #开启Nginx的状态监控
  4. stub_status;
  5. }
  6. ...
  7. }

*4.1 开启Nginx的状态监控(取值用于zabbix监控)

  1. 浏览器访问: http://mirror.oldhou.com/status
  2. --->>
  3. Active connections: 1
  4. server accepts handled requests
  5. 3 3 39
  6. Reading: 0 Writing: 1 Waiting: 0

提供以下状态信息7种状态指标含义

状态 含义
Active connections 当前活跃连接数,包括Waiting等待连接数。
accepts 已接收的总TCP连接数量。
handled 已处理的TCP连接数量。
requests 当前总http请求数量。
Reading 当前读取的请求头数量。
Writing 当前响应的请求头数量。
Waiting 当前等待请求的空闲客户端连接数

*5. Location匹配—-优先级

5.1 location匹配规则

# 匹配规则(匹配路径uri) 优先级
= 精确匹配 1 必须是百分百匹配
^~ 以某个字符串开头 2
~ 区分大小写的正则匹配 3
~* 不区分大小写的正则匹配 4
/ 通用匹配,任何请求都会匹配到 5

整不好就404了

官方文档:

The “/” request will match configuration A, the “/index.html” request will match configuration B the “/documents/document.html” request will match configuration C, the “/images/1.gif” request will match configuration D, the “/documents/1.jpg” request will match configuration E.

[root@web01 conf.d]# cat /etc/nginx/conf.d/location2.oldhou.com.conf

  1. server {
  2. listen 80;
  3. server_name location2.oldhou.com;
  4. # 通用匹配,任何请求都会匹配到
  5. location / {
  6. root html;
  7. index index.html;
  8. }
  9. # 精准匹配,必须请求的uri是/nginx_status
  10. location = /nginx_status {
  11. stub_status;
  12. }
  13. # 严格区分大小写,匹配以.php结尾的都走这个location xx.com/1.php
  14. location ~ \.php$ {
  15. default_type text/html;
  16. return 200 'php访问成功';
  17. }
  18. # 严格区分大小写,匹配以.jsp结尾的都走这个location
  19. location ~ \.jsp$ {
  20. # \ 转义符 点是特殊字符
  21. default_type text/html;
  22. return 200 'jsp访问成功';
  23. }
  24. # 不区分大小写匹配,只要用户访问.jpg,gif,png,js,css 都走这条location
  25. location ~* \.(jpg|gif|png|js|css)$ {
  26. return 403;
  27. }
  28. # 不区分大小写匹配
  29. location ~* \.(sql|bak|tgz|tar.gz|.git)$ {
  30. deny all;
  31. }
  32. }
  • 测试

    1. 一:
    2. curl -H Host:location.etiantian.org http://10.0.0.7/index.html
    3. curl -H Host:location.etiantian.org http://10.0.0.7/documents/document.html
    4. curl -H Host:location.etiantian.org http://10.0.0.7/images/1.gif
    5. curl -H Host:location.etiantian.org http://10.0.0.7/documents/1.jpg
    6. 二:
    7. curl -H Host:location2.etiantian.org http://10.0.0.7/test.php
    8. curl -H Host:location2.etiantian.org http://10.0.0.7/test.jsp
    9. curl -H Host:location2.etiantian.org http://10.0.0.7/1.jpg
    10. curl -H Host:location2.etiantian.org http://10.0.0.7/dadasdas/dsadsa/dsadsa/1.jpg
    11. curl -H Host:location2.etiantian.org http://10.0.0.7/dadasdas/dsadsa/dsadsa/1.sql



    6.2 location优先级

    参考6.1表格

6.3 location @ 内部重定向

  1. error_page 404 403 401 @err;
  2. location @err {
  3. default_type text/html;
  4. return 200 '你可能是不小心走丢了。';
  5. } #将错误404,403,401统一跳转一个页面

6.4 location uri 添加 / 和不添加 / 的区别?
#不添加/,默认上/code/test目录下找index.html文件,如果没有 index.html则会查找/code/test文件

  1. location /test {
  2. root /code;
  3. index index.html;
  4. }

添加/,默认上/test目录下寻找index.html文件,如果没有index.html 则会直接返回403

  1. location /test/ {
  2. root /code;
  3. }

6. nginx日志

6.1 访问日志,错误日志,日志切割


cat /etc/nginx/nginx.conf image.png 日志格式 log_format 访问日志 access_log 错误日志 error_log


  • log_format: 定义日志格式:
  • 关键字 变量

    1. log_format main '$remote_addr - $remote_user [$time_local] "$request" '
    2. '$status $body_bytes_sent "$http_referer" '
    3. '"$http_user_agent" "$http_x_forwarded_for"';
  • 访问日志如何调用

  • nginx配置文件添加:access_log /var/log/nginx/access.log main;
    1. $remote_addr # 记录客户端IP地址
    2. $remote_user # 记录客户端用户名
    3. $time_local # 记录通用的本地时间
    4. $time_iso8601 # 记录ISO8601标准格式下的本地时间
    5. $request # 记录请求的方法以及请求的http协议
    6. $status # 记录请求状态码(用于定位错误信息)
    7. $body_bytes_sent # 发送给客户端的资源字节数,不包括响应头的大小
    8. $bytes_sent # 发送给客户端的总字节数
    9. $msec # 日志写入时间。单位为秒,精度是毫秒。
    10. $http_referer # 记录从哪个页面链接访问过来的
    11. $http_user_agent # 记录客户端浏览器相关信息
    12. $http_x_forwarded_for #记录客户端IP地址
    13. $request_length # 请求的长度(包括请求行, 请求头和请求正文)。
    14. $request_time # 请求花费的时间,单位为秒,精度毫秒
  • access_log 可以定义在 http、server、location?

    每一个server都会定义一个access_log 为了区分网站的访问记录
      http {
          access_log   /var/log/nginx/access.log main;
          server {
              # access_log /var/log/nginx/log.oldxu.com.log main;
          }
    
          #如果某个网站不想记录日志,则可以通过如下两种方式去实现?
          server {
              access_log off;
              #access_log /dev/null;
          }
      }
    

    推荐server层配置access_log方便区分每个网站的日志信息。

error_log:错误日志

error_log  /var/log/nginx/error.log warn;    
#几乎是所有Nginx统一的一个位置。(全局,作用于所有的网站)

如果Nginx在访问的时候没有达到你的预期,请检查错误日志,

总结:常用模块

autoindex allow、deny auth_basic limit_req limit_conn stub_status location log

6.2 goaccess基本使用

  • 安装

[root@web01 ~]# yum install goaccess -y

  • goaccess进行简单配置修改

[root@web01 ~]# grep "^[a-Z]" /etc/goaccess/goaccess.conf
time-format %H:%M:%S
date-format %d/%b/%Y
log-format %h %^[%d:%t %^] “%r” %s %b “%R” “%u”

  • 手动测试

[root@web01 ~]# goaccess -f /var/log/nginx/access.log

  • 定义一个访问goaccess的网站
  • [root@web01 ~]# cat /etc/nginx/conf.d/goaccess.etiantian.org.conf
    server {
      listen 80;
      server_name goaccess.etiantian.org;
      root /code/log;
      location / {
          index index.html;
      }
    }
    
    [root@web01 ~]#nginx -t
    [root@web01 ~]# systemctl reload nginx

我们更希望能将此页面保存为HTML,然后通过浏览器访问,那么我们则需要配置日志格式
mkdir /code/log
goaccess -f /var/log/nginx/access.log -o /code/log/index.html -p /etc/goaccess/goaccess.conf --real-time-html &

netstat -lntp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:7890 0.0.0.0:* LISTEN 5695/goaccess