【问题标题】:Configuring Amazon Elastic Beanstalk with PostGIS使用 PostGIS 配置 Amazon Elastic Beanstalk
【发布时间】:2013-06-23 23:01:47
【问题描述】:

有没有人有使用 PostGIS 设置 Amazon Elastic Beanstalk 的经验(以便我可以利用 Geodjango)?

默认设置(RDS,以 MySQL 为特色)目前不支持开箱即用的许多功能: 1. PostgreSQL + PostGIS 2.能够安装GEOS、Proj.4等C/C++库

提前致谢

【问题讨论】:

    标签: postgresql amazon-web-services postgis amazon-elastic-beanstalk geodjango


    【解决方案1】:

    如果您想将 geodjango 与 Amazon Elastic Beanstalk 一起使用,您需要创建一个自定义 AMI,您可以在其中安装 PostGIS,然后在启动时将您的 Elastic Beanstalk 应用程序指向该 AMI。

    这是一个很好的tutorial on how to customize an EBS AMI。还有一个AWS tutorial for that,但我发现第一个更容易理解。在我的自定义 AMI 上,我从源代码安装了 geos、gdal、proj4 和 postgis,并使用 yum install postgres 安装了 postgres。以下是我用来将所有库安装到 AMI 中的命令。

    为了让 django 应用程序找到库,我还在 AWS EBS 控制台中设置了一个额外的环境变量。在我的环境的菜单栏中,我转到配置 --> 软件配置并通过添加属性LD_LIBRARY_PATH设置为/usr/local/lib/:$LD_LIBRARY_PATH来编辑环境属性。 p>

    由于beanstalk应用实例不打算自己运行数据库,所以我还建立了一个Amazon RDS Postgres托管数据库,这是一个相对较新的服务,它支持PostGIS。

    如果你把所有这些放在一起,你应该得到一个非常可扩展的 GeoDjango 应用程序!

    sudo yum install postgresql postgresql-devel postgresql-server postgresql9-contrib gcc gcc-c++ make libtool curl libxml2 libxml2-devel python-devel
    
    wget http://download.osgeo.org/proj/proj-4.8.0.zip
    unzip proj-4.8.0.zip
    cd proj-4.8.0
    ./configure
    make
    sudo make install
    cd ..
    
    wget http://download.osgeo.org/geos/geos-3.4.2.tar.bz2
    tar -xvf geos-3.4.2.tar.bz2
    cd geos-3.4.2
    ./configure
    make
    sudo make install
    cd ..
    
    wget http://download.osgeo.org/gdal/1.10.1/gdal1101.zip
    unzip gdal1101.zip
    cd gdal-1.10.1
    ./configure --with-python=yes
    make
    sudo make install
    cd ..
    
    wget http://download.osgeo.org/postgis/source/postgis-2.1.1.tar.gz
    tar -xvf postgis-2.1.1.tar.gz
    cd postgis-2.1.1
    ./configure
    make
    sudo make install
    

    【讨论】:

    • 应该LD_LIBRARYPATH 是LD_LIBRARY_PATH 吗?进行此更改后,它对我有用。
    • 是的,你是对的。那是一个错字。感谢指出,刚刚更新了答案。
    • 同时您也可以使用 Docker 来运行您的应用程序。因此,此处描述的自定义 AWS AMI 的替代方法是构建一个安装了 postgis 的 Docker 映像并通过它运行您的应用程序。在此处阅读有关 Docker 和 EB 的更多信息aws.amazon.com/about-aws/whats-new/2014/04/23/…
    • 当实例出现时,您可以利用 ebextensions 为您安装软件包,请参阅此问题:stackoverflow.com/questions/27177327/…
    • 我无法让 python 绑定工作,例如from osgeo import gdal...ModuleNotFoundError: No module named 'osgeo'。我已经按照建议在环境中设置了LD_LIBRARY_PATH,并确认使用gdal-config --version 在EC2 实例上安装了gdal。有什么建议吗?
    【解决方案2】:

    您也可以不使用自定义 AMI,只需使用 ebextensions。我使用 Amazon Instance (2013.09) ami-35792c5c 对此进行了测试,因此请使用该实例而不是较新的实例。如果您完成了Django in Elastic Beanstalk 101,您就会了解 ebextensions。下面的 ebextensions 将很快开始,您可以使用以下 ebextensions。只需将以下内容放在存储库底部的 .ebextensions 文件夹中。我还在这些配置文件中包含了 postgres 9.3 和 memcached:

    00_repo_ostgis.config:

    files:
      "/etc/yum.repos.d/pgdg-93-redhat.repo":
        mode: "000644"
        owner: root
        group: root
        content: |
          [pgdg93]
          name=PostgreSQL 9.3 $releasever - $basearch
          baseurl=http://yum.postgresql.org/9.3/redhat/rhel-6-$basearch
          enabled=1
          gpgcheck=1
          gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-PGDG-93
    
          [pgdg93-source]
          name=PostgreSQL 9.3 $releasever - $basearch - Source
          failovermethod=priority
          baseurl=http://yum.postgresql.org/srpms/9.3/redhat/rhel-6-$basearch
          enabled=0
          gpgcheck=1
          gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-PGDG-93
    
    commands:
      epel_repo:
        command: yum-config-manager -y --enable epel
      remi_repo:
        command: yum-config-manager -y --enable remi
    
    packages:
      rpm:
        pgdg-redhat93-9.3-1: 'http://yum.postgresql.org/9.3/redhat/rhel-6-x86_64/pgdg-redhat93-9.3-1.noarch.rpm'
        remi: 'http://rpms.famillecollet.com/enterprise/remi-release-6.rpm'
        qt4-devel: 'http://mirror.centos.org/centos/6/os/x86_64/Packages/qt-4.6.2-28.el6_5.x86_64.rpm'
    

    01_app_postgis.config:

    packages:
      yum:
        libtiff-devel: ''
        libjpeg-devel: ''
        libzip-devel: ''
        freetype-devel: ''
        postgresql-devel: ''
        gdal: ''
        gdal-python: ''
        geos: ''
        proj: ''
        libmemcached: ''
        libmemcached-devel: ''
        cyrus-sasl-devel: ''
        zlib-devel: ''
    
    container_commands:
      01_collectstatic:
        command: 'PYTHONPATH=.:..:../lib cd site/<your_project> && ./manage.py collectstatic -c --noinput && cd ../..'
        leader_only: true
      02_migrate:
        command: 'PYTHONPATH=.:..:../lib cd site/<your_project> && ./manage.py migrate --noinput && cd ../..'
        leader_only: true
    
    option_settings:
      - namespace: aws:elasticbeanstalk:container:python
        option_name: WSGIPath
        value: site/<your_project>/wsgi.py
      - namespace: aws:elasticbeanstalk:container:python:staticfiles
        option_name: /static/
        value: site/<your_project>/static/
      - option_name: DJANGO_SETTINGS_MODULE
        value: settings_prod
    

    我的项目结构有点不同。我的设置文件和 urls.py 我移动到了项目目录的根目录,所以我不得不更改 wsgi.py 中设置的路径。所以相应地调整它。只需使用您之前使用的 container_commands 和 option_settings。

    您的 requirements.txt 文件应至少包含:

    Django==1.7.1
    Pillow
    psycopg2
    

    我将大多数其他 python 依赖项存储在我的 PYTHONPATH 中包含的 ../lib 中,所以我的 repo 结构是这样的:

    <your_project>/
    ├── requirements.txt
    ├── .ebextensions/
    │   ├── 00_repos_postgis.config
    │   └── 01_app_postgis.config
    └── site/
        ├── <your_project>
        │   ├── wsgi.py
        │   ├── settings_prod.py  # used for EB, like settings_local.py but uses env vars
        │   └── settings.py
        └── lib/
            └── <all pip dependencies>
    

    查看我构建的部署工具,它使用了结构。我从 EB CLI 工具中获取了我喜欢的内容并进行了调整,直到它为 django 量身定制:https://github.com/radlws/django-awseb-tasks

    注意:启动环境时使用 AMI ami-35792c5c 非常重要。它是唯一一个对我有用的设置。如果其他实例有效,请随时将它们编辑到此答案中。另见my original question。

    【讨论】:

      【解决方案3】:

      如果您想使用 radtek 的解决方案并想使用最新的 Amazon AMI (2014.9),您可能会遇到依赖问题。 This 为我解决了这个问题。

      【讨论】:

        【解决方案4】:

        正如我提到的 here 我对 2017.03 图像的解决方案是:

        commands:
          01_yum_update:
            command: sudo yum -y update
          02_epel_repo:
            command: sudo yum-config-manager -y --enable epel
          03_install_gdal_packages:
            command: sudo yum -y install gdal gdal-devel
        
        files:
          "/etc/httpd/conf.d/wsgihacks.conf":
            mode: "000644"
            owner: root
            group: root
            content: |
              WSGIPassAuthorization On
        
        packages:
          yum:
            git: []
            postgresql95-devel: []
            gettext: []
            libjpeg-turbo-devel: []
            libffi-devel: []
        

        【讨论】:

          【解决方案5】:

          打开您的 aws beanstalk 的 ssh shell。一步一步执行下面的命令。您将获得工作 postgis。

          cd /home/ec2-user
          
          sudo yum -y install gcc gcc-c++ make cmake libtool libcurl-devel libxml2-devel rubygems swig fcgi-devel libtiff-devel freetype-devel curl-devel libpng-devel giflib-devel libjpeg-devel cairo-devel freetype-devel readline-devel openssl-devel python27 python27-devel
          
          # PROJ
          wget http://download.osgeo.org/proj/proj-4.8.0.tar.gz
          tar -zxvf proj-4.8.0.tar.gz
          cd proj-4.8.0
          ./configure
          make
          sudo make install
          cd ..
          
          # GEOS
          wget http://download.osgeo.org/geos/geos-3.4.2.tar.bz2
          tar -xvf geos-3.4.2.tar.bz2
          cd geos-3.4.2
          ./configure
          make
          sudo make install
          cd ..
          
          # GDAL
          wget http://download.osgeo.org/gdal/1.10.1/gdal-1.10.1.tar.gz
          tar -zxvf gdal-1.10.1.tar.gz
          cd gdal-1.10.1
          ./configure
          make
          sudo make install
          cd ..
          
          # PostGIS
          wget http://download.osgeo.org/postgis/source/postgis-2.1.0.tar.gz
          tar -xvf postgis-2.1.0.tar.gz
          cd postgis-2.1.0
          ./configure
          make
          sudo make install
          cd ..
          

          然后创建一个符号链接:

          ln -s /usr/local/lib/libgdal.so /usr/lib/libgdal.so.1
          /sbin/ldconfig
          

          【讨论】:

            【解决方案6】:

            这里是 python3 gdal 绑定 将在 AWS EB 实例中工作的替代答案。 pygdal 是“标准 GDAL python 绑定的virtualenv 和 setuptools 友好版本”的一个不错的包,但不支持 1.7.3,这是使用 sudo yum -y install gdal gdal-devel 安装的 gdal 版本,例如 this answer。

            因此,我必须安装更新的 gdal 并设置链接以配合它。此方法借鉴了yellowcap’s、radek’s 和其他各种 Stackoverflow 帖子中的信息。

            作为yellowcap said,您必须设置环境变量以建立所需的库链接。在 AWS EB 控制台中,配置 --> 软件配置,编辑环境属性,添加: LD_LIBRARY_PATH  = “/usr/local/lib/:$LD_LIBRARY_PATH”

            LD_PRELOAD = ”/usr/lib/libgdal.so.1

            将以下内容放入存储库底部的 .ebextensions 文件夹中:

            django.config:

            option_settings:
              "aws:elasticbeanstalk:application:environment":
                DJANGO_SETTINGS_MODULE: “<your project>.settings.server_settings"
                PYTHONPATH: "$PYTHONPATH"
              "aws:elasticbeanstalk:container:python":
                WSGIPath: “<your project>/wsgi.py"
              "aws:elasticbeanstalk:container:python:staticfiles":
                "/static/": "www/static/"
            
            commands:
              01_yum_update:
                command: sudo yum -y update
              02_pip_upgrade:
                command: /opt/python/run/venv/bin/pip install --upgrade pip
                ignoreErrors: false
            
            packages:
              yum:
                postgresql95-devel: []
                git: []
                libffi-devel: []
            
            container_commands:
              01_migrate:
                command: "python manage.py migrate"
                leader_only: true
              02_collectstatic:
                command: "source /opt/python/run/venv/bin/activate && python manage.py collectstatic --noinput”
            

            gdal.config

            files:
             "/opt/elasticbeanstalk/hooks/appdeploy/pre/01_install_gdal_prerequisites.sh":
                mode: "000755"
                owner: root
                group: root
                content: |
                    #!/usr/bin/env bash
            
                    sudo yum install -y gcc-c++ gcc libpng libtiff postgresql95-devel git libffi-devel libxml2-devel libxslt-devel htop
            
                    wget http://download.osgeo.org/proj/proj-4.9.3.tar.gz
                    tar -zvxf proj-4.9.3.tar.gz
                    cd proj-4.9.3
                    ./configure
                    make -j 2
                    sudo make install
                    cd ..
                    rm proj-4.9.3.tar.gz
            
                    wget http://download.osgeo.org/gdal/2.3.2/gdal-2.3.2.tar.gz
                    tar -zvxf gdal-2.3.2.tar.gz
                    cd gdal-2.3.2
                    ./configure --with-static-proj4=/usr/local/lib --with-python --with-threads --with-pg=/usr/bin/pg_config
                    make -j 2
                    sudo make install
                    cd ..
                    rm gdal-2.3.2.tar.gz
            
                    ln -s /usr/local/lib/libgdal.so /usr/lib/libgdal.so.1
                    sudo ldconfig
            

            在 requirements.py 中包含 pygdal 包

            pygdal==2.3.2.4
            

            您必须确保 gdal 版本号与 pygdal 版本号匹配,请参阅pygdal documentation。

            结果

            以下适用于您的 django 项目所在的 EC2 实例虚拟环境:

            $ python manage.py shell
            In [1]: from osgeo import gdal
            
            In [2]: 
            

            【讨论】:

              猜你喜欢
              • 2015-02-23
              • 2018-02-27
              • 2014-04-24
              • 2018-10-13
              • 2021-11-26
              • 2017-03-18
              • 2019-09-24
              • 2013-04-01
              • 2014-12-15
              相关资源
              最近更新 更多