我错过了什么?这是我第一次尝试使用 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.7cd /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.confLoadModule 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/