python-3.x - 如何将最新 (2020) Django 安装到 AWS EC2 Linux 2 实例并使用 Apache Hello World 服务

标签 python-3.x django apache

我错过了什么?这是我第一次尝试使用 Django。内置在 Django 中的服务器可以很好地在本地提供文件,但我不能让 Apache 做同样的事情。以下是我在一个全新的、干净的 Linux 2 实例中所做的事情。

sudo yum update
sudo yum install -y python3
sudo yum install httpd-devel
sudo yum install -y mod_wsgi
cd /etc/httpd/modules     (verify that mod_wsgi is there)
cd /var/www/
sudo mkdir myApp
sudo chown ec2-user myApp
cd myApp
sudo pip3 install virtualenv
virtualenv myprojectenv
source myprojectenv/bin/activate
sudo pip3 install django==2.1.1
django-admin startproject myApp
cd myApp
python manage.py migrate
python manage.py runserver
wget http://127.0.0.1:8000/      (works correctly as it should and I receive test page)
python manage.py startapp hello
cd myApp
vim settings.py
settings.py:编辑这部分看起来像这样:
INSTALLED_APPS = [
     'django.contrib.admin',
     'django.contrib.auth',
     'django.contrib.contenttypes',
      'django.contrib.sessions',
      'django.contrib.messages',
     'django.contrib.staticfiles',
      'hello.apps.HelloConfig',
]
.
vim urls.py
urls.py:整个文件如下所示:
from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('hello.urls')),
]
.
cd ..
cd hello
vim views.py
views.py:整个文件看起来像这样
from django.shortcuts import render
# Create your views here.

# hello/views.py
from django.http import HttpResponse
def homePageView(request):
return HttpResponse('Hello, World!')
.
vim urls.py
hello/urls.py:整个文件如下所示:
# hello/urls.py
from django.urls import path
from .views import homePageView

urlpatterns = [
         path('', homePageView, name='home')
]
.
cd ..
python manage.py runserver
wget http://127.0.0.1:8000/      (works correctly as it should, now gets “Hello World!”)
现在对于 Apache 部分:
sudo vim /etc/httpd/conf/httpd.conf
    
将以下内容粘贴到 httpd.conf 的底部:
WSGIScriptAlias / /var/www/myApp/myApp/myApp/wsgi.py
WSGIPythonHome /var/www/myApp/myprojectenv
WSGIPythonPath /var/www/myApp

<Directory /var/www/myApp/myApp/myApp>
<Files wsgi.py>
Require all granted
</Files>
</Directory>
.
sudo service httpd restart
wget http://127.0.0.1
连接到 127.0.0.1:80... 已连接。
已发送 HTTP 请求,等待响应...
这就是它所做的一切,直到它超时。通过浏览器连接到公共(public) IP 地址做同样的事情;它连接并坐在那里等待响应。
Apache 错误日志 (/var/log/httpd/error_log) 说:
Django ImportError: No module named site
快速搜索表明这是因为 mod_wsgi 使用的 python 版本与我的虚拟环境不同。我正在使用python3.7
cd /etc/httpd/modules
ldd mod_wsgi.so
输出
    linux-vdso.so.1 (0x00007ffd7dec3000)
    libpython2.7.so.1.0 => /lib64/libpython2.7.so.1.0 (0x00007fe35815d000)
    libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fe357f3f000)
    libdl.so.2 => /lib64/libdl.so.2 (0x00007fe357d3b000)
    libutil.so.1 => /lib64/libutil.so.1 (0x00007fe357b38000)
    libm.so.6 => /lib64/libm.so.6 (0x00007fe3577f8000)
    libc.so.6 => /lib64/libc.so.6 (0x00007fe35744d000)
    /lib64/ld-linux-x86-64.so.2 (0x00007fe358755000)
显然这是一个不同的版本。我已经卸载了它,在python3.7虚拟环境中重新安装了它,但结果是一样的。它仍然显示“libpython2.7.so.1.0 =>/lib64/libpython2.7.so.1.0”。

最佳答案

最终,这里的问题是让 Python 使用正确/新版本的 sqlite3。位于/var/log/httpd/error_log 的错误日志证明对故障排除非常有用(惊喜)。
在搜索其他问答时,我发现了很多涉及 LD_LIBRARY_PATH 和 LD_RUN_PATH 的答案。然而,随着更深入的研究,我发现这些并不是指导编译器了解库路径的首选方法。如下所示,使用 ldconfig 以及放置在/etc/ld.so.conf.d/目录中的 .conf 文件。
以下是获取 Apache 提供的最新 Django 的分步说明;从一个新的 Linux 2 EC2 实例开始。

sudo yum update
sudo su
yum groupinstall "Development Tools"
crtl-d
sudo yum -y install libffi-devel
sudo yum install -y openssl-devel
sudo vim /etc/ld.so.conf.d/usrlocal.conf
在您创建的这个空文件中,添加:
/usr/local/lib
/usr/local/lib64
下一个:
sudo ldconfig -v
cd ~
mkdir downloads
cd downloads
wget https://sqlite.org/2020/sqlite-autoconf-3320300.tar.gz
tar -xvf sqlite-autoconf-3320300.tar.gz
cd sqlite-autoconf-3320300
./configure --prefix=/usr/local
make -L
sudo make install
sudo ldconfig -v
cd ~downloads
wget https://www.python.org/ftp/python/3.7.7/Python-3.7.7.tgz
tar -xvf Python-3.7.7.tgz
cd Python-3.7.7
./configure --enable-shared --enable-optimizations --with-threads --enable-loadable-sqlite-extensions --with-openssl=/usr/local/lib64
sudo make -L
sudo make altinstall        (altinstall keeps old 2.7 version)
sudo ldconfig -v
python 3.7                  (to verify installation ctrl-d to quit)
>>>import sqlite3
>>> sqlite3.sqlite_version
ctrl-d
sudo chown -R ec2-user /usr/local/lib/python3.7
sudo chown ec2-user /usr/local/bin
sudo chown ec2-user /usr/local/lib
sudo yum install httpd-devel
sudo ldconfig -v
cd /var/www/
sudo mkdir django
sudo chown ec2-user django
cd django
pip3.7 install virtualenv
virtualenv myprojectenv
source myprojectenv/bin/activate
python -c 'import sys; print(sys.prefix)'
pip3.7 install mod_wsgi           
mod_wsgi-express module-config
这将输出如下内容。您将复制它并将其粘贴到 httpd.conf 文件的底部。须藤 vim/etc/httpd/conf/httpd.conf
LoadModule wsgi_module "/var/www/django/myprojectenv/lib/python3.7/site-packages/mod_wsgi/server/mod_wsgi-py37.cpython-37m-x86_64-linux-gnu.so"
WSGIPythonHome "/var/www/django/myprojectenv"
下一个:
pip3.7 install Django==3.0.7
django-admin startproject myApp
cd myApp
python manage.py migrate
python manage.py startapp hello
cd myApp
vim wsgi.py
编辑成如下所示(添加“import sys”和“sys.path……。”)
import os
import sys
from django.core.wsgi import get_wsgi_application

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myApp.settings')
sys.path.append('/var/www/myApp/myApp/myApp')
sys.path.append('/var/www/myApp/myApp')

application = get_wsgi_application()
下一个:
vim settings.py
编辑为如下所示,替换您的 EC2 实例公共(public) IP
    ALLOWED_HOSTS = ['xx.xxx.xx.xxx']     (substitute your EC2 public IP address)

    INSTALLED_APPS = [
     'django.contrib.admin',
     'django.contrib.auth',
     'django.contrib.contenttypes',
      'django.contrib.sessions',
      'django.contrib.messages',
     'django.contrib.staticfiles',
      'hello.apps',
     ]


vim urls.py
from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('hello.urls')),
]
下一个:
cd ../hello
vim views.py
编辑为如下所示。这些是 Python 文件。所以,注意你的缩进
from django.shortcuts import render
# Create your views here.

# hello/views.py
from django.http import HttpResponse
def homePageView(request):
    return HttpResponse('Hello, World!')
您将创建下一个文件。
vim urls.py
粘贴:
# hello/urls.py
from django.urls import path
from .views import homePageView

urlpatterns = [
    path('', homePageView, name='home')
]
现在回到 Apache:
sudo vim /etc/httpd/conf/httpd.conf
    
将以下内容粘贴到 httpd.conf 的底部:
WSGIScriptAlias / /var/www/django/myApp/myApp/wsgi.py
WSGIPythonPath /var/www/django

<Directory /var/www/django/myApp/myApp>
<Files wsgi.py>
Require all granted
</Files>
</Directory>
.
sudo service httpd start
此时,您应该能够向实例的公共(public) IP 发出请求并获得“Hello World!”回复。
最后:
sudo su
vim /var/log/httpd/error_log
和中提琴,你有一些新问题要解决!

关于python-3.x - 如何将最新 (2020) Django 安装到 AWS EC2 Linux 2 实例并使用 Apache Hello World 服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62531052/

相关文章:

Python raw_input 不工作

python - 为什么collections.deque的rotate()方法具有线性时间复杂度?

python - 根据值在 Admin 中自定义 Django 表单字段

mysql - OperationalError,Django 无法连接到 MySQL 数据库

python - 网关超时在 Apache 上使用 Django 和 mod_wsgi

php - 德鲁帕尔 7 : Sharing authentication with HTTP-Auth

python-3.x - MemoryError : Unable to allocate 30. 4 GiB,用于具有形状(725000、277、76)和数据类型 float64 的数组

python - Tkinter:为按钮和标签制作 'classes'

python - 在 django 中,如何从初始化脚本中调用子命令 'syncdb'?

php - 无法在 cent os 6.4 中启用 SOAP(最终版)