Nginx从理论到实践超详细笔记(下)

简介: Nginx从理论到实践超详细笔记(下)

nginx里面的基本组成模块


image.png


nginx在处理请求的时候,更多的是会把这些请求组成一条请求链,链上的各个模块都会进行不同功能的处理。例如说对于请求的解压和压缩处理,对于ssl的处理模块等。总的来说,nginx的基本模块我总结为了以下几项:


event module 事件处理机制模块,提供了各种事件的具体处理框架。nginx具体采用何种事件来处理,依赖于操作系统和编译设置项,例如ngx_event_core_module和ngx_epoll_module。


phase handler 主要负责处理客户端请求并产生待响应内容,ngx_http_static_module就是其中之一,该module主要是将nginx请求转往读取一些磁盘上边的数据,然后做出输出响应,例如说:uri 是以 / 结尾,则会交由 index 模块来链接上完整的路径名然后通过内部调用的方式来调用本模块。


output filter 该模块可以对响应的输出内容做出指定的修改,例如对页面的某些特定url进行替换操作。


upstream 这一模块相信大家都很熟悉,该模块主要是做反向代理的工作。


load-balancer 此模块主要是负责负载均衡功能,在集群中选择任意一台服务器作为请求的处理。


nginx的常用配置案例讲解


首先来查看一份最为基础的nginx基本配置:


events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;  #标识使用零拷贝
    keepalive_timeout  65;  #标识采用长连接
    server {
        listen       80;
        server_name  localhost;
        location / {
            root   html;
            index  index.html index.htm;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}


ps:这份配置里面分成了很多份配置块,每个配置块和大括号之间都需要有空格进行标明,否则会识别失效


配置location的重定向


例如说我们在/usr/local/www/文件夹底下创建了一份html页面,然后需要通过nginx来进行访问,nginx在匹配server的location路径的时候,会先按照全路径,再从左往右,再从右往左匹配的顺序。


server {
        listen       80;
        server_name  www.idea.com  *.idea.com  idea.*;
        location / {
            root  /usr/local/www/;
        }
    }


注意,这里面的root配置是存在继承关系的,location里面的root会继承location外边的root信息。如果location里面有写root,就会按照location里面的root来判断。server外>server内>location内。


配置动静分离


所谓的动静分离实质上是指我们对于nginx配置里面的动态请求和静态文件都做了一定的分离。例如以下的配置信息:


server {
        listen       80;
        server_name  www.idea.com  *.idea.com  idea.*;
        root /usr/local/www;    
    #这里面添加映射static的记录
        location /static {
            root /usr/local/static/;
        }
        location / {
            root  /usr/local/www/;
            index idea.html;
        }
    }


ps:这里面的配置内容,我引入了host文件的修改


192.168.43.235 www.idea.com 
192.168.43.235 test.idea.com 
192.168.43.235 idea.test


图片的实际存储位置是:


/usr/local/static/img/logo.jpg


按照上述的配置来讲,访问的方式是:


http://www.idea.com/static/img/logo.jpg


但是这种情况下,我们通过nginx来访问图片的方式是不会成功的,原因是这个地址会被nginx处理成为:


前往root地址+static的最终地址进行查询:


/usr/local/static/static


为了避免这种情况,通常会用别名alias来进行匹配,具体配置如下:


server {
        listen       80;
        server_name  www.idea.com  *.idea.com  idea.*;
        root /usr/local/www;    
        location /static {
            alias /usr/local/static/;
        }
        location / {
            root  /usr/local/www/;
            index idea.html;
        }
    }


这个时候,我们再去访问 http://www.idea.com/static/img/logo.jpg 就会访问成功了。

同样对于别名我们可以进行更加复杂一些的逻辑操作案例:


假设我们需要访问static底下的文件内容,这个时候不需要携带相应的名称,直接通过访问


http://www.idea.com/static/css/test.css 就可以访问到 /usr/local/www/static/css/ 底下的内容了


那么,假如说有很多种类型的静态文件需要进行映射该如何配置呢?这个时候可以引入正则表达式的配置:


server {
        listen       80;
        server_name  www.idea.com  *.idea.com  idea.*;
        root /usr/local/www;    
        location /static {
            alias /usr/local/static/;
        }
#这里的~是指忽略大小写
        location  ~* \.(gif|png|jpg|css|js) {
            root /usr/local/static/;
        }
        location / {
            root  /usr/local/www/;
            index  idea.html;
        }
    }


加入了这段正则表达式的配置之后(~* .(gif|png|css|js)$) 通过访问该路径:


http://www.idea.com/css/test.css 我们就可以访问到/usr/local/static/css/底下的文件内容了。


代理访问机制


nginx还提供了一个非常灵活的代理访问机制,供我们通过代理的方式来进行访问location


通过nginx配置完全匹配代理进行页面跳转:


server {
        listen       80;
        server_name  www.idea.com  *.idea.com  idea.*;
        root /usr/local/www;    
        location /static {
            alias /usr/local/static/;
        }
        location ~* \.(gif|png|jpg|css|js) {
            alias /usr/local/static/;
        }
        location  =/idea-serach {
            proxy_pass  http://www.baidu.com
        }
        location / {
            root  /usr/local/www/;
            index idea.html;
        }
    }


通过proxy_pass配置来提供代理的请求转发,当我们访问http://www.idea.com/idea-serach的时候,就会匹配到访问百度的页面了。


小结


nginx对于访问的常见配置支持以下几种:


  1. 通过全路径访问location
  2. 通过关键字static匹配来访问location
  3. 通过正则表达式来访问location
  4. 通过反向代理进行访问location


防盗链匹配


设置某些链接只允许在固定的网站站点进行访问,防止某些特殊的域名进行ip访问之后盗取本网站的资源文件,因此可以设置这个防盗链的功能。具体配置如下:


server {
        listen       80;
        server_name  www.idea.com  *.idea.com  idea.*;
        root /usr/local/www/;   
        location /static {
            alias /usr/local/static/;
        }
        # 防盗链配置
        location ~* \.(gif|png|jpg|css|js) {
            valid_referers none blocked *.idea.com;
            if ($invalid_referer) {
                return 403;
            }
            root /usr/local/static/;
        }
        location =/idea-serach {
            proxy_pass http://www.baidu.com;
        }
        location / {
            root  /usr/local/www/;
}
}


网站黑名单


黑名单的配置比较简单,只需要先创建好黑名单文件,然后在http块里面引入就好了


# 创建黑名单文件
echo 'deny 192.168.0.132;' >> balck.ip
#http 配置块中引入 黑名单文件
include       black.ip;


记得配置成功之后要让nginx reload一下,同时请求的时候查看是否是203,如果是的话说明是缓存请求。


nginx的日志配置


当我们需要对于客户端发送的数据进行一些详细信息的查看时候,需要对nginx进行日志的记录,相应的可选参数有以下几点:


log_format格式变量:
    $remote_addr  #记录访问网站的客户端地址
    $remote_user  #远程客户端用户名
    $time_local  #记录访问时间与时区
    $request  #用户的http请求起始行信息
    $status  #http状态码,记录请求返回的状态码,例如:200、301、404等
    $body_bytes_sent  #服务器发送给客户端的响应body字节数
    $http_referer  #记录此次请求是从哪个连接访问过来的,可以根据该参数进行防盗链设置。
    $http_user_agent  #记录客户端访问信息,例如:浏览器、手机客户端等
    $http_x_forwarded_for  #当前端有代理服务器时,设置web节点记录客户端地址的配置,此参数生效的前提是代理服务器也要进行相关的x_forwarded_for设置


将日志配置放在http块里面即可。


通常我们会将日志的配置放置于http模块当中,例如下边的这组案例:


events {
    worker_connections  1024;
}
http {
    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;
    keepalive_timeout  65;
    server {
        listen       80;
        server_name  localhost;
        #charset koi8-r;
        #access_log  logs/host.access.log  main;
        location / {
            root   html;
            index  index.html index.htm;
        }
        #error_page  404              /404.html;
        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        } 
    }
    }


