我的nginx部署在一台EC2上,我重新申请了一台EC2的实例来部署应用(假定Nginx所在的服务器的内网IP为172.16.100.1,新申请的应用服务器的内网IP为172.16.100.2),当我在新申请的实例机器上部署好我的应用后,然后也在nginx里面配置好了nginx的接口的转发,当我重启nginx后,发现接口请求不通。
遇到这种很难的问题一般我都会先问我的助理,我们之间的聊天记录大概是这样的:
问:AWS 上面有两个EC2的实例,这两台实例在同一个区域.但是这两个实例之间互相ping不通,为什么?
答:在 AWS 上,如果两个 EC2 实例在同一个区域,但是它们之间互相 ping 不通,可能有多种原因。以下是一些可能导致这种情况的常见原因:
根据以上可能的原因,猜测大概率是因为第一个原因,于是接着顺藤摸瓜去排查:
问:对于第一个原因安全组配置问题,我该如何在安全组配置中添加允许 ICMP 流量的入站规则?
答:在 AWS 安全组中添加允许 ICMP 流量的入站规则可以通过以下步骤完成:
我想对于他的回答,我是比较认可的,我猜测,通过它的提示,可以解决我的问题(未验证)。但是我的应用场景是什么样的,我想我应该详细的告诉他,这样,他也能更好的回答我 。于是我又继续问他:
问:我想在服务器上的nginx中配置可以访问另外一台服务器的8081端口,我还需要添加什么规则吗?
答:如果你想在 Nginx 服务器上配置以访问另一台服务器的 8081 端口,你需要确保以下几个方面:
server {
listen 80;
location / {
proxy_pass http://目标服务器的IP地址:8081;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
确保以上几点都正确配置,这样就能够在 Nginx 服务器上成功访问另一台服务器的 8081 端口了。如果你使用的是云服务提供商,也要记得检查云服务提供商的网络配置,确保允许这些流量通过。
他太贴心了,还把nginx的配置实例都发给我了。
根据他告诉我的这几条,我依然是选择了第一条,于是我又继续问他:
问:出站规则怎么配置?
答:在 AWS 的安全组中配置出站规则的步骤如下:
那么配置了出站规则还需要配置入站规则吗?于是我问他:
问:我在另外一台服务器中还需要添加8081端口的入站规则吗?
答:是的,如果你希望另一台服务器能够接收来自 Nginx 服务器的流量,你需要在目标服务器的安全组中添加入站规则,以允许 Nginx 服务器发起的流量进入目标服务器的 8081 端口。
在目标服务器上,按照以下步骤添加入站规则(跟出站规则类似):
于是我去查看了我服务器所用的安全组,我发现两台服务器用的是同一个安全组,我想,**同一个安全组也需要入站规则和出站规则都去配置吗?**于是我又继续问他 :
问:如果我的Nignx服务器和应用服务器用的是同一个安全组,我需要在该安全组下都去配置入站和出站规则吗?
答:如果你的 Nginx 服务器和应用服务器使用同一个安全组,你只需要在该安全组中配置一次规则。安全组的规则是双向的,因此在同一个安全组内设置的规则同时适用于入站和出站流量。
在这种情况下,只需确保在该安全组中设置允许 Nginx 服务器发起的流量访问应用服务器的 8081 端口的规则。这样,Nginx 服务器就可以成功连接到应用服务器的 8081 端口。
步骤如下:
看见他告诉我的答案,我比较兴奋,因为只用配置一个规则就可以了,他只告诉我选择允许的流量类型(协议),并没有说选择哪个,于是我又问他:
问:选择允许的流量类型(协议),这个协议我需要选择哪一个?
答:如果你的目标是通过 Nginx 服务器与应用服务器之间建立 HTTP 连接,你需要选择 “HTTP(80)” 或 “HTTPS(443)” 作为协议,具体选择哪一个取决于你的应用服务器上监听的端口。通常来说,HTTP 使用端口 80,而 HTTPS 使用端口 443。
在 AWS 安全组规则中,你可以选择协议的方式是选择 “HTTP(80)” 或 “HTTPS(443)”,而不是直接选择协议的通用名称(如 TCP 或 UDP)。
如果你的应用服务器监听的端口是 8081,并且你希望通过 Nginx 服务器访问该端口,你应该选择 “自定义 TCP 规则”,并将端口设置为 8081。如果你的应用服务器运行的是 HTTP 服务,端口为 80,那么你可以选择 “HTTP(80)”。
总之,选择合适的协议和端口,以确保你的流量能够在 Nginx 和应用服务器之间正确传递。
于是我就开始配置起来,在配置过程中,为了安全起见,我只想配置来源IP为我的Nginx的IP:172.16.100.1。但是在我输入完这个IP后,它提示我:必须指定 CIDR 数据块、安全组 ID 或前缀列表。于是,我又问他:
问:我输入固定IP地址后,提示我必须指定 CIDR 数据块、安全组 ID 或前缀列表。
答:
如果 AWS 安全组中要指定特定的单个 IP 地址,你可以使用 CIDR(Classless Inter-Domain Routing)表示法,并将子网掩码设置为 32。CIDR 表示法中的 /32 表示单个 IP 地址。
在 AWS 安全组规则中,你可以按照以下方式输入特定的单个 IP 地址:
在来源 IP 中输入: 172.16.100.1/32
这表示允许来自单个 IP 地址 172.16.100.1 的流量通过。CIDR 表示法的 /32 意味着只有这个特定的 IP 地址是允许的。
确保在安全组规则中按照正确的格式输入特定 IP 地址,并保存规则。如果还有其他规则,确保它们的设置也是正确的。、
通过以上配置,我再次在Nginx服务器上执行telnet 172.16.100.2 8081发现已经ok,通了,问题解决了。
最后总结一下,就是配置入站规则。感谢我的助理,他帮了我的大忙~