我以前做过我生命中最复杂的IP技巧,所以我绝不是新手。现在我遇到了一个非常奇怪的情况。
我有一个系统,我用一个jetty服务器复制了几十次甚至几百次,而且我使用的是org.mortbay.jetty 6.11的旧版本。重量很轻。在JRE-1.5,-1.6,-1.7,-1.8,.在Windows,Linux,FreeBSD,Solaris上,你有什么。没问题。
现在,该系统在Amazon这个特定版本上运行良好。
__| __|_ )
_| ( / 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)。当实例出现时,服务器立即启动。日志中没有错误。但只是简单的事情,如:
curl -v http://localhost/就会被困住。
* 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:
touch /var/lock/subsys/local
setcap cap_net_bind_service=+ep $(readlink -f $(which java))和/etc/ld.so.con.d/java.conf是
/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类型服务器,如下所示:
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上了,我也遇到了同样的问题!
发布于 2020-11-05 19:45:50
我发现了问题。在Jetty代码中的调试器中找到的。
这是一个配置错误。
这与配置参数"spawnOrShrinkAt“有关,事实上,我认为这仍然是较新的org.eclipe Jetty代码中的一个参数,因此它可能会帮助构建”嵌入式“web服务器的人。
我从线程池中的两个线程开始,这两个线程都被SocketConnectors使用,一个用于HTTP,另一个用于HTTPS。现在我做了一个连接。spawnOrShrinkAt配置参数被设置为5。所发生的情况是,请求处理程序线程没有生成,因为3< spawnOrShrinkAt,因此请求被放到队列中。我一直在看这个,因为在我再次尝试之前,我总是断开连接。如果我只是打开连接,再试两次,那么最终就会超过5的阈值,请求就会被处理。
当我克隆服务器时,之所以会发生这种情况,是因为没有客户机尝试连接(我认为是这样的)。
Jetty线程池配置参数相当模糊,而spawnOrShrink值的有害影响对我来说并不清楚。我现在把它放在默认状态下就行了。
https://serverfault.com/questions/1041355
复制相似问题