示例配置 1:反向代理 + 负载均衡 + 缓存控制
http {
# 定义后端服务器池,用于负载均衡
upstream backend_servers {
server backend1.example.com weight=3; # 权重为3
server backend2.example.com weight=1; # 权重为1
server backend3.example.com backup; # 备份服务器
}
# 全局缓存配置,缓存静态文件的请求
proxy_cache_path /data/nginx/cache keys_zone=my_cache:10m levels=1:2 max_size=1g;
proxy_temp_path /data/nginx/temp;
server {
listen 80;
server_name www.example.com;
# 启用缓存和压缩功能
gzip on;
gzip_types text/css application/javascript image/png;
# 处理静态文件
location /static/ {
root /var/www/static; # 静态文件路径
expires 30d; # 缓存30天
}
# 处理动态请求,使用负载均衡和反向代理
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;
proxy_cache my_cache; # 启用缓存
proxy_cache_valid 200 302 10m; # 成功和重定向的缓存时间为10分钟
proxy_cache_valid 404 1m; # 404页面缓存1分钟
}
# 自定义错误页面
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /var/www/errors; # 错误页面路径
}
}
}
解析与说明:
关键字: http
作用: 定义HTTP服务器相关的全局配置,并且通过 upstream 来定义负载均衡的后端服务器池。proxy_cache_path 配置了缓存机制。
语法规则: http 块是Nginx的全局配置块之一,定义在该块中的配置会影响所有的 server 块。
upstream 块:
关键字: upstream
自定义名称: backend_servers(定义的服务器池的名称,供后续使用)
作用: 定义负载均衡的服务器集群。server backend1.example.com weight=3 表示 backend1 服务器的权重是3,而 backend2 的权重是1,表示更多请求会被分配给 backend1。server backend3.example.com backup 是备份服务器,仅在其他服务器不可用时启用。
语法规则: upstream 块中的服务器定义了负载均衡的后端服务器池,可以通过proxy_pass引用这些服务器。
proxy_cache_path 和 proxy_temp_path:
关键字: proxy_cache_path, proxy_temp_path
自定义名称: /data/nginx/cache 是缓存存储路径,my_cache 是缓存区域的名称。
作用: 定义缓存路径及缓存区。keys_zone=my_cache:10m 定义了一个名称为 my_cache 的缓存区域,大小为10MB,max_size=1g 限制缓存总大小为1GB。
语法规则: proxy_cache_path 定义了缓存的路径、区域名称及缓存大小限制等。
server 块:
关键字: server
自定义名称: www.example.com(域名)
作用: 定义虚拟主机,处理对 www.example.com 的请求。监听80端口。
语法规则: server 块用于定义虚拟主机,每个 server 块包含域名、端口以及与之相关的多个 location。
location /static/ 块:
关键字: location, root, expires
自定义路径: /static/(URL前缀),/var/www/static(静态文件路径)
作用: 处理 /static/ 路径下的请求。通过 root 指定静态资源的物理路径,expires 30d 指定浏览器缓存30天。
语法规则: location 块用于匹配请求的路径。root 定义该路径对应的文件系统目录。
location / 块:
关键字: location, proxy_pass, proxy_cache
自定义名称: backend_servers(引用的负载均衡服务器池)
作用: 处理动态请求,使用 proxy_pass 将请求转发给 upstream 定义的服务器池,使用 proxy_cache 对动态内容进行缓存。
语法规则: proxy_pass 用于将请求代理到后端服务器,proxy_cache 启用Nginx的缓存机制。
错误页面:
关键字: error_page, location
自定义路径: /50x.html(错误页面路径)
作用: 定义自定义的服务器错误页面。当出现 500, 502, 503, 504 错误时,返回 50x.html。
语法规则: error_page 用于自定义错误页面。location = 用于精确匹配该错误页面路径。
示例配置 2:Nginx 作为反向代理,支持 HTTPS 和 HTTP/2
http {
# 定义后端服务器
upstream backend {
server 127.0.0.1:8080;
}
server {
listen 443 ssl http2; # 启用HTTPS和HTTP/2
server_name www.example.com;
# SSL 证书和密钥
ssl_certificate /etc/nginx/ssl/example.com.crt;
ssl_certificate_key /etc/nginx/ssl/example.com.key;
# SSL安全配置
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
# 开启Gzip压缩
gzip on;
gzip_types text/plain text/css application/javascript;
# 代理请求到后端
location / {
proxy_pass http://backend; # 代理到后端服务器
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
# 静态文件缓存
location /static/ {
root /var/www/html/static;
expires 30d;
}
}
# HTTP到HTTPS的重定向
server {
listen 80;
server_name www.example.com;
location / {
rewrite ^ https://$server_name$request_uri? permanent; # 301重定向到HTTPS
}
}
}
解析与说明:
upstream 块:
关键字: upstream
自定义名称: backend(后端服务器池名称)
作用: 定义反向代理的后端服务器池。此处仅有一台服务器,位于 127.0.0.1:8080。
SSL 和 HTTP/2 配置:
关键字: listen, ssl_certificate, ssl_certificate_key, ssl_protocols
自定义路径: /etc/nginx/ssl/example.com.crt 和 /etc/nginx/ssl/example.com.key(SSL证书和密钥路径)
作用: 在443端口启用HTTPS和HTTP/2协议,配置SSL证书及安全协议。
语法规则: listen 443 ssl http2 启用HTTPS和HTTP/2协议,ssl_protocols 指定支持的TLS版本。
HTTP到HTTPS重定向:
关键字: rewrite
内置变量: $server_name, $request_uri
作用: 将所有HTTP请求重定向到HTTPS版本。
语法规则:
rewrite ^ https://$server_name$request_uri? permanent;
使用 rewrite 指令进行正则匹配,并将请求重定向到HTTPS。
proxy_pass 指令:
关键字: proxy_pass, proxy_set_header
自定义名称: backend(定义的服务器池)
作用: 将客户端请求转发给定义的后端服务器池 backend,并保持客户端请求头信息(如IP、Host等)。
静态文件缓存:
关键字: expires
作用: 缓存 /static/ 路径下的文件,浏览器缓存时间设置为30天。
语法规则: expires 30d 指定缓存时长。
总结
关键字: server, upstream, location, proxy_pass, ssl_certificate, rewrite 等是Nginx中的关键字,具有特定的语法和作用。
自定义名称: 如 backend_servers、my_cache、example.com 等名称和路径根据需求自定义,便于引用。
语法规则: Nginx的语法基于块和指令的组合。块如 http、server、location 用于定义作用范围,指令如 proxy_pass、ssl_certificate、expires 用于定义具体行为。
解释重定向:
下面是对
rewrite ^ https://$server_name$request_uri? permanent;
这一 Nginx 指令中每个部分的详细解释。该指令用于将所有HTTP请求永久重定向(301重定向)到对应的HTTPS版本。
-
rewrite:
解释: Nginx的 rewrite 指令用于修改请求的URI或URL。它可以通过正则表达式来匹配请求的URL,并根据需要重定向到新的URL。
作用: 告诉Nginx如何处理和重定向请求的URI。 -
^:
解释: 这是一个正则表达式符号,表示字符串的开始。
作用: 它告诉Nginx匹配请求的URL从头开始,即匹配所有请求的URI。这里 ^ 独立使用,表示匹配任意URI。 -
https://:
解释: 这是要重定向到的新URL的协议部分。https:// 指定重定向到HTTPS协议,强制将请求从HTTP切换到HTTPS。
作用: 将原始的HTTP请求转换为HTTPS请求。 -
$server_name:
解释: 这是Nginx中的一个内置变量,表示当前请求的服务器名称(即域名)。该变量在每个请求中自动填充,例如 www.example.com。
作用: 使用当前请求的服务器名来构建新的重定向URL,确保请求保持在同一个域名下。 -
$request_uri:
解释: 这是Nginx的另一个内置变量,表示请求的完整URI(包括请求路径和查询字符串)。
例如,客户端请求/path/to/page?query=value,
$request_uri 将被替换为 /path/to/page?query=value。作用: 保持请求的URI不变,确保重定向后的路径和查询参数与原请求一致。
-
?:
解释: ? 是一个符号,表示查询参数的分隔符。在URL中,? 用于将查询字符串与主路径分开。例如:/path?param=value。
作用: 保证在重定向过程中,查询参数(如果有)也被正确传递。这里的 ? 仅用于保留查询字符串,即使原请求中没有查询参数。 -
permanent:
解释: 这是一个标志,告诉Nginx返回HTTP状态码 301,表示永久重定向。浏览器或搜索引擎会将该重定向信息缓存,并认为资源的地址已经永久改变。
作用: 表示这是一个永久重定向(301状态码),会通知浏览器更新缓存中的URL以指向新地址。与 permanent 相对的是 redirect(或 302),表示临时重定向。
整体效果:
当rewrite ^ https://$server_name$request_uri? permanent;
这一指令执行时,Nginx会将所有传入的HTTP请求重定向到对应的HTTPS版本,并保持路径和查询字符串不变。
请求流程举例: 假设用户访问了以下URL:
http://www.example.com/page?id=123
正则表达式 ^ 会匹配整个URI。
$server_name 将被替换为 www.example.com。
$request_uri 将被替换为 /page?id=123。
? 保留查询参数,即 id=123。
permanent 会将响应的状态码设为 301(永久重定向)。
最终重定向URL: https://www.example.com/page?id=123
关键点总结:
rewrite 是Nginx指令,用于重定向请求。
^ 匹配从头到尾的所有请求URI。
https:// 强制将请求协议更改为HTTPS。
$server_name 替换为当前请求的服务器名。
$request_uri 保留原请求的路径和查询参数。
? 保留查询字符串。
permanent 告诉浏览器这是一个永久重定向,并返回 301 状态码。