Nginx学习笔记
入门
介绍
Nginx(发音为"engine-x")是一种高性能的开源Web服务器和反向代理服务器,以及一个用于HTTP、SMTP、POP3和IMAP协议的负载均衡器。以下是一些关于Nginx的详细介绍:
-
性能优越: Nginx以其出色的性能而闻名,特别适用于处理高并发的网络流量。它能够处理数千个并发连接而不显著增加系统负担。
-
反向代理服务器: Nginx常用作反向代理服务器,将客户端请求转发给后端服务器。这使得它成为一个理想的解决方案,用于负载均衡和提高Web应用程序的可靠性。
-
负载均衡: Nginx支持负载均衡,能够将请求分发到多个后端服务器,从而提高系统的整体性能和可用性。
-
静态文件服务: 除了作为反向代理服务器外,Nginx还可以用于提供静态文件服务。它能够高效地处理和传送静态资源,如HTML、CSS、JavaScript和图像文件。
-
模块化结构: Nginx采用模块化结构,允许用户通过添加模块来扩展其功能。这使得它非常灵活,可以适应各种不同的需求。
-
事件驱动架构: Nginx采用事件驱动的架构,通过异步非阻塞方式处理请求。这有助于减少资源消耗,提高并发性能。
-
易于配置: Nginx的配置文件简单而直观,易于理解和管理。它支持动态重新加载配置,使得在不停止服务的情况下可以进行实时修改。
-
支持多协议: 除了HTTP协议,Nginx还支持SMTP、POP3和IMAP等协议,使其成为一个多功能的服务器。
总体而言,Nginx是一个强大而灵活的Web服务器,适用于各种规模的应用程序和场景。
两个版本线
Nginx有两个主要的版本线:Mainline版本和Stable版本。在这两个版本线上,有一系列的具体版本。以下是一些Nginx的常见版本:
-
Mainline版本:
- Mainline版本是Nginx的最新开发版本,包含了最新的功能和改进。这个版本线上发布的版本可能包含一些实验性的特性,适合那些想要尝试最新功能的用户。
-
Stable版本:
- Stable版本是相对较为稳定和经过更长时间测试的版本。这个版本线上发布的版本被认为是更适合在生产环境中使用的。
-
具体版本:
- 具体的版本号会根据发布时间而变化。例如,Nginx的版本号可能是1.18.0、1.20.1等。版本号中的第一个数字表示主要版本,后面的数字表示次要版本和补丁。
-
LTS版本:
- 有时候,Nginx会发布长期支持(LTS)版本,这些版本在支持周期内会得到更长时间的更新和维护,适合那些更注重稳定性和长期支持的用户。
请注意,为了获取最新的版本信息和详细的发布说明,建议直接访问Nginx官方网站。在那里你可以找到最新版本的下载链接以及完整的发布历史。
四大阵营
- Nginx开源版:
- 描述: Nginx开源版是Nginx官方维护的开源版本,提供了高性能的Web服务器和反向代理功能。它是一个轻量级、模块化的服务器,广泛用于搭建静态内容服务器、反向代理以及负载均衡。
- 特点: 稳定、高性能、模块化结构、支持反向代理和负载均衡。
- 许可: 2-clause BSD许可证。
- Nginx Plus商业版:
- 描述: Nginx Plus是Nginx官方提供的商业版,除了包含Nginx开源版的所有功能外,还提供了一些增值功能,如实时监控、动态负载均衡、高级缓存等。它是为企业级应用和大规模部署设计的。
- 特点: 包含Nginx开源版功能、增值功能、商业支持。
- 许可: 商业许可证。
- OpenResty:
- 描述: OpenResty是一个基于Nginx的开源项目,通过集成一些额外的模块和Lua脚本语言来扩展Nginx的功能。它旨在提供一个高性能、可扩展且灵活的Web应用程序服务器,适用于需要动态性能和功能的场景。
- 特点: 集成Lua脚本、模块化设计、适用于动态应用程序。
- 许可: BSD许可证。
- Tengine:
- 描述: Tengine是由淘宝网发起的一个开源项目,是在Nginx基础上进行定制和优化的版本。Tengine专注于性能和扩展性,通过一些改进来适应大规模高并发的互联网应用场景。
- 特点: 性能优化、支持淘宝等大规模站点的需求。
- 许可: 2-clause BSD许可证。
这些版本都在Nginx的基础上进行了不同程度的定制和优化,以满足不同用户和应用场景的需求。选择适当的版本通常取决于项目的特定要求、性能预期以及对商业支持的需求。
常用命令
Nginx 有一系列的命令用于管理和控制其行为。以下是一些常见的 Nginx 相关命令:
-
启动 Nginx:
1
sudo systemctl start nginx
-
停止 Nginx:
1
sudo systemctl stop nginx
-
重新加载配置文件:
1
sudo systemctl reload nginx
-
重启 Nginx:
1
sudo systemctl restart nginx
-
检查配置文件语法:
1
sudo nginx -t
这个命令用于检查 Nginx 配置文件的语法是否正确,如果正确则输出 “syntax is okay”。
-
显示 Nginx 版本信息:
1
nginx -v
或者
1
nginx -V
-v
显示版本号,-V
显示版本号和编译信息。 -
查看 Nginx 运行状态:
1
sudo systemctl status nginx
这个命令用于查看 Nginx 是否正在运行,以及运行状态的一些信息。
-
平滑升级 Nginx:
1
sudo systemctl upgrade nginx
这个命令用于平滑地升级 Nginx,保持持续服务的可用性。
-
测试配置并重新加载:
1
sudo nginx -t && sudo systemctl reload nginx
这个命令用于在测试通过后重新加载 Nginx 配置。
这些命令可以帮助你管理 Nginx 的启动、停止、重启、重新加载配置等操作。确保在执行任何更改前备份你的配置文件,以免出现意外问题。
安装启动相关
安装Nginx
以Centos7 为例。
要在CentOS 7上安装Nginx,您可以按照以下步骤进行操作:
-
打开终端(可以通过SSH连接到服务器)。
-
使用root权限或sudo权限运行以下命令以更新系统软件包:
|
|
- 安装EPEL存储库(Extra Packages for Enterprise Linux):
|
|
- 安装Nginx:
|
|
- 启动Nginx服务并设置为开机启动:
|
|
- 检查Nginx服务是否正在运行:
|
|
如果一切顺利,您将看到Nginx正在运行的信息。
- 在浏览器中输入服务器的IP地址或域名,您应该能够看到Nginx的欢迎页面。
至此,您已成功安装并启动Nginx。请注意,您可能需要配置Nginx以适应您的特定需求,比如配置虚拟主机等。
安装包安装
如果您有一个tar.gz压缩的Nginx安装包,您可以按照以下步骤进行解压和安装:
-
下载Nginx tar.gz包。您可以从Nginx官方网站或其他可信赖的源下载最新版本。
-
使用以下命令解压缩下载的tar.gz包。假设您的包名是
nginx-x.x.x.tar.gz
:
|
|
替换x.x.x
为实际的版本号。
- 进入解压后的Nginx目录:
|
|
- 执行配置命令:
|
|
该命令将检查系统并生成Makefile。
- 使用make命令编译:
|
|
- 使用make命令安装:
|
|
- 安装完成后,您可以使用以下命令启动Nginx服务:
|
|
如果需要使用特定的配置文件,可以在启动命令中指定配置文件的路径,例如:
|
|
请注意,这种方法可能需要手动配置Nginx,并且您需要确保系统中已安装了编译所需的依赖项。如果您仅需基本安装,并希望更轻松地管理Nginx,建议使用包管理器方式安装。
启动Nginx
|
|
安装成系统服务
创建服务脚本
|
|
服务脚本内容
|
|
重新加载系统服务
|
|
启动服务
|
|
开机启动
|
|
Nginx的目录构成
nginx的目录构成包括以下几个主要部分:
- client_body_temp:这个目录通常用于存储客户端请求体中的临时文件。当客户端发送包含表单数据或上传文件等请求时,这些数据将被存储在此目录中,直到请求被处理完毕。
- conf:这是nginx的主要配置目录,其中包含了nginx的全局配置文件(通常为nginx.conf)以及站点配置文件(如default.conf)和其他相关配置文件。
- fastcgi_temp:这个目录通常用于存储FastCGI进程返回的临时文件。当nginx处理动态内容时,它通常会与FastCGI进程进行交互,并将生成的临时文件存储在此目录中。
- html:这个目录通常用于存储静态网站内容。在大多数情况下,nginx将通过反向代理将客户端请求发送到该目录中的静态HTML文件。
- logs:这个目录通常用于存储nginx的日志文件。这些日志文件可以用于监视服务器性能、诊断问题以及记录访问日志等。
- proxy_temp:这个目录通常用于存储代理服务器返回的临时文件。当nginx作为反向代理服务器时,它可能会生成临时文件,并将这些文件存储在此目录中。
- sbin:这是nginx可执行文件的安装目录,其中包含了nginx的主要可执行文件和其他相关工具。
- scgi_temp:这个目录通常用于存储SCGI进程返回的临时文件。当nginx处理SCGI应用程序时,它通常会与SCGI进程进行交互,并将生成的临时文件存储在此目录中。
- uwsgi_temp:这个目录通常用于存储uWSGI进程返回的临时文件。当nginx与uWSGI应用程序集成时,它可能会生成临时文件,并将这些文件存储在此目录中。
基本请求流程

