Apache,mod-wsgi:任何 URL 都由项目提供服务,ServerName 被忽略

Apache,mod-wsgi:任何 URL 都由项目提供服务,ServerName 被忽略

我正在 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>

相关内容