Lit*_*ain 5 python django passenger reactjs webpack
我正在尝试在 Digital Ocean 液滴上部署使用 Django/Redux/React/Webpack 构建的 Web 应用程序。我在部署服务器上使用 Phusion Passenger 和 Nginx。
我使用 create-react-app 来构建一个 Django 应用程序,它有一个使用 React/Redux 的前端和一个使用 django-rest-framework 的后端 api。我使用npm run build.
Django 应用程序配置为在 frontend/build 文件夹中查找其文件,一切都按预期工作,包括身份验证。它基于本教程:http : //v1k45.com/blog/modern-django-part-1-setting-up-django-and-react/
在 settings.py 中:
ALLOWED_HOSTS = ['*']
TEMPLATES = [
...
'DIRS': [
os.path.join(BASE_DIR, 'frontend/build'),
],
...
]
STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'frontend/build/static'),
]
Run Code Online (Sandbox Code Playgroud)
在我的开发机器上,我激活了一个 Python 3.6 虚拟环境并运行./manage.py runserver,应用程序显示在 localhost:3000。
在部署服务器上,我将文件克隆到 var/www/ 中的文件夹中并构建了前端。
我已经根据带有文件passenger_wsgi.py的文档设置了Passenger:
import myapp.wsgi
application = myapp.wsgi.application
Run Code Online (Sandbox Code Playgroud)
wsgi.py 文件位于下面的 djangoapp 文件夹中:
import os
from django.core.wsgi import get_wsgi_application
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myapp.settings')
application = get_wsgi_application()
Run Code Online (Sandbox Code Playgroud)
乘客文档仅涵盖单部分应用程序:
https://www.phusionpassenger.com/library/walkthroughs/start/python.html https://www.phusionpassenger.com/library/walkthroughs/deploy/python/digital_ocean/nginx/oss/xenial/deploy_app.html https: //www.phusionpassenger.com/library/deploy/wsgi_spec.html
我已经尝试将教程第 1 部分的代码直接克隆到我的服务器上并按照说明运行它。我通过添加"proxy": "http://localhost:8000"到 frontend/package.json 让它在服务器上工作。如果我运行 Django 服务器,./manage.py runserver --settings=ponynote.production_settings xxx.x.x.x:8000
那么应用程序将在 myserver:8000 上正确提供。然而,Passenger 仍然没有提供正确的文件。
我已将 wsgi.py 更改为这样说:
import os
from django.core.wsgi import get_wsgi_application
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "myapp.production_settings")
application = get_wsgi_application()
Run Code Online (Sandbox Code Playgroud)
现在,Passenger 在 URL 根处提供的页面似乎具有指向 js 文件的正确链接,例如“text/javascript”src="/static/bundles/js/main.a416835a.js,但这些链接不起作用:预期的 js 不存在。Passenger 无法从 static/bundles/js 提供 js 文件,即使 Django 服务器可以找到它们。
非常感谢任何帮助或想法。
缺少的关键设置是乘客配置文件中的“位置”设置。
尽管 Django 服务器提供静态文件,包括 React 应用程序的构建文件,但 Nginx 除了“公共”目录中的静态文件外看不到任何静态文件。
因此,要将使用 Webpack 构建的 Django 应用程序部署到生产环境,您需要告诉 Nginx 这些文件。如果您使用的是 Passenger,这些设置可能位于单独的 Passenger 配置文件中。“alias”是在文件夹名称与“static”(网页链接指向的位置)不同的情况下使用的命令。
如果您的应用程序使用虚拟环境,则需要指定 Passenger 可以在哪里找到正确的 Python 可执行文件。
/etc/nginx/sites-enabled/myapp.conf
server {
listen 80;
server_name xx.xx.xx.xx;
# Tell Passenger where the Python executable is
passenger_python /var/www/myapp/venv36/bin/python3.6;
# Tell Nginx and Passenger where your app's 'public' directory is
# And where to find wsgi.py file
root /var/www/myapp/myapp/myapp;
# Tell Nginx where Webpack puts the bundle folder
location /static/ {
autoindex on;
alias /var/www/myapp/myapp/assets/;
}
# Turn on Passenger
passenger_enabled on;
}
Run Code Online (Sandbox Code Playgroud)
Passenger 使用 wsgi.py 文件作为应用程序的入口点。您需要一个比 wsgi.py 文件高一级的 Passenger_wsgi.py 文件。这告诉 Passenger 在哪里可以找到 wsgi.py 文件。
/var/www/myapp/myapp/passenger_wsgi.py
import myapp.wsgi
application = myapp.wsgi.application
Run Code Online (Sandbox Code Playgroud)
/var/www/myapp/myapp/myapp/wsgi.py
如果您使用单独的 production_settings.py 文件,请确保在此处指定该文件。
import os
from django.core.wsgi import get_wsgi_application
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "myapp.production_settings")
application = get_wsgi_application()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2293 次 |
| 最近记录: |