nginx配置压缩和智能分发


Nginx配置优化:压缩与智能分发

概述

本文档详细分析前后端分离Django项目的Nginx配置,重点介绍压缩优化和智能分发策略。

配置结构分析

双Server块设计

# 主站点服务器 - example.com
server {
    listen 80;
    server_name example.com;
    # 配置内容...
}

# 管理后台服务器 - admin.example.com  
server {
    listen 80;
    server_name admin.example.com;
    # 配置内容...
}

设计优势

  • 基于域名进行流量分发
  • 主站和管理后台分离,提高安全性
  • 相同端口不同服务,简化部署

智能压缩配置

1. 响应压缩(建议添加)

# 在http上下文中添加(nginx.conf主配置文件)
gzip on;
gzip_vary on;
gzip_min_length 1024;
gzip_types
    text/plain
    text/css
    text/xml
    text/javascript
    application/javascript
    application/xml+rss
    application/json
    image/svg+xml;

2. 客户端压缩支持检测

# 可添加的智能压缩检测
map $http_accept_encoding $gzip_extension {
    default     "";
    "~*gzip"    ".gz";
}

智能分发策略

1. WebP智能图片分发

# WebP支持检测映射
map $http_accept $webp_suffix {
    default   "";
    "~*webp"  ".webp";
}

# 应用WebP智能分发
location ~* \.(png|jpg|jpeg)$ {
    try_files $uri$webp_suffix $uri =404;
    add_header Vary Accept;
}

工作机制

  • 检测客户端Accept头是否包含”webp”
  • 优先返回WebP格式图片(体积更小)
  • 回退到原始格式保证兼容性

2. 路径智能路由

# API请求路由到Django后端
location ~ ^/(api|ckeditor)/ {
    proxy_pass http://web:8000;
    # 代理配置...
}

# 静态资源服务
location / {
    root /usr/share/nginx/html;
    try_files $uri $uri/ $uri.html /index.html;
}

# 媒体文件处理
location /media/ {
    alias /app/media/;
}

缓存控制策略

1. 开发环境禁用缓存

# 完全禁用缓存配置
sendfile off;
tcp_nopush off;
tcp_nodelay on;
add_header Cache-Control "no-cache, no-store, must-revalidate";
add_header Pragma "no-cache";
add_header Expires "0";
etag off;
proxy_cache off;
proxy_buffering off;

2. 生产环境缓存建议

# 生产环境推荐配置
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ {
    expires 1y;
    add_header Cache-Control "public, immutable";
}

location / {
    try_files $uri $uri/ /index.html;
    add_header Cache-Control "no-cache";
}

安全优化配置

1. 文件上传限制

client_max_body_size 50M;  # 防止大文件攻击

2. 管理路径隐藏

# 隐藏原始admin路径
location ~ ^/admin(/|$) {
    return 500;
}

3. 独立管理后台域名

server_name admin.example.com;  # 管理后台独立域名

性能优化配置

1. 连接超时设置

proxy_connect_timeout 30s;
proxy_send_timeout 30s;
proxy_read_timeout 30s;

2. WebSocket支持

proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";

URL重写优化

1. 无扩展名访问

# 重定向.html到无扩展名URL
location ~ \.html$ {
    rewrite ^(.*)\.html$ $scheme://$http_host$1 permanent;
}

修复问题:保留原始请求的端口信息,避免重定向后端口丢失。

健康检查与监控

location /health {
    access_log off;
    return 200 "healthy\n";
    add_header Content-Type text/plain;
}

Docker部署注意事项

1. 静态文件路径映射

# 前端静态文件
root /usr/share/nginx/html;

# Django静态文件  
alias /app/staticfiles/;

# 媒体文件
alias /app/media/;

2. 服务发现配置

# Docker容器间通信
proxy_pass http://web:8000;

完整优化配置示例

# 压缩配置
gzip on;
gzip_vary on;
gzip_min_length 1024;
gzip_comp_level 6;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml image/svg+xml;

# WebP智能检测
map $http_accept $webp_suffix {
    default   "";
    "~*webp"  ".webp";
}

server {
    # 基础配置...
    
    # 智能压缩与分发
    location ~* \.(js|css|html)$ {
        gzip_static on;
        brotli_static on;
        expires 1h;
        add_header Cache-Control "public";
    }
    
    # 图片智能分发
    location ~* \.(png|jpg|jpeg)$ {
        try_files $uri$webp_suffix $uri =404;
        expires 1M;
        add_header Cache-Control "public, immutable";
        add_header Vary Accept;
    }
}

总结

本配置实现了:

  • 智能压缩:根据客户端支持自动选择最优格式
  • 路径分发:基于请求路径智能路由到不同服务
  • 缓存优化:开发环境实时更新,生产环境长期缓存
  • 安全防护:文件上传限制、管理路径隐藏
  • 性能调优:连接超时、WebSocket支持等
  • Docker友好:容器化部署最佳实践

这种配置方案特别适合前后端分离项目,在保证开发效率的同时提供生产级性能。


文章作者: Mealsee
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Mealsee !
  目录