Ubuntu下Apache部署Django的SSL连接配置及站点访问异常排查
问题拆解与分步修复方案
咱们一步步来解决你遇到的三个核心问题:HTTPS访问时暴露文件目录结构、HTTP与HTTPS无法同时正常服务,以及Apache端口与Django路径的配置对齐。
1. 解决HTTPS显示文件结构的问题
当前配置下Apache列出目录,大概率是这几个原因导致的,咱们逐个排查修复:
- 先禁用目录索引模块:如果
mod_autoindex模块启用,当没有默认索引文件时,Apache就会自动列出目录。执行以下命令禁用它:sudo a2dismod autoindex sudo systemctl restart apache2 - 检查WSGI配置文件的有效性:你设置的
WSGIScriptAlias / /var/www/html/django/django.wsgi必须指向一个正确配置的wsgi文件。如果这个文件不存在或者配置错误,Apache就无法加载Django,转而显示目录。标准的django.wsgi内容应该是这样的(替换你的项目名为实际Django项目名称):import os import sys sys.path.append('/var/www/html/django') os.environ.setdefault('DJANGO_SETTINGS_MODULE', '你的项目名.settings') from django.core.wsgi import get_wsgi_application application = get_wsgi_application() - 修正静态文件Alias配置:你当前把
/static/指向了/template/,这明显不对——Django的静态文件应该对应collectstatic命令生成的静态文件目录,一般是/var/www/html/django/static/。修改这部分配置:Alias /static/ "/var/www/html/django/static/" <Directory "/var/www/html/django/static/"> Order deny,allow Allow from all Require all granted </Directory> - 在目录配置中禁用索引:在Django项目的
Directory块里明确加上Options -Indexes,强制Apache不显示目录列表:<Directory /var/www/html/django> WSGIProcessGroup example.com WSGIApplicationGroup %{GLOBAL} Order deny,allow Allow from all Require all granted Options -Indexes # 禁止目录列表 </Directory>
2. 配置HTTP(8080端口)与HTTPS同时访问
你已经把Apache默认端口改成8080,但当前配置里只有443的VirtualHost,这就是两个协议无法同时访问的原因。咱们先调整端口监听,再添加8080的配置:
- 修改Apache端口监听:编辑
/etc/apache2/ports.conf,确保同时监听8080和443:Listen 8080 Listen 443 - 添加8080端口的VirtualHost:这里有两种方案,根据你的需求选择:
方案A:HTTP自动重定向到HTTPS(推荐)
这种方案更安全,也不用维护两份相同的配置,用户访问http://example.com:8080会自动跳转到https://example.com:
<VirtualHost *:8080> ServerName example.com Redirect permanent / https://example.com/ </VirtualHost>
方案B:同时保留HTTP和HTTPS访问
如果必须同时提供两个协议的服务,就把HTTPS的配置复制一份到8080的VirtualHost,去掉SSL相关的配置项:
<VirtualHost *:8080> ServerName example.com WSGIDaemonProcess example.com threads=5 WSGIScriptAlias / /var/www/html/django/django.wsgi WSGIProcessGroup example.com Alias /static/ "/var/www/html/django/static/" <Directory "/var/www/html/django/static/"> Order deny,allow Allow from all Require all granted </Directory> <Location "/media"> SetHandler None </Location> <LocationMatch "\.(jpg|gif|png|js|css)$"> SetHandler None </LocationMatch> <Directory /var/www/html/django> WSGIProcessGroup example.com WSGIApplicationGroup %{GLOBAL} Order deny,allow Allow from all Require all granted Options -Indexes </Directory> </VirtualHost>
3. 确保目录权限正确
Apache运行用户(通常是www-data)需要有Django项目目录的访问权限,执行以下命令修复权限:
sudo chown -R www-data:www-data /var/www/html/django sudo chmod -R 755 /var/www/html/django
4. 验证配置并重启服务
所有修改完成后,先检查Apache配置是否有语法错误:
sudo apache2ctl configtest
如果输出Syntax OK,就重启Apache服务使配置生效:
sudo systemctl restart apache2
做完这些步骤后,HTTPS访问应该会正常加载Django内容而不是目录列表,同时HTTP(8080端口)也能正常工作(要么重定向,要么加载Django)。
内容的提问来源于stack exchange,提问作者Chandan Sharma
相关产品推荐
相关产品推荐

