我正在 Ubuntu 20 上设置一个 Django 项目和 Apache。下面的设置正确显示了 Django 项目,但是指向服务器 IP 地址的任何 URL 都可用于该项目。我显然需要将其限制在我的特定网站 mysite.com 上。ServerName 被忽略。
我已经看过其他问题/答案。但是,他们通常会提到 httpd.conf,而 Apache 不再使用它。或者,没有可接受的答案。或者,它与我的设置无关。另外,我被告知不要碰 apache2.conf。这是一个全新的安装实例,因此不会出现奇怪的东西。
我最终需要在同一台服务器上提供多个站点的服务。
安装 Apache mod-wsgi:
sudo apt install apache2 apache2-utils ssl-cert libapache2-mod-wsgi
sudo a2enmod rewrite
sudo systemctl restart apache2
设置.conf 文件并激活它:
Copy mysite.com.conf to /etc/apache2/sites-available
sudo a2ensite mysite.com.conf
sudo a2dissite 000-default.conf
sudo systemctl reload apache2
sudo systemctl restart apache2
mysite.com.conf:
<VirtualHost *:80>
WSGIApplicationGroup %{GLOBAL}
WSGIDaemonProcess test_project_ns processes=1 threads=10 python-path=/home/ubuntu/test_project python-home=/home/ubuntu/test_project/test_env
WSGIProcessGroup test_project_ns
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html
ServerName mysite.com
ServerAlias www.mysite.com
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
<Directory /home/ubuntu/test_project/test_ui>
<Files wsgi.py>
Require all granted
</Files>
</Directory>
WSGIScriptAlias / /home/ubuntu/test_project/test_ui/wsgi.py
</VirtualHost>
结果:
mysite.com 正确地提供了 Django 项目,但指向该服务器的任何其他网站也都能正确地提供该服务。
apache2ctl -S 的输出:
VirtualHost configuration:
*:80 mysite.com (/etc/apache2/sites-enabled/mysite.com.conf:1)
ServerRoot: "/etc/apache2"
Main DocumentRoot: "/var/www/html"
Main ErrorLog: "/var/log/apache2/error.log"
Mutex watchdog-callback: using_defaults
Mutex rewrite-map: using_defaults
Mutex default: dir="/var/run/apache2/" mechanism=default
PidFile: "/var/run/apache2/apache2.pid"
Define: DUMP_VHOSTS
Define: DUMP_RUN_CFG
User: name="www-data" id=33 not_used
Group: name="www-data" id=33 not_used
答案1
因此,如果 apache 找不到与 URL 匹配的站点,它将使用第一个虚拟主机,而不管 ServerName 是什么。因此,我在实际虚拟主机之前添加了一个阻止虚拟主机。现在,所有与 ServerName 或 ServerAlias 不匹配的站点都会显示标准禁止消息。
这也适用于多个 site.com.conf 文件。我将阻塞虚拟主机添加到每个文件的顶部,这样当有多个文件时我就不必担心哪个虚拟主机是“第一个”。
<VirtualHost *:80>
<Location />
Deny from all
</Location>
</VirtualHost>
<VirtualHost *:80>
ServerName mysite.com
.....
</VirtualHost>