🐇明明跟你说过:个人主页
🏅个人专栏:《洞察之眼:ELK监控与可视化》🏅
🔖行路有良友,便是天堂🔖
目录
一、前言
1、Nginx概述
二、Nginx核心功能
1、URL重写与重定向
2、反向代理
3、负载均衡
4、访问控制
5、SSL/TLS配置
三、Nginx模块讲解
1、HTTP模块
2、Stream模块
四、Nginx实际应用
1、Nginx在Web开发中的应用
2、Nginx在CDN中的应用
一、前言
1、Nginx概述
Nginx("engine x"的发音类似于"引擎 X")是一款高性能的开源Web服务器和反向代理服务器,由Igor Sysoev创建,并于2004年首次公开发布。它以其卓越的性能、高度的可靠性、简单的配置和低资源消耗而闻名。
以下是Nginx的概述:
- 高性能:Nginx以其高效的事件驱动架构而闻名,能够处理大量并发连接和高流量。它使用异步非阻塞I/O模型,有效地处理客户端请求,并且在高负载下表现优异。
- 反向代理:Nginx作为反向代理服务器时,可以接收客户端的请求并将其转发给后端服务器。它能够进行负载均衡、缓存静态内容、处理SSL终止等操作,提高了Web应用程序的性能和可靠性。
- 负载均衡:Nginx可以将请求分发给多个后端服务器,以实现负载均衡。通过配置不同的负载均衡算法,例如轮询、IP哈希、最少连接等,可以根据不同的需求实现请求的合理分发。
- 静态文件服务:Nginx非常擅长提供静态文件服务,能够高效地提供HTML、CSS、JavaScript、图像等静态内容,并且支持文件压缩和HTTP缓存等功能。
- 反向代理缓存:Nginx可以缓存后端服务器返回的响应,以减轻后端服务器的负载并提高响应速度。它支持不同类型的缓存,包括文件缓存、内存缓存和代理缓存等。
- HTTPS支持:Nginx支持SSL/TLS协议,能够进行HTTPS加密通信,并且支持SSL终止、SSL重定向、证书验证等功能,保障了Web应用程序的安全性。
- 简单配置:Nginx的配置文件采用简洁直观的语法,易于理解和维护。它支持模块化配置,可以通过加载不同的模块来扩展其功能,满足不同的需求。
- 高度可扩展:Nginx是一个模块化的Web服务器,可以通过加载不同的模块来扩展其功能,例如HTTP反向代理、负载均衡、缓存、安全性等。这使得Nginx可以根据不同的需求进行定制和扩展,适用于各种规模和类型的Web应用程序。
二、Nginx核心功能
1、URL重写与重定向
在 Nginx 中,URL 重写和重定向是常见的任务,用于处理客户端请求并将其发送到适当的位置。它们经常用于修改 URL 结构、处理旧 URL、执行 URL 路由等。
下面是 Nginx 中的 URL 重写和重定向的概念和用法:
URL 重写(URL Rewriting)
- URL 重写是指修改客户端请求的 URL 路径,而不改变客户端看到的 URL。这个过程通常在 Nginx 的配置文件中通过 rewrite 指令来完成。URL 重写可以用于修改 URL 结构、处理错误的 URL 请求等。
例如,假设想要将所有 /old-url 的请求重写到 /new-url,可以使用如下配置:
location /old-url {
rewrite ^/old-url/(.*)$ /new-url/$1 permanent;
}
- 这个配置中的 rewrite 指令将匹配以 /old-url 开头的 URL,然后将其重写为以 /new-url 开头的 URL,并使用 permanent 关键字表示这是一个永久重定向。重定向后的 URL 将保留原始的查询参数。
URL 重定向(URL Redirection)
- URL 重定向是指将客户端请求的 URL 重定向到另一个 URL 地址。这个过程会向客户端返回一个 HTTP 状态码(如 301 永久重定向或 302 临时重定向),告诉客户端要跳转到另一个 URL。
- 在 Nginx 中,可以使用 return 指令或 rewrite 指令来实现 URL 重定向。
例如,要将所有访问根目录的请求重定向到一个新的域名,可以使用如下配置:
server {
listen 80;
server_name old-domain.com;
location / {
return 301 http://new-domain.com$request_uri;
}
}
- 这个配置中的 return 指令将所有访问 old-domain.com 根目录的请求重定向到 new-domain.com。
URL 重写用于修改 URL 路径,而 URL 重定向则用于将客户端请求重定向到另一个 URL 地址。这两个功能在 Nginx 中都有其独特的用途,可以根据需求选择合适的方法来处理请求。
2、反向代理
Nginx 反向代理是一种常见的用途,它允许 Nginx 接收来自客户端的请求,并将这些请求转发给后端的服务器或应用程序,然后将后端服务器的响应返回给客户端。这种方式可以隐藏后端服务器的实际 IP 地址和配置,并提供负载均衡、缓存、SSL 终端等功能。
下面是一个简单的 Nginx 反向代理配置示例:
server {
listen 80;
server_name your_domain.com;
location / {
proxy_pass http://backend_server;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
在这个配置中:
- listen 指令指定了 Nginx 监听的端口,这里是 80 端口,用于 HTTP 访问。
- server_name 指令指定了你的域名。
- location / 指令定义了处理客户端请求的位置。这里的配置表示当客户端访问网站时,Nginx 将会代理所有的请求。
- proxy_pass 指令指定了后端服务器的地址,Nginx 会将客户端的请求转发给该地址。
- proxy_set_header 指令用于设置 HTTP 请求头。在这个例子中,设置了 Host、X-Real-IP 和 X-Forwarded-For 头,用于传递客户端的真实 IP 地址和其他信息给后端服务器。
实际使用中,需要将 backend_server 替换为实际的后端服务器的地址,可以是 IP 地址或域名。此外,可能需要根据实际情况配置其他选项,例如 SSL 配置、缓存配置等。
通过这样的配置,Nginx 将充当反向代理,将客户端的请求转发给后端服务器,并将后端服务器的响应返回给客户端,从而实现了反向代理的功能。
3、负载均衡
Nginx 可以作为负载均衡器,用于将来自客户端的请求分发到多个后端服务器,以提高系统的性能、可用性和可扩展性。Nginx 提供了几种负载均衡算法,如轮询、IP Hash、最少连接等,可以根据需求选择适合的算法。
下面是一个简单的 Nginx 负载均衡配置示例:
http {
upstream backend_servers {
server 192.168.1.10;
server 192.168.1.11;
server 192.168.1.12;
}
server {
listen 80;
server_name your_domain.com;
location / {
proxy_pass http://backend_servers;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
}
在这个配置中:
- upstream 指令定义了后端服务器的集群,其中包含了多个服务器的地址和端口。这些服务器可以是真实的后端服务器,也可以是代理服务器或其他类型的服务器。
- server 指令定义了每个后端服务器的地址和端口。
- listen 指令和 server_name 指令定义了 Nginx 监听的端口和服务器名。
- location / 指令定义了处理客户端请求的位置。这里的配置表示当客户端访问网站时,Nginx 将会代理所有的请求给 upstream 中定义的后端服务器集群。
- proxy_pass 指令将客户端的请求转发给后端服务器集群。
- proxy_set_header 指令用于设置 HTTP 请求头,以传递客户端的真实 IP 地址和其他信息给后端服务器。
通过这样的配置,Nginx 将会根据负载均衡算法(默认是轮询算法)将客户端的请求分发到多个后端服务器上,从而实现了负载均衡的功能。可以根据实际需求配置更多的后端服务器,并根据需要选择适合的负载均衡算法。
4、访问控制
Nginx 提供了多种方法来实现访问控制,包括基于 IP 地址、基于用户身份、基于 HTTP 请求头等。这些方法可以帮助你限制访问某些资源,保护你的网站免受恶意攻击和未经授权的访问。
下面是几种常见的 Nginx 访问控制方法:
基于 IP 地址的访问控制
使用 allow 和 deny 指令可以实现基于 IP 地址的访问控制。你可以在 Nginx 配置文件中设置允许或拒绝访问的 IP 地址列表。
例如,下面的配置将允许来自指定 IP 地址范围的访问,拒绝其他所有 IP 地址的访问:
location / {
allow 192.168.1.0/24;
deny all;
}
基于 HTTP 请求头的访问控制
可以使用 if 指令结合 HTTP 请求头来实现更细粒度的访问控制。
例如,下面的配置将拒绝所有没有 Referer 请求头或者 Referer 不是指定域名的请求:
location / {
if ($http_referer !~* (your-domain.com)) {
return 403;
}
}
基于用户身份的访问控制
如果应用程序需要用户登录,可以结合应用程序的身份验证机制来实现访问控制。
例如,下面的配置要求用户登录后才能访问网站的特定部分:
location /private {
auth_basic "Restricted";
auth_basic_user_file /etc/nginx/.htpasswd;
}
在这个例子中,auth_basic 指令用于设置基本身份验证,auth_basic_user_file 指令指定了存储用户名和密码的文件路径。
5、SSL/TLS配置
配置 Nginx 的 SSL/TLS 是保护网站和用户数据安全的重要措施。SSL/TLS 配置包括证书的安装和使用,加密算法的选择,以及其他安全相关的设置。
以下是一个基本的 Nginx SSL/TLS 配置示例:
server {
listen 443 ssl;
server_name your_domain.com;
ssl_certificate /path/to/your/certificate.crt;
ssl_certificate_key /path/to/your/private.key;
# 安全参数配置
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH';
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
ssl_session_tickets off;
ssl_stapling on;
ssl_stapling_verify on;
# 可选的安全性增强配置
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
add_header X-Frame-Options "SAMEORIGIN";
add_header X-Content-Type-Options "nosniff";
# 配置 SSL 会话的结束方式
ssl_session_tickets off;
location / {
# 其他配置...
}
}
在这个配置中:
- listen 443 ssl; 指令表示该服务器块监听 443 端口,并启用 SSL/TLS 加密。
- server_name 指令指定了你的域名。
- ssl_certificate 和 ssl_certificate_key 指令指定了 SSL 证书和私钥的路径,这两个文件是 SSL/TLS 加密的必要组件。
- ssl_protocols 指令用于指定允许使用的 SSL/TLS 协议版本。
- ssl_prefer_server_ciphers on; 指令表示优先使用服务器端定义的加密套件。
- ssl_ciphers 指令定义了可用的加密算法套件。
- ssl_session_cache 指令设置 SSL 会话缓存的大小和存储位置。
- ssl_session_timeout 指令设置 SSL 会话的超时时间。
- ssl_session_tickets 指令控制 SSL 会话票据的使用。
- ssl_stapling 和 ssl_stapling_verify 指令启用 OCSP Stapling 和 OCSP Stapling 验证。
- add_header 指令用于添加额外的安全头,如 Strict-Transport-Security、X-Frame-Options 和 X-Content-Type-Options。
以上是一个基本的 SSL/TLS 配置示例,可以根据实际需求对其进行调整和扩展,以满足网站安全性和性能需求。
三、Nginx模块讲解
1、HTTP模块
Nginx 的 HTTP 模块是 Nginx 的核心模块之一,它处理 HTTP 请求和响应,并提供了丰富的功能和配置选项,包括反向代理、负载均衡、缓存、访问控制等。
以下是一些常用的 Nginx HTTP 模块及其功能:
- Core Module(核心模块):提供了基本的 HTTP 服务器功能,包括定义服务器块、监听端口、设置服务器名称等。例如,listen、server_name 等指令都属于核心模块。
- Access Module(访问模块):用于控制客户端对服务器的访问权限。包括 allow 和 deny 指令,可以根据客户端的 IP 地址或其他条件来允许或拒绝访问。
- Rewrite Module(重写模块):用于重写或修改 URL。提供了 rewrite 指令,可以根据匹配规则修改客户端请求的 URL。
- Proxy Module(代理模块):提供了反向代理功能,允许将客户端的请求转发给后端的服务器或应用程序。包括 proxy_pass、proxy_set_header 等指令。
- Load Balancing Module(负载均衡模块):用于将客户端的请求分发到多个后端服务器,以提高系统的性能和可用性。包括 upstream 和 server 指令。
- SSL Module(SSL 模块):提供了 SSL/TLS 加密功能,用于保护网站和用户数据的安全。包括 ssl_certificate、ssl_certificate_key 等指令。
- Headers Module(头部模块):用于添加、修改或删除 HTTP 请求和响应头。包括 add_header、more_set_headers 等指令。
- Gzip Module(压缩模块):用于压缩 HTTP 响应体,减小传输数据的大小,提高网站的加载速度。包括 gzip、gzip_types 等指令。
- Cache Module(缓存模块):用于缓存静态和动态内容,减轻后端服务器的负载,并提高响应速度。包括 proxy_cache、proxy_cache_key 等指令。
以上是一些常见的 Nginx HTTP 模块及其功能,可以根据需求在 Nginx 配置文件中使用这些模块和指令来实现各种功能。 Nginx 的模块化设计使得它可以灵活地适应不同的应用场景和需求。
2、Stream模块
Nginx 的 Stream 模块是 Nginx 的一个核心模块之一,用于处理 TCP 和 UDP 流量。与 HTTP 模块不同,Stream 模块不处理 HTTP 请求和响应,而是处理基于传输层协议的数据流,例如 TCP 连接、UDP 包等。Stream 模块通常用于实现反向代理、负载均衡、TCP/UDP 代理等网络层级别的功能。
以下是一些常见的 Nginx Stream 模块及其功能:
- Core Module(核心模块):提供了基本的 Stream 服务器功能,包括定义服务器块、监听端口等。与 HTTP 模块的核心模块类似。
- Proxy Module(代理模块):提供了 TCP 和 UDP 的反向代理功能,允许将客户端的 TCP/UDP 流量转发给后端的服务器或应用程序。包括 proxy_pass、proxy_set_header 等指令。
- Load Balancing Module(负载均衡模块):用于将客户端的 TCP/UDP 流量分发到多个后端服务器,以提高系统的性能和可用性。包括 upstream 和 server 指令。
- SSL Module(SSL 模块):提供了 TCP 的 SSL/TLS 加密功能,用于保护 TCP 连接的安全。包括 ssl_certificate、ssl_certificate_key 等指令。
- UDP Module(UDP 模块):用于处理 UDP 流量,可以实现 UDP 的反向代理、负载均衡等功能。Nginx 1.19.0 版本引入了对 UDP 的支持。
Stream 模块的使用方式与 HTTP 模块类似,你可以在 Nginx 配置文件中定义 Stream 服务器块,并在其中使用相应的指令来配置 TCP 或 UDP 的代理、负载均衡等功能。通过 Stream 模块,Nginx 可以成为一个功能强大的 TCP/UDP 代理服务器,可以处理各种类型的网络流量,并提供高性能和可靠性。
四、Nginx实际应用
1、Nginx在Web开发中的应用
Nginx 在 Web 开发中有许多应用,它是一个高性能的 Web 服务器和反向代理服务器,提供了许多功能和特性,适用于各种不同的 Web 开发场景。
以下是一些 Nginx 在 Web 开发中常见的应用:
- 静态文件服务: Nginx 可以作为一个高性能的静态文件服务器,用于提供网站的静态资源,如 HTML、CSS、JavaScript、图片等。它可以快速地响应静态文件的请求,并有效地缓存静态内容,提高网站的访问速度和性能。
- 反向代理: Nginx 可以作为反向代理服务器,将客户端的请求转发给后端的服务器或应用程序,并将后端服务器的响应返回给客户端。这种方式可以隐藏后端服务器的实际 IP 地址和配置,并提供负载均衡、高可用性、安全性等功能。
- 负载均衡: Nginx 可以作为负载均衡器,将客户端的请求分发到多个后端服务器上,以提高系统的性能和可用性。它支持多种负载均衡算法,如轮询、IP Hash、最少连接等,并可以根据服务器的健康状态进行动态调整。
- 缓存服务: Nginx 可以作为缓存服务器,缓存静态和动态内容,减轻后端服务器的负载,并提高响应速度。它支持内存缓存和磁盘缓存,并可以根据需要配置缓存规则和过期时间。
- SSL/TLS 终端: Nginx 支持 SSL/TLS 加密,可以用于安全地传输数据和保护用户隐私。它可以用作 SSL/TLS 终端,对客户端进行 SSL 握手,并在后端服务器之间使用非加密的 HTTP 或 HTTPS 连接。
- 反向 WebSocket 代理: Nginx 可以代理 WebSocket 请求,用于实现实时通信和双向数据传输。它支持 WebSocket 协议的代理和负载均衡,可以处理大量的并发连接。
- HTTP/2 支持: Nginx 支持 HTTP/2 协议,可以提供更快的网页加载速度和更低的延迟。它可以与现代的 Web 浏览器和服务器一起使用,以实现最新的 Web 性能优化。
2、Nginx在CDN中的应用
在 CDN(内容分发网络)中,Nginx 是一个非常常见和重要的组件,它提供了多种功能和特性,用于优化内容分发、提高网站性能、加强安全性等。
以下是 Nginx 在 CDN 中的一些常见应用:
- 内容缓存: Nginx 可以作为 CDN 的缓存服务器,缓存静态和动态内容,如 HTML、CSS、JavaScript、图片、视频等。通过缓存静态内容,Nginx 可以减轻后端服务器的负载,并提高内容的访问速度和性能。
- 反向代理: Nginx 可以作为 CDN 的反向代理服务器,将客户端的请求转发给最近的缓存服务器或源服务器,并将响应返回给客户端。这种方式可以加速内容传输,提高网站的可用性和可靠性。
- 负载均衡: CDN 通常包含多个缓存节点,Nginx 可以作为负载均衡器,将客户端的请求分发到多个缓存节点上,以提高系统的性能和可用性。它支持多种负载均衡算法,如轮询、IP Hash、最少连接等,并可以根据节点的健康状态进行动态调整。
- SSL/TLS 终端: Nginx 支持 SSL/TLS 加密,可以用于安全地传输内容和保护用户隐私。在 CDN 中,Nginx 可以作为 SSL/TLS 终端,对客户端进行 SSL 握手,并在缓存节点之间使用非加密的 HTTP 或 HTTPS 连接。
- 内容压缩: Nginx 支持内容压缩,可以减小传输数据的大小,提高内容的传输速度和节省带宽。在 CDN 中,Nginx 可以压缩静态和动态内容,并提供 Gzip 压缩、Brotli 压缩等功能。
- 安全防护: Nginx 提供了丰富的安全特性,如访问控制、反向代理防护、DDoS 防护等。在 CDN 中,Nginx 可以用于防止恶意攻击、保护网站安全,并提供安全日志和监控功能。
💕💕💕每一次的分享都是一次成长的旅程,感谢您的陪伴和关注。希望这些关于Nginx的文章能陪伴您走过技术的一段旅程,共同见证成长和进步!😺😺😺
🧨🧨🧨让我们一起在技术的海洋中探索前行,共同书写美好的未来!!!