You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Rocky Linux 9上GeoDjango切换PostGIS引擎触发libgeos.py MemoryError

解决Rocky Linux 9上GeoDjango切换PostGIS引擎后的MemoryError问题

问题场景

在Rocky Linux 9上基于Apache部署的GeoDjango项目,使用标准PostgreSQL引擎时运行正常,但切换到PostGIS后端('ENGINE': 'django.contrib.gis.db.backends.postgis')后触发以下MemoryError:

File "/home/centurion/centurion_web/.venv/lib/python3.12/site-packages/django/contrib/gis/db/backends/postgis/base.py", line 7, in <module>
from .adapter import PostGISAdapter
File "/home/centurion/centurion_web/.venv/lib/python3.12/site-packages/django/contrib/gis/db/backends/postgis/adapter.py", line 5, in <module>
from django.contrib.gis.geos import GEOSGeometry
File "/home/centurion/centurion_web/.venv/lib/python3.12/site-packages/django/contrib/gis/geos/__init__.py", line 5, in <module>
from .collections import (  # NOQA
File "/home/centurion/centurion_web/.venv/lib/python3.12/site-packages/django/contrib/gis/geos/collections.py", line 5, in <module>
from django.contrib.gis.geos import prototypes as capi
File "/home/centurion/centurion_web/.venv/lib/python3.12/site-packages/django/contrib/gis/geos/prototypes/__init__.py", line 7, in <module>
from django.contrib.gis.geos.prototypes.coordseq import (  # NOQA
File "/home/centurion/centurion_web/.venv/lib/python3.12/site-packages/django/contrib/gis/geos/prototypes/coordseq.py", line 3, in <module>
from django.contrib.gis.geos.libgeos import CS_PTR, GEOM_PTR, GEOSFuncFactory
File "/home/centurion/centurion_web/.venv/lib/python3.12/site-packages/django/contrib/gis/geos/libgeos.py", line 88, in <module>
notice_h = NOTICEFUNC(notice_h)
^^^^^^^^^^^^^^^^^^^^
MemoryError

Windows开发环境使用runserver运行正常,已尝试设置GEOS_LIBRARY_PATH、GDAL_LIBRARY_PATH及降级Django至4.2,问题未解决。

解决方案

1. 安装系统级地理空间依赖包

Rocky Linux 9上的GeoDjango依赖系统级的GEOS、GDAL和PostGIS库,需确保这些包已正确安装:

sudo dnf install geos geos-devel gdal gdal-devel postgis postgresql15-postgis3

注意:PostgreSQL版本需与项目使用的版本匹配,若项目用PostgreSQL 14则替换为postgresql14-postgis3

2. 配置Apache环境变量

Apache运行时的环境上下文与用户shell不同,需在项目的Apache配置文件中显式指定GEOS和GDAL库路径:

  1. 编辑Apache配置文件(如/etc/httpd/conf.d/centurion_web.conf),添加以下内容:
SetEnv GEOS_LIBRARY_PATH /usr/lib64/libgeos_c.so
SetEnv GDAL_LIBRARY_PATH /usr/lib64/libgdal.so
  1. 重启Apache服务:
sudo systemctl restart httpd

3. 重新安装虚拟环境中的依赖包

虚拟环境中的Python可能因系统库变更导致依赖包兼容性问题,需重新安装相关组件:

  1. 激活虚拟环境:
source /home/centurion/centurion_web/.venv/bin/activate
  1. 卸载并重新安装依赖:
pip uninstall -y django psycopg2-binary django-contrib-gis
pip install django==4.2 psycopg2-binary django-contrib-gis

4. 检查SELinux权限

Rocky Linux默认启用SELinux,可能阻止Apache访问地理空间库:

  • 临时关闭SELinux测试:
sudo setenforce 0

若问题解决,需添加永久SELinux规则:

sudo semanage fcontext -a -t httpd_sys_content_t '/usr/lib64/libgeos_c.so'
sudo semanage fcontext -a -t httpd_sys_content_t '/usr/lib64/libgdal.so'
sudo restorecon -v /usr/lib64/libgeos_c.so /usr/lib64/libgdal.so

原因说明

Windows开发环境中,GeoDjango相关包通常自带预编译的GEOS/GDAL二进制文件,无需依赖系统库;而Linux环境下需依赖系统级库,若库缺失、路径未正确配置或权限受限,会导致Python加载库时触发内存错误。

内容的提问来源于stack exchange,提问作者rocketman521

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 19:30:27