这是我在社区中的第一个问题,如果我写错了,我提前道歉
我用 Python(Django)开发了一个应用程序,在质量环境中,我使用 gunicorn 来提供部署:gunicorn --bind 0.0.0.0:8000 application.wsgi --daemon
在同一台服务器上,我使用 Apache 监听端口 443(https://)并通过代理将请求重定向到 Gunicorn,如下所示:
<VirtualHost *:443>
ServerName example.com
ProxyRequests Off
ProxyPreserveHost On
<Proxy *>
Require all granted
Allow from all
</Proxy>
ProxyPass / http://example.com:8000/
ProxyPassReverse / http://example.com:8000/
# SSL
SSLEngine On
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
#Include conf-available
SSLCertificateFile /etc/letsencrypt/live/example.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem
Include /etc/letsencrypt/options-ssl-apache.conf
</VirtualHost>
一切都运行正常,除了静态文件外,我可以通过 https 访问它。
我按照文档的建议,执行了命令collectstatic
,文件就在我配置的 settings.py 文件夹 (/static) 中生成了
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'static/')
我利用已经安装了 Apache 的事实,尝试在同一个 VirtualHost 中为 /static 目录添加一个别名,如下所示:
Alias /static "/home/ubuntu/example/static/"
<Directory "/home/ubuntu/example/static">
Order allow,deny
Allow from all
Require all granted
</Directory>
VirtualHost 的完整配置如下:
<VirtualHost *:443>
ServerName example.com
Alias /static "/home/ubuntu/example/static/"
<Directory "/home/ubuntu/example/static">
Order allow,deny
Allow from all
Require all granted
</Directory>
ProxyRequests Off
ProxyPreserveHost On
<Proxy *>
Require all granted
Allow from all
</Proxy>
ProxyPass / http://example.com:8000/
ProxyPassReverse / http://example.com:8000/
# SSL
SSLEngine On
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
#Include conf-available
SSLCertificateFile /etc/letsencrypt/live/example.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem
Include /etc/letsencrypt/options-ssl-apache.conf
</VirtualHost>
但是,当我尝试访问此目录中的文件时,我总是得到一个:
未找到 – 未在此服务器上找到所请求的资源。
我分析了 error.log 和 access.log,甚至没有在日志中看到该请求。
将相同的别名添加到端口 80 上的另一个虚拟主机,它可以正常工作。我认为问题在于将此别名添加到端口 443 的特定虚拟主机
你能帮助我吗?
答案1
经过一番努力,我终于发现了错误。
我需要在 ProxyPass 中包含一个例外规则,使用快捷方式一切都很好。
我添加了这一行:
ProxyPass /static!
ProxyPass / http://example.com:8000/
这篇文章对我有帮助: