背景

背景

背景

我有一台同时运行 laravel 应用程序的 aws 机器,现在我尝试安装beanstalk 控制台。laravel 应用程序的 nginx 配置文件如下所示:

include forge-conf/default/before/*;

server {
    listen 80 default_server;
    listen [::]:80 default_server;
    server_name default;
    root /home/forge/default/public;

    # FORGE SSL (DO NOT REMOVE!)
    # ssl_certificate;
    # ssl_certificate_key;

    ssl_protocols ..
    ssl_ciphers ..
    ssl_prefer_server_ciphers on;
    ssl_dhparam ..

    add_header X-Frame-Options "SAMEORIGIN";
    add_header X-XSS-Protection "1; mode=block";
    add_header X-Content-Type-Options "nosniff";

    index index.html index.htm index.php;

    charset utf-8;

    # FORGE CONFIG (DOT NOT REMOVE!)
    include forge-conf/default/server/*;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location = /favicon.ico { access_log off; log_not_found off; }
    location = /robots.txt  { access_log off; log_not_found off; }

    access_log off;
    error_log  /var/log/nginx/default-error.log error;

    error_page 404 /index.php;

    location ~ \.php$ {
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass unix:/var/run/php/php7.1-fpm.sock;
        fastcgi_index index.php;
        include fastcgi_params;
    }

    location ~ /\.ht {
        deny all;
    }
}

beanstalk 应用程序的 nginx 配置文件如下所示:

server {
    listen 8080;
    listen [::]:8080;
    server_name beanstalk_server;
    root /home/forge/beanstalk-console/public;

    index index.html index.htm index.php;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location = /favicon.ico { access_log off; log_not_found off; }
    location = /robots.txt  { access_log off; log_not_found off; }

    error_log  /var/log/nginx/default-error.log error;

    error_page 404 /index.php;

    location ~ \.php$ {
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass unix:/var/run/php/php7.1-fpm.sock;
        fastcgi_index index.php;
        include fastcgi_params;
    }

    location ~ /\.ht {
        deny all;
    }
}

问题

当我尝试点击时server-ip:8080,出现错误:

server-ip took too long to respond.

我已确保这不是权限问题,因为我已像这样更新 aws 实例的入站规则:

在此处输入图片描述

但还是没有运气,我知道这不是 beanstalk 控制台本身的问题,因为如果我只是切换端口(即,如果让 beanstalk 控制台监听端口 80 而不是 8080,它就可以正常工作.. 我也尝试了不同的端口,如 1515,但仍然不起作用)..

我也知道 localhost:8080 工作正常,因为运行

wget localhost:8080 

确实返回了 beanstalk 的 html 站点。

需要注意的一点是,我的 aws 机器也位于负载均衡器后面。它将负载均衡器端口 80 处的 http 请求转发到机器的端口 80。但我认为这不会有什么区别

在此处输入图片描述

我该怎么办?

更新

当我尝试访问 beanstalk 时,我检查了我的访问日志 ( tail -f /var/log/nginx/access.logtail -f /var/log/nginx/access.log) 和错误日志 ( ),但什么也没发现。$ tail -f /var/log/nginx/error.log

这是我的 netstat 命令的输出

tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      11997/nginx -g daem
tcp        0      0 0.0.0.0:8080            0.0.0.0:*               LISTEN      11997/nginx -g daem
tcp        0      0 10.0.17.158:80          10.0.1.251:19336        ESTABLISHED 11998/nginx: worker
tcp        0      0 10.0.17.158:80          10.0.17.87:62074        ESTABLISHED 11998/nginx: worker
tcp        0      0 10.0.17.158:80          10.0.17.101:59938       ESTABLISHED 11998/nginx: worker
tcp        0      0 10.0.17.158:80          10.0.17.101:60988       ESTABLISHED 11998/nginx: worker
tcp        0      0 10.0.17.158:80          10.0.1.21:63633         ESTABLISHED 11998/nginx: worker
tcp        0      0 10.0.17.158:80          10.0.1.21:62603         ESTABLISHED 11998/nginx: worker
tcp        0      0 10.0.17.158:80          10.0.17.87:63110        ESTABLISHED 11998/nginx: worker
tcp        0      0 10.0.17.158:80          10.0.1.251:20344        ESTABLISHED 11998/nginx: worker
tcp6       0      0 :::80                   :::*                    LISTEN      11997/nginx -g daem
tcp6       0      0 :::8080                 :::*                    LISTEN      11997/nginx -g daem

更新 2:防火墙设置

看来 8080 端口没有防火墙。请参见命令

netstat -ntlp | grep LISTEN
(Not all processes could be identified, non-owned process info
 will not be shown, you would have to be root to see it all.)
tcp        0      0 0.0.0.0:11300           0.0.0.0:*               LISTEN      -
tcp        0      0 127.0.0.1:587           0.0.0.0:*               LISTEN      -
tcp        0      0 0.0.0.0:6379            0.0.0.0:*               LISTEN      -
tcp        0      0 0.0.0.0:11211           0.0.0.0:*               LISTEN      -
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      11998/nginx: worker
tcp        0      0 0.0.0.0:8080            0.0.0.0:*               LISTEN      11998/nginx: worker
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      -
tcp        0      0 0.0.0.0:5432            0.0.0.0:*               LISTEN      -
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      -
tcp6       0      0 :::3306                 :::*                    LISTEN      -
tcp6       0      0 :::80                   :::*                    LISTEN      11998/nginx: worker
tcp6       0      0 :::8080                 :::*                    LISTEN      11998/nginx: worker
tcp6       0      0 :::22                   :::*                    LISTEN      -
tcp6       0      0 :::5432                 :::*                    LISTEN      -

我还运行了 nmap:

nmap 10.0.17.158

Starting Nmap 7.01 ( https://nmap.org ) at 2017-10-11 10:38 EEST
Nmap scan report for 10.0.17.158
Host is up (0.000068s latency).
Not shown: 995 closed ports
PORT     STATE SERVICE
22/tcp   open  ssh
80/tcp   open  http
3306/tcp open  mysql
5432/tcp open  postgresql
8080/tcp open  http-proxy

答案1

基于 Shadi 的回答,并检查 AWS 确实将 8080 端口路由到机器后,问题出在iptables

我不确定如何使用 iptables 检查端口是否被阻止,但这里有一个允许端口 8080 的命令:

这是允许从操作系统级别访问端口 8080 的 iptables 命令:

sudo iptables -I INPUT 1 -i eth0 -p tcp --dport 8080 -j ACCEPT

(有关 iptables 命令的参考,请参阅优秀的帖子,直接引用的格式就是这样的,其余部分我也添加了自己的解释):

-I INPUT 1:-I 标志告诉 iptables 插入一条规则。这与将规则附加到末尾的 -A 标志不同。-I 标志采用链和要插入新规则的规则位置。

在本例中,我们将此规则添加为 INPUT 链的第一条规则。这将使其余规则下移。我们希望此规则位于顶部,因为它是基础规则,不应受到后续规则的影响。

-i eth0:如果数据包使用的接口是“eth0”接口(以太网),则规则的此组件匹配。

-p tcp:这只是指定 tcp 协议

-- dport 8080:我们正在讨论的端口

-j ACCEPT:指定匹配数据包的目标。在这里,我们告诉 iptables 应该接受并允许符合上述条件的数据包通过。

如何检查端口是否开放?

正如上面的链接中提到的,您只需运行以下命令:

sudo iptables -S

这将输出很多规则,具体取决于您的设置。要简化操作,只需运行此命令

$ sudo iptables -S | grep "dport 8080"
-A INPUT -i eth0 -p tcp -m tcp --dport 8080 -j ACCEPT

这样你就可以立即知道 8080 端口的情况

如何持久化iptables命令?

只需使用iptables-persistent包:

sudo apt-get update
sudo apt-get install iptables-persistent

它将在全新安装时保留 iptables 规则,有关更多详细信息,请参阅上述链接

答案2

由于 localhost:8080 有效,因此来自外部的请求不会到达正在监听该端口 8080 的服务器。检查以下内容

  1. AWS 正在将请求路由到您的服务器(根据您的配置应该是这样的)
  2. 检查您实例的防火墙配置。您使用的是什么操作系统?配置可能拒绝访问该端口

相关内容