Nginx学习笔记

入门

介绍

Nginx(发音为"engine-x")是一种高性能的开源Web服务器和反向代理服务器,以及一个用于HTTP、SMTP、POP3和IMAP协议的负载均衡器。以下是一些关于Nginx的详细介绍:

  1. 性能优越: Nginx以其出色的性能而闻名,特别适用于处理高并发的网络流量。它能够处理数千个并发连接而不显著增加系统负担。

  2. 反向代理服务器: Nginx常用作反向代理服务器,将客户端请求转发给后端服务器。这使得它成为一个理想的解决方案,用于负载均衡和提高Web应用程序的可靠性。

  3. 负载均衡: Nginx支持负载均衡,能够将请求分发到多个后端服务器,从而提高系统的整体性能和可用性。

  4. 静态文件服务: 除了作为反向代理服务器外,Nginx还可以用于提供静态文件服务。它能够高效地处理和传送静态资源,如HTML、CSS、JavaScript和图像文件。

  5. 模块化结构: Nginx采用模块化结构,允许用户通过添加模块来扩展其功能。这使得它非常灵活,可以适应各种不同的需求。

  6. 事件驱动架构: Nginx采用事件驱动的架构,通过异步非阻塞方式处理请求。这有助于减少资源消耗,提高并发性能。

  7. 易于配置: Nginx的配置文件简单而直观,易于理解和管理。它支持动态重新加载配置,使得在不停止服务的情况下可以进行实时修改。

  8. 支持多协议: 除了HTTP协议,Nginx还支持SMTP、POP3和IMAP等协议,使其成为一个多功能的服务器。

总体而言,Nginx是一个强大而灵活的Web服务器,适用于各种规模的应用程序和场景。

两个版本线

Nginx有两个主要的版本线:Mainline版本和Stable版本。在这两个版本线上,有一系列的具体版本。以下是一些Nginx的常见版本:

  1. Mainline版本:

    • Mainline版本是Nginx的最新开发版本,包含了最新的功能和改进。这个版本线上发布的版本可能包含一些实验性的特性,适合那些想要尝试最新功能的用户。
  2. Stable版本:

    • Stable版本是相对较为稳定和经过更长时间测试的版本。这个版本线上发布的版本被认为是更适合在生产环境中使用的。
  3. 具体版本:

    • 具体的版本号会根据发布时间而变化。例如,Nginx的版本号可能是1.18.0、1.20.1等。版本号中的第一个数字表示主要版本,后面的数字表示次要版本和补丁。
  4. LTS版本:

    • 有时候,Nginx会发布长期支持(LTS)版本,这些版本在支持周期内会得到更长时间的更新和维护,适合那些更注重稳定性和长期支持的用户。

请注意,为了获取最新的版本信息和详细的发布说明,建议直接访问Nginx官方网站。在那里你可以找到最新版本的下载链接以及完整的发布历史。

四大阵营

  1. Nginx开源版:
    • 描述: Nginx开源版是Nginx官方维护的开源版本,提供了高性能的Web服务器和反向代理功能。它是一个轻量级、模块化的服务器,广泛用于搭建静态内容服务器、反向代理以及负载均衡。
    • 特点: 稳定、高性能、模块化结构、支持反向代理和负载均衡。
    • 许可: 2-clause BSD许可证。
  2. Nginx Plus商业版:
    • 描述: Nginx Plus是Nginx官方提供的商业版,除了包含Nginx开源版的所有功能外,还提供了一些增值功能,如实时监控、动态负载均衡、高级缓存等。它是为企业级应用和大规模部署设计的。
    • 特点: 包含Nginx开源版功能、增值功能、商业支持。
    • 许可: 商业许可证。
  3. OpenResty:
    • 描述: OpenResty是一个基于Nginx的开源项目,通过集成一些额外的模块和Lua脚本语言来扩展Nginx的功能。它旨在提供一个高性能、可扩展且灵活的Web应用程序服务器,适用于需要动态性能和功能的场景。
    • 特点: 集成Lua脚本、模块化设计、适用于动态应用程序。
    • 许可: BSD许可证。
  4. Tengine:
    • 描述: Tengine是由淘宝网发起的一个开源项目,是在Nginx基础上进行定制和优化的版本。Tengine专注于性能和扩展性,通过一些改进来适应大规模高并发的互联网应用场景。
    • 特点: 性能优化、支持淘宝等大规模站点的需求。
    • 许可: 2-clause BSD许可证。

这些版本都在Nginx的基础上进行了不同程度的定制和优化,以满足不同用户和应用场景的需求。选择适当的版本通常取决于项目的特定要求、性能预期以及对商业支持的需求。

常用命令

Nginx 有一系列的命令用于管理和控制其行为。以下是一些常见的 Nginx 相关命令:

  1. 启动 Nginx:

    1
    
    sudo systemctl start nginx
  2. 停止 Nginx:

    1
    
    sudo systemctl stop nginx
  3. 重新加载配置文件:

    1
    
    sudo systemctl reload nginx
  4. 重启 Nginx:

    1
    
    sudo systemctl restart nginx
  5. 检查配置文件语法:

    1
    
    sudo nginx -t

    这个命令用于检查 Nginx 配置文件的语法是否正确,如果正确则输出 “syntax is okay”。

  6. 显示 Nginx 版本信息:

    1
    
    nginx -v

    或者

    1
    
    nginx -V

    -v 显示版本号,-V 显示版本号和编译信息。

  7. 查看 Nginx 运行状态:

    1
    
    sudo systemctl status nginx

    这个命令用于查看 Nginx 是否正在运行,以及运行状态的一些信息。

  8. 平滑升级 Nginx:

    1
    
    sudo systemctl upgrade nginx

    这个命令用于平滑地升级 Nginx,保持持续服务的可用性。

  9. 测试配置并重新加载:

    1
    
    sudo nginx -t && sudo systemctl reload nginx

    这个命令用于在测试通过后重新加载 Nginx 配置。

这些命令可以帮助你管理 Nginx 的启动、停止、重启、重新加载配置等操作。确保在执行任何更改前备份你的配置文件,以免出现意外问题。

安装启动相关

安装Nginx

以Centos7 为例。

要在CentOS 7上安装Nginx,您可以按照以下步骤进行操作:

  1. 打开终端(可以通过SSH连接到服务器)。

  2. 使用root权限或sudo权限运行以下命令以更新系统软件包:

1
sudo yum update
  1. 安装EPEL存储库(Extra Packages for Enterprise Linux):
1
sudo yum install epel-release
  1. 安装Nginx:
1
sudo yum install nginx
  1. 启动Nginx服务并设置为开机启动:
1
2
sudo systemctl start nginx
sudo systemctl enable nginx
  1. 检查Nginx服务是否正在运行:
1
sudo systemctl status nginx

如果一切顺利,您将看到Nginx正在运行的信息。

  1. 在浏览器中输入服务器的IP地址或域名,您应该能够看到Nginx的欢迎页面。

至此,您已成功安装并启动Nginx。请注意,您可能需要配置Nginx以适应您的特定需求,比如配置虚拟主机等。

安装包安装

如果您有一个tar.gz压缩的Nginx安装包,您可以按照以下步骤进行解压和安装:

  1. 下载Nginx tar.gz包。您可以从Nginx官方网站或其他可信赖的源下载最新版本。

  2. 使用以下命令解压缩下载的tar.gz包。假设您的包名是nginx-x.x.x.tar.gz

1
tar -zxvf nginx-x.x.x.tar.gz

替换x.x.x为实际的版本号。

  1. 进入解压后的Nginx目录:
1
cd nginx-x.x.x
  1. 执行配置命令:
1
./configure

该命令将检查系统并生成Makefile。

  1. 使用make命令编译:
1
make
  1. 使用make命令安装:
1
make install
  1. 安装完成后,您可以使用以下命令启动Nginx服务:
1
nginx

如果需要使用特定的配置文件,可以在启动命令中指定配置文件的路径,例如:

1
nginx -c /path/to/nginx.conf

请注意,这种方法可能需要手动配置Nginx,并且您需要确保系统中已安装了编译所需的依赖项。如果您仅需基本安装,并希望更轻松地管理Nginx,建议使用包管理器方式安装。

启动Nginx

1
2
3
4
./nginx 启动
./nginx -s stop 快速停止
./nginx -s quit 优雅关闭,在退出前完成已经接受的连接请求
./nginx -s reload 重新加载配置

安装成系统服务

创建服务脚本

1
vi /usr/lib/systemd/system/nginx.service

服务脚本内容

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
[Unit]
Description=nginx - web server
After=network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf
ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s stop
ExecQuit=/usr/local/nginx/sbin/nginx -s quit
PrivateTmp=true
[Install]
WantedBy=multi-user.target

重新加载系统服务

1
systemctl daemon-reload

启动服务

1
systemctl start nginx.service

开机启动

1
systemctl enable nginx.service

Nginx的目录构成

nginx的目录构成包括以下几个主要部分:

  1. client_body_temp:这个目录通常用于存储客户端请求体中的临时文件。当客户端发送包含表单数据或上传文件等请求时,这些数据将被存储在此目录中,直到请求被处理完毕。
  2. conf:这是nginx的主要配置目录,其中包含了nginx的全局配置文件(通常为nginx.conf)以及站点配置文件(如default.conf)和其他相关配置文件。
  3. fastcgi_temp:这个目录通常用于存储FastCGI进程返回的临时文件。当nginx处理动态内容时,它通常会与FastCGI进程进行交互,并将生成的临时文件存储在此目录中。
  4. html:这个目录通常用于存储静态网站内容。在大多数情况下,nginx将通过反向代理将客户端请求发送到该目录中的静态HTML文件。
  5. logs:这个目录通常用于存储nginx的日志文件。这些日志文件可以用于监视服务器性能、诊断问题以及记录访问日志等。
  6. proxy_temp:这个目录通常用于存储代理服务器返回的临时文件。当nginx作为反向代理服务器时,它可能会生成临时文件,并将这些文件存储在此目录中。
  7. sbin:这是nginx可执行文件的安装目录,其中包含了nginx的主要可执行文件和其他相关工具。
  8. scgi_temp:这个目录通常用于存储SCGI进程返回的临时文件。当nginx处理SCGI应用程序时,它通常会与SCGI进程进行交互,并将生成的临时文件存储在此目录中。
  9. uwsgi_temp:这个目录通常用于存储uWSGI进程返回的临时文件。当nginx与uWSGI应用程序集成时,它可能会生成临时文件,并将这些文件存储在此目录中。

基本请求流程

image-20240114102515862

nginx.conf最小配置解析

nginx.conf是nginx服务器的配置文件,它决定了服务器的行为和功能。下面是一个非常基础的nginx.conf配置文件解析:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
worker_processes  1;

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;
        }
    }
}
  • “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地址是互联网中用于标识计算机和网络资源的三个重要概念。它们之间的关系如下:

  1. IP地址:IP地址是计算机在网络中的唯一标识符。它们由一系列数字组成,这些数字在IPv4系统中用点分隔,而在IPv6系统中用方括号包围。这些数字可以被视为在网络中的位置或地址,因为通过这些地址,计算机可以被路由到相应的位置。
  2. 域名:域名是用户友好的名称,用于表示网络上的计算机或服务。域名的唯一目的是让人类易于理解和理解网络上的资源。它们被组织成层次结构的名称空间,由多个部分组成,每个部分由点分隔。例如,“example.com"就是一个域名。
  3. 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服务的基础。

  1. 浏览器:浏览器是用户访问Web网站的主要工具。常见的浏览器包括Chrome、Firefox、Safari和Microsoft Edge等。它们负责接收并显示从Web服务器返回的HTTP响应。当用户在浏览器中输入域名或输入URL并点击访问时,浏览器会通过DNS解析来获取对应服务器的IP地址,然后使用HTTP协议与服务器建立连接,发送请求并接收响应,最终将响应的内容展示给用户。
  2. Nginx:Nginx是一款开源的Web和反向代理服务器,它也常被用作邮件代理和缓存服务器。Nginx的特点是性能高,占用资源少,同时支持HTTP、HTTPS、HTTP2等多种协议。Nginx提供了一个高效的文件传输协议,可以作为Web服务器使用,也可以作为反向代理服务器,将来自浏览器的请求转发到后端的应用服务器或数据库服务器。
  3. 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虚拟主机的详细原理:

  1. 服务器块
    • Nginx使用服务器块来定义不同的虚拟主机。每个服务器块包含了一个server指令,定义了该虚拟主机的配置。
    • 服务器块中可以包含一系列的配置指令,例如监听的端口、域名、日志文件路径等。
1
2
3
4
5
6
7
server {
    listen 80;
    server_name example.com www.example.com;

    # 其他配置指令
    ...
}
  1. 域名匹配

    • Nginx使用server_name指令来指定虚拟主机的域名。当收到一个请求时,Nginx会根据请求的Host头部信息匹配到相应的虚拟主机。
    • 如果请求的Host头部信息与某个虚拟主机的server_name匹配,那么该虚拟主机的配置将被用于处理该请求。
  2. 默认服务器

    • 如果请求的Host头部信息在所有虚拟主机中都没有匹配项,Nginx会使用默认服务器。默认服务器通常是第一个定义的服务器块。
1
2
3
4
5
6
7
server {
    listen 80 default_server;
    server_name _;

    # 默认服务器的配置
    ...
}
  1. 请求处理
    • 当Nginx确定了要使用哪个虚拟主机的配置时,它开始处理请求。
    • 请求处理包括对URI的解析、静态文件的服务、反向代理等。配置块中的指令决定了如何处理请求。
1
2
3
4
location / {
    # 处理请求的配置
    ...
}
  1. 反向代理
    • 虚拟主机可以用于配置Nginx作为反向代理服务器。在这种情况下,请求会被代理到后端服务器上,Nginx负责将响应返回给客户端。
1
2
3
4
5
location / {
    proxy_pass http://backend_server;
    # 其他代理配置
    ...
}
  1. 动态虚拟主机
    • Nginx还支持动态虚拟主机的配置,通过在server_name中使用正则表达式,可以实现根据不同的域名动态匹配不同的虚拟主机。
1
2
3
4
5
6
7
server {
    listen 80;
    server_name ~^(?<subdomain>\w+)\.example\.com$;

    # 使用$subdomain变量处理不同的子域名
    ...
}

总的来说,Nginx中虚拟主机的原理基于域名匹配和服务器块的配置。通过合理配置服务器块,Nginx可以根据不同的域名和请求进行灵活的虚拟主机管理和请求处理。

servername匹配规则

我们需要注意的是servername匹配分先后顺序,写在前面的匹配上就不会继续往下匹配了。

完整匹配

我们可以在同一servername中匹配多个域名

1
server_name vod.mmban.com www1.mmban.com;

通配符匹配

1
server_name *.mmban.com;

通配符结束匹配

1
server_name vod.*;

正则匹配

1
server_name ~^[0-9]+\.mmban\.com$;

反向代理

网关、代理和反向代理

在计算机网络中,网关、代理和反向代理是网络架构中的关键概念,它们有不同的作用和功能。

  1. 网关(Gateway):

    • 网关是在网络中连接两个不同协议的设备或系统,它能够转换信息,使得两者能够进行通信。网关通常用于连接本地网络与互联网,执行协议转换、数据格式转换等功能。它工作在 OSI 模型的应用层,负责不同网络之间的协议转换。
  2. 代理(Proxy):

    • 代理是一种中间实体,它代表客户端执行某些操作。代理可以用于多种目的,包括提供安全性、过滤内容、加速访问等。客户端通过代理与服务器通信,服务器认为请求是从代理发出的,而不是直接来自客户端。代理工作在 OSI 模型的应用层。
  3. 反向代理(Reverse Proxy):

    • 反向代理是代理服务器的一种,它代表服务器向客户端提供服务。客户端向反向代理发送请求,而代理将请求转发到一个或多个服务器上,并将服务器的响应返回给客户端。客户端对服务器的实际位置和标识一无所知,因为它只与反向代理通信。反向代理通常用于负载均衡、缓存加速、安全性等方面。

总结:

  • 网关连接不同协议的设备,工作在应用层。
  • 代理是中间实体,代表客户端执行操作,工作在应用层。
  • 反向代理代表服务器向客户端提供服务,客户端不直接与服务器通信,而是通过反向代理,工作在应用层。

反向代理的系统架构

反向代理的系统架构通常涉及多层组件,以实现负载均衡、安全性、性能优化等目标。以下是反向代理系统架构的主要组件:

  1. 客户端:

    • 客户端是发起请求的终端用户或其他系统。它们向反向代理发送请求,并期望获得响应。
  2. 反向代理服务器:

    • 反向代理服务器是系统中的核心组件。它接收来自客户端的请求,并将其转发到后端服务器。反向代理可以执行多种功能,包括负载均衡、SSL/TLS 握手、缓存、安全检查等。
  3. 负载均衡器:

    • 负载均衡器是反向代理的一部分,负责将客户端请求分发到多个后端服务器,以确保这些服务器能够更均匀地处理请求。这有助于提高系统的性能和可伸缩性。
  4. 后端服务器群:

    • 后端服务器群是处理实际请求的服务器集合。这些服务器可能提供相同的服务,以确保高可用性,或者它们可能提供不同的服务,由反向代理根据规则进行路由。
  5. SSL/TLS 终端:

    • 如果系统使用加密通信,反向代理可能包含 SSL/TLS 终端,负责处理加密和解密流量。这有助于减轻后端服务器的计算负担。
  6. 缓存系统:

    • 缓存系统用于存储反向代理从后端服务器接收的响应。这有助于提高性能,尤其是对于静态内容或频繁请求的内容。
  7. 安全层(WAF等):

    • 反向代理可以集成安全组件,如 Web 应用防火墙(WAF),用于检测和阻止潜在的安全威胁。这有助于提高系统的安全性。
  8. 监控和日志组件:

    • 系统架构通常包括监控和日志组件,用于追踪系统的性能、故障排除和安全审计。

这些组件共同工作,形成一个有效的反向代理系统,提供负载均衡、性能优化、安全性等功能。架构的具体设计可能会因应用需求和规模而有所不同。

DR 模型

DR(Direct Routing)模型是一种负载均衡架构,通常与反向代理一起使用。在 DR 模型中,客户端通过反向代理与代理服务器建立连接,然后代理服务器将请求转发给后端服务器,但响应数据直接返回给客户端而不经过代理服务器。这样,反向代理只负责将请求路由到合适的后端服务器,而实际数据传输不通过代理服务器,从而提高性能。

0%