Apache tidak dapat terhubung ke tomcat 9 ajp baru

Aug 20 2020

Apache2 saya tidak dapat lagi terhubung (dengan ajp) ke tomcat bawaan Spring boot saya setelah memutakhirkan versi Spring boot dari 2.1.4 ke 2.3.2.

Ini menunjukkan kesalahan berikut:

[proxy:error] [pid xxxx ] (111)Connection refused: AH00957: AJP: attempt to connect to 10.0.75.1:8500 (10.0.75.1) failed
[proxy_ajp:error] [pid xxxx ] [client xxx ] AH00896: failed to make connection to backend: 10.0.75.1, referer: http://myapp.develop/home/

Saya memiliki lingkungan dev yang disiapkan dengan cara ini:

  • aplikasi Angular (server node berjalan pada 4200)

  • backend boot musim semi (konektor ajp diatur pada tomcat pada port 8500)

  • server apache2 frontal (di kontainer buruh pelabuhan) yang disiapkan untuk mengalihkan permintaan ke kedua aplikasi:

    <VirtualHost *:80>
    ServerName myapp.develop
    
    ProxyPass "/home" "http://10.0.75.1:4200/home"
    ProxyPassReverse "/home" "http://10.0.75.1:4200/home"
    
    ProxyPass "/backend" "ajp://10.0.75.1:8500/backend"
    ProxyPassReverse "/backend" "ajp://10.0.75.1:8500/backend"
    

dan saya mengakses aplikasi web saya dengan nama domain di / etc / hosts: myapp.develop

ini adalah konfigurasi tomcat boot musim semi saya

   Connector connector = new Connector("AJP/1.3");
   connector.setScheme("http");
   connector.setPort(8500);
   connector.setSecure(false);
   connector.setAllowTrace(false);
   ((AbstractAjpProtocol) connector.getProtocolHandler()).setSecretRequired(false);

di app.properties:

tomcat.ajp.port=8500
tomcat.ajp.remoteauthentication=false
tomcat.ajp.enabled=true

dan ini adalah log kucing jantan:

o.s.b.w.e.t.TomcatWebServer  : Tomcat initialized with port(s): 8080 (http) 8500 (http)
o.a.c.h.Http11NioProtocol    : Initializing ProtocolHandler ["http-nio-8080"]
o.a.c.a.AjpNioProtocol       : Initializing ProtocolHandler ["ajp-nio-127.0.0.1-8500"]
o.a.c.c.StandardService      : Starting service [Tomcat]
o.a.c.c.StandardEngine       : Starting Servlet engine: [Apache Tomcat/9.0.37]

Saya meragukan perubahan ini:

  • Pada 8.5.51 dan seterusnya, alamat pendengar default dari Konektor AJP diubah ke alamat loopback daripada semua alamat.

adalah apa yang menyebabkan saya masalah ini tetapi saya tidak tahu bagaimana mengatasinya.

Jawaban

5 Prerna Sep 17 2020 at 04:37

Saya menghadapi masalah serupa saat memutakhirkan versi kucing jantan. Menambahkan properti yang disebutkan di bawah ini ke konektor ajp membantu kasus saya.

connector.setProperty("address","0.0.0.0");
connector.setProperty("allowedRequestAttributesPattern",".*");
((AbstractAjpProtocol)connector.getProtocolHandler()).setSecretRequired(false);

Penjelasan detail:

Untuk keraguan Anda:

Pada 8.5.51 dan seterusnya, alamat pendengar default dari Konektor AJP diubah ke alamat loopback daripada semua alamat.

Sebelum pembaruan ini, konektor AJP tomcat bersedia menerima permintaan dari alamat IP apa pun, sehingga tidak diperlukan untuk menentukan properti "alamat" secara eksplisit. Namun setelah pembaruan ini, perilaku defaultnya adalah konektor AJP bersedia menerima permintaan yang hanya dibuat sebagai localhost (loopback). Gunakan properti "address" yang terdaftar di bawah ini untuk memperluas jangkauan pendengaran tidak hanya ke alamat loopback

connector.setProperty("address","0.0.0.0"); // OR connector.setProperty("address","::");

Gunakan properti di bawah ini untuk mengaktifkan semua jenis atribut permintaan (kecuali Anda memiliki info header, dalam hal ini aktifkan yang spesifik). Permintaan dengan atribut permintaan yang tidak dikenal akan ditolak dengan tanggapan 403:

connector.setProperty("allowedRequestAttributesPattern",".*"); 

Gunakan properti "secretRequired" untuk menentukan apakah sebuah rahasia perlu dipertukarkan dengan server HTTP sehingga memungkinkan permintaan melalui ajp. Jika ya, maka setel juga properti "rahasia". Jika tidak, permintaan akan gagal dengan 403.

((AbstractAjpProtocol)connector.getProtocolHandler()).setSecretRequired(false);

Referensi: Referensi Konfigurasi Apache Tomcat 8

Penggunaan protokol AJP memerlukan pertimbangan keamanan tambahan karena memungkinkan manipulasi langsung yang lebih besar terhadap struktur data internal Tomcat daripada konektor HTTP. Perhatian khusus harus diberikan pada nilai yang digunakan untuk atribut address , secret , secretRequired dan allowRequestAttributesPattern .

2 OlafKock Aug 20 2020 at 21:58

Saya belum pernah melihat konektor disiapkan dalam kode seperti ini, ini lebih baik dideklarasikan di server.xml

Namun, kode Anda adalah

Connector connector = new Connector("AJP/1.3");
connector.setScheme("http");
connector.setPort(8500);
connector.setSecure(false);
connector.setAllowTrace(false);
((AbstractAjpProtocol) connector.getProtocolHandler()).setSecretRequired(false);

dan kemudian Anda menyatakan bahwa Anda tahu tentang perubahan yang menghancurkan ini

Pada 8.5.51 dan seterusnya, alamat pendengar default dari Konektor AJP diubah ke alamat loopback daripada semua alamat.

Menggabungkan keduanya: Anda tidak pernah menyetel alamat mendengarkan di kode Anda - jadi Anda mungkin menggunakan default. Dan saat Anda mencoba meneruskan ke alamat non-loopback, tidak ada cara untuk menjangkau server dengan cara ini.

Editor anonim dari jawaban ini menyarankan connector.setAttribute("address", "0.0.0.0");, tetapi secara pribadi, saya lebih suka menyimpannya di server.xml: Konektor biasanya tidak dikonfigurasi dan diubah saat runtime, dan meminta administrator Anda mengedit file teks jauh lebih nyaman di hari ke operasi-hari.