使用 Python、Apache(代理)和 SSL 的静态文件

使用 Python、Apache(代理)和 SSL 的静态文件

这是我在社区中的第一个问题,如果我写错了,我提前道歉

我用 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/

这篇文章对我有帮助:

如何向 Apache 反向代理规则添加例外

相关内容