ngixn里面的代理配置


正向代理


image.png


客户机和服务器之间加入一层proxy代理机器,当发生请求的时候,由代理服务器去请求server端。最常见的正向代理案例有:vpn,局域网里面的上网客户端工具等。


举个栗子来讲:


当我们需要通过路径匹配到 $host: $port /baidu.html的时候,被代理请求百度页面,可以进行以下的配置:


location =/baidu.html {
           proxy_pass http://www.baidu.com;
    }


反向代理


当客户端请求服务端的时候,实际上在服务端的接入层有一个代理机器进行请求的转发,而这一层请求的转发相对于客户端而言是透明的。


image.png


反向代理请求内部的服务器,虽然配置相似,但是功能不同,配置案例如下:


location =/baidu.html {
           proxy_pass http:/127.0.0.1:8088;
    }


代理相关参数


proxy_pass           # 代理服务
proxy_redirect off;   # 是否允许重定向
proxy_set_header Host $host; # 传 header 参数至后端服务
proxy_set_header X-Forwarded-For $remote_addr; # 设置request header 即客户端IP 地址
proxy_connect_timeout 90; # 连接代理服务超时时间
proxy_send_timeout 90; # 请求发送最大时间
proxy_read_timeout 90;  # 读取最大时间
proxy_buffer_size 4k; 
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k; 
proxy_temp_file_write_size 64k;


ngixn里面的负载均衡


nginx里面有个叫做upstream的模块,专门用于配置负载均衡的内容,upstream里面提供有以下的相关参数:


service 反向服务地址 加端口


weight 权重


max_fails 失败多少次 认为主机已挂掉则,踢出


fail_timeout 移除server之后重新请求的时间 当服务挂了之后,这段时间内重新连接


backup 备用服务 (当服务全部都挂了,那么就会请求这里的服务)


max_conns 允许最大连接数


slow_start 当节点恢复,不立即加入,而是等待 slow_start 后加入服务对列。


相应参数的具体配置如下:


