如何将最新 (2020) Django 安装到 AWS EC2 Linux 2 实例并使用 Apache Hello World 提供服务

Ada*_*ter 5 apache django python-3.x

我缺少什么?这是我第一次尝试使用 Django。Django 中内置的服务器可以在本地很好地提供该文件,但我无法让 Apache 执行相同的操作。以下是我在一个全新的、干净的 Linux 2 实例上所做的事情。

\n
sudo yum update\nsudo yum install -y python3\nsudo yum install httpd-devel\nsudo yum install -y mod_wsgi\ncd /etc/httpd/modules     (verify that mod_wsgi is there)\ncd /var/www/\nsudo mkdir myApp\nsudo chown ec2-user myApp\ncd myApp\nsudo pip3 install virtualenv\nvirtualenv myprojectenv\nsource myprojectenv/bin/activate\nsudo pip3 install django==2.1.1\ndjango-admin startproject myApp\ncd myApp\npython manage.py migrate\npython manage.py runserver\nwget http://127.0.0.1:8000/      (works correctly as it should and I receive test page)\npython manage.py startapp hello\ncd myApp\nvim settings.py\n
Run Code Online (Sandbox Code Playgroud)\n

settings.py:编辑此部分,如下所示:

\n
INSTALLED_APPS = [\n     'django.contrib.admin',\n     'django.contrib.auth',\n     'django.contrib.contenttypes',\n      'django.contrib.sessions',\n      'django.contrib.messages',\n     'django.contrib.staticfiles',\n      'hello.apps.HelloConfig',\n]\n
Run Code Online (Sandbox Code Playgroud)\n

\n
vim urls.py\n
Run Code Online (Sandbox Code Playgroud)\n

urls.py:整个文件如下所示:

\n
from django.contrib import admin\nfrom django.urls import path, include\n\nurlpatterns = [\n    path('admin/', admin.site.urls),\n    path('', include('hello.urls')),\n]\n
Run Code Online (Sandbox Code Playgroud)\n

\n
cd ..\ncd hello\nvim views.py\n
Run Code Online (Sandbox Code Playgroud)\n

views.py:整个文件看起来像这样

\n
from django.shortcuts import render\n# Create your views here.\n\n# hello/views.py\nfrom django.http import HttpResponse\ndef homePageView(request):\nreturn HttpResponse('Hello, World!')\n
Run Code Online (Sandbox Code Playgroud)\n

\n
vim urls.py\n
Run Code Online (Sandbox Code Playgroud)\n

hello/urls.py:整个文件如下所示:

\n
# hello/urls.py\nfrom django.urls import path\nfrom .views import homePageView\n\nurlpatterns = [\n         path('', homePageView, name='home')\n]\n
Run Code Online (Sandbox Code Playgroud)\n

\n
cd ..\npython manage.py runserver\nwget http://127.0.0.1:8000/      (works correctly as it should, now gets \xe2\x80\x9cHello World!\xe2\x80\x9d)\n
Run Code Online (Sandbox Code Playgroud)\n

现在来说说 Apache 部分:

\n
sudo vim /etc/httpd/conf/httpd.conf\n    \n
Run Code Online (Sandbox Code Playgroud)\n

将以下内容粘贴到 httpd.conf 的底部:

\n
WSGIScriptAlias / /var/www/myApp/myApp/myApp/wsgi.py\nWSGIPythonHome /var/www/myApp/myprojectenv\nWSGIPythonPath /var/www/myApp\n\n<Directory /var/www/myApp/myApp/myApp>\n<Files wsgi.py>\nRequire all granted\n</Files>\n</Directory>\n
Run Code Online (Sandbox Code Playgroud)\n

\n
sudo service httpd restart\nwget http://127.0.0.1\n
Run Code Online (Sandbox Code Playgroud)\n

正在连接到 127.0.0.1:80...已连接。\nHTTP 请求已发送,正在等待响应...

\n

这就是它所做的一切,直到超时。通过浏览器连接到公共IP地址也可以做同样的事情;它连接并只是坐在那里等待响应。

