我设置了一个 google 计算引擎实例并安装了 nginx,现在 nginx 正在监听端口 80。我的实例分配了一个静态外部 IP,但我无法访问我的外部 IP 地址。
为什么这必须这么难?所有的教程都只是说:
安装 nginx 并转到你的外部 ip,你应该到达 nginx 欢迎屏幕
我为 http/https 设置了防火墙规则,但没有任何效果。以下是一些需要查看的内容:
nginx 服务器配置:
listen 80;
listen [::]:80;
server_name example.com;
root /var/www/example.com;
index index.html;
location / {
try_files $uri $uri/ =404;
}
nginx 正在运行:
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 3490/nginx
tcp6 0 0 :::80 :::* LISTEN 3490/nginx
我想去:104.196.111.24
但它只是说safari failed to open the page
运行ifconfig
返回此结果:
docker0 Link encap:Ethernet HWaddr 02:42:de:3f:fb:67
inet addr:172.18.0.1 Bcast:0.0.0.0 Mask:255.255.0.0
UP BROADCAST MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
eth0 Link encap:Ethernet HWaddr 02:42:ac:11:00:02
inet addr:172.17.0.2 Bcast:0.0.0.0 Mask:255.255.0.0
inet6 addr: fe80::42:acff:fe11:2/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1460 Metric:1
RX packets:3802 errors:0 dropped:0 overruns:0 frame:0
TX packets:2248 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:21591383 (20.5 MiB) TX bytes:351275 (343.0 KiB)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:54 errors:0 dropped:0 overruns:0 frame:0
TX packets:54 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:3568 (3.4 KiB) TX bytes:3568 (3.4 KiB)
答案1
关闭 80 端口
$ nmap -p80 104.196.111.24
Starting Nmap 6.40 ( http://nmap.org ) at 2016-03-09 16:25 CET
Nmap scan report for 24.111.196.104.bc.googleusercontent.com (104.196.111.24)
Host is up (0.14s latency).
PORT STATE SERVICE
80/tcp closed http
这导致我认为防火墙配置有问题,尽管您的屏幕截图上勾选了“允许 http 流量”和“允许 https 流量”选项。现在我对 GCE 的防火墙配置不太了解。
(注:稍后:截至目前,nmap
报告主机已关闭。)
关于我最初的帖子
我的初始帖子(如下)适用于nginx
在真实主机上运行的实例。我忽略了你实际运行虚拟机,其中监听本地地址(主机上的“其他东西”将请求代理到虚拟机)可能是正常的nginx
。但是我不明白为什么内部 IP 地址没有显示在您的ifconfig
输出中。
初始帖子内容:
如果我理解正确的话,您在地址为 104.196.111.24 的服务器上运行了一个 nginx 实例。当您尝试在 Web 浏览器中访问此地址时,会出现错误。
因此,我不完全确定这是否会起作用,但我注意到你的 nginx 实例正在监听 0.0.0.0(ipv4)上的端口 80,这是一个本地地址。维基百科对此有如下解释:
在互联网协议版本 4 中,地址 0.0.0.0 是一个不可路由的元地址,用于指定无效、未知或不适用的目标。
而且:
在服务器上下文中,0.0.0.0 表示“本地机器上的所有 IPv4 地址”。
因此我认为这里有一些需要修复的地方,因为nginx
似乎只能从服务器上的本地地址访问。
此外,如果我将自己设置nginx
为在 0.0.0.0 上监听任何网站的 80 端口,那么浏览该站点将返回错误(例如连接已重新初始化,而不是来自 的错误nginx
)。
因此,我会尝试设置nginx
为监听外部地址上的端口 80,例如:
listen 104.196.111.24:80;
(当然,之后请使用 检查这是否正确nginx -t
,然后使用 重新加载 nginx 规则service nginx reload
)。
编辑:来自的附加信息ifconfig
让我认为网络配置确实存在错误(或未设置),但我无法解释:网卡(eth0,正在运行)的地址是 172.17.0.2,属于某些特殊的 IANA 保留地址范围。我期望 104.196.111.24 出现在ifconfig
的输出中,但事实并非如此。我甚至不明白如何在没有设置的情况下通过 ssh 进入 104.196.111.24。无论如何,我认为nginx
只要它在 0.0.0.0 上监听,就无法从外部访问,必须修复此问题才能解决问题,这可以通过修复网络配置来实现。
答案2
使用通配符即可
listen *:80;
listen *:443 ssl;
答案3
你来错地方了。根据 ifconfig 结果,你似乎位于谷歌云壳并不是ssh 进入您的实例 shell。如果您在实例 shell 中,ifconfig 结果将与控制台中显示的内部 ip 地址匹配。
答案4
检查项目 VPC 的防火墙规则:
$ gcloud beta compute firewall-rules list
如果80端口TCP没有覆盖,则需要添加:
$ gcloud beta compute firewall-rules create default-allow-http80 \
> --direction ingress --action allow --source-ranges 0.0.0.0/0
> --rules tcp:80