如何在CentOS7的Apache服务器同时运行WSGI应用与常规网站?
核心问题分析
从你提供的配置和日志来看,httpme.tk访问时跳转到mniek.ru,主要是虚拟主机配置的匹配逻辑和细节问题导致的,我们逐一拆解排查:
1. VirtualHost端口配置不明确
你的http_error_api.conf中使用了<VirtualHost *>,而mniek.ru的配置明确指定了<VirtualHost *:80>和<VirtualHost *:443>。Apache在匹配虚拟主机时,会优先选择端口定义更精确的配置;同时,你的Flask应用配置里还沿用了Apache 2.2的旧权限语法,可能导致目录访问规则不生效,间接引发请求 fallback 到默认站点。
2. 虚拟主机加载与匹配优先级
虽然http_error_api.conf文件名以h开头会先于mniek.ru.conf加载,但如果前者的配置存在语法或规则问题,Apache会自动忽略这个虚拟主机,所有未匹配的请求就会落到第一个有效的虚拟主机(也就是mniek.ru的配置)上。
具体修复步骤
步骤1:修正Flask应用的虚拟主机配置
打开/etc/httpd/conf.d/http_error_api.conf,修改以下两处:
# 把模糊的端口改为明确的80端口 <VirtualHost *:80> ServerName www.httpme.tk ServerAlias httpme.tk WSGIDaemonProcess application user=apache group=apache threads=5 WSGIScriptAlias / /var/www/http_error_api/wsgi.py WSGIScriptReloading On <Directory /var/www/http_error_api> WSGIProcessGroup application WSGIApplicationGroup %{GLOBAL} # 替换Apache 2.2的旧语法为2.4的标准权限规则 Require all granted </Directory> </VirtualHost>
步骤2:确认DNS解析正确性
确保httpme.tk和www.httpme.tk的A记录已经指向你的VPS IP 0.0.26.144。本地可以通过以下命令验证:
ping httpme.tk nslookup httpme.tk
如果解析结果不是你的VPS IP,需要先修改域名的DNS配置。
步骤3:检查Apache配置语法并重启
运行命令验证所有配置文件的语法是否正确:
httpd -t
如果输出Syntax OK,则重启Apache服务使配置生效:
systemctl restart httpd
如果有语法错误,根据提示修正对应的配置问题(比如括号不闭合、指令拼写错误等)。
步骤4:验证虚拟主机匹配效果
使用curl命令测试请求头,确认httpme.tk是否匹配到正确的虚拟主机:
curl -I http://httpme.tk
如果返回的响应头中包含Flask应用的特征(比如自定义的X-Powered-By字段),说明配置已经生效。
额外优化:消除全局ServerName警告
日志中反复出现的AH00558警告,可以通过在/etc/httpd/conf/httpd.conf中添加全局ServerName解决:
ServerName 0.0.26.144:80
或者使用你的主域名ServerName mniek.ru:80,这不会影响虚拟主机运行,但能消除日志中的冗余警告。
内容的提问来源于stack exchange,提问作者Никита Шишкин

