虚拟主机无法在不同的端口上工作

虚拟主机无法在不同的端口上工作

我正在尝试在运行 centos7.1 的单台服务器上托管我的网站。我能够在端口上进行虚拟主机,80 但当我将端口更改为时second-site8080它指向first-site。但是,对于 URL,http://62.210.xx.xx:8080/它工作正常,指向second-site

我正在这样做:

httpd配置文件

Listen 80
Listen 8080

also tried 
Listen 0.0.0.0:80
Listen 0.0.0.0:8080
but same

commented out for apache 2.4
#NameVirtualHost 62.210.xx.xx:80
#NameVirtualHost 62.210.xx.xx:8080

ServerAdmin root@localhost

#first-site.com
<VirtualHost 62.210.xx.xx:80>
ServerName first-site.com
ServerAlias www.first-site.com
DocumentRoot /var/www/first-site
</VirtualHost>

#second-site.com
<VirtualHost 62.210.xx.xx:8080>
ServerName second-site.com
ServerAlias www.second-site.com
DocumentRoot /var/www/second-site
</VirtualHost>


netstat -tulpn | grep httpd
tcp6       0      0 :::80                   :::*                    LISTEN      25253/httpd
tcp6       0      0 :::8080                 :::*                    LISTEN      25253/httpd


/etc/host/
62.210.xx.xx www.first-site.com first-site.com www.second-site.com second-site.com

/usr/sbin/httpd -t
AH00548: NameVirtualHost has no effect and will be removed in the next release /etc/httpd/conf/httpd.conf:46
Syntax OK

更新

apachectl -S
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, 
using 62.210.xx.xx. Set the 'ServerName' directive globally to suppress this message
VirtualHost configuration:
62.210.xx.xx:8080      m.second-site.com (/etc/httpd/conf/httpd.conf:427)
62.210.xx.xx:80        is a NameVirtualHost
     default server first-site.com (/etc/httpd/conf/httpd.conf:363)
     port 80 namevhost first-site.com (/etc/httpd/conf/httpd.conf:363)
             alias www.first-site.com
     port 80 namevhost image.first-site.com (/etc/httpd/conf/httpd.conf:3                                                                             77)
     port 80 namevhost m.first-site.com (/etc/httpd/conf/httpd.conf:389)
     port 80 namevhost second-site.com (/etc/httpd/conf/httpd.conf:401)
             alias www.second-site.com
     port 80 namevhost image.second-site.com (/etc/httpd/conf/httpd.conf:415)
     port 80 namevhost third-site.com (/etc/httpd/conf/httpd.conf:439)
             alias www.third-site.com
     port 80 namevhost image.third-site.com (/etc/httpd/conf/httpd.conf:453)
ServerRoot: "/etc/httpd"
Main DocumentRoot: "/var/www/html"
Main ErrorLog: "/etc/httpd/logs/error_log"
Mutex proxy: using_defaults
Mutex authn-socache: using_defaults
Mutex default: dir="/run/httpd/" mechanism=default
Mutex mpm-accept: using_defaults
Mutex fcgid-pipe: using_defaults
Mutex authdigest-opaque: using_defaults
Mutex proxy-balancer-shm: using_defaults
Mutex rewrite-map: using_defaults
Mutex authdigest-client: using_defaults
Mutex fcgid-proctbl: using_defaults
PidFile: "/run/httpd/httpd.pid"
Define: DUMP_VHOSTS
Define: DUMP_RUN_CFG
User: name="xxxxxxx" id=1000
Group: name="root" id=0

答案1

正如 Inigo Flores 已经指出的那样,这是默认的 apache 行为。

在浏览器中输入 second-site.com,它将始终连接到端口 80。如果要访问其他端口,则需要在 URL 中指定它,例如 second-site.com:8080

如果您想访问像 second-site.com 这样的网站,使用不同的端口是没有意义的。

答案2

尝试使该Listen语句与您的相匹配VirtualHost

如果您只想绑定到公共 IP 62.210.xx.xx,请在任何地方使用它。

Listen 62.210.xx.xx:80
Listen 62.210.xx.xx:8080

<VirtualHost 62.210.xx.xx:80>
  ServerName first-site.com
  ServerAlias www.first-site.com
  DocumentRoot /var/www/first-site
</VirtualHost>

<VirtualHost 62.210.xx.xx:8080>
  ServerName second-site.com
  ServerAlias www.second-site.com
  DocumentRoot /var/www/second-site
</VirtualHost>

- 或者 -

如果要绑定到该服务器上的所有接口,请使用通配符。

Listen 80
Listen 8080

<VirtualHost *:80>
  ServerName first-site.com
  ServerAlias www.first-site.com
  DocumentRoot /var/www/first-site
</VirtualHost>

<VirtualHost *:8080>
  ServerName second-site.com
  ServerAlias www.second-site.com
  DocumentRoot /var/www/second-site
</VirtualHost>

本质上,该Listen语句告诉 apache 绑定到该 IP/端口。指定 0.0.0.0:80 将仅监听 ipv4 地址。仅指定端口号将绑定到端口 80 上的所有接口。

类似地,当SYN数据包进来时,VirtualHost语句会尝试根据Listen语句进行匹配。

答案3

您需要确定使用的是基于名称的虚拟主机还是基于 IP/端口的虚拟主机。您目前将两者混淆在一起了。

如果您要将服务器放在自己的端口上,则不应定义NameVirtualHost这些端口。当您为请求到达的主机和端口定义这些端口时,apache 会根据和选择要使用的虚拟主机servername配置serveraliases

我不清楚当虚拟主机块使用不同的 IP/端口定义时,Apache 是否准备根据域名选择虚拟主机。您所描述的听起来可能就是正在发生的事情。

在您的/etc/hosts文件中,您指定了first-site.comsecond-site.com。这两个都不是定义的虚拟主机,因为对于它们您使用前缀www.。如果您使用基于名称的虚拟主机,您可能希望将ServerAlias指令添加到虚拟主机块中。同时,您的开头段落对您所指的网站使用了无用的简写 - 您最好将其更改为引用您遇到问题的确切 URL。

答案4

62.210.xx.xx 是您的服务器的 IP 还是服务器前的 NAT IP?您必须在 VirtualHost 上拥有服务器的真实 IP,并且如果服务器上有多个 IP,则必须拥有请求所来自的 IP。

相关内容