Nginx的其它功能
# Nginx的其它功能
# 域名映射
Nginx中的域名映射主要通过配置虚拟主机(Server Block)实现,允许将不同域名指向同一服务器的不同应用或目录。更简单的说,就是根据用户的请求地址来返回对应的文件给用户。
# 映射
在Nginx中通过server
块定义不同域名的处理规则,该配置写在nginx.conf
:
server {
listen 80;
server_name example.com www.example.com; # 绑定域名
root /var/www/example.com; # 网站根目录
index index.html; # 默认首页 如果有多个文件 可以用 空格 隔开
location / {
try_files $uri $uri/ =404; # 处理静态文件
}
}
2
3
4
5
6
7
8
9
- 关于location
在 Nginx 配置中,location
块用于定义如何处理针对特定 URI 的请求。它允许你根据请求的 URL 路径来配置不同的处理方式,比如服务静态文件、转发请求到后端服务器或执行重写规则等。
location / {
try_files $uri $uri/ =404;
}
2
3
location /
:这个块匹配所有请求(因为它使用了/
,表示根路径),也就是说,除非有更具体的location
块匹配某个请求,否则都会由这个块处理。try_files
指令:尝试按顺序查找指定的文件或目录。如果找不到,则返回指定的状态码(在这个例子中是404)$uri
:当前请求的 URI(不包括查询字符串)。$uri/
:尝试将 URI 作为一个目录来处理。=404
:如果前面的所有尝试都失败了,Nginx 将返回 404 错误。
这意味着,当收到一个请求时,Nginx 首先尝试找到与请求 URI 完全匹配的文件。如果没有找到,则尝试将其作为目录处理(查找默认索引文件)。如果这两步都未能成功,则返回 404 错误。
# 高级属性
- 通配符
使用*.example.com
匹配所有子域名,适用于多级子站:
server {
listen 80;
server_name *.example.com;
root /var/www/wildcard;
}
2
3
4
5
- 多域名共享路径
server {
listen 80;
server_name domain1.com domain2.com;
root /shared/root;
}
2
3
4
5
# 不同的作用域
Nginx 的配置文件中 http
、server
和 location
是三个不同的作用范围(或上下文),它们的设计是为了实现分层管理和模块化配置。每个部分的作用范围和职责不同,以下是对它们的详细说明:
# http 块
作用范围
- 全局 HTTP 配置:
http
块是 Nginx 配置文件中最外层的块之一,用于定义与 HTTP 协议相关的全局配置。 - 它影响所有
server
块中的配置。
http {
include mime.types; # 包含 MIME 类型定义
default_type application/octet-stream; # 默认 MIME 类型
sendfile on; # 启用高效文件传输模式
keepalive_timeout 65; # 长连接超时时间
gzip on; # 启用 Gzip 压缩
server {
...
}
}
2
3
4
5
6
7
8
9
10
11
12
13
http
块是全局配置的核心,定义了所有虚拟主机(server
块)共享的配置。
# server 块
- 虚拟主机配置:
server
块是http
块的子级,用于定义一个虚拟主机(Virtual Host)。 - 每个
server
块对应一个独立的网站或服务。
server {
listen 80; # 监听 80 端口
server_name example.com www.example.com; # 匹配的域名
root /var/www/example; # 网站根目录
index index.html index.htm; # 默认首页文件
location / {
try_files $uri $uri/ =404;
}
}
2
3
4
5
6
7
8
9
10
11
server
块是针对特定域名或 IP 的配置,允许你为不同的网站或服务定义独立的规则。
# Location 块
- URL 路径匹配:
location
块是server
块的子级,用于定义如何处理特定 URL 路径的请求。 - 它的作用范围是某个
server
块内的具体路径。
location / {
root /var/www/html;
index index.html;
}
location /images/ {
root /var/www/static;
autoindex on; # 开启目录浏览
}
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000; # PHP 处理器
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
location
块是针对特定 URL 路径的配置,允许你对不同的请求路径应用不同的规则。
# 配置文件
上面说了,这些映射配置写在nginx.conf文件中,那如果不同项目需要不同配置文件,该怎么编写呢?
Nginx的配置文件管理遵循模块化设计原则,主配置文件为nginx.conf
,但不同项目的配置通常会拆分为独立文件并通过特定方式引入。
Nginx的全局配置默认位于/etc/nginx/nginx.conf
(Linux系统)。此文件定义了全局参数(如工作进程数、日志格式等),并通过include
指令引入其他子配置文件。
http {
include /etc/nginx/conf.d/*.conf; # 加载所有以.conf结尾的配置文件
include /etc/nginx/sites-enabled/*; # 启用虚拟主机配置
}
2
3
4
之所以要这样做————将不同项目的配置拆分为独立文件(如project1.conf),通过主文件nginx.conf的include指令统一加载。是为了避免了单文件臃肿,使配置逻辑更清晰。
# 反向代理
Nginx的反向代理是其核心功能之一,通过将客户端请求转发至后端服务器并隐藏真实服务细节,实现负载均衡、安全加固等能力。
反向代理是指位于客户端和实际服务器之间的一个中介服务器,它接收客户端的请求,并将这些请求转发给后端的实际服务器处理。Nginx 是一个非常流行的反向代理服务器,它可以用来隐藏后端服务器的真实地址,提供负载均衡、缓存等功能。
# 正向代理
有反向代理,那有正向代理吗?答案是:有的。
- 正向代理:为客户端服务,客户端通过它访问外部资源,比如用于绕过网络限制或加速访问。
- 反向代理:为服务器服务,对外表现为单一入口点,客户端并不知道实际处理请求的是哪台服务器。
如何记忆呢?正向代理,用户和nginx是一起的,而反向代理,nginx和服务器是一起的。
# 核心
透明性
客户端直接与反向代理通信,无需感知后端服务器的存在。例如,用户访问 example.com时,实际请求可能被分发至多个后端服务器。
安全隔离 隐藏后端服务器真实IP,过滤恶意请求(如DDoS攻击),并通过SSL终端解密HTTPS流量
# 配置示例
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://backend_server; # 后端服务器地址
proxy_set_header Host $host; # 设置请求头中的Host字段
proxy_set_header X-Real-IP $remote_addr; # 记录客户端真实IP
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 支持XFF头
proxy_set_header X-Forwarded-Proto $scheme; # 支持HTTPS协议识别
}
}
2
3
4
5
6
7
8
9
10
11
12
在这个例子中,所有对 example.com
的请求都会被转发到 backend_server
。你还可以设置额外的 HTTP 头信息,以便后端服务器能够获取客户端的真实 IP 地址和其他有用的信息。
# 负载均衡
Nginx 中的负载均衡是指 Nginx 作为反向代理服务器,接收客户端请求,并根据一定的策略
将这些请求转发到一组后端服务器(也称为上游服务器)中的某一台。这种方式不仅可以提高系统的可用性和扩展性,还可以通过分发请求来平衡各台服务器的负载,避免某一台服务器过载而其他服务器闲置的情况。
# 开启负载均衡
要在 Nginx 中配置负载均衡,你需要使用 upstream
指令定义一个服务器组,然后在 server
块中使用这个组来处理请求。
http {
upstream backend_servers {
server backend1.example.com;
server backend2.example.com;
server backend3.example.com;
# 可选参数:
# weight=number - 设置权重,默认为1
# max_fails=number - 失败尝试次数,默认为1
# fail_timeout=time - 在max_fails失败后暂停的时间,默认为10秒
# backup - 标记此服务器为备用服务器,在主服务器不可用时使用
# down - 标记服务器永久不可用
}
server {
listen 80;
location / {
proxy_pass http://backend_servers; # 使用前面定义的upstream组
}
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
- 以下是简单的加权轮询
upstream backend_servers {
server backend1.example.com weight=3;
server backend2.example.com;
server backend3.example.com;
}
2
3
4
5
注意:虽然 Nginx 默认不会主动检测后端服务器的健康状态,但可以通过第三方模块如
nginx_upstream_check_module
来实现健康检查功能,或者利用max_fails
和fail_timeout
参数来间接管理。
# 三者区别
现在你清楚了三者的区别了吗?
特性 | 反向代理 | 负载均衡 |
---|---|---|
基本功能 | 接收客户端请求并转发给后端服务器,再将响应返回给客户端 | 将客户端请求分发到多个后端服务器以平衡负载 |
目的 | 提供安全性和灵活性,简化客户端与后端服务器的交互 | 提高系统性能和可靠性,确保高可用性 |
是否需要后端服务器池 | 不一定需要(可以直接转发到单一服务器) | 必须有多个后端服务器 |
典型应用场景 | 隐藏后端服务器、SSL终结、缓存静态内容 | 分布式部署、集群管理、高并发处理 |
其实负载均衡和反向代理往往一起使用。
# 压缩gzip
# 介绍
Gzip 是一种压缩技术,主要用于减少 HTTP 响应的大小。在 Nginx 中启用 Gzip 后,它的作用是针对 服务器响应给浏览器的资源 进行压缩,而不是对浏览器上传到服务器的文件进行压缩。
# 压缩方向:服务器 → 浏览器
- 当客户端(如浏览器)向服务器发送请求时,服务器会根据配置决定是否对响应内容进行压缩。
- 如果启用了 Gzip,并且客户端支持 Gzip(通过
Accept-Encoding: gzip
请求头声明),服务器会将响应内容压缩后返回给客户端。 - 浏览器接收到压缩后的响应后,会自动解压并呈现内容。
# 不涉及:浏览器 → 服务器
- Gzip 配置不会对浏览器上传到服务器的文件进行压缩。
- 浏览器上传文件时,通常是以原始形式发送数据,或者通过其他方式(如
Content-Encoding
)进行编码,但这与 Nginx 的 Gzip 配置无关。
# 一个流程例子
步骤 1:浏览器请求
浏览器向服务器发送请求,请求头中可能包含:
GET /index.html HTTP/1.1
Host: example.com
Accept-Encoding: gzip, deflate, br
2
3
Accept-Encoding: gzip
表示浏览器支持 Gzip 压缩。
步骤 2:服务器响应
如果服务器启用了 Gzip,并且客户端支持 Gzip,服务器会对响应内容进行压缩,并返回以下响应头:
HTTP/1.1 200 OK
Content-Type: text/html
Content-Encoding: gzip
Vary: Accept-Encoding
2
3
4
Content-Encoding: gzip
表示响应内容已被 Gzip 压缩。- 浏览器会根据该字段自动解压内容。
步骤 3:浏览器解压
浏览器接收到压缩后的响应后,会自动解压并渲染页面。
# 诞生原因
为了节省带宽并提高加载速度
- 适用场景:用于优化静态资源(如 HTML、CSS、JavaScript)和动态内容(如 JSON API)的传输效率,节省带宽并提高加载速度。
# 如何启用
它的启用很简单,直接在nginx的配置文件中,加上
# 启用 Gzip 压缩
gzip on;
2
nginx的作用域,有三个,分别是http,server,location
你知道它们各自什么的作用范围吗
# 基本配置实例
以下是一个实例配置,仅供参考
http {
# 启用 Gzip 压缩
gzip on;
# 设置压缩级别(1-9,默认为 1)
gzip_comp_level 6;
# 指定需要压缩的 MIME 类型
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
# 最小压缩文件大小(单位:字节,默认为 20 字节)
gzip_min_length 1024;
# 是否在响应头中添加 "Vary: Accept-Encoding"
gzip_vary on;
# 禁用对 IE6 或更低版本的 Gzip 支持
gzip_disable "msie6";
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 配置详解
gzip on;
启用 Gzip 压缩功能。gzip_comp_level
设置压缩级别,范围为 1 到 9:- 1:压缩速度最快,但压缩比最低。
- 9:压缩比最高,但 CPU 消耗较大。
- 推荐值为 6,兼顾性能和压缩效果。
gzip_types
指定需要压缩的 MIME 类型。默认情况下,Nginx 只会对text/html
进行压缩。你可以根据需求添加其他类型,如text/css
、application/javascript
等。gzip_min_length
设置最小压缩文件大小。小于该值的文件不会被压缩(因为压缩小文件可能得不偿失)。gzip_vary
添加Vary: Accept-Encoding
响应头,确保缓存服务器能够正确处理不同编码的内容。
gzip_vary on;
是 Nginx 中用于控制 HTTP 响应头中Vary
字段的一个配置选项。它的主要作用是确保缓存服务器(如代理服务器、CDN 等)能够正确处理不同编码的内容,从而避免因 Gzip 压缩导致的缓存问题。当启用了 Gzip 压缩时,同一资源可能会以两种形式返回给客户端:
- 未压缩的原始内容(针对不支持 Gzip 的客户端)。
- 压缩后的内容(针对支持 Gzip 的客户端)。
如果缓存服务器没有正确区分这两种情况,可能会将压缩后的内容错误地返回给不支持 Gzip 的客户端,或者将未压缩的内容返回给支持 Gzip 的客户端。
通过启用
gzip_vary on;
,Nginx 会在响应头中添加以下字段:Vary: Accept-Encoding
gzip_disable
禁用对某些浏览器的支持。例如,msie6
表示禁用对 IE6 或更低版本的支持。
# 注意事项
- CPU 消耗 压缩操作会增加服务器的 CPU 负载,尤其是在高并发场景下。建议根据服务器性能选择合适的压缩级别。
- 不适合小文件 对于非常小的文件(如小于 1KB),压缩可能无法带来明显的带宽节省,反而增加了 CPU 开销。
- 动态内容的缓存问题 如果动态内容被缓存,可能会导致未压缩的内容被缓存服务器存储,影响后续请求的压缩效果。
# 扩展
Brotli 是一种现代的压缩算法,由 Google 开发,旨在提供比 Gzip 更高的压缩率。与 Gzip 相比,Brotli 在文本文件(如 HTML、CSS、JavaScript)的压缩上表现尤为出色,能够显著减少传输数据的大小,从而提高网页加载速度并节省带宽。
# 特点
- 高压缩率:相比 Gzip,Brotli 提供更高的压缩率,尤其是在处理文本文件时。
- 支持广泛:现代浏览器(如 Chrome、Firefox、Edge 等)普遍支持 Brotli 压缩。
- 性能权衡:虽然 Brotli 的压缩率更高,但压缩速度较慢,尤其是在高压缩级别下。
# 适用场景
- 静态资源(如 HTML、CSS、JavaScript 文件)的压缩。
- 动态内容(如 JSON API)的压缩。
注意
Nginx 默认不支持 Brotli 压缩,需要通过第三方模块(如 ngx_brotli
)来实现。以下是启用和配置 Brotli 的步骤:
# 其他
当然,nginx作为一个强大http服务器,它的功能绝对不止这些,比如还有限流,上传文件限制,这里就不一一展开了,欢迎大家自行查阅资料。