我需要在一个物理服务器上运行 apache 和 nginx。最好两者都监听 443,但在不同的域上。据我所知,这只有在两个 IP 的情况下才有可能。从旧文档中,我找到了一个适用于 ubuntu 10.04 的工作示例,并希望让它在 ubunut 16.04 上运行。
在此设置中,有 2 个 IP:
enp0s8 Link encap:Ethernet HWaddr 08:00:27:4f:d8:fb
inet addr:192.143.56.200 Bcast:192.143.56.255 Mask:255.255.255.0
inet6 addr: fe80::a00:27ff:fe4f:d8fb/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:323 errors:0 dropped:0 overruns:0 frame:0
TX packets:241 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:32078 (32.0 KB) TX bytes:128319 (128.3 KB)
enp0s8:1 Link encap:Ethernet HWaddr 08:00:27:4f:d8:fb
inet addr:192.143.56.201 Bcast:192.143.56.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
使用 iptables 进行端口转发:
sudo iptables -L -t nat
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
REDIRECT tcp -- anywhere 192.168.56.201 tcp dpt:https redir ports 8000
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
REDIRECT tcp -- anywhere 192.168.56.201 tcp dpt:https redir ports 8000
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
nginx 配置:
listen 8000 ssl http2 default_server;
listen [::]:8000 ssl http2 default_server;
理论上这应该可行。不幸的是,它不行。当 apache 停止并且 nginx 正在运行时,我无法访问 url 中带有 :8000 的文件。离开端口后,我确实收到 ERR_CONNECTION_REFUSED 一旦我启动 apache,它将接管连接并提供错误。
提前感谢您对此提供的任何帮助!
答案1
您需要指定 nginx 应该监听的接口的 IP。
如果添加: listen 8000 ssl http2 default_server; listen [::]:8000 ssl http2 default_server;
它将在 8000 端口、所有 ipv4 接口 IP(第一行)和所有 ipv6 接口 IP(第二行)上监听。
因此,要使 nginx 仅监听 IP 地址 192.143.56.201 的端口(比如 443),你需要执行以下命令: listen 192.143.56.201:8000
请注意,我不确定 nginx 是否能够仅监听接口别名(您的设置仅显示一个带有额外别名的接口)。
您可以测试它,或者直接考虑添加第二个独立接口(第二个网卡)。使用 VLAN(不同于网络别名)也应该有效,但您需要一个支持 802.1Q 的交换机(这样它就可以在软件包上标记/取消标记 vlan)