美文网首页
最全最简单的nginx的教程

最全最简单的nginx的教程

作者: 勇敢的心888 | 来源:发表于2021-08-08 11:07 被阅读0次

    Http

    Http协议介绍

    超文本传输协议(Hypertext Transfer Protocol,HTTP)是一个用于传输超媒体文档(例如 HTML)的应用层协议。它是为 Web 浏览器与 Web 服务器之间的通信而设计的,但也可以用于其他目的。HTTP 遵循经典的客户端-服务端模型,客户端打开一个连接以发出请求,然后等待直到收到服务器端响应。HTTP 是无状态协议,这意味着服务器不会在两个请求之间保留任何数据(状态)。尽管通常基于 TCP/IP 层,但它可以在任何可靠的传输层上使用,也就是说,该协议不会像 UDP 那样静默的丢失消息。RUDP——作为 UDP 的可靠化升级版本——是一种合适的替代选择。

    http版本

    http1.0 短链接 链接 请求 响应 断开

    http1.1 长链接 连接 请求 响应 请求 响应 请求 响应 断开

    http2 流水线 连接 请求 请求 请求 响应 响应 响应 断开

    img

    详细介绍 点我

    统一资源定位符 (URL)

    方案或协议

    img

    http://告诉浏览器使用何种协议。对于大部分 Web 资源,通常使用 HTTP 协议或其安全版本,HTTPS 协议。另外,浏览器也知道如何处理其他协议。例如, mailto: 协议指示浏览器打开邮件客户端;ftp:协议指示浏览器处理文件传输。常见的方案有:

    主机

    img

    www.example.com 既是一个域名,也代表管理该域名的机构。它指示了需要向网络上的哪一台主机发起请求。当然,也可以直接向主机的 IP address 地址发起请求。但直接使用 IP 地址的场景并不常见。

    端口

    img

    :80 是端口。它表示用于访问 Web 服务器上资源的技术“门”。如果访问的该 Web 服务器使用HTTP协议的标准端口(HTTP为80,HTTPS为443)授予对其资源的访问权限,则通常省略此部分。否则端口就是 URI 必须的部分。

    路径

    img

    /path/to/myfile.html 是 Web 服务器上资源的路径。在 Web 的早期,类似这样的路径表示 Web 服务器上的物理文件位置。现在,它主要是由没有任何物理实体的 Web 服务器抽象处理而成的。

    查询

    img

    ?key1=value1&key2=value2 是提供给 Web 服务器的额外参数。这些参数是用 & 符号分隔的键/值对列表。Web 服务器可以在将资源返回给用户之前使用这些参数来执行额外的操作。每个 Web 服务器都有自己的参数规则,想知道特定 Web 服务器如何处理参数的唯一可靠方法是询问该 Web 服务器所有者。

    片段

    img

    #SomewhereInTheDocument 是资源本身的某一部分的一个锚点。锚点代表资源内的一种“书签”,它给予浏览器显示位于该“加书签”点的内容的指示。 例如,在HTML文档上,浏览器将滚动到定义锚点的那个点上;在视频或音频文档上,浏览器将转到锚点代表的那个时间。值得注意的是 # 号后面的部分,也称为片段标识符,永远不会与请求一起发送到服务器。

    访问网站分析

    1. 浏览器分析超链接中的URL

    2. 浏览器向DNS请求解析网址的IP地址

    3. DNS将解析出的IP地址返回浏览器

    4. 浏览器与服务器建立TCP连接(80端口)

    5. 浏览器请求文档: GET /index.htmI

    6. 服务器给出响应,将文档index.html发送给浏览器

    7. 浏览器显示index.html中的内容

    8. 释放TCP连接

    先连接 后请求

    Http请求(request)方法

    方法(Method)是对所请求对象所进行的操作,也就是一些命令。 请求报文中的操作有:

    img

    消息头

    img

    cookies

    HTTP Cookie(也叫 Web Cookie 或浏览器 Cookie)是服务器发送到用户浏览器并保存在本地的一小块数据,它会在浏览器下次向同一服务器再发起请求时被携带并发送到服务器上。通常,它用于告知服务端两个请求是否来自同一浏览器,如保持用户的登录状态。Cookie 使基于无状态的HTTP协议记录稳定的状态信息成为了可能。

    Cookie 主要用于以下三个方面:

    • 会话状态管理(如用户登录状态、购物车、游戏分数或其它需要记录的信息)

    • 个性化设置(如用户自定义设置、主题等)

    • 浏览器行为跟踪(如跟踪分析用户行为等)

    详见链接

    Http响应(response)方法

    响应报文中的状态码

    状态码(Status-Code)是响应报文状态行中包含的一个3位数字,指明特定的请求是否被满足,如果没有满足,原因是什么。状态码分为以下五类:

    img

    <pre class="md-fences md-end-block ty-contain-cm modeLoaded" spellcheck="false" lang="" cid="n69" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: var(--monospace); font-size: 0.9em; display: block; break-inside: avoid; text-align: left; white-space: normal; background-image: inherit; background-position: inherit; background-size: inherit; background-repeat: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: rgb(248, 248, 248); position: relative !important; border: 1px solid rgb(231, 234, 237); border-radius: 3px; padding: 8px 4px 6px; margin-bottom: 15px; margin-top: 15px; width: inherit; color: rgb(51, 51, 51); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;">200 # 成功请求
    301 # 永久重定向(redirect) 客户端请求的网页已经永久移动到新的位置,当链接发生变化时,返回301代码告诉客户端链接的变化,客户端保存新的链接,并向新的链接发出请求,已返回请求结果
    302 # 临时重定向(redirect) http--->https
    304 # 浏览器缓存
    403 # 请求不到首页或权限被拒绝
    404 # 请求的资源不存在
    500 # 服务器内部错误,程序代码错误
    502 # 找不到后端的资源
    503 # 服务器由于临时的服务器过载或者是维护,无法解决当前的请求
    504 # 请求超时</pre>

    消息头

    img

    Http相关术语

    PV(Page View)

    访问量, 即页面浏览量或点击量,衡量网站用户访问的网页数量;在一定统计周期内用户每打开或刷新一个页面就记录1次,多次打开或刷新同一页面则浏览量累计。

    UV(Unique Visitor)

    独立访客,统计1天内访问某站点的用户数(以cookie为依据);访问网站的一台电脑客户端为一个访客。

    IP(Internet Protocol)

    独立IP数,是指1天内多少个独立的IP浏览了页面,即统计不同的IP浏览用户数量。同一IP不管访问了几个页面,独立IP数均为1;不同的IP浏览页面,计数会加1。 IP是基于用户广域网IP地址来区分不同的访问者的,所以,多个用户(多个局域网IP)在同一个路由器(同一个广域网IP)内上网,可能被记录为一个独立IP访问者。如果用户不断更换IP,则有可能被多次统计。

    SOA松耦合架构

    面向服务的架构(SOA)是一个组件模型,它将应用程序的不同功能单元(称为服务)进行拆分,并通过这些服务之间定义良好的接口和协议联系起来。接口是采用中立的方式进行定义的,它应该独立于实现服务的硬件平台、操作系统和编程语言。这使得构建在各种各样的系统中的服务可以以一种统一和通用的方式进行交互。

    Nginx基础

    Nginx是一个开源且高性能、可靠的Http Web服务、代理服务。

    开源: 直接获取源代码高性能: 支持海量并发可靠: 服务稳定

    Nginx的优势

    Nginx非常轻量

    功能模块少 (源代码仅保留http与核心模块代码,其余不够核心代码会作为插件来安装)

    代码模块化 (易读,便于二次开发,对于开发人员非常友好)

    互联网公司都选择Nginx

    1.Nginx技术成熟,具备的功能是企业最常使用而且最需要的

    2.适合当前主流架构趋势, 微服务、云架构、中间层

    3.统一技术栈, 降低维护成本, 降低技术更新成本。

    Nginx采用Epool网络模型,Apache采用Select模型

    Select: 当用户发起一次请求,select模型就会进行一次遍历扫描,从而导致性能低下。

    Epool: 当用户发起请求,epool模型会直接进行处理,效率高效,并无连接限制。

    应用场景广泛

    开源的web服务器

    静态资源

    nginx` `apache` `IIS` `lighttpd` `tengine` `openresty
    

    动态

    Tomcat  java` `Jboos
    

    tomcat 处理动态资源强大 静态不行 所以一般和nginx配合使用

    Nginx快速安装

    Nginx软件安装的方式有很多种

    1.源码编译=>Nginx (1.版本随意 2.安装复杂 3.升级繁琐)

    2.epel仓库=>Nginx (1.版本较低 2.安装简单 3.配置不易读)

    3.官方仓库=>Nginx (1.版本较新 2.安装简单 3.配置易读,推荐)

    yum安装

    1.安装Nginx软件所需依赖包

    [root@web ~]# yum install -y gcc gcc-c++ autoconf pcre pcre-devel make automake wget httpd-tools vim tree
    

    2.配置nginx官方 yum源

    [root@web ~]# vim /etc/yum.repos.d/nginx.repo
    [nginx]
    name=nginx repo
    baseurl=http://nginx.org/packages/centos/7/$basearch/
    gpgcheck=0
    enabled=1
    

    3.安装Nginx服务,启动并加入开机自启

    [root@web ~]# yum install nginx -y
    [root@web ~]# systemctl enable nginx
    [root@web ~]# systemctl start nginx
    

    4.检查Nginx软件版本以及编译参数

    [root@web ~]# nginx -v
    nginx version: nginx/1.14.0
    [root@web ~]# nginx -V # 查看nginx的编译参数
    

    编译安装

    下载nginx源码包并解压

    可在http://nginx.org/en/download.html下载.tar.gz的源码包,如(nginx-1.4.7.tar.gz)

    下载后通过tar -xvzf 进行解压,解压后的nginx目录结构如下:

    img

    为nginx设置安装目录和启用的模块

    切换到解压后的nginx目录中执行:

    ./configure --prefix=/opt/demo/nginx --add-module=/home/fastdfs-nginx-module/src --with-http_stub_status_module --with-http_ssl_module

    注: 这里可以使用nginx -V查看别的已经安装的nginx的参数 别的自己需要什么添加什么参数

    参数说明:

    --prefix 用于指定nginx编译后的安装目录

    --add-module 为添加的第三方模块,此次添加了fdfs的nginx模块

    --with..._module 表示启用的nginx模块,如此处启用了http_ssl_module模块

    可能出现的错误:

    出现:./configure: error: the HTTP rewrite module requires the PCRE library.

    解决方法:yum -y install pcre-devel

    出现:SSL modules require the OpenSSL library

    解决方法:yum install openssl-devel

    编译

    执行make 进行编译,如果编译成功的话会在第一步中objs中出现一个nginx文件

    特别注意:

    在已安装的nginx上进行添加模块的话执行到这里就行了,把objs中的nginx替换掉之前的安装的nginx/sbin/中的nginx文件,然后重启nginx就行了,如果执行下一步的install,会导致之前安装的nginx被覆盖,比如之前配置好的nginx.conf文件)

    安装

    执行make install 进行安装,安装后--prefix 中指定的安装目录下回出现如下目录结构

    启动nginx

    切入到第四步中的sbin目录或是创建一个nginx软链接

    ln -s /opt/demo/nginx/sbin/nginx /usr/bin/nginx

    完成后执行:

    nginx start(如需开机自启,可在/etc/rc.d/rc.local 文件中添此命令)

    如出现:nginx: [error] invalid PID number "" in "/usr/local/nginx/logs/nginx.pid"

    则需通过nginx –c ../conf/nginx.conf 命令指定nginx的配置

    nginx配置文件

    为了让大家更清晰的了解Nginx软件的全貌,可使用rpm -ql nginx查看整体的目录结构及对应的功能,如下表格整理了Nginx比较重要的配置文件

    1.Nginx主配置文件

    路径 类型 作用
    /etc/nginx/nginx.conf 配置文件 nginx主配置文件
    /etc/nginx/conf.d/default.conf 配置文件 默认网站配置文件

    2.Nginx代理相关参数文件

    路径 类型 作用
    /etc/nginx/fastcgi_params 配置文件 Fastcgi代理配置文件
    /etc/nginx/scgi_params 配置文件 scgi代理配置文件
    /etc/nginx/uwsgi_params 配置文件 uwsgi代理配置文件

    3.Nginx编码相关配置文件

    路径 类型 作用
    /etc/nginx/win-utf 配置文件 Nginx编码转换映射文件
    /etc/nginx/koi-utf 配置文件 Nginx编码转换映射文件
    /etc/nginx/koi-win 配置文件 Nginx编码转换映射文件
    /etc/nginx/mime.types 配置文件 Content-Type与扩展名

    4.Nginx管理相关命令

    路径 类型 作用
    /usr/sbin/nginx 命令 Nginx命令行管理终端工具
    /usr/sbin/nginx-debug 命令 Nginx命令行与终端调试工具

    4.Nginx日志相关目录与文件

    路径 类型 作用
    /var/log/nginx 目录 Nginx默认存放日志目录
    /etc/logrotate.d/nginx 配置文件 Nginx默认的日志切割

    默认配置

    Nginx主配置文件/etc/nginx/nginx.conf是一个纯文本类型的文件,整个配置文件是以区块的形式组织的。一般,每个区块以一对大括号{}来表示开始与结束。
    Nginx主配置文件整体分为三块进行学习,分别是CoreModule(核心模块),EventModule(事件驱动模块),HttpCoreModule(http内核模块)

    CoreModule核心模块

    user www;                       #Nginx进程所使用的用户
    worker_processes 1;             #Nginx运行的work进程数量(建议与CPU数量一致或auto)
    error_log /log/nginx/error.log  #Nginx错误日志存放路径
    pid /var/run/nginx.pid          #Nginx服务运行后产生的pid进程号
    

    events事件模块

    events {            
        worker_connections 25535;  #每个worker进程支持的最大连接数
        use epoll;                  #事件驱动模型, epoll默认
    }
    

    http内核模块

    http {  #http层开始
    ...    
        #使用Server配置网站, 每个Server{}代表一个网站(简称虚拟主机)
        'server' {
            listen       80;            #监听端口, 默认80
            server_name  www.baidu.com;       #提供的域名
            access_log  access.log;     #该网站的访问日志
            #控制网站访问路径
            'location' / {
                root   /usr/share/nginx/html;   #存放网站源代码的位置 #这里可以是root也可以是alias 如果是root 那么找的就是
                index  index.html index.htm;    #默认返回网站的文件
            }
        }
        ...
        #第二个虚拟主机配置
        'server' {
        ...
        }
        
        include /etc/nginx/conf.d/*.conf;  #包含/etc/nginx/conf.d/目录下所有以.conf结尾的文件
    }   #http层结束
    

    http server location扩展了解项

    • http{}层下允许有多个Server{}层,一个Server{}层下又允许有多个Location

    • http{} 标签主要用来解决用户的请求与响应。

    • server{} 标签主要用来响应具体的某一个网站。

    • location{} 标签主要用于匹配网站具体URL路径。

    root与alias的区别

    格式

    nginx指定文件路径有两种方式root和alias,指令的使用方法和作用域:

    [root]

    语法:root path

    默认值:root html

    配置段:http、server、location、if

    [alias]

    语法:alias path

    配置段:location

    root与alias主要区别

    在于nginx如何解释location后面的uri,这会使两者分别以不同的方式将请求映射到服务器文件上。

    root的处理结果是:root路径 + location路径

    alias的处理结果是:使用alias路径替换location路径

    alias是一个目录别名的定义,root则是最上层目录的定义。

    还有一个重要的区别是alias后面必须要用“/”结束,否则会找不到文件的,而root则可有可无。

    例:

    # 如果一个请求的URI是/t/a.html时,web服务器将会返回服务器上的/www/root/html/t/a.html的文件。
    location ^~ /t/ {
        root /www/root/html/;
    }
    # 如果一个请求的URI是/t/a.html时,web服务器将会返回服务器上的/www/root/html/new_t/a.html的文件。
    # 注意这里是new_t,因为alias会把location后面配置的路径丢弃掉,把当前匹配到的目录指向到指定的目录。
    location ^~ /t/ {
        alias /www/root/html/new_t/;
    }
    
    • 使用alias时,目录名后面一定要加"/"。

    • alias在使用正则匹配时,必须捕捉要匹配的内容并在指定的内容处使用。

    • alias只能位于location块中。(root可以不放在location中)

    Nginx网站配置

    1.新增nginx配置文件

    [root@web01 conf.d]# cat /etc/nginx/conf.d/game.conf 
    server {
        listen 80;
        server_name game.baidu.com;
        location / {
            root /code;
            index index.html;
        }
    }
    

    2.放置源代码文件至nginx配置文件root指定的目录

    [root@web01 conf.d]# mkdir /code && cd /code
    [root@web01 code]# rz  html5.zip
    [root@web01 code]# unzip html5.zip
    [root@web01 code]# ls
    ceshi  game  html5.zip  img  index.html  readme.txt
    

    3.检查nginx的语法是否存在错误

    [root@web01 code]# nginx -t
    nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
    nginx: configuration file /etc/nginx/nginx.conf test is successful
    

    4.重载Nginx [reload|restart]

    [root@web01 code]# systemctl reload nginx
    

    reload和restart的区别

    reload 平滑重启 等连接断开后重启

    restart 强制重启 强制断开连接

    Nginx虚拟主机

    通常在企业中可能会有很多业务系统,那么多套业务服务如何使用Nginx配置?

    如果使用如上方式部署,则需要多台服务器配置Nginx,但如果使用虚拟主机方式,则在同一个Nginx上运行多套单独服务,这些服务是相互独立的。简单来说,看似多套业务系统,实则可以运行在一台Nginx服务上

    Nginx配置虚拟主机有如下三种方式:

    方式一、基于主机多IP方式
    方式二、基于端口的配置方式
    方式三、基于多个hosts名称方式(多域名方式)

    基于多IP的虚拟主机配置实战

    那么基于多IP的方式,有如下两种方式:

    1.配置多网卡多IP的方式

    server {
        ...
        listen 10.0.0.10:80;
        ...
    }
    server {
        ...
        listen 10.0.0.11:80;
        ...
    }
    

    1.配置单网卡多IP的方式

    #添加一个IP
    [root@web01 ~]# ip addr add 10.0.0.11/24 dev eth0
    # 虚拟机配置方案
    [root@web01 ~]# cat /etc/nginx/conf.d/addr1.conf
    server {
        ...
        listen 10.0.0.10:80;
        ...
    }
    [root@web01 ~]# cat /etc/nginx/conf.d/addr2.conf
    server {
        ...
        listen 10.0.0.11:80;
        ...
    }
    

    基于端口虚拟主机配置实战

    Nginx多端口虚拟主机方式,具体配置如下

    #仅修改listen监听端口即可, 但不能和系统端口出现冲突
    [root@web01 ~]# cat /etc/nginx/conf.d/port1.conf
    server {
        ...
        listen 80;
        ...
    }
    [root@web01 ~]# cat /etc/nginx/conf.d/port2.conf
    server {
        ...
        listen 81;
        ...
    }
    [root@web01 ~]# cat /etc/nginx/conf.d/port3.conf
    server {
        ...
        listen 82;
        ...
    }
    

    基于host名称的虚拟主机方式配置实战

    1.创建对应的web站点目录以及程序代码

    [root@web01 ~]# mkdir /soft/code/{server1,server2}
    [root@web01 ~]# echo "server1" > /code/server1/index.html
    [root@web01 ~]# echo "server2" > /code/server2/index.html
    

    2.配置不同域名的虚拟主机

    [root@web02 ~]# cat /etc/nginx/conf.d/server1.conf
    server {
        listen       80;
        server_name  1.baidu.com;
        root /code/server1;
        index index.html;
        ...
    }
    [root@web01 ~]# cat /etc/nginx/conf.d/server2.conf
    server {
        ...
        listen       80;
        server_name  2.baidu.com;
        root /code/server2;
        index index.html;
    }
    

    Nginx日志管理

    Nginx有非常灵活的日志记录模式,每个级别的配置可以有各自独立的访问日志。日志格式通过log_format命令定义格式。

    1.log_format定义日志格式语法

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

    2.默认Nginx定义语法格式如下

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                          '$status $body_bytes_sent "$http_referer" '
                          '"$http_user_agent" "$http_x_forwarded_for"';
    

    3.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地址和客户端请求的服务器地址。
    

    4.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
    

    5.Nginx Access日志配置实践

    server {
        listen 80;
        server_name code.baidu.com;
        
        #将当前的server网站的访问日志记录至对应的目录,使用main格式
        access_log /var/log/nginx/code.baidu.com.log main;
        location / {
            root /code;
        }
        #当有人请求改favicon.ico时,不记录日志
        location /favicon.ico {
            access_log off;
            return 200;
        }
    }
    

    日志切割logrotate

    [root@nginx conf.d]# cat /etc/logrotate.d/nginx
    /var/log/nginx/*.log {
            daily                   # 每天切割日志
            missingok               # 日志丢失忽略
            rotate 52               # 日志保留52天
            compress                # 日志文件压缩
            delaycompress           # 延迟压缩日志
            notifempty              # 不切割空文件
            create 640 nginx adm    # 日志文件权限
            sharedscripts
            postrotate      # 切割日志执行的命令
                    if [ -f /var/run/nginx.pid ]; then
                            kill -USR1 `cat /var/run/nginx.pid`
                    fi
            endscript
    }
    

    Nginx模块

    模块官网地址

    Nginx目录索引

    ngx_http_autoindex_module

    ngx_http_autoindex_module模块处理以斜杠字符('/')结尾的请求,并生成目录列表。
    ngx_http_index_module模块找不到索引文件时,通常会将请求传递给模块。

    1.指令

    #启用或禁用目录列表输出,on开启,off关闭。
    Syntax: autoindex on | off;
    Default:    autoindex off;
    Context:    http, server, location
    #指定是否应在目录列表中输出确切的文件大小,on显示字节,off显示大概单位。
    Syntax: autoindex_exact_size on | off;
    Default: autoindex_exact_size on;
    Context:    http, server, location
    #指定目录列表中的时间是应以本地时区还是UTC输出。on本地时区,off UTC时间。
    Syntax: autoindex_localtime on | off;
    Default: autoindex_localtime off;
    Context: http, server, location
    

    2.示例配置

    [root@web ~]# cat /etc/nginx/conf.d/module.conf 
    server {
        listen 80;
        server_name module.baidu.com;
        charset utf-8,gbk;  #设定字符集,防止中文字符乱码显示。
        
        location /download {
            root /code/;
            autoindex on;
            autoindex_exact_size off;
        }
    }
    

    Nginx状态监控

    ngx_http_stub_status_module

    ngx_http_stub_status_module模块提供对基本状态信息的访问。
    默认情况下不构建此模块,应使用--with-http_stub_status_module配置参数启用它 。

    1.指令

    Syntax: stub_status;
    Default: —
    Context: server, location
    

    2.示例配置

    [root@web ~]# cat /etc/nginx/conf.d/module.conf
    server {
        listen 80;
        server_name module.bgx.com;
        access_log off;
        
        location /nginx_status {
            stub_status;
        }
    }
    

    3.此配置创建一个简单的网页,其基本状态数据可能如下所示:

    img

    4.提供以下状态信息

    Active connections  # 当前活动客户端连接数,包括Waiting等待连接数。
    accepts             # 已接受总的TCP连接数。
    handled             # 已处理总的TCP连接数。
    requests            # 客户端总的http请求数。
    Reading             # 当前nginx读取请求头的连接数。
    Writing             # 当前nginx将响应写回客户端的连接数。
    Waiting             # 当前等待请求的空闲客户端连接数。
    # 注意, 一次TCP的连接,可以发起多次http的请求, 如下参数可配置进行验证
    keepalive_timeout  0;   # 类似于关闭长连接
    keepalive_timeout  65;  # 65s没有活动则断开连接
    

    Nginx访问控制

    ngx_http_access_module

    ngx_http_access_module模块允许限制对某些客户端地址的访问。

    1.指令

    #允许配置语法
    Syntax: allow address | CIDR | unix: | all;
    Default:    —
    Context:    http, server, location, limit_except
    #拒绝配置语法
    Syntax: deny address | CIDR | unix: | all;
    Default:    —
    Context:    http, server, location, limit_except
    

    2.示例配置,拒绝指定的IP访问该网站的/nginx_status, 其他IP全部允许访问

    location /nginx_status {
      stub_status;
      #deny 192.168.5.4/32; #拒绝某个ip访问其他的都可以访问
      #allow all;
     
      allow 127.0.0.1; #监控nginx状态时,仅允许该服务器的回环地址访问
      deny all;
     }
    

    3.示例配置,只允许指定的来源IP能访问/nginx_status, 其它网段全部拒绝

    [root@web ~]# cat /etc/nginx/conf.d/module.conf
    server {
        listen 80;
        server_name module.bgx.com;
            
        location /nginx_status {
            stub_status;
            allow 127.0.0.1;  #监控nginx状态时使用
            allow 10.0.0.1/32;  #允许地址或地址段
            deny all;              #拒绝所有人
        }
    }
    

    注意:deny和allow的顺序是有影响的

    • 默认情况下,从第一条规则进行匹配

    • 如果匹配成功,则不继续匹配下面的内容。

    • 如果匹配不成功,则继续往下寻找能匹配成功的内容。

    Nginx资源限制

    ngx_http_auth_basic_module

    ngx_http_auth_basic_module模块允许使用HTTP基本身份验证,验证用户名和密码来限制对资源的访问。

    1.指令

    #使用HTTP基本身份验证协议启用用户名和密码验证。
    Syntax: auth_basic string| off;
    Default: auth_basic off;
    Context: http, server, location, limit_except
    #指定保存用户名和密码的文件
    Syntax: auth_basic_user_file file;
    Default: -
    Context: http, server, location, limit_except
    

    2.指定保存用户名和密码的文件,格式如下:

    #可以使用htpasswd程序或"openssl passwd"命令生成对应的密码;
    name1:passwd1
    name2:passwd2
    #使用htpaaswd创建新的密码文件, -c创建新文件 -b允许命令行输入密码
    [root@xuliangwei ~]# yum install httpd-tools
    [root@xuliangwei ~]# htpasswd -b -c /etc/nginx/auth_conf admin 123456 #这里如果不想留下history记录 可以不使用-b
    

    3.在conf中配置

    auth_basic "what's your problem ?";
    auth_basic_user_file /etc/nginx/auth_conf;
    

    Nginx访问限制

    经常会遇到这种情况,服务器流量异常,负载过大等等。对于大流量恶意的攻击访问,会带来带宽的浪费,服务器压力,从而影响业务,针对这种情况我们可以考虑对同一个ip的连接数,请求数、进行限制。

    ngx_http_limit_conn_module

    ngx_http_limit_conn_module模块用于限制定义key的连接数,特别是来自单个IP地址的连接数。
    但并非所有连接都被计算在内,仅当连接已经读取了整个请求头时才计算连接。

    1.指令

    Syntax:  limit_conn_zone key zone=name:size;
    Default: —
    Context: http
    Syntax: limit_conn zone number;
    Default: —
    Context: http, server, location
    

    2.设置共享内存区域和给定键值的最大允许连接数。超过此限制时,服务器将返回错误以回复请求

    # http标签段定义连接限制
    http{
        limit_conn_zone $binary_remote_addr zone=conn_zone:10m;
    }
    server {
        # 同一时刻只允许一个客户端连接
        limit_conn conn_zone 1; 
        location / {
            root /code;
            index index.html;
        }
    

    3).使用ab工具进行压力测试

    [root@xuliangwei ~]# yum install -y httpd-tools
    [root@xuliangwei ~]# ab -n 20 -c 2  http://127.0.0.1/index.html
    

    4).nginx日志结果

    2018/10/24 18:04:49 [error] 28656#28656: *1148 limiting connections by zone "conn_zone", client: 123.66.146.123, server: www.xuliangwei.com, request: "GET / HTTP/1.0", host: "www.xuliangwei.com"
    2018/10/24 18:04:49 [error] 28656#28656: *1155 limiting connections by zone "conn_zone", client: 123.66.146.123, server: www.xuliangwei.com, request: "GET / HTTP/1.0", host: "www.xuliangwei.com"
    

    ngx_http_limit_req_module

    ngx_http_limit_req_module模块用于限制定义key请求的处理速率,特别单一的IP地址的请求的处理速率。

    1.指令

    #模块名ngx_http_limit_req_module
    Syntax:  limit_req_zone key zone=name:size rate=rate;
    Default: —
    Context: http
    Syntax: limit_conn zone number [burst=number] [nodelay];
    Default: —
    Context: http, server, location
    

    2.设置共享内存区域和请求的最大突发大小。过多的请求被延迟,直到它们的数量超过最大的限制,在这种情况下请求以错误终止。

    # http标签段定义请求限制, rate限制速率,限制一秒钟最多一个IP请求
    http {
        limit_req_zone $binary_remote_addr zone=req_zone:10m rate=1r/s;
    }
    server {
        listen 80;
        server_name module.bgx.com;
        # 1r/s只接收一个请求,其余请求拒绝处理并返回错误码给客户端
        #limit_req zone=req_zone;
        
        # 请求超过1r/s,剩下的将被延迟处理,请求数超过burst定义的数量, 多余的请求返回503 写nodelay的话延时后面剩下的直接被拒绝
        limit_req zone=req_zone burst=3 nodelay;
        location / {
            root /code;
            index index.html;
        }
    }
    

    3).使用ab工具进行压力测试

    [root@xuliangwei ~]# yum install -y httpd-tools
    [root@xuliangwei ~]# ab -n 500 -c 2  http://127.0.0.1/index.html
    

    4).nginx日志结果

    2018/10/24 07:38:53 [error] 81020#0: *8 limiting requests, excess: 3.998 by zone "req_zone", client: 10.0.0.10, server: module.bgx.com, request: "GET /index.html HTTP/1.0", host: "10.0.0.10"
    2018/10/24 07:38:53 [error] 81020#0: *9 limiting requests, excess: 3.998 by zone "req_zone", client: 10.0.0.10, server: module.bgx.com, request: "GET /index.html HTTP/1.0", host: "10.0.0.10"
    

    Nginx连接限制没有请求限制有效?

    我们先来回顾一下http协议的连接与请求,首先HTTP是建立在TCP基础之上, 在完成HTTP请求需要先建立TCP三次握手(称为TCP连接),在连接的基础上在完成HTTP的请求。

    所以多个HTTP请求可以建立在一次TCP连接之上, 那么我们对请求的精度限制,当然比对一个连接的限制会更加的有效,因为同一时刻只允许一个TCP连接进入, 但是同一时刻多个HTTP请求可以通过一个TCP连接进入。所以针对HTTP的请求限制才是比较优的解决方案。

    Nginx Location

    使用Nginx Location可以控制访问网站的路径, 但一个server允许出现多个location配置, 那多个location出现冲突谁的优先级会更高呢

    1.Location语法示例

    location [=|^~|~|~*|!~|!~*|/] /uri/ { ...
    }
    

    2.Location语法优先级排列

    匹配符 匹配规则 优先级
    = 精确匹配 1
    ^~ 以某个字符串开头 2
    ~ 区分大小写的正则匹配 3
    ~* 不区分大小写的正则匹配 4
    !~ 区分大小写不匹配的正则 5
    !~* 不区分大小写不匹配的正则 6
    / 通用匹配,任何请求都会匹配到 7

    3.配置网站验证Location优先级

    [root@Nginx conf.d]# cat testserver.conf 
    server {
        listen 80;
        server_name module.baidu.com;
        location / {
            default_type text/html;
            return 200 "location /";
        }
        location =/ {
            default_type text/html;
            return 200 "location =/";
        }
        location ~ / {
            default_type text/html;
            return 200 "location ~/";
        }
        # location ^~ / {
        #   default_type text/html;
        #   return 200 "location ^~";
        # }
    }
    

    4.测试Location优先级

    # 优先级最高符号=
    [root@Nginx conf.d]# curl module.baidu.com
    location =/
    # 注释掉精确匹配=, 重启Nginx
    [root@Nginx ~]# curl module.baidu.com
    location ~/
    # 注释掉~, 重启Nginx
    [root@Nginx ~]# curl module.baidu.com
    location /
    

    5.Locaiton规则配置应用场景

    # 通用匹配,任何请求都会匹配到
    location / {
        ...
    }
    # 严格区分大小写,匹配以.php结尾的都走这个location    
    location ~ \.php$ {
        ...
    }
    # 严格区分大小写,匹配以.jsp结尾的都走这个location 
    location ~ \.jsp$ {
        ...
    }
    # 不区分大小写匹配,只要用户访问.jpg,gif,png,js,css 都走这条location
    location ~* .*\.(jpg|gif|png|js|css)$ {
        ...
    }
    # 不区分大小写匹配
    location ~* "\.(sql|bak|tgz|tar.gz|.git)$" {
        ...
    }
    

    相关文章

      网友评论

          本文标题:最全最简单的nginx的教程

          本文链接:https://www.haomeiwen.com/subject/rwznvltx.html