Gunicorn访问静态文件时抛出403错误
Gunicorn throws error 403 when accessing static files
python==2.7.5
、django==1.11.10
、gunicorn==19.7.1
、RHEL 7.4
我的工作中有一个 django
项目不是我写的。
它位于 eventcat
用户的主目录中,随着时间的推移,我们 运行 磁盘上的可用 space 已用完。我要将项目移动到 /data/
。
在我移动项目目录并设置新环境后,我遇到了静态文件未加载并抛出 403 forbidden
错误的问题。
嗯,我知道 gunicorn
不应该在生产环境中提供静态文件,但这是一个低负载的内部项目。我必须按原样处理。
服务器使用自写脚本启动(我将环境行更改为新路径):
#!/bin/sh
. ~/.bash_profile
. /data/eventcat/env/bin/activate
exec gunicorn -c gunicorn.conf.py eventcat.wsgi:application
gunicorn.conf.py
包括:
bind = '127.0.0.1:8000'
backlog = 2048
workers = 1
worker_class = 'sync'
worker_connections = 1000
timeout = 120
keepalive = 2
spew = False
daemon = True
pidfile = 'eventcat.pid'
umask = 0
user = None
group = None
tmp_upload_dir = None
errorlog = 'er.log'
loglevel = 'debug'
accesslog = 'ac.log'
access_log_format = '%(h)s %(l)s %(u)s %(t)s "%(r)s" %(s)s %(b)s "%(f)s" "%(a)s"'
proc_name = None
def post_fork(server, worker):
server.log.info("Worker spawned (pid: %s)", worker.pid)
def pre_fork(server, worker):
pass
def pre_exec(server):
server.log.info("Forked child, re-executing.")
def when_ready(server):
server.log.info("Server is ready. Spawning workers")
def worker_int(worker):
worker.log.info("worker received INT or QUIT signal")
import threading, sys, traceback
id2name = dict([(th.identm, th.name) for th in threading.enumerate()])
code = []
for threadId, stack in sys._current_frames().items():
code.append("\n# Thread: %s(%d)" % (id2name.get(threadId, ""), threadId))
for filename, lineno, name, line in traceback.exctract_stack(stack):
code.append('File: "%s", line %d, in %s' %(filename, lineno, name))
if line:
code.append(" %s" % (line.strip()))
worker.log.debug("\n".join(code))
def worker_abort(worker):
worker.log.info("worker received SIGABRT signal")
static
目录中的所有文件都属于 eventcat
用户,就像目录本身一样。
我在 er.log
和 ac.log
.
中找不到任何有用的信息
服务器是 运行 https
协议,项目目录中有一个 ssl.conf
。它有 static
和 media
的别名指向以前的项目位置,我将所有这些条目更改为新条目。虽然我找不到这个配置文件在哪里使用。
请告诉我如何找出问题的原因。我应该查看哪些配置文件或其他内容?
更新:
感谢@ruddra,gunicorn
根本没有提供静态服务。那是 httpd
。在 httpd 配置中进行更改后,一切正常。
据我所知,gunicorn 不提供静态内容。因此,要提供静态内容,最好在使用 NGINX 的部署中使用 whitenoise or you can use NGINX, Apache or any reverse proxy server. You can check Gunicorn's documentation。
如果您想使用 whitenoise,请使用以下方式安装:
pip install whitenoise
然后像这样(在 settings.py
内)向 MIDDLEWARES
添加白噪声:
MIDDLEWARE = [
# 'django.middleware.security.SecurityMiddleware',
'whitenoise.middleware.WhiteNoiseMiddleware',
# ...
]
python==2.7.5
、django==1.11.10
、gunicorn==19.7.1
、RHEL 7.4
我的工作中有一个 django
项目不是我写的。
它位于 eventcat
用户的主目录中,随着时间的推移,我们 运行 磁盘上的可用 space 已用完。我要将项目移动到 /data/
。
在我移动项目目录并设置新环境后,我遇到了静态文件未加载并抛出 403 forbidden
错误的问题。
嗯,我知道 gunicorn
不应该在生产环境中提供静态文件,但这是一个低负载的内部项目。我必须按原样处理。
服务器使用自写脚本启动(我将环境行更改为新路径):
#!/bin/sh
. ~/.bash_profile
. /data/eventcat/env/bin/activate
exec gunicorn -c gunicorn.conf.py eventcat.wsgi:application
gunicorn.conf.py
包括:
bind = '127.0.0.1:8000'
backlog = 2048
workers = 1
worker_class = 'sync'
worker_connections = 1000
timeout = 120
keepalive = 2
spew = False
daemon = True
pidfile = 'eventcat.pid'
umask = 0
user = None
group = None
tmp_upload_dir = None
errorlog = 'er.log'
loglevel = 'debug'
accesslog = 'ac.log'
access_log_format = '%(h)s %(l)s %(u)s %(t)s "%(r)s" %(s)s %(b)s "%(f)s" "%(a)s"'
proc_name = None
def post_fork(server, worker):
server.log.info("Worker spawned (pid: %s)", worker.pid)
def pre_fork(server, worker):
pass
def pre_exec(server):
server.log.info("Forked child, re-executing.")
def when_ready(server):
server.log.info("Server is ready. Spawning workers")
def worker_int(worker):
worker.log.info("worker received INT or QUIT signal")
import threading, sys, traceback
id2name = dict([(th.identm, th.name) for th in threading.enumerate()])
code = []
for threadId, stack in sys._current_frames().items():
code.append("\n# Thread: %s(%d)" % (id2name.get(threadId, ""), threadId))
for filename, lineno, name, line in traceback.exctract_stack(stack):
code.append('File: "%s", line %d, in %s' %(filename, lineno, name))
if line:
code.append(" %s" % (line.strip()))
worker.log.debug("\n".join(code))
def worker_abort(worker):
worker.log.info("worker received SIGABRT signal")
static
目录中的所有文件都属于 eventcat
用户,就像目录本身一样。
我在 er.log
和 ac.log
.
服务器是 运行 https
协议,项目目录中有一个 ssl.conf
。它有 static
和 media
的别名指向以前的项目位置,我将所有这些条目更改为新条目。虽然我找不到这个配置文件在哪里使用。
请告诉我如何找出问题的原因。我应该查看哪些配置文件或其他内容?
更新:
感谢@ruddra,gunicorn
根本没有提供静态服务。那是 httpd
。在 httpd 配置中进行更改后,一切正常。
据我所知,gunicorn 不提供静态内容。因此,要提供静态内容,最好在使用 NGINX 的部署中使用 whitenoise or you can use NGINX, Apache or any reverse proxy server. You can check Gunicorn's documentation。
如果您想使用 whitenoise,请使用以下方式安装:
pip install whitenoise
然后像这样(在 settings.py
内)向 MIDDLEWARES
添加白噪声:
MIDDLEWARE = [
# 'django.middleware.security.SecurityMiddleware',
'whitenoise.middleware.WhiteNoiseMiddleware',
# ...
]