\n

Apache 错误日志 (/var/log/httpd/error_log) 如下所示:

\n
Django ImportError: No module named site\n
Run Code Online (Sandbox Code Playgroud)\n

快速搜索表明这是因为 mod_wsgi 使用的 python 版本与我的虚拟环境不同。我使用的是python3.7

\n
cd /etc/httpd/modules\nldd mod_wsgi.so\n
Run Code Online (Sandbox Code Playgroud)\n

输出

\n
    linux-vdso.so.1 (0x00007ffd7dec3000)\n    libpython2.7.so.1.0 => /lib64/libpython2.7.so.1.0 (0x00007fe35815d000)\n    libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fe357f3f000)\n    libdl.so.2 => /lib64/libdl.so.2 (0x00007fe357d3b000)\n    libutil.so.1 => /lib64/libutil.so.1 (0x00007fe357b38000)\n    libm.so.6 => /lib64/libm.so.6 (0x00007fe3577f8000)\n    libc.so.6 => /lib64/libc.so.6 (0x00007fe35744d000)\n    /lib64/ld-linux-x86-64.so.2 (0x00007fe358755000)\n
Run Code Online (Sandbox Code Playgroud)\n

显然这是一个不同的版本。我已经卸载了它,并在python3.7虚拟环境中重新安装了它,但结果是一样的。它仍然显示“libpython2.7.so.1.0 => /lib64/libpython2.7.so.1.0”。

\n

Ada*_*ter 2

最终,这里的问题是让 Python 使用正确/新版本的 sqlite3。事实证明,位于 /var/log/httpd/error_log 的错误日志对于故障排除非常有用(令人惊讶)。

\n

在搜索其他问答时,我发现了很多涉及 LD_LIBRARY_PATH 和 LD_RUN_PATH 的答案。然而,通过更深入的研究,我发现这些并不是指示编译器了解库路径的首选方法。如下所示,改为使用 ldconfig,以及放置在 /etc/ld.so.conf.d/ 目录中的 .conf 文件。

\n

以下是获取 Apache 提供的最新 Django 的分步说明;从新的 Linux 2 EC2 实例开始。

\n
sudo yum update\nsudo su\nyum groupinstall "Development Tools"\ncrtl-d\nsudo yum -y install libffi-devel\nsudo yum install -y openssl-devel\nsudo vim /etc/ld.so.conf.d/usrlocal.conf\n
Run Code Online (Sandbox Code Playgroud)\n

在您创建的这个空文件中,添加:

\n
/usr/local/lib\n/usr/local/lib64\n
Run Code Online (Sandbox Code Playgroud)\n

下一个:

\n
sudo ldconfig -v\ncd ~\nmkdir downloads\ncd downloads\nwget https://sqlite.org/2020/sqlite-autoconf-3320300.tar.gz\ntar -xvf sqlite-autoconf-3320300.tar.gz\ncd sqlite-autoconf-3320300\n./configure --prefix=/usr/local\nmake -L\nsudo make install\nsudo ldconfig -v\ncd ~downloads\nwget https://www.python.org/ftp/python/3.7.7/Python-3.7.7.tgz\ntar -xvf Python-3.7.7.tgz\ncd Python-3.7.7\n./configure --enable-shared --enable-optimizations --with-threads --enable-loadable-sqlite-extensions --with-openssl=/usr/local/lib64\nsudo make -L\nsudo make altinstall        (altinstall keeps old 2.7 version)\nsudo ldconfig -v\npython 3.7                  (to verify installation ctrl-d to quit)\n>>>import sqlite3\n>>> sqlite3.sqlite_version\nctrl-d\nsudo chown -R ec2-user /usr/local/lib/python3.7\nsudo chown ec2-user /usr/local/bin\nsudo chown ec2-user /usr/local/lib\nsudo yum install httpd-devel\nsudo ldconfig -v\ncd /var/www/\nsudo mkdir django\nsudo chown ec2-user django\ncd django\npip3.7 install virtualenv\nvirtualenv myprojectenv\nsource myprojectenv/bin/activate\npython -c 'import sys; print(sys.prefix)'\npip3.7 install mod_wsgi           \nmod_wsgi-express module-config\n
Run Code Online (Sandbox Code Playgroud)\n