upstream backend {
       server 192.168.43.191:8080 weight=5 fail_timeout=10s;
       server 192.168.43.191:8089 weight=5 fail_timeout=10s;
    }


ngixn里面默认支持的负载均衡策略是轮询加权重的方式,除此之外,nginx自身还支持额外的多种负载均衡策略:


ll+weight:轮询加权重 (默认)


容易出现失重的情况,例如说某一台机器的访问过慢,容易导致请求堆积。


ip_hash : 基于Hash 计算 ,常用于保持session 一至性


基于hash计算的时候,可以根据ip进行hash计算请求到指定的服务器。


(通常session一致性在分布式中最好的处理手段是将session存储在第三方的存储中心)

首先对ip进行hash计算之后,将该值和服务器个数进行取模运算。


url_hash: 静态资源缓存,节约存储,加快速度


可以根据图片的url请求到指定的服务器,比较好理解。


least_conn : 最小链接数


每次请求都只会请求到最少客户端连接数的那台服务器去。


least_time :最小的响应时间


计算节点平均响应时间,然后取响应最快的那个,分配权重更高


配置案例



通过使用ip进行哈希计算的方式来请求后端服务器


upstream backend {
       ip_hash;
       server 192.168.43.191:8080 weight=1;
       server 192.168.43.191:8089 weight=8 fail_timeout=10s;
}
  location / {
            #root   html;
            index  index.html index.htm;
            proxy_pass http://backend;
   }


当然nginx除了这些常用功能以外,还提供有非常丰富的其他功能配置,具体配置可以参考nginx的官方文档配置信息http://nginx.org/en/docs/



相关实践学习
部署高可用架构
本场景主要介绍如何使用云服务器ECS、负载均衡SLB、云数据库RDS和数据传输服务产品来部署多可用区高可用架构。
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
相关文章
|
3月前
|
缓存 负载均衡 应用服务中间件
高性能网络编程技术 Nginx 的概念与实践
Nginx 是一款高性能、轻量级的Web服务器和反向代理服务器,它在网络编程技术领域中被广泛应用。本文将详细介绍Nginx的概念和实践,包括其核心原理、功能特点、优势和应用场景等方面。同时,还将深入探讨如何使用Nginx进行高性能网络编程,结合实际案例进行分析。
|
3月前
|
存储 缓存 负载均衡
Nginx入门笔记
Nginx入门笔记
111 0
|
7月前
|
缓存 运维 负载均衡
华为大佬秘密撰写的Nginx运维笔记遭人恶意开源,整整638页全泄露
众所周知,Nginx是当下最流行的Web服务器,它具有很强的负载均衡,反向代理,邮件代理以及静态缓存的功能。在提供这些功能的同时,Nginx的性能也极其优秀,可以轻松支持百万、千万级的并发连接,能够为Tomcat、Django等性能不佳的Web应用抗住绝大部分外部流量。那么,Nginx是如何实现高速并发处理呢? 今天小轩就在这里给大家介绍一份“Nginx”的实战笔记,整整638页。话不多说,直击主题。让我们一起来看看这份有着“百万点击播放量”的Nginx笔记吧。 由于篇幅受限,部分内容只能以截图的方式展示出来。需要完整版点击此处获取。 Nginx应用与运维实战 目录
|
1月前
|
弹性计算 算法 应用服务中间件
倚天使用|Nginx性能高27%,性价比1.5倍,基于阿里云倚天ECS的Web server实践
倚天710构建的ECS产品,基于云原生独立物理核、大cache,结合CIPU新架构,倚天ECS在Nginx场景下,具备强大的性能优势。相对典型x86,Http长连接场景性能收益27%,开启gzip压缩时性能收益达到74%。 同时阿里云G8y实例售价比G7实例低23%,是Web Server最佳选择。
|
3月前
|
缓存 负载均衡 应用服务中间件
高性能网络编程技术 Nginx 的概念与实践
在当今互联网时代,高性能网络编程技术越来越受到重视。Nginx 作为一款高性能、高可靠性的 Web 服务器,拥有广泛的应用和优异的性能表现。本文将介绍 Nginx 的基本概念、架构以及实践技巧,帮助读者更好地理解和使用这一工具。
|
4月前
|
负载均衡 前端开发 应用服务中间件
NGINX高可用之keepalived+nginx主从模式+主主模式配置实践
NGINX高可用之keepalived+nginx主从模式+主主模式配置实践
135 1
|
4月前
|
Java 应用服务中间件 API
Nginx使用实践总结
Nginx使用实践总结
35 0
|
4月前
|
负载均衡 网络协议 应用服务中间件
当当网266买来的1399页Nginx笔记,原来我入门都不算
Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点(俄文:Рамблер)开发的,第一个公开版本0.1.0发布于2004年10月4日。
当当网266买来的1399页Nginx笔记,原来我入门都不算
|
5月前
|
负载均衡 应用服务中间件 nginx
nginx配置和热部署实践
nginx配置和热部署实践
90 0
|
6月前
|
应用服务中间件 nginx
nginx详细笔记
nginx详细笔记