Python

使用 Python、Apache(代理)和 SSL 的靜態文件

  • March 16, 2021

這是我在社區的第一個問題,如果我寫錯了,我提前道歉

我在 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 的特定 VirtualHost

你能幫助我嗎?

經過很多困難,我發現了錯誤。

我需要在 ProxyPass 中包含一個例外規則,快捷方式一切正常。

我包括了這一行:

ProxyPass /static!
ProxyPass / http://example.com:8000/

這篇文章幫助了我:

如何向 apache 反向代理規則添加例外

引用自:https://serverfault.com/questions/1057302