我想使用以下命令运行一个并排运行的 Python 3.* 和 PHP 7.* 服务器:
php.localhost
py.localhost
我的/etc/httpd/conf/httpd.conf
:
# Dynamic Shared Object (DSO) Support
LoadModule wsgi_module modules/mod_wsgi.so
LoadModule php7_module modules/libphp7.so
AddHandler php7-script php
Include conf/extra/php7_module.conf
WSGIScriptAlias / /var/www/python/app.py
ServerName localhost
# Virtual hosts
Include conf/extra/httpd-vhosts.conf
完整httpd.conf
文件这里。
我的/etc/httpd/conf/extra/httpd-vhosts.conf
:
<VirtualHost *:80>
ServerAdmin [email protected]
DocumentRoot "/var/www/php"
ServerName php
ServerAlias php.localhost
ErrorLog "/var/log/httpd/php-error.log"
CustomLog "/var/log/httpd/php-access.log" common
</VirtualHost>
<VirtualHost *:80>
ServerAdmin [email protected]
DocumentRoot "/var/www/python"
ServerName python
ServerAlias py.localhost
ErrorLog "/var/log/httpd/py-error.log"
CustomLog "/var/log/httpd/py-access.log" common
</VirtualHost>
我的/etc/hosts
:
# Static table lookup for hostnames.
# See hosts(5) for details.
127.0.0.1 php.localhost
127.0.0.1 py.localhost
我的主机名是L702X
。
我很困惑,我搜索了搜索引擎并按照指南查找,但似乎没有任何意义,例如,到 127.0.0.1 的路由怎么会到达两个不同的地址?
如果我缺少配置文件,请评论,我会添加。任何帮助都值得感激。
答案1
到 127.0.0.1 的路由怎么能到达两个不同的地址
不,该hosts
文件应该反过来解释:两个不同的名称转换为相同的 127.0.0.1 地址(“如果您想访问 py.localhost,请联系 127.0.0.1”)——就像两个人共享一个电话号码一样。
这完全不会影响 IP 层路由;无论如何获得,它仍然是相同的 127.0.0.1,并且到它的数据包会以相同的方式传输。
(这种做法在互联网上也很常见,数百个 DNS 域解析到同一个 Web 服务器的 IP 地址。)
唯一有趣的部分是如何阿帕奇区分属于不同域的 HTTP 请求——这一点已在本站重复,但简而言之,浏览器会包含域名之内HTTP 请求(通过添加Host:
HTTP 标头)。
答案2
作为@grawity 已经很出色的答案的补充,你应该记住DNS(或者在这种情况下hosts
,您的文件用于相同的目的)仅将名称映射到 IP 地址 - 但在这些名称到 IP 映射中没有固有的 IP 限制。@grawity 举的电话号码(IP)能够联系到不同的人(名称/程序)的例子就是一个很好的例子。
如果存在一个映射规则,即单个 IP 只能使用一次,那么您就无法从同一个 IP 运行多个服务(即使是不同类型的服务),这将是一个严重的技术限制。您需要为 HTTP、DNS、电子邮件等设置单独的 IP(可能还有服务器)。和所有子域名(www.example.com是 的子域名示例.com,例如,需要单独的 IP示例.com)。
由于这些映射中没有这样的限制,程序通常会通过不同的端口联系服务器以分离流量。请注意,端口不包含在 DNS 条目(或您的hosts
文件)中——由各个软件决定它们应该使用哪些端口进行通信。如果在单个端口(常规网络流量的端口 80 或 443)上收到了针对不同名称的多个请求,则由服务器(在您的情况下位于 127.0.0.1)决定它应该做什么,例如,如果它收到针对php.localhost
或 的请求py.localhost
。
这是基于名称的虚拟主机(技术上服务器名称指示[SNI] for HTTPS) 进来了。您的虚拟主机文件包含 Apache 的指令,其中说明“如果我们收到此主机名的请求,则执行 X。”如果没有匹配的名称,服务器通常会返回HTTP 状态代码404(未找到)。如果存在,虚拟主机条目将告诉服务器如何继续(从此目录提供页面等)。
请注意,您ServerName localhost
输入的httpd.conf
是默认主机。如果在虚拟主机文件中未找到匹配的主机名,有时会使用此主机,而不是返回 404。