Python
使用 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 的特定 VirtualHost
你能幫助我嗎?
經過很多困難,我發現了錯誤。
我需要在 ProxyPass 中包含一個例外規則,快捷方式一切正常。
我包括了這一行:
ProxyPass /static! ProxyPass / http://example.com:8000/
這篇文章幫助了我: