Amazon-Web-Services

在 Amazon EC2 上,JETTY 伺服器突然正確連接,最奇怪的事情

  • November 5, 2020

我之前一直在做我一生中最複雜的IP技巧,所以我絕不是新手。現在我有一個非常奇怪的情況。

我有一個系統,我使用 jetty servlet 伺服器複製了數十次甚至數百次,並且我使用的是 org.mortbay.jetty 6.11 的舊受信任版本。重量很輕。在 Windows、Linux、FreeBSD、Solaris 上執行 JRE-1.5、-1.6、-1.7、-1.8,…,你有什麼。沒問題。

現在,系統在這個特定版本的 Amazon Linux 上執行良好。

      __|  __|_  )
      _|  (     /   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.nano,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 將連接顯示為 ESTABLISHED。

埠是80,我用setcap方法讓那個埠打開,cat /etc/rc.local:

touch /var/lock/subsys/local
setcap cap_net_bind_service=+ep $(readlink -f $(which java))

和 /etc/ld.so.conf.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.conf.d/java.conf 創建

奇怪的是,如果我正在創建一個非常簡單的 Java netcat 類型伺服器,如下所示:

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);
       }
     }
   }
 }
}

然後它工作得很好。

現在你可能會說:你的碼頭伺服器有問題。給我看看這個配置。試試 ecipe jetty 的升級,無論如何,不,我負擔不起這種類型的跑來跑去。我寧願放棄整個 Linux 系統,轉而使用 FreeBSD。但我報告這個細節是希望有人看到這樣的問題,並可能會給出一些自由聯想。評論或回答。我給你投票,我保證。

如果我發現出了什麼問題,我會回來報告自己。

PS:是的,奇怪的是,在 EC2 上,這些連接在 netstat -d -a -t 上顯示為 tcp6,即使它們顯示的是 IPv4 地址。但這不是問題。它仍然可以在舊伺服器上執行,並且在確切的複製上失敗。

PS:現在我把所有東西都移到了 FreeBSD 上,我遇到了完全相同的問題!

我發現了這個問題。使用該 Jetty 程式碼中的調試器找到它。

這是一個配置錯誤。

它與配置參數“spawnOrShrinkAt”有關,事實上,我認為這仍然是較新的 org.eclipe Jetty 程式碼中的一個參數,因此它可能對建構“嵌入式”Web 伺服器的人有所幫助。

我從執行緒池中的兩個執行緒開始,它們都被 SocketConnectors 使用,一個用於 HTTP,一個用於 HTTPS。現在我建立了一個聯繫。ThreadPool 的 spawnOrShrinkAt 配置參數設置為 5。發生的情況是,由於 3 < spawnOrShrinkAt,沒有生成請求處理程序執行緒,因此將請求放入隊列。我一直看到這種情況,因為我在再次嘗試之前總是斷開連接。如果我只是讓連接保持打開狀態並再試兩次,最終將超過門檻值 5 並且請求將得到處理。

為什麼在我複製伺服器時發生這種情況是因為沒有客戶端進行連接嘗試(我認為是這樣)。

Jetty 執行緒池配置參數在 IMO 中相當模糊,我不清楚 spawnOrShrink 值的不利影響。我現在將其保留為預設值,它可以工作。

引用自:https://serverfault.com/questions/1041355