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库路径:
- 编辑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
- 重启Apache服务:
sudo systemctl restart httpd
3. 重新安装虚拟环境中的依赖包
虚拟环境中的Python可能因系统库变更导致依赖包兼容性问题,需重新安装相关组件:
- 激活虚拟环境:
source /home/centurion/centurion_web/.venv/bin/activate
- 卸载并重新安装依赖:
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
相关产品推荐
相关产品推荐