nginx.conf最小配置解析
nginx.conf是nginx服务器的配置文件,它决定了服务器的行为和功能。下面是一个非常基础的nginx.conf配置文件解析:
|
|
-
“worker_processes”: “这个配置项定义了nginx使用的worker进程的数量。在这里,它被设置为1,表示nginx将使用一个单独的worker进程来处理请求”。
-
“events”: “这部分配置了nginx的事件模块,包括并发连接数和超时设置。在这里,worker_connections被设置为1024,表示nginx将允许最多1024个并发连接”。
-
“http”: “这部分配置了nginx的HTTP模块,包括各种HTTP相关的设置。这里包含了mime.types文件,定义了各种MIME类型,default_type表示默认的MIME类型为application/octet-stream,即二进制流。sendfile设置为on表示启用sendfile模式,可以提高网络传输效率。keepalive_timeout定义了长连接的超时时间,这里设置为65秒”。
‘sendfile on;‘是用于设置是否使用Nginx自己的sendfile函数发送文件。这个函数是一种高速的文件传输方法,通常在HTTP服务中使用。设置为’on’时,Nginx会在读取请求的文件和响应的文件之间直接进行传输,无需复制数据到内核缓冲区。这样可以使请求和响应之间的数据传输更加高效。因此,‘sendfile on;‘的意思就是让Nginx在处理HTTP请求时,如果请求的文件大小小于或等于sendfile_threshold变量设置的值(默认为16KB),则使用sendfile函数进行文件传输。这样可以提高文件传输的效率。
-
“server”: “这部分配置了一个HTTP服务器,包括其监听的端口和服务器名称。在这里,服务器监听80端口,服务器名称被设置为localhost”。
-
“location”: “这部分是用于定义服务器上不同路径的访问规则。在这里,对于根路径(即访问网站的域名),root设置为html目录,index设置为主页为index.html和index.htm”。
-
“error_page”: “这部分配置了当发生错误时,nginx如何处理这些错误。在这里,当发生500、502、503或504错误时,nginx会返回一个指定的错误页面,该页面被存储在html目录下的/50x.html文件中”。
-
“/50x.html”: “这部分定义了当发生50x系列错误时返回的自定义错误页面路径。”
虚拟主机与域名解析
IP地址/域名和DNS
域名、DNS(域名系统)和IP地址是互联网中用于标识计算机和网络资源的三个重要概念。它们之间的关系如下:
- IP地址:IP地址是计算机在网络中的唯一标识符。它们由一系列数字组成,这些数字在IPv4系统中用点分隔,而在IPv6系统中用方括号包围。这些数字可以被视为在网络中的位置或地址,因为通过这些地址,计算机可以被路由到相应的位置。
- 域名:域名是用户友好的名称,用于表示网络上的计算机或服务。域名的唯一目的是让人类易于理解和理解网络上的资源。它们被组织成层次结构的名称空间,由多个部分组成,每个部分由点分隔。例如,“example.com"就是一个域名。
- DNS:DNS(域名系统)是用于将域名转换为IP地址的系统。当你在浏览器中输入一个域名时,你的设备会向DNS服务器请求该域名的IP地址,DNS服务器会返回相应的IP地址,然后设备将使用这些IP地址连接到相应的服务器或资源。通过这种方式,域名和IP地址在人类可读的名称和数字标识符之间建立了映射关系。
具体到DNS和IP地址的转换过程:
当你在浏览器中输入一个域名时,浏览器首先会尝试本地DNS服务器来查找这个域名对应的IP地址。如果本地DNS服务器无法找到对应的IP地址,它会查询主要的公共DNS服务器(如谷歌的8.8.8.8或者Cloudflare的1.1.1.1),并在这些DNS服务器中查找这个域名的IP地址。如果仍然找不到,浏览器会尝试其他公共DNS服务器,直到找到对应的IP地址为止。
找到IP地址后,浏览器会通过这些IP地址连接到相应的服务器或资源。如果DNS服务器无法正确地将域名转换为IP地址,可能会导致网络连接问题或访问错误资源。
总的来说,域名、DNS和IP地址之间的关系是:域名是人类友好的网络资源名称,而IP地址是计算机在网络中的唯一标识符;DNS系统负责将域名转换为对应的IP地址,以方便网络访问。
浏览器、Nginx和HTTP协议
浏览器、Nginx和HTTP协议是互联网中常用的三个组件,它们共同构成了Web服务的基础。
- 浏览器:浏览器是用户访问Web网站的主要工具。常见的浏览器包括Chrome、Firefox、Safari和Microsoft Edge等。它们负责接收并显示从Web服务器返回的HTTP响应。当用户在浏览器中输入域名或输入URL并点击访问时,浏览器会通过DNS解析来获取对应服务器的IP地址,然后使用HTTP协议与服务器建立连接,发送请求并接收响应,最终将响应的内容展示给用户。
- Nginx:Nginx是一款开源的Web和反向代理服务器,它也常被用作邮件代理和缓存服务器。Nginx的特点是性能高,占用资源少,同时支持HTTP、HTTPS、HTTP2等多种协议。Nginx提供了一个高效的文件传输协议,可以作为Web服务器使用,也可以作为反向代理服务器,将来自浏览器的请求转发到后端的应用服务器或数据库服务器。
- HTTP协议:HTTP(Hypertext Transfer Protocol)协议是一种应用层协议,用于在网络中传输超文本(包括HTML文档和图片等)。HTTP协议支持客户端和服务器之间的通信,包括请求和响应。HTTP协议基于TCP/IP协议族,使用80端口。HTTP协议的特点是简单、灵活和扩展性好,它被广泛应用于Web浏览器和Web服务器之间。
在使用HTTP协议时,浏览器向服务器发送请求,请求中包含要获取的资源(如HTML文档)的URL。服务器接收到请求后,根据URL找到相应的资源,然后返回给浏览器。浏览器接收到响应后,解析响应内容并展示给用户。
Nginx可以通过配置来充当HTTP或HTTPS代理服务器,它具有很高的性能和灵活性,常被用于反向代理服务器来分担负载,提高Web服务的性能和可靠性。
虚拟主机原理
在Nginx中,虚拟主机(Virtual Host)的原理涉及到服务器块、域名匹配和请求处理。下面是关于Nginx虚拟主机的详细原理:
- 服务器块:
- Nginx使用服务器块来定义不同的虚拟主机。每个服务器块包含了一个server指令,定义了该虚拟主机的配置。
- 服务器块中可以包含一系列的配置指令,例如监听的端口、域名、日志文件路径等。
|
|
-
域名匹配:
- Nginx使用
server_name
指令来指定虚拟主机的域名。当收到一个请求时,Nginx会根据请求的Host头部信息匹配到相应的虚拟主机。 - 如果请求的Host头部信息与某个虚拟主机的
server_name
匹配,那么该虚拟主机的配置将被用于处理该请求。
- Nginx使用
-
默认服务器:
- 如果请求的Host头部信息在所有虚拟主机中都没有匹配项,Nginx会使用默认服务器。默认服务器通常是第一个定义的服务器块。
|
|
- 请求处理:
- 当Nginx确定了要使用哪个虚拟主机的配置时,它开始处理请求。
- 请求处理包括对URI的解析、静态文件的服务、反向代理等。配置块中的指令决定了如何处理请求。
|
|
- 反向代理:
- 虚拟主机可以用于配置Nginx作为反向代理服务器。在这种情况下,请求会被代理到后端服务器上,Nginx负责将响应返回给客户端。
|
|
- 动态虚拟主机:
- Nginx还支持动态虚拟主机的配置,通过在
server_name
中使用正则表达式,可以实现根据不同的域名动态匹配不同的虚拟主机。
- Nginx还支持动态虚拟主机的配置,通过在
|
|
总的来说,Nginx中虚拟主机的原理基于域名匹配和服务器块的配置。通过合理配置服务器块,Nginx可以根据不同的域名和请求进行灵活的虚拟主机管理和请求处理。
servername匹配规则
我们需要注意的是servername匹配分先后顺序,写在前面的匹配上就不会继续往下匹配了。
完整匹配
我们可以在同一servername中匹配多个域名
|
|
通配符匹配
|
|
通配符结束匹配
|
|
正则匹配
|
|
反向代理
网关、代理和反向代理
在计算机网络中,网关、代理和反向代理是网络架构中的关键概念,它们有不同的作用和功能。
-
网关(Gateway):
- 网关是在网络中连接两个不同协议的设备或系统,它能够转换信息,使得两者能够进行通信。网关通常用于连接本地网络与互联网,执行协议转换、数据格式转换等功能。它工作在 OSI 模型的应用层,负责不同网络之间的协议转换。
-
代理(Proxy):
- 代理是一种中间实体,它代表客户端执行某些操作。代理可以用于多种目的,包括提供安全性、过滤内容、加速访问等。客户端通过代理与服务器通信,服务器认为请求是从代理发出的,而不是直接来自客户端。代理工作在 OSI 模型的应用层。
-
反向代理(Reverse Proxy):
- 反向代理是代理服务器的一种,它代表服务器向客户端提供服务。客户端向反向代理发送请求,而代理将请求转发到一个或多个服务器上,并将服务器的响应返回给客户端。客户端对服务器的实际位置和标识一无所知,因为它只与反向代理通信。反向代理通常用于负载均衡、缓存加速、安全性等方面。
总结:
- 网关连接不同协议的设备,工作在应用层。
- 代理是中间实体,代表客户端执行操作,工作在应用层。
- 反向代理代表服务器向客户端提供服务,客户端不直接与服务器通信,而是通过反向代理,工作在应用层。
反向代理的系统架构
反向代理的系统架构通常涉及多层组件,以实现负载均衡、安全性、性能优化等目标。以下是反向代理系统架构的主要组件:
-
客户端:
- 客户端是发起请求的终端用户或其他系统。它们向反向代理发送请求,并期望获得响应。
-
反向代理服务器:
- 反向代理服务器是系统中的核心组件。它接收来自客户端的请求,并将其转发到后端服务器。反向代理可以执行多种功能,包括负载均衡、SSL/TLS 握手、缓存、安全检查等。
-
负载均衡器:
- 负载均衡器是反向代理的一部分,负责将客户端请求分发到多个后端服务器,以确保这些服务器能够更均匀地处理请求。这有助于提高系统的性能和可伸缩性。
-
后端服务器群:
- 后端服务器群是处理实际请求的服务器集合。这些服务器可能提供相同的服务,以确保高可用性,或者它们可能提供不同的服务,由反向代理根据规则进行路由。
-
SSL/TLS 终端:
- 如果系统使用加密通信,反向代理可能包含 SSL/TLS 终端,负责处理加密和解密流量。这有助于减轻后端服务器的计算负担。
-
缓存系统:
- 缓存系统用于存储反向代理从后端服务器接收的响应。这有助于提高性能,尤其是对于静态内容或频繁请求的内容。
-
安全层(WAF等):
- 反向代理可以集成安全组件,如 Web 应用防火墙(WAF),用于检测和阻止潜在的安全威胁。这有助于提高系统的安全性。
-
监控和日志组件:
- 系统架构通常包括监控和日志组件,用于追踪系统的性能、故障排除和安全审计。
这些组件共同工作,形成一个有效的反向代理系统,提供负载均衡、性能优化、安全性等功能。架构的具体设计可能会因应用需求和规模而有所不同。
DR 模型
DR(Direct Routing)模型是一种负载均衡架构,通常与反向代理一起使用。在 DR 模型中,客户端通过反向代理与代理服务器建立连接,然后代理服务器将请求转发给后端服务器,但响应数据直接返回给客户端而不经过代理服务器。这样,反向代理只负责将请求路由到合适的后端服务器,而实际数据传输不通过代理服务器,从而提高性能。