news 2026/6/9 22:01:27

使用Nginx基于下载的全球瓦片数据本地搭建瓦片底图服务

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
使用Nginx基于下载的全球瓦片数据本地搭建瓦片底图服务

如何你已经有了 按 level(zoom)分类的 JPG或PNG 格式的瓦片数据需要发布瓦片数据
✅ 首选:Nginx /Apache 静态服务器直发
✅ 大规模:TileServer / MBTiles / 对象存储

为什么不用Geoserver?
GeoServer 不适合“管理已经切好的 XYZ/JPG 瓦片” GeoServer 的设计前提是:
原始空间数据 → 动态 / 缓存切片. 而不是: 已切好的瓦片 → 再发布

Nginx(其次 Apache)静态发布就是效率最高、最简单、最稳定的方案,而且这是行业共识,不是“经验之谈”。
静态瓦片请求的理想路径是:
HTTP 请求
→ 内核 sendfile
→ 文件系统页缓存
→ 网卡
❌ 没有 Python / Java
❌ 没有渲染
❌ 没有数据库
❌ 没有坐标计算
👉 IO 直通 = 性能极限

Nginx 的三大杀手级优势

  1. 事件驱动(epoll)
  • 单进程可扛数万并发
  • 非阻塞 IO
  1. sendfile + mmap
  • 文件直接从内核到网卡
  • 零拷贝
  1. 文件系统缓存命中率极高
  • 热瓦片 = 内存直出
  • QPS 几乎只看网卡带宽

一、最终目标

访问方式:
http://127.0.0.1/tiles/{z}/{x}/{y}.jpg
特点:
⚡ 极限性能
📦 零依赖
🔒 可加 HTTPS / 鉴权
🧱 可扩展 CDN

二、准备工作

1. 安装 Nginx

sudo apt update sudo apt install -y nginx

检查:

nginx -v

2. 准备瓦片目录(非常重要)

推荐目录结构

/data/tiles/ └── 0/ └── 0/ └── 0.jpg

即:
/data/tiles/{z}/{x}/{y}.jpg

📌 注意:
目录名必须是数字
文件名只包含 y.jpg

3. 权限设置(很多人卡在这里)

sudo chown -R www-data:www-data /data/tiles sudo chmod -R 755 /data/tiles

三、Nginx 核心配置

1. 新建站点配置

sudo nano /etc/nginx/sites-available/tiles.conf

2.tiles.conf内容

server { listen 80 default_server; listen [::]:80 default_server; # 瓦片根目录 #root /data; # 静态瓦片发布 location /tiles/ { alias /data/tiles/; autoindex on; # 直接命中磁盘文件 try_files $uri =404; # 缓存 1 年(瓦片不可变) expires 365d; add_header Cache-Control "public, immutable"; # 允许跨域 add_header Access-Control-Allow-Origin *; # 关闭访问日志(减少 IO) access_log off; } # 防止误访问根目录 location / { return 404; } }

3. 启用站点

sudo ln -s /etc/nginx/sites-available/tiles.conf /etc/nginx/sites-enabled/ sudo nginx -t sudo systemctl reload nginx

四、系统级性能开关(必须)

编辑主配置:

sudo nano /etc/nginx/nginx.conf

确保这些是 on:

sendfile on; tcp_nopush on; tcp_nodelay on; aio threads;

五、验证是否正常(3 步)
1️⃣ 浏览器访问一个瓦片

http://127.0.0.1/tiles/1/0/0.jpg

✔ 能显示图片 = 成功
2️⃣ 用 curl 看缓存头
curl -I http:///127.0.0.1/tiles/1/0/1.jpg
应看到:
Cache-Control: public, immutable
Expires: …
3️⃣ Leaflet 测试
index.html

<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8" /> <title>Leaflet 双 TileLayer(低分 + ROI 高分)</title> <link rel="stylesheet" href="https://unpkg.com/leaflet@1.9.4/dist/leaflet.css" /> <style> html, body, #map { width: 100%; height: 100%; margin: 0; padding: 0; } </style> </head> <body> <div id="map"></div> <script src="https://unpkg.com/leaflet@1.9.4/dist/leaflet.js"></script> <script> /* ========================= 1️⃣ 地图初始化 ========================= */ const map = L.map('map', { center: [35, 105], // 中国附近 zoom: 4, minZoom: 1, maxZoom: 18 }); /* ========================= 2️⃣ 瓦片 URL ========================= */ const TILE_URL = 'http://127.0.0.1/tiles/{z}/{x}/{y}.jpg'; /* ========================= 3️⃣ 低分全球底图(z ≤ 5) ========================= */ const lowResLayer = L.tileLayer(TILE_URL, { tms: true, // ⚠️ 你的是 TMS minZoom: 1, maxZoom: 18, maxNativeZoom: 5, // 🔑 全球真实瓦片只到 5 attribution: 'Low Resolution Tiles' }); /* ========================= 4️⃣ 高分 ROI 图层(z ≥ 6) ========================= */ const highResLayer = L.tileLayer(TILE_URL, { tms: true, // 同样是 TMS minZoom: 6, // 🔑 6 级开始才请求 maxZoom: 18, opacity: 1.0, attribution: 'High Resolution ROI Tiles' }); /* ========================= 5️⃣ 叠加顺序(关键) ========================= */ // ⚠️ 先加低分,再加高分 lowResLayer.addTo(map); highResLayer.addTo(map); /* ========================= 6️⃣ 调试:点击查看当前级别 ========================= */ map.on('click', (e) => { console.log( `lat=${e.latlng.lat.toFixed(6)}, ` + `lon=${e.latlng.lng.toFixed(6)}, ` + `zoom=${map.getZoom()}` ); }); </script> </body> </html>
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/6 11:43:56

【运维】小回顾

今天早上和大领导沟通完接下来的解决方案之后&#xff0c;顺利解决了客户那边由于服务器断电造成的软件故障&#xff0c;所幸昨天我的失误没有造成生产事故。今天其实还有一次删除的工作要实施&#xff0c;这次谨记昨天的教训&#xff0c;反复验证完待删除文件已备份之后&#…

作者头像 李华
网站建设 2026/6/6 11:13:07

pg_relation_size,pg_table_size,pg_indexes_size,pg_total_relation_size之间的关系

文章目录文档用途详细信息文档用途 本文旨在介绍pg_relation_size,pg_table_size,pg_indexes_size,pg_total_relation_size之间的关系。 详细信息 先通过一个例子来直观的展现一下他们的区别和联系。 存在一张带索引的表t&#xff0c;OID为16384&#xff0c;与该表相关联的…

作者头像 李华
网站建设 2026/6/9 8:23:27

网络安全审计高效指南:手把手教你利用常用工具发现潜在威胁与漏洞

网络安全审计是一种检查和评估网络安全控制措施、策略和程序的有效性的过程。网络安全审计的目标是识别网络中可能存在的安全漏洞&#xff0c;以及制定改进计划以提高网络安全。 1. 网络安全审计的重要性 网络安全审计有助于保护组织的信息资产&#xff0c;防止数据泄露&…

作者头像 李华
网站建设 2026/6/6 11:29:26

2026年1月房产中介管理系统使用体验评测

在房产中介行业数字化转型加速的当下&#xff0c;一款高效实用的房产中介管理系统&#xff0c;能为经纪公司降本增效、提升成交率提供核心支撑。无论是夫妻店、小型团队还是连锁企业&#xff0c;都需依托系统实现房客源、办公流程、营销获客的规范化管理。本次评测精选4款主流房…

作者头像 李华
网站建设 2026/6/6 6:50:44

【改进差分优化算法JaDE】差分进化算法(DE)及其变体自适应权重差分进化算法(JaDE)在CEC2005函数寻优的对比研究附Matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。&#x1f34e; 往期回顾关注个人主页&#xff1a;Matlab科研工作室&#x1f34a;个人信条&#xff1a;格物致知,完整Matlab代码及仿真咨询…

作者头像 李华
网站建设 2026/6/5 0:19:04

收藏!35+程序员转行大模型全攻略:从入门到求职落地,少走90%弯路

在技术迭代日新月异的当下&#xff0c;大模型领域凭借其广阔的应用场景、持续攀升的市场需求以及极具吸引力的薪资待遇&#xff0c;已然成为程序员群体转型的热门优选赛道。对于35岁以上的程序员而言&#xff0c;尽管面临着精力分配失衡、技术代际断层、职场竞争加剧等现实挑战…

作者头像 李华