这将输出类似下面的内容。您将复制该内容并将其粘贴到 httpd.conf 文件的底部。sudo vim /etc/httpd/conf/httpd.conf

\n
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"\nWSGIPythonHome "/var/www/django/myprojectenv"\n
Run Code Online (Sandbox Code Playgroud)\n

下一个:

\n
pip3.7 install Django==3.0.7\ndjango-admin startproject myApp\ncd myApp\npython manage.py migrate\npython manage.py startapp hello\ncd myApp\nvim wsgi.py\n
Run Code Online (Sandbox Code Playgroud)\n

编辑为如下所示(添加 \xe2\x80\x98import sys\xe2\x80\x99 和 \xe2\x80\x98sys.path\xe2\x80\xa6\xe2\x80\xa6.\xe2\x80\x99)

\n
import os\nimport sys\nfrom django.core.wsgi import get_wsgi_application\n\nos.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myApp.settings')\nsys.path.append('/var/www/myApp/myApp/myApp')\nsys.path.append('/var/www/myApp/myApp')\n\napplication = get_wsgi_application()\n
Run Code Online (Sandbox Code Playgroud)\n

下一个:

\n
vim settings.py\n
Run Code Online (Sandbox Code Playgroud)\n

编辑如下所示,替换您的 EC2 实例公共 IP

\n
    ALLOWED_HOSTS = ['xx.xxx.xx.xxx']     (substitute your EC2 public IP address)\n\n    INSTALLED_APPS = [\n     'django.contrib.admin',\n     'django.contrib.auth',\n     'django.contrib.contenttypes',\n      'django.contrib.sessions',\n      'django.contrib.messages',\n     'django.contrib.staticfiles',\n      'hello.apps',\n     ]\n\n\nvim urls.py\nfrom django.contrib import admin\nfrom django.urls import path, include\n\nurlpatterns = [\n    path('admin/', admin.site.urls),\n    path('', include('hello.urls')),\n]\n
Run Code Online (Sandbox Code Playgroud)\n

下一个:

\n
cd ../hello\nvim views.py\n
Run Code Online (Sandbox Code Playgroud)\n

编辑如下所示。这些是 Python 文件。所以,请注意你的缩进

\n
from django.shortcuts import render\n# Create your views here.\n\n# hello/views.py\nfrom django.http import HttpResponse\ndef homePageView(request):\n    return HttpResponse('Hello, World!')\n
Run Code Online (Sandbox Code Playgroud)\n

您将创建下一个文件。

\n
vim urls.py\n
Run Code Online (Sandbox Code Playgroud)\n

粘贴:

\n
# hello/urls.py\nfrom django.urls import path\nfrom .views import homePageView\n\nurlpatterns = [\n    path('', homePageView, name='home')\n]\n
Run Code Online (Sandbox Code Playgroud)\n

现在回到阿帕奇:

\n
sudo vim /etc/httpd/conf/httpd.conf\n    \n
Run Code Online (Sandbox Code Playgroud)\n

将以下内容粘贴到 httpd.conf 的底部:

\n
WSGIScriptAlias / /var/www/django/myApp/myApp/wsgi.py\nWSGIPythonPath /var/www/django\n\n<Directory /var/www/django/myApp/myApp>\n<Files wsgi.py>\nRequire all granted\n</Files>\n</Directory>\n
Run Code Online (Sandbox Code Playgroud)\n

\n
sudo service httpd start\n
Run Code Online (Sandbox Code Playgroud)\n

此时,您应该能够向实例的公共 IP 发出请求并获得 \xe2\x80\x9cHello World!\xe2\x80\x9d 响应。

\n

最后:

\n
sudo su\nvim /var/log/httpd/error_log\n
Run Code Online (Sandbox Code Playgroud)\n

和中提琴,你有一些新问题需要解决!

\n