首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在亚马逊的EC2上,一个码头服务器突然正常连接,这是最奇怪的事情。

在亚马逊的EC2上,一个码头服务器突然正常连接,这是最奇怪的事情。
EN

Server Fault用户
提问于 2020-11-05 06:34:35
回答 1查看 313关注 0票数 0

我以前做过我生命中最复杂的IP技巧,所以我绝不是新手。现在我遇到了一个非常奇怪的情况。

我有一个系统,我用一个jetty服务器复制了几十次甚至几百次,而且我使用的是org.mortbay.jetty 6.11的旧版本。重量很轻。在JRE-1.5,-1.6,-1.7,-1.8,.在Windows,Linux,FreeBSD,Solaris上,你有什么。没问题。

现在,该系统在Amazon这个特定版本上运行良好。

代码语言:javascript
复制
       __|  __|_  )
       _|  (     /   Amazon Linux 2 AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-2/
104 package(s) needed for security, out of 190 available
Run "sudo yum update" to apply all updates.
[ec2-user@ws ~]$ uname -a
Linux ws.pill.guru 4.14.88-88.73.amzn2.x86_64 #1 SMP Thu Dec 13 18:04:55 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux

如果我只克隆系统,通过创建一个AMI,然后在相同的硬件类别中启动一个实例(t2.nan,t2.micro)。当实例出现时,服务器立即启动。日志中没有错误。但只是简单的事情,如:

代码语言:javascript
复制
curl -v http://localhost/

就会被困住。

代码语言:javascript
复制
*   Trying 127.0.0.1...
* TCP_NODELAY set
* Connected to localhost (127.0.0.1) port 80 (#0)
> GET / HTTP/1.1
> Host: localhost
> User-Agent: curl/7.55.1
> Accept: */*
>

卡在这里了。无响应。只是卡住了。

Netstat显示已建立的连接。

端口为80,我使用setcap方法允许打开该端口,cat /etc/rc.local:

代码语言:javascript
复制
touch /var/lock/subsys/local
setcap cap_net_bind_service=+ep $(readlink -f $(which java))

和/etc/ld.so.con.d/java.conf是

代码语言:javascript
复制
/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.191.b12-0.amzn2.x86_64/jre/lib/amd64/jli
/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.191.b12-0.amzn2.x86_64/lib/amd64/jli

使用find /usr/lib/jvm/ -name jli >/etc/ld.so.con.d/java.conf创建

奇怪的是,如果我创建一个非常简单的Java类型服务器,如下所示:

代码语言:javascript
复制
import java.net.Socket;
import java.net.ServerSocket;
import java.io.InputStream;
import java.io.OutputStream;

public class SimpleServer {
  public static void main(String[] args) throws Exception {
    try(ServerSocket serverSocket = new ServerSocket(Integer.parseInt(args[0]))) {
      while(true) {
        Socket conn = serverSocket.accept();
        InputStream in = conn.getInputStream();
        byte buffer[] = new byte[1024];
        while(true) {
          int n = in.read(buffer);
          if(n < 0)
            break;
          System.out.write(buffer, 0, n);
        }
      }
    }
  }
}

那它就能正常工作了。

现在您可能会说:您的码头服务器出了问题。给我看看这个配置。试着升级埃利普码头,不管怎么说,不,我负担不起那种跑来跑去。我宁愿放弃整个Linux系统,转而使用FreeBSD。但我报告这些细节,是希望有人看到这样的问题,并可能给予一些自由联合。评论或回答。我投你一票,我保证。

如果我发现出了什么问题,我就回来报告自己。

PS:是的,奇怪的是,在EC2上,这些连接在netstat -d -a -t上显示为tcp6,尽管它们显示的是IPv4地址。但这不是问题所在。它仍然在旧服务器上工作,在精确的克隆上失败。

PS:现在我把所有的东西都搬到FreeBSD上了,我也遇到了同样的问题!

EN

回答 1

Server Fault用户

回答已采纳

发布于 2020-11-05 19:45:50

我发现了问题。在Jetty代码中的调试器中找到的。

这是一个配置错误。

这与配置参数"spawnOrShrinkAt“有关,事实上,我认为这仍然是较新的org.eclipe Jetty代码中的一个参数,因此它可能会帮助构建”嵌入式“web服务器的人。

我从线程池中的两个线程开始,这两个线程都被SocketConnectors使用,一个用于HTTP,另一个用于HTTPS。现在我做了一个连接。spawnOrShrinkAt配置参数被设置为5。所发生的情况是,请求处理程序线程没有生成,因为3< spawnOrShrinkAt,因此请求被放到队列中。我一直在看这个,因为在我再次尝试之前,我总是断开连接。如果我只是打开连接,再试两次,那么最终就会超过5的阈值,请求就会被处理。

当我克隆服务器时,之所以会发生这种情况,是因为没有客户机尝试连接(我认为是这样的)。

Jetty线程池配置参数相当模糊,而spawnOrShrink值的有害影响对我来说并不清楚。我现在把它放在默认状态下就行了。

票数 0
EN
页面原文内容由Server Fault提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://serverfault.com/questions/1041355

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档