Nginx的简介
Nginx 是一个高性能的网页服务器,能够反向代理HTTP、HTTPS、SMTP、POP3、IMAP,也可以作为一个负载均衡器和 HTTP 缓存。是一个免费、开源、高性能的 HTTP 服务器。Nginx 以其高性能、稳定性、丰富的特性、以及简单配置和低资源消耗而著称。Nginx 是由 Igor Sysoev 开发设计来供俄罗斯的大型门户网站和搜索引擎Rambler的使用。此软件在BSD-like协议下发行,可以在 UNIX、GNU/Linux、BSD、Mac OS X、Solaris和Microsoft Windows等操作系统中运行。
与传统的服务器不同,Nginx 不依赖线程来处理请求。相反,它使用了一个更具可扩展性的事件驱动(异步)体系结构。这种体系结构使用较小的内存量,但更重要的是,内存的使用量在有负载的时候更加可预测。即使你不希望同时处理数千个请求,但仍然可以从 Nginx 的高性能和小内存占用中受益。Nginx所有方向都可以扩展:从最小的VPS(Virtual Private Servers到大型的服务器集群。
Nginx的配置详解
Nginx 的配置文件的结构抽象成如下示意图
Nginx 的架构是以高度模块化为设计基础,除了非常少量的核心代码,其它的一切皆是模块。高度抽象的模块接口,结构的设计简单,使得 Nginx 十分的灵活与高效,默认情况下只会加载默认、必须的模块,其它的一些功能实现需要加载一些第三方的模块。而配置文件中的各个指令配置项其实便是对模块的一个功能配置。Nginx 在运行时至少需要加载几个核心的模块和一个事件类模块,这些模块运行时所支持的配置项称为基础配置,这样的配置项很多,一般将其分为四大类:
调试配置项
必备配置项
优化配置项
事件类配置项
在 Nginx 中有一个非常重要的核心模块就是 ngx_http_core_module 模块,它实现了静态 Web 服务器的主要功能,而其相关的配置项都放在 http{} 配置块中。
一个典型、完整的静态 Web 服务器还会包含多个 server 配置块和 location 配置块。
server 配置块类似于 Apache 中的 VirtualHost 配置块,用于配置虚拟主机。其中 location 用于匹配请求的 URI(URI 表示的是访问路径,除域名以外的内容),匹配的方式有多种:
精准匹配
忽略大小写的正则匹配
大小写敏感的正则匹配
前半部分匹配
其语法如下:
其中各个符号的含义:
=:用于精准匹配,需要请求的 uri 与 pattern 表达式完全匹配的时候才会执行 location 中的操作。
~:用于区分大小写的正则匹配。
~*:用于不区分大小写的正则匹配。
^~:用于匹配 URI 的前半部分。
负载均衡是优化资源的利用率、最大化吞吐量、减少延迟以及确保容错配置的常用技术。通过配置 Nginx 实现负载均衡,提高了 Web 应用程序的可伸缩性和可靠性。负载均衡的实现主要依赖于反向代理与upstream相关模块。
upstream 模块(模块名:ngx_http_upstream_module)是 Nginx 负载均衡的主要模块,它提供了实现后台服务器负载均衡的方法,还提供对后端服务器健康检查的功能。
Nginx 模块一般分为三类:handler、filter、upstream。upstream 模块本质上属于 handler 模块,但是它不会产生自己的内容,而是通过请求其它后端服务器得到需要的内容。
Upstream 模块,使 Nginx 跨越单机的限制,完成网络数据的接收、处理和转发。
数据转发功能,为 Nginx 提供了跨越单机的横向处理能力,使 Nginx 摆脱只能为终端节点提供单一功能的限制,而使它具备了网路应用级别的拆分、封装和整合的战略功能。
Nginx 有着很强大的高并发、高负载的能力。当客户端发出静态文件请求(例如前端页面)时,Nginx 会作为一个静态 web 服务器直接向客户端提供静态文件服务。当客户端发出不适合 Nginx 提供服务的动态请求时,Nginx 会作为一个反向代理服务器,将请求转发到上游服务器中处理,处理后返回的动态应答再由 Nginx 转发给客户端。
proxy_pass 便是 HTTP proxy module 中重要配置项,通过该配置项我们可以配置将请求转发给哪一台服务节点、或者哪一个服务群。当设置转发给某一个节点时,其格式为 proxy_pass http://ip或者域名:端口, 当需要转发给某一个服务器群时,需要结合 upstream 使用。
在默认的负载均衡上,nginx 还支持一些调度算法来配置:
1)最少连接负载均衡:下一个请求被分配给连接数最少的服务器。
2)加权负载均衡:通过使用权重,来实现负载均衡。
3) ip-hash 负载均衡:将客户端的 IP 地址用作哈希键,以决定服务器组中应该为客户端请求选择什么服务器。此方法可确保来自同一客户端的请求将始终定向到同一服务器,除非此服务器不可用。
反向代理(Reverse Proxy)是指:代理服务器接受来自客户端的请求,然后将请求转发到内部网络上的服务器,并将服务器的响应返回给客户端。与之对应的是正向代理,具体的内容将在后面的实验中详细介绍。
反向代理服务器在网络拓扑中所处的位置(如上图所示)正好是负载均衡设备所在的位置,因此我们常常使用反向代理服务器作为负载均衡设备。反向代理服务器根据当前后端服务器的负载情况,将请求转发给一台合适的服务器,并将处理结果返回给用户,这就是反向代理负载均衡。
其它常见的 Web 负载均衡方式包括:DNS 轮询、IP 负载均衡、HTTP 重定向负载均衡等。
正向代理服务器是一个位于客户端和目标服务器之间的服务器,即下图中的服务器 Proxy ,它通常和客户端在同一局域网(也有可能不是)。客户端为了从目标服务器 Server 取得它想要的内容,它首先向代理服务器发送一个请求并指定目标(即要访问的目标服务器),然后代理服务器 Proxy 向目标服务器 Server 转交请求并将获得的内容返回给客户端。
正向代理的用途:
隐藏客户端的信息:客户端通过代理服务器访问目标服务器,因此目标服务器只知道请求来自哪个代理服务器,而不清楚来自哪个具体的客户端,隐藏了真实的客户端信息。
访问限制:代理服务器可以对客户端进行控制管理,提高安全性。
缓存优化、提高访问速度:通常代理服务器都设置一个较大的硬盘缓冲区,会将部分请求的响应保存到缓冲区中,当其他用户再访问相同的信息时,则直接由缓冲区中取出信息,传给用户,以提高访问速度。
正向代理服务器与反向代理服务器两者的相同点是:所处的位置都是客户端和服务器之间,都是将客户端的请求转发给服务器,再把服务器的响应转发给客户端。两者不同的是:
反向代理是服务器的代理,有负载均衡、安全防护等功能;正向代理是客户端的代理,帮助客户端访问其无法访问的服务器资源,解决访问限制问题。
正向代理中,服务器不知道真正的客户端到底是谁,以为访问自己的就是真实的客户端。而在反向代理中,客户端不知道真正的服务器是谁,以为自己访问的就是真实的服务器。
proxy_set_header 用于修改或设置请求头中某个字段 field 的值 value,重定义发往后端服务器的请求头。
proxy_set_header field value;
常用的有以下两种:
proxy_set_header Host $http_host;:
在 Nginx 代理向后端服务器(即我们访问的 Web 服务器)发送的 http 请求头中加入 Host 字段信息,用于后端服务器识别是哪个主机访问。
proxy_set_header X-Forwarded-For $remote_addr;:
在 Nginx 代理向后端服务器发送 http 请求头加入 X-Forwarded-For 字段信息,用于后端服务器中的服务程序记录真实的客户端 IP,而不是代理服务器的 IP。
配置请求头:
设置超时时间是为了保证一个请求占用固定的时间,超出之后返回给客户端一个状态码:504 Gateway Time-out(充当网关或代理的服务器,未及时从远端服务器获取请求),可以防止出现一个请求占用过长时间的现象。这里介绍四个关于超时时间设置的指令,分为两大类:
设置解析超时时间:
resolver_timeout 指令。
解析超时时间使用指令 resolver_timeout 来设置。这个时间是指 Nginx 连接 DNS 解析服务器的时间,如果在指定时间内没有连接上 DNS 解析服务器,则判定为连接超时。
代理连接超时时间:
proxy_connect_timeout 指令。
proxy_connect_timeout 指令用于设置正向代理服务器与 Web 服务器连接的超时时间(即发起 TCP 握手等候的超时时间)。如果在指定时间内没有与 Web 服务器建立 TCP 连接,则判定为超时。
proxy_send_timeout 指令。
proxy_send_timeout 指令用于设置 Nginx 代理服务器向 Web 服务器传输请求的超时时间。这个时间是指相邻两次写操作之间的最长时间间隔,而不是整个请求传输完成的最长时间。如果 Nginx 代理服务器在超时时间段内没有发送任何数据,TCP 连接将被关闭。
proxy_read_timeout 指令。
proxy_read_timeout 指令用于设置 Nginx 代理服务器从 Web 服务器获取响应信息的超时时间。连接建立成功后,Nginx 等待 Web 服务器的响应,如果在指定的时间内 Web 服务器没有发送数据,那么 Nginx 会断开 TCP 连接。
比如设置解析超时时间为 5 分钟,配置中应该这么写:resolver_timeout 5m;
Nginx 正向代理服务器是客户端和后端服务器沟通的桥梁,后端服务器的响应必然会返回给 Nginx 正向代理服务器,然后 Nginx 代理服务器再将响应传递给客户端。因为客户端的连接速度往往是不同的,甚至可能速度差距十分大。如果客户端是缓慢的,在有缓冲的情况下,Nginx 代理会将后端服务的响应临时存储到缓冲区,然后按客户端的连接速度发送给客户端。如果客户端连接速度很快,缓冲可以关闭,使数据尽快到达客户端。在本实验中,我们配置有缓冲的 Nginx 代理服务器。Nginx 代理服务器将响应临时存储到缓冲区中,但是临时缓冲区是会预设空间大小的,如果超出设定的大小时,缓冲就会写入到磁盘中。缓冲优化主要是要合理设置缓冲区大小,尽量避免缓冲到硬盘时的情况。
缓冲相关指令:
proxy_buffering on | off
proxy_buffering 的作用是配置是否启用 Proxy Buffer。
proxy_buffer_size
proxy_buffer_size 指令配置从被代理服务器获取的第一份响应数据的大小。这个响应数据中一般包含了 http 响应头,Nginx 通过它来获取响应数据和被代理数据的一些必要信息。
proxy_buffers
proxy_buffers 指令用于配置接受一次响应的 buffer 个数和每个 buffer 的大小。缓冲区总的大小为 number*size。若某些请求的响应过大,则超过 buffer 的部分将被缓冲到硬盘(缓冲目录由 proxy_temp_path 指令指定,但一般都选择关闭磁盘缓冲),如果数据缓冲到硬盘会使响应的速度减慢,影响用户体验。
proxy_busy_buffers_size
Nginx 会在没有完全读完后端响应的时候就开始向客户端传送数据,所以它会划出一部分缓冲区来专门向客户端传送数据(这部分的大小是由 proxy_busy_buffers_size 来控制的),然后它继续从后端取数据,缓冲区满了之后就写到磁盘的临时文件中。proxy_busy_buffers_size 指令用于配置处于 busy 状态的 Proxy Buffer 的总大小,一般设置为 proxy_buffers 中单个缓冲区大小的 2 倍。
proxy_max_temp_file_size
proxy_max_temp_file_size 用于配置所有临时文件的总体积大小。(临时文件是指缓冲区满了之后存放到硬盘的文件)
更多精彩干货分享
点击下方名片关注
IT那活儿
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/129775.html
摘要:原文地址实战指南二在中搭建服务器学习最快的方法就是直接使用,在实战指南一介绍中,我们已经介绍了如何快速搭建,以及如何在中运行我们的第一个程序。 原文地址:Docker实战指南(二):在Docker中搭建Nginx服务器 Introduction 学习Docker最快的方法就是直接使用,在Docker实战指南(一):Docker介绍中,我们已经介绍了如何快速搭建Docker,以及如何在D...
摘要:本博客首发在,后因各种原因迁移至先来一波官方站点关于介绍。同时拥有一套缓存机制,可以进一步降低网络压力,加速用户响应。主配置文件中,使用命令引用分支配置文件。接收到一个请求后,先与所有标准进行匹配,并记录匹配度最高的一个。 本博客首发在cnblogs,后因各种原因迁移至segmentfault 先来一波官方站点关于nginx介绍。nginx相关历史这里不再赘述啦。showImg(ht...
摘要:经由超文本传输协议通信,但是数据包由安全协议加密,实现加密数据与认证功能。该模块指令定义相关设置证书文件,私钥文件,会话缓存等内容。允许在客户端建立会话时传递请求服务器名称,这样服务器就会知道该发送哪个虚拟主机下的证书文件。 1、nginx基本状态信息页面 配置示例: location /basic_status { stub_...
摘要:在上一篇文章里的奇淫技巧字符串截断中我们介绍过了使用来进行截断字符串的用法这次我们来了解下的逻辑用法什么是逻辑用法呢就程序中的关系就叫做逻辑了支持的与或者与吗答案是当你尝试这样配置重载时会报出错误那么我们应该怎样来实现和的逻辑关系呢 在上一篇文章:《NGINX里的奇淫技巧 —— 1. 字符串截断》中, 我们介绍过了使用if来进行截断字符串的用法, 这次我们来了解下if的逻辑用法: 什...
摘要:在上海研究院的同事们如果想参加这个内部培训,可以联系同事。第三行命名执行命令,生成新的镜像文件。说句题外话虽然今年月份被微软收购了,但是用户体验一点也没变,一如既往的优秀。关于更多另类用法,请参阅的文章写在被微软收购之际的那些另类用法。 2018年只剩最后30天了。Jerry在2017年的最后一天,曾经立下一个目标:这个微信公众号在2018年保证至少每周发布一篇SAP原创技术文章。 从...
摘要:在上海研究院的同事们如果想参加这个内部培训,可以联系同事。第三行命名执行命令,生成新的镜像文件。说句题外话虽然今年月份被微软收购了,但是用户体验一点也没变,一如既往的优秀。关于更多另类用法,请参阅的文章写在被微软收购之际的那些另类用法。 2018年只剩最后30天了。Jerry在2017年的最后一天,曾经立下一个目标:这个微信公众号在2018年保证至少每周发布一篇SAP原创技术文章。 从...
阅读 1346·2023-01-11 13:20
阅读 1684·2023-01-11 13:20
阅读 1132·2023-01-11 13:20
阅读 1858·2023-01-11 13:20
阅读 4100·2023-01-11 13:20
阅读 2704·2023-01-11 13:20
阅读 1385·2023-01-11 13:20
阅读 3597·2023-01-11 13:20