我在通过uWSGI hunky dory运行的Apache服务器上设置了Django实例。当我使用python manage.py runserver
时,在本地计算机上一切看起来都很完美。不幸的是,当我将文件上传到预先准备好的生产服务器的那一刻,它拒绝加载Django的所有内置静态文件,并返回了404,我不知道为什么...
要查询的网址列为www.mysite.com/static/admin/css/fonts.css
,与管理后端(css/base.css
,css/dashboard.css
和css/responsive.css
)相似。起初,我认为这些软件包可能有问题,因此我强制重新安装了Django,但没有成功。仍未加载...
这是我的uWSGI配置.ini:
[uwsgi]
chdir = /path/to/top/level/mysite
module = mysite.wsgi:application
env = DJANGO_SETTINGS_MODULE=mysite.settings
master = true
pidfile = /path/to/project.pid
socket = 127.0.0.1:49152
; Dont use UNIX sockets as it confuses the proxy and alters the request
: URL's. Current Apache version cant handle it.
; socket=/var/run/swerth_django.sock
processes = 5
harakiri = 20
post-buffering = 1
max-requests = 5000
vacuum = true
home = /path/to/top/level/Virtualenv/directory
daemonize = /path/to/uWSGI.log
env = LANG=en_US.UTF-8
enable-threads = true
我将静态根和url包括如下(注释是我自己的理解):
#The URL of which the static files in STATIC_ROOT directory are served
STATIC_URL = '/static/'
#The absolute path to the directory where ./manage.py collectstatic
# will collect static files for deployment.
STATIC_ROOT = '/home/swerth/public_html/swerth/static'
但是值得一提的是,我目前还没有任何静态文件。我那时还没有发展。我只想使用Django随附的模板。
好,所以我做了一些研究,并设法缩小了范围(感谢@Alasdair指出Django文档中的特定页面)。看来我可以正常运行python manage.py collectstatic
并将其导入所有需要的文件到www.mysite.com/static
中。但是由于某种原因,django dosnt似乎正在“查看”文件,因为它们未在浏览器中呈现(找不到404)。
鉴于此,我假设它在settings.py
中是我的配置?
# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/2.1/howto/static-files/
#The URL of which the static files in STATIC_ROOT directory are
#served
STATIC_URL = '/static/'
#The absolute path to the directory where ./manage.py collectstatic
# will collect static files for deployment.
STATIC_ROOT = os.path.join(BASE_DIR, "static")
STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'static')
]
我的Apache使用以下配置设置为反向代理:
RewriteEngine off
ProxyPreserveHost on
ProxyPass "/" "uwsgi://127.0.0.1:49152/"
ProxyPassReverse "/" "uwsgi://127.0.0.1:49152/"
我做错了什么吗? (请注意,我努力避免不得不编辑HTML文件静态文件链接,因为我真的很想知道我做错了什么,因此不会再发生,因为Django应该可以直接从www.mysite.com/static
开始提供服务)
好吧,所以我按照建议进行了尝试,并尝试设置代理以排除静态目录并仅正常提供文件,并添加了一个别名以将URL映射到实际目录,但是它仍然无法正常工作。它似乎完全忽略了我的ProxyPass
异常并将其发送给Django,即使我将其包含在不太具体的规则之上?有趣的问题是,当我为不太具体的/admin/
指定/
而不是仅ProxyPass
时,它仅代理该URL到Django,但是,突然之间Django为Django启动了404 /admin/
。此外,我尝试提供的静态文件被禁止使用403
?!?!我当前的.conf文件如下所示:
Alias /static/ /home/swerth/public_html/swerth/static/
<Directory /home/swerth/public_html/swerth/static/>
Require all granted
</Directory>
<Directory /home/swerth/public_html/swerth/swerth/>
<Files wsgi.py>
Require all granted
</Files>
</Directory>
ProxyPreserveHost on
ProxyPass /whm-server-status/ !
ProxyPass /static/ !
ProxyPass / uwsgi://127.0.0.1:49152/
ProxyPassReverse / uwsgi://127.0.0.1:49152/
答案 0 :(得分:1)
这可能是因为您尚未设置Apache服务静态文件。尝试执行以下操作
pwd
获取该文件夹的绝对路径。您的情况下看起来像/home/swerth/public_html/swerth/static
。另外,请确保运行Apache httpd进程的用户具有对静态文件夹的读取权限。现在通过执行编辑您的VirtualHost
sudo nano /etc/apache2/sites-available/000-default.confsudo nano /etc/apache2/sites-available/000-default.conf
如果您使用其他配置文件,请用自己的000-default.conf替换。
将以下内容添加到虚拟主机块:
<VirtualHost *:80>
. . .
Alias /static /home/swerth/public_html/swerth/static
<Directory /home/swerth/public_html/swerth/static>
Require all granted
</Directory>
. . .
</VirtualHost>
还要确保将其放在uwsgi <Directory>
部分的上方
4.通过执行sudo systemctl restart apache2
This是一个很好的教程,我发现了如何将Django应用程序部署到生产环境。
希望这会有所帮助。