27人参与 • 2025-08-20 • 缓存
nginx反向代理的基础配置结构主要包括server块和location块的配置。一个典型的反向代理配置示例如下:
server { listen 80; server_name example.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 backend_servers { server backend1.example.com:8080; server backend2.example.com:8080; }
在这个配置中,server
块定义了一个虚拟服务器,listen 80
指定监听80端口,server_name
指定服务器名称。location /
匹配所有请求,proxy_pass
将请求转发到名为backend_servers
的upstream组。proxy_set_header
指令用于设置转发到后端服务器的http头信息。
location指令支持多种匹配模式,可以实现精准的路由控制。常见匹配方式包括:
# 主站 location / { proxy_pass http://www.xxxx.com; proxy_redirect off; proxy_set_header host $host; proxy_set_header x-real-ip $remote_addr; } # a站目录 location ~ ^/(search|app|game|qp|dpscpi|news|zt)/.*$ { proxy_pass http://soft.xxx.com; proxy_set_header host $host; } # b站目录 location ~ ^/(gfapi|games|soft|zti|ssou|xp|sitemapv1).*$ { proxy_pass http://other.xxx.com; }
正则表达式匹配使用~
符号,^
表示字符串开始,$
表示字符串结束。这种配置可以根据url路径将请求分发到不同的后端服务器。
upstream模块用于定义一组后端服务器,实现负载均衡。nginx支持多种负载均衡算法:
upstream backend { # 默认轮询 server backend1.example.com; server backend2.example.com; # 加权轮询 server backend3.example.com weight=3; # ip哈希 ip_hash; # 最少连接 least_conn; # 备份服务器 server backup.example.com backup; }
权重(weight)参数表示权值,权值越高被分配到的几率越大。ip_hash保证同一客户端ip的请求总是分配到同一后端服务器,适用于需要会话保持的场景。
反向代理中正确处理http头信息至关重要,常见配置参数包括:
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_set_header x-forwarded-proto $scheme; proxy_redirect off; proxy_http_version 1.1; proxy_connect_timeout 60; proxy_read_timeout 60; proxy_send_timeout 60;
这些配置确保后端服务器能获取客户端真实ip(x-real-ip
),了解请求是通过http还是https(x-forwarded-proto
)发起的。超时参数(proxy_connect_timeout
, proxy_read_timeout
, proxy_send_timeout
)防止因后端响应慢导致连接堆积。
nginx的proxy_cache_path指令用于定义缓存路径和基本参数,其完整语法为:
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m inactive=60m use_temp_path=off;
其中关键参数说明:
/var/cache/nginx
:缓存文件存储路径levels=1:2
:定义缓存目录的层级结构(1:2表示两级子目录)keys_zone=my_cache:10m
:定义共享内存区域名称和大小(10mb用于存储缓存键)inactive=60m
:60分钟内未被访问的缓存将被删除use_temp_path=off
:禁用临时文件存储路径缓存区域的内存分配采用keys_zone机制,每个缓存条目约消耗约800字节内存,因此10mb内存空间可支持约12,800个缓存键。实际缓存内容存储在磁盘上,通过max_size参数可限制磁盘缓存总量(如max_size=10g)。
nginx通过proxy_cache_valid指令设置不同响应状态码的缓存时间:
proxy_cache_valid 200 302 10m; # 成功响应缓存10分钟 proxy_cache_valid 404 1m; # 404错误缓存1分钟 proxy_cache_valid any 1m; # 其他状态缓存1分钟
缓存更新机制包含三种模式:
proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504
proxy_cache_key指令决定缓存项的唯一标识,默认配置为:
proxy_cache_key "$scheme$request_method$host$request_uri";
这表示缓存键包含协议类型(http/https)、请求方法、主机名和完整uri。对于动态内容,建议增加$args变量包含查询参数:
proxy_cache_key "$scheme$request_method$host$request_uri$args"
在负载均衡场景下,如需保持会话一致性,可添加$cookie_jsessionid等会话标识到缓存键。但需注意缓存键过长会导致内存消耗增加,需在keys_zone中预留足够空间。
nginx提供$upstream_cache_status变量记录缓存命中状态,其可能取值包括:
监控配置示例:
location /nginx_status { stub_status on; access_log off; allow 127.0.0.1; deny all; }
通过访问该接口可获取活跃连接数(active)、总请求数(requests)等关键指标。结合日志分析工具(如goaccess)可统计缓存命中率,优化inactive和max_size参数。
nginx的gzip压缩功能通过减少传输数据量显著提升网页加载速度。在http模块中启用gzip的基本配置包括:
gzip on; gzip_min_length 1k; gzip_buffers 4 16k; gzip_types text/plain text/css application/x-javascript;
关键参数中,gzip_min_length
设置仅压缩大于1kb的文件,避免小文件压缩带来的性能损耗;gzip_buffers
分配4个16kb内存块用于存储压缩数据流。对于现代web应用,建议将gzip_types
扩展为包含application/json
和application/javascript
等mime类型。需注意,默认配置下nginx会跳过已压缩的图片/视频文件,这是为避免重复压缩消耗cpu资源。
keepalive机制通过复用tcp连接减少握手开销,典型配置如下:
keepalive_timeout 65; keepalive_requests 1000;
keepalive_timeout
设定连接保持时间为65秒,超过空闲时间后关闭连接;keepalive_requests
限制单个连接最多处理1000个请求后强制重建连接,防止内存泄漏。对于高并发场景,建议将worker_connections
调至10240,并配合multi_accept on
实现单个worker进程同时接受多个新连接。需注意,过长的keepalive时间会导致服务器资源占用上升,需根据实际业务访问频率调整。
针对css/js/图片等静态资源,通过expires
指令设置浏览器缓存:
location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ { expires 30d; add_header cache-control "public, no-transform"; }
该配置使客户端缓存静态资源30天,cache-control: public
允许代理服务器缓存资源,no-transform
禁止中间节点修改内容。对于版本化静态资源(如带hash的文件名),可进一步延长缓存时间至1年并添加版本查询参数。nginx还会自动发送last-modified
和etag
头实现条件请求,当资源未修改时返回304状态码减少传输量。
代理缓冲区配置直接影响大文件传输稳定性,推荐值:
proxy_buffer_size 16k; proxy_buffers 4 64k; proxy_busy_buffers_size 128k;
proxy_buffer_size
设置头缓冲区为16kb,proxy_buffers
分配4个64kb缓冲区存储响应内容。对于视频等大型文件,需增加proxy_max_temp_file_size
防止临时文件过大。超时参数方面,client_header_timeout
建议设为5秒防止慢速攻击,proxy_read_timeout
根据后端处理能力调整(通常60-300秒)。特别注意tcp_nodelay on
禁用nagle算法,可提升小数据包实时性。
nginx反向代理环境下xss防护的核心在于http头部的安全策略配置。通过添加以下安全头部可有效缓解xss攻击风险:
x-xss-protection "1; mode=block"
:强制浏览器启用xss过滤机制content-security-policy "default-src 'self'"
:限制资源加载源防止注入x-content-type-options "nosniff"
:阻止mime类型嗅探攻击关键配置示例:
add_header x-frame-options "sameorigin"; add_header x-xss-protection "1; mode=block"; add_header x-content-type-options "nosniff"; add_header content-security-policy "default-src 'self' http: https: data: blob: 'unsafe-inline'"; add_header referrer-policy "strict-origin-when-cross-origin";
该配置通过五层防护头组合,既防止点击劫持又限制脚本执行上下文。需注意csp策略需根据实际业务资源加载需求调整白名单范围。
nginx的限流模块提供三种防护维度:
limit_conn_zone
定义共享内存区(如10mb存储约12,800个ip的状态)limit_req_zone
设置每秒请求阈值(如10r/s)limit_rate
控制单个连接传输速度典型ddos防护配置:
limit_conn_zone $binary_remote_addr zone=conn_limit:10m; limit_req_zone $binary_remote_addr zone=req_limit:10m rate=10r/s; server { limit_conn conn_limit 5; limit_req zone=req_limit burst=20 nodelay; }
此配置实现ip级连接数(5个)和请求速率(峰值20个/秒)双重限制。对于突发流量,burst
参数允许短暂超限,而nodelay
立即执行惩罚策略。
反向代理需特别关注三类敏感信息防护:
proxy_hide_header x-powered-by; server_tokens off;
if ($request_method !~ ^(get|head|post)$) { return 405; }
ssl/tls强化配置建议:
ssl_protocols tlsv1.2 tlsv1.3; ssl_prefer_server_ciphers on; ssl_ciphers 'ecdhe-ecdsa-aes128-gcm-sha256:ecdhe-rsa-aes128-gcm-sha256';
该配置禁用老旧协议并启用强加密套件,结合hsts头可有效防止降级攻击。
nginx日志监控的关键指标包括:
$request_time
超过500ms的请求可能遭遇资源耗尽攻击accepts/handled
连接数对比识别异常流量日志分析配置优化:
log_format security '$remote_addr - $status - "$request" - $http_user_agent'; access_log /var/log/nginx/security.log security buffer=32k flush=5s;
使用独立日志格式记录安全相关数据,缓冲区设置平衡i/o性能与实时性。建议结合实时分析工具监控$upstream_cache_status
的miss率突变,这可能预示缓存穿透攻击。
nginx的stub_status
模块提供了基础的性能监控能力,通过配置location /nginx_status
可暴露关键指标。典型配置如下:
location /nginx_status { stub_status on; access_log off; allow 127.0.0.1; deny all; }
该配置会返回包含以下数据的纯文本响应:
对于生产环境,建议通过nginx exporter将数据转换为prometheus可读取的格式,配合grafana实现可视化监控。关键指标包括每秒请求数(requests)、连接成功率(conns_opened_percent)和丢弃连接数(conns_dropped_qps)。
nginx错误日志默认位于/var/log/nginx/error.log
,需重点关注以下模式:
connect() failed
类错误:反映后端服务连接问题,需检查proxy_connect_timeout
(默认60秒)是否过短upstream timed out
:需调整proxy_read_timeout
(默认60秒)和proxy_send_timeout
(默认60秒)cache loader
进程报错:表明缓存索引重建异常,需检查proxy_cache_path
目录权限对于访问日志,推荐使用log_format
定义包含$upstream_cache_status
的定制格式,可统计缓存命中率:
log_format cache '***$time_local ***$upstream_cache_status ***"$request"';
通过分析miss/hit/expired
等状态占比,可评估缓存效果。
系统级工具组合应用:
top
:监控nginx worker进程的cpu/内存占用,异常值可能表明配置不当vmstat 1
:观察系统上下文切换(cs)和阻塞进程(b),若超过5000/s需优化tcpdump
:抓包分析网络延迟,命令如:tcpdump -i eth0 -nn -s 0 -w nginx.pcap port 80
nginx特有指标调优:
worker_processes auto
设置worker_rlimit_nofile
大于worker_connections
(建议2:1比例)sendfile
和tcp_nopush
可加速静态文件传输完整的缓存监控体系包含三个维度:
stub_status
接口获取瞬时指标$upstream_cache_status
变量,统计命中率趋势proxy_cache_path
目录大小,避免超过max_size
导致频繁淘汰典型问题处理流程:
proxy_cache_key
是否包含过多变量(如$args
),或proxy_cache_valid
时间过短keys_zone
内存大小(如从10mb调整为100mb),减少索引磁盘读写proxy_cache_lock on
,避免并发请求击穿后端nginx的多级缓存架构通过分层缓存策略实现性能优化,其核心在于合理配置proxy_cache_path指令。该指令支持定义缓存路径、内存区域大小及失效时间等关键参数,例如:
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m inactive=60m use_temp_path=off;
此配置中,levels=1:2
指定两级目录结构以提升文件检索效率,keys_zone=my_cache:10m
定义10mb共享内存区域存储缓存索引,inactive=60m
设置60分钟未被访问的缓存自动清理。实际应用中可结合max_size参数限制磁盘缓存总量(如10gb),防止存储溢出。
多级缓存的典型实现包含以下层级:
expires 30d
等指令设置长期缓存策略;动态内容缓存需解决数据实时性与性能的矛盾。nginx通过proxy_cache_valid指令实现差异化缓存周期,例如:
proxy_cache_valid 200 302 10m; proxy_cache_valid 404 1m;
该配置对http 200/302响应缓存10分钟,404响应仅缓存1分钟。针对api等动态接口,可通过proxy_cache_key "$scheme$request_method$host$request_uri$args"
构建包含请求参数的缓存键,确保不同参数组合的响应独立缓存。
对于实时性要求高的场景,可采用以下方案:
proxy_cache_use_stale
指令在更新失败时返回陈旧数据;location ~ /purge(/.*)
配置清理路径;proxy_cache_bypass
指令跳过特定请求的缓存,如带认证头的api请求。nginx的灰度发布主要通过upstream模块和变量匹配实现。基础配置如下:
upstream production { server backend1:8080 weight=9; server backend2:8080 weight=1; }
此配置将90%流量导向backend1,10%导向backend2实现流量分流。更精细的控制可通过map模块实现,例如根据cookie值分配流量:
map $cookie_gray $group { default "production"; "true" "experiment"; } upstream experiment { server backend3:8080; }
实际部署时,结合proxy_pass http://$group
实现动态路由。对于ab测试,可通过split_clients
模块随机分配用户:
split_clients "${remote_addr}${ua}" $variant { 50% "a"; 50% "b"; }
该配置基于客户端ip和user-agent哈希值均分流量,确保测试组稳定性。
nginx作为微服务网关的核心能力包括路由转发、负载均衡和协议转换。典型配置通过location匹配服务路径:
location /user-service/ { proxy_pass http://user-service/api/; proxy_set_header x-real-ip $remote_addr; }
微服务集成需重点关注:
consul-template
自动生成服务节点列表;proxy_next_upstream
指令配置故障转移策略,如超时或5xx错误时切换后端节点;stub_status
模块暴露连接数、请求数等指标,与prometheus等监控系统对接。在kubernetes环境中,nginx ingress controller可实现更细粒度的流量管理,支持基于header、cookie的canary发布和流量镜像等高级特性。性能优化方面,建议启用http/2协议并调整keepalive参数至keepalive_requests 1000
,提升长连接复用率。
nginx生产环境配置需涵盖核心功能模块与安全策略,以下为关键检查项:
反向代理基础配置
确保proxy_pass
指向正确的后端服务器组,并配置必要的头信息转发:
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_set_header
指令确保后端服务器获取客户端真实ip和协议信息。
负载均衡健康检查
upstream模块需配置max_fails
和fail_timeout
参数,例如:
upstream backend_servers { server backend1.example.com:8080 max_fails=2 fail_timeout=30s; server backend2.example.com:8080 weight=3; }
权重(weight
)和故障检测参数可提升服务可用性。
缓存策略验证
静态资源应启用强缓存,动态内容需设置合理的过期时间:
location ~* \.(jpg|css|js)$ { expires 30d; add_header cache-control "public, no-transform"; }
动态内容缓存需结合proxy_cache_valid
按状态码差异化配置。
协议支持
升级至nginx 1.21+版本可默认启用tlsv1.3,需在ssl配置中明确声明:
ssl_protocols tlsv1.2 tlsv1.3; ssl_ciphers 'tls_aes_256_gcm_sha384:tls_chacha20_poly1305_sha256';
此配置提升加密强度同时保持向后兼容。
模块兼容性
第三方模块如ngx_cache_purge
需验证与主版本兼容性。例如,清除缓存需匹配proxy_cache_path定义的zone名称:
location ~ /purge(/.*) { proxy_cache_purge cache_one $host$1$is_args$args; }
若版本不兼容可能导致缓存清理失效。
配置迁移
旧版worker_connections
参数若超过linux系统ulimit -n
限制,需同步调整系统级文件描述符限制。
动态服务发现
在kubernetes环境中,通过dns解析实现后端服务自动发现:
resolver kube-dns.kube-system.svc.cluster.local valid=10s; upstream k8s_services { server service-1.namespace.svc.cluster.local resolve; server service-2.namespace.svc.cluster.local resolve; }
resolver
指令确保pod ip变化时及时更新。
sidecar代理集成
与istio等service mesh集成时,需关闭nginx的负载均衡功能以避免双重代理:
proxy_pass http://localhost:15001; proxy_redirect off; proxy_buffering off;
此配置将流量控制权移交至sidecar。
弹性伸缩支持
配置共享内存区域(keys_zone
)时需预留扩容空间:
proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=shared_cache:100m max_size=10g;
内存区域大小应随pod副本数线性增长。
压力测试工具配置
使用wrk模拟高并发请求,重点监控连接成功率与错误率:
wrk -t12 -c400 -d30s http://example.com --latency
线程数(-t
)应匹配nginx的worker_processes
设置。
关键指标采集
通过stub_status
模块获取实时性能数据:
location /nginx_status { stub_status on; access_log off; allow 127.0.0.1; deny all; }
输出包含active connections
、requests per second
等核心指标。
瓶颈分析维度
worker_cpu_affinity
绑定是否均衡sendfile
和aio
指令启用状态keys_zone
内存使用率到此这篇关于nginx反向代理与缓存实现代码的文章就介绍到这了,更多相关nginx反向代理缓存内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
您想发表意见!!点此发布评论
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论