# 80 → 301 → 443 server { listen 80; listen [::]:80; server_name app-api.shaguabijia.com; return 301 https://$host$request_uri; } # 443 SSL 反代到本地 uvicorn (127.0.0.1:8770) server { listen 443 ssl http2; listen [::]:443 ssl http2; server_name app-api.shaguabijia.com; ssl_certificate /etc/nginx/ssl/app-api.shaguabijia.com.pem; ssl_certificate_key /etc/nginx/ssl/app-api.shaguabijia.com.key; ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers HIGH:!aNULL:!MD5; ssl_session_cache shared:SSL:10m; # 上传接口(反馈/上报截图、头像)业务上限 = 最多 6 张 × 每张 5MB # (见 app _MAX_IMAGES / AVATAR_MAX_BYTES)≈ 30MB,留余量设 32m。 # 低于此值时带截图的反馈会在到达 uvicorn 前就被 nginx 413,表现为「提交经常失败」 # (纯文字反馈体积小、不受影响 → 呈现为「时好时坏」)。根治仍需客户端上传前压缩。 client_max_body_size 32m; # JSON 响应压缩。nginx 默认 gzip off,且就算 on 了 gzip_types 也只含 text/html、 # gzip_proxied 默认 off(反代来的响应一律不压)—— 三个默认值凑一起 = 我们所有接口都在裸奔。 # 比价记录列表这种一次 50 条、字段名 + 中文店名/菜名高度重复的 JSON,gzip 压缩比稳定在 8~10 倍 # (几百 KB → 几十 KB),弱网下省的就是首屏那几秒。 # 只压 JSON:APK 直链(/media/shaguabijia.apk)、图片本身已是压缩格式,再压纯浪费 CPU。 gzip on; gzip_proxied any; # 反代响应也压(默认 off = 对我们这套反代等于没开) gzip_types application/json; gzip_min_length 1024; # 小响应压了反而更大(gzip 头开销),不值当 gzip_comp_level 5; # 5 是体积/CPU 的常用折中点,再往上收益递减 gzip_vary on; # 给 CDN/中间缓存正确按 Accept-Encoding 分桶 location / { proxy_pass http://127.0.0.1:8770; proxy_http_version 1.1; 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_read_timeout 30s; } }