本文分享关于优化 Nginx 的相关问题,清理下大脑,我们直接开始。
Nginx 在高并发环境下表现优异,主要得益于它的 事件驱动架构。为了进一步优化并发处理能力,可以调整以下配置:
worker_connections 1024; # 每个工作进程最多处理 1024 个连接
events { use epoll; worker_connections 1024;}
这些设置可以帮助 Nginx 更高效地处理并发连接,提升系统的整体吞吐量。
Nginx 具有强大的缓存功能,可以通过缓存机制大幅度减少后端服务器的负载,降低响应时间。
http { proxy_cache_path /tmp/cache levels=1:2 keys_zone=my_cache:10m inactive=60m max_size=1g; server { listen 80; location / { proxy_cache my_cache; proxy_pass http://backend; proxy_cache_valid 200 1h; proxy_cache_use_stale error timeout updating; } }}
server { location /images/ { expires 30d; add_header Cache-Control "public"; }}
缓存不仅能提升 Nginx 的性能,还能降低后端服务的压力,尤其适用于静态内容。
3、如何优化 Nginx 的响应时间和带宽利用率?
http { gzip on; gzip_min_length 1024; gzip_types text/plain text/css application/javascript application/json;}
server { listen 80; tcp_nopush on; tcp_nodelay on; }
server { listen 443 ssl http2; server_name example.com; ssl_certificate /path/to/certificate.crt; ssl_certificate_key /path/to/certificate.key;}
Nginx 配置的瓶颈通常出现在以下几个方面:
1)Nginx 配置文件结构: 确保配置文件的结构清晰,避免过多的 location 和 server 块,从而减少 Nginx 解析配置的复杂度。
2)避免过多的正则表达式: 正则匹配会消耗较多的 CPU 资源,尽量避免在 location 块中使用复杂的正则表达式,或者将其替换为路径匹配。
3)合并 server 和 location 配置: 尽量避免重复配置相同的内容,合理利用 include 来复用通用配置,减少冗余。
4)减小负载均衡策略的复杂性: 负载均衡时,如果有多个后端服务器,尽量简化负载均衡算法,使用简单的轮询算法,避免复杂的健康检查和权重设置。
5、如何配置 Nginx 的日志以减少 I/O 开销?
Nginx 的日志功能在生产环境中非常重要,但过多的日志写入会导致 I/O 开销,影响性能。
server { listen 80; access_log off; location / { proxy_pass http://backend; }}
http { log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main buffer=32k flush=5m;}
这里设置了日志缓冲为 32KB,并且每 5 分钟刷新一次日志。
6、如何优化 Nginx 配置以防止 DDoS 攻击?
通过以下配置,Nginx 可以有效地防止恶意流量和 DDoS 攻击:
http { limit_req_zone $binary_remote_addr zone=req_limit:10m rate=10r/s; server { listen 80; location / { limit_req zone=req_limit burst=20 nodelay; proxy_pass http://backend; } }}
http { limit_conn_zone $binary_remote_addr zone=conn_limit:10m; server { listen 80; location / { limit_conn conn_limit 1; proxy_pass http://backend; } }}
http { client_body_timeout 10s; client_header_timeout 10s; send_timeout 10s;}
7. 如何优化 Nginx 的 SSL/TLS 性能?
Nginx 在处理 HTTPS 时需要高效地配置 SSL/TLS,以减少加密解密的性能开销:
ssl_session_cache shared:SSL:10m;ssl_session_timeout 1h;
ssl_protocols TLSv1.2 TLSv1.3;ssl_ciphers 'HIGH:!aNULL:!MD5';
ssl_stapling on;ssl_stapling_verify on;
server { listen 8080; location /status { stub_status on; access_log off; allow 127.0.0.1; deny all; }}
描述master-worker架构与epoll事件模型的协同工作原理
1)Master进程: 负责读取配置、绑定端口、管理Worker进程(平滑重启、热加载)。
2)Worker进程: 实际处理请求,采用非阻塞+epoll多路复用机制。
3)Epoll模型: 基于事件驱动,仅遍历活跃连接,复杂度O(1),支持百万级并发。
worker_processes auto; # 匹配CPU核心数
worker_connections 10240; # 单个Worker最大连接数
use epoll; # 明确指定事件模型
location /api/ { 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;proxy_set_header Host $http_host;proxy_http_version 1.1; proxy_set_header Connection "";
11、如何通过Slab分配器优化Nginx内存碎片?给出数学公式与配置策略
总内存需求 = worker_processes × (worker_connections × 请求缓冲区 + 响应缓冲区)
分级内存池管理slab_size1m; slab_page_size4k;
限制单个请求内存client_body_buffer_size16k;client_header_buffer_size4k;large_client_header_buffers832k;
连接级内存限制connection_pool_size4096;request_pool_size4k;
查看内存碎片率nginx -V 2>&1 | grep -o 'with-debug' && kill -USR1 $(cat /run/nginx.pid)tail -f /var/log/nginx/error.log | grep slab
12、如何设计Nginx缓存策略防止高并发下的缓存穿透?
proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=mycache:1024m inactive=7d use_temp_path=off;
location / { proxy_cache mycache; proxy_cache_lockon; proxy_cache_key"$scheme$request_method$host$request_uri"; proxy_cache_valid20030210m; proxy_cache_use_staleerror timeout updating; proxy_cache_background_updateon; }
13、如何利用Nginx+Lua实现动态限频?给出完整代码逻辑
lua_shared_dict limit_counter 10m;server { location / { access_by_lua_block { local limit_counter = ngx.shared.limit_counter local key = ngx.var.binary_remote_addr local req,_ = limit_counter:get(key) if req then if req > 100 then ngx.exit(503) else limit_counter:incr(key,1) end else limit_counter:set(key,1,1) end } }}
14、如何通过 Nginx 拦截 SQL 注入和 XSS 攻击?给出正则表达式和配置片段
set $block0;if ($request_method !~ ^(GET|POST)$ ) { set$block1; }
if ($query_string~* "union.*select.*from") { set$block1; } if ($args~* "") { set$block1; }
location / { if ($block = 1) { return444; } }
15、如何构建Nginx全维度监控指标?给出Prometheus+Grafana方案
location /nginx_status { stub_status; allow 127.0.0.1; deny all;}
job_name: 'nginx'static_configs:
16、如何实现Nginx的零停机热升级?请描述完整操作流程及回滚方案
1)备份旧版本二进制文件
cp /usr/sbin/nginx /usr/sbin/nginx.old
2)编译新版本(需保留原 configure 参数)
./configure --with-http_v2_module --with-stream=dynamic...make && make install
3)向主进程发送 USR2 信号启动新进程
kill -USR2 $(cat /run/nginx.pid)
4)逐步关闭旧 Worker 进程
kill -WINCH $(cat /run/nginx.pid.oldbin)
5)强制回滚(若新版本异常)
mv /usr/sbin/nginx.old /usr/sbin/nginxkill -HUP $(cat /run/nginx.pid.oldbin)
17、如何基于Nginx+GeoIP实现跨国流量调度?给出DNS与Nginx联动方案
geoip_country /usr/share/GeoIP/GeoIP.dat;map$geoip_country_code$backend { default us.web.service; CN cn.web.service; JP jp.web.service; }
server { location / { resolver8.8.8.8 valid=30s; proxy_pass http://$backend; proxy_next_upstreamerror timeout http_500; }}
18、在Kubernetes+Serverless架构中,Nginx Ingress如何实现自动弹性伸缩?
nginx.ingress.kubernetes.io/canary: "true"nginx.ingress.kubernetes.io/canary-weight: "20"
19、如何将 HTTP/1.1 升级为 HTTP/2 并优化性能?给出关键配置项
http { listen443 ssl http2; keepalive_timeout300s; keepalive_requests10000; gzipon; gzip_min_length1k; gzip_comp_level3; gzip_types text/plain application/json; http2_max_field_size16k; http2_max_header_size64k; http2_body_preread_size128k; http2_streams_index_size1024;}
性能指标:
连接复用率提升 40%+
首字节时间(TTFB)降低 30%
头部传输体积减少 50%
20、设计防御大规模 CC 攻击的分布式限流方案,需支持动态规则更新
limit_req_zone $binary_remote_addr zone=global_limit:10m rate=100r/s;limit_req zone=global_limit burst=200 delay=10;
location /api/limit_rules { proxy_pass http://rule_engine;
nginx -s reload && lua_shared_dict limit_rules 10m;}
access_by_lua_block { local rules = ngx.shared.limit_rules local ip = ngx.var.remote_addr if rules:get(ip) == "block" then ngx.exit(444) end}
防御指标:
单IP QPS限制精度 ±5%
规则更新延迟 < 500ms
10Gbps攻击流量过滤率 99.9%
21、在Kubernetes中如何优化Nginx Ingress Controller性能?
1)水平自动扩缩
autoscaling: enabled:trueminReplicas:3maxReplicas:100metrics: -type:Pods pods: metric: name:nginx_connections_active target: type:AverageValue averageValue: 1000
2)内核参数调优(DaemonSet)
sysctls:name: net.core.somaxconnvalue: "65535"name: net.ipv4.tcp_tw_reusevalue: "1"
3)零拷贝优化
env:name: NGINX_ENABLE_TCP_NOPUSHvalue: "true"
4)优化效果
Pod启动时间缩短至 2s
长连接复用率提升至 95%
单Pod支撑并发连接数突破 50k
22、如何通过火焰图定位 Nginx CPU 热点问题?给出完整诊断流程
1)安装 SystemTap 工具链
yum install systemtap kernel-devel-$(uname -r)
2)采集CPU样本(持续30秒)
stap -v -DMAXSKIPPED=99999 -DSTP_NO_OVERLOAD \ -DMAXTRYLOCK=1000 -DMAXMAPENTRIES=100000 \ -d nginx --ldd -c 'global s; probe process("/usr/sbin/nginx").function("*") { s[probefunc()] <<1; }' \ -o nginx_cpu.flame
3)生成火焰图
git clone https://github.com/brendangregg/FlameGraph./FlameGraph/stackcollapse-stap.pl nginx_cpu.flame | ./FlameGraph/flamegraph.pl > cpu.svg
4)典型问题定位
正则表达式回溯(优化rewrite规则)
阻塞式文件IO(启用aio threads)
第三方模块死锁(检查OpenSSL版本兼容性)
23、你能描述下 Nginx 的匹配方式有哪些,并且它们之间的优先级?
1)精确匹配(Exact Match)
仅匹配完全相同的URI(区分大小写)。
优先级最高,一旦匹配成功,立即停止搜索其他规则。
2)前缀匹配(Prefix Match)
分为两种形式:
① 普通前缀匹配
匹配所有以 /prefix 开头的URI。
优先级低于正则匹配和精确匹配。
②优先前缀匹配(Non-Regular Prefix Match)
location ^~ /static { # 匹配 /static、/static/css 等,且不再检查其他正则规则}
3)正则匹配(Regular Expression Match)
分为两种形式:
①区分大小写的正则匹配
②不区分大小写的正则匹配
使用正则表达式匹配URI,不区分大小写。
同样按配置文件顺序执行,选择第一个匹配的规则。
location ~ \.php$ { }
location ~* \.(jpg|png)$ { }
4)默认匹配(Default Match)
作为兜底规则,匹配所有未被其他规则匹配的URI。
优先级最低,仅在无其他匹配时生效。
优先级总结
| 匹配类型 | 优先级顺序 | 说明 |
location = /uri | | |
location ^~ /prefix |
| |
location ~ \.regex$ | | |
location ~* \.regex$ | | |
location /prefix | | |
location / | | |
server { location = /login { proxy_pass http://backend/login; }
location ^~ /static { root /var/www/static; }
location~ \.php$ { fastcgi_pass php_backend; }
location~* \.(jpg|png)$ { expires30d; }
location / { proxy_pass http://backend; }}
关键注意事项
1)正则匹配顺序:
2)性能优化:
使用 ^~ 前缀匹配替代正则匹配可提升性能;
避免过于复杂的正则表达式(如嵌套回溯)。
3)冲突处理:
4)特殊场景:
以上内容希望可以帮助到大家,在面试中游刃有余,主动出击。
来源丨公众号:云原生运维圈(ID:cloudnativeopscircle)dbaplus社群欢迎广大技术人员投稿,投稿邮箱:editor@dbaplus.cn