Bagaimana saya bisa men-debug nginx lebih jauh dari log kesalahan?

34

Saat ini saya menerima banjir HTTP yang cukup besar sekarang, dan itu menyebabkan proxy nginx saya terbalik menghasilkan 502 Bad Gateway.

Saya memiliki server frontend yang menjalankan nginx sebagai proxy ke server backend saya, tetapi itu hanya mendapatkan banyak connect() failed (110: Connection timed out) while connecting to upstreamkesalahan. Banyak dari mereka. Jika saya mem-bypass server proxy untuk terhubung ke backend, saya dapat menjalankan situs dengan baik, jadi saya tahu itu ada di proxy sebaliknya. Namun, saya tidak tahu bagaimana menentukan mengapa waktunya habis.

Ada bantuan?

menjalankan nginx 1.2.3 pada CentOS 6.2

rampok
sumber
Anda bisa mulai dengan memperbarui Nginx ke versi terbaru. Meskipun, saya tidak mengetahui adanya bug seperti itu di 1.2.3
Ben Lessani - Sonassi
2
.... dan kemudian lihat apa pun yang MENOLAK KONEKSI DARI NGINX
symcbean
Apa server backend Anda? Saya telah bingung sebelumnya oleh kesalahan ketika kesalahan Nginx melayani sebenarnya berasal dari backend. Kelihatannya tidak seperti kasus di sini, tetapi Anda perlu memperbarui pertanyaan Anda dengan lebih detail.
jeffatrackaid
Juga, apakah Anda menghubungkan melalui jaringan pribadi / publik ke backend? Apakah IP proxy yang masuk daftar putih di firewall, ddos, atau alat jenis pembatasan ip / rate lainnya? Seperti apa tampilan netstat di server backend? Berapa banyak koneksi yang terbuka? Apa MaxClients di backend? Apakah Anda melelahkan itu?
jeffatrackaid

Jawaban:

19

Saya berasumsi bahwa Anda telah mendongkrak tingkat pencatatan kesalahan Nginx hingga debug. Jika tidak, mulailah dari sana.

Taruhan terbaik Anda mungkin akan digunakan straceuntuk melihat panggilan sistem yang dibuat oleh Nginx. Khususnya, Anda ingin memperhatikan connect()panggilan, dan mengawasi kode pengembalian ini ( man 2 connectbisa menjadi teman Anda di sini).

Setelah Anda memiliki informasi itu, Anda dapat membuat tebakan yang lebih baik tentang apakah masalahnya terbatas pada proxy frontend Anda, atau ada hubungannya dengan interaksi antara proxy dan server aplikasi backend.

jgoldschrafe
sumber
37

Tidak ada yang lebih hebat dari ini kecuali Anda ingin memasukkan probe dtrace:

  1. Setel level log debug: /etc/nginx/nginx.conf:

    ...
    http {
            ...
            error_log /var/log/nginx/error.log debug; # todo testing remove me not for production use
            ...
    }
    
  2. Atur tcpdump di jendela lain:

    tcpdump not port 22 -vvv -s0 -q -XXX
    
  3. Monitor file log di jendela lain:

    tail -f /var/log/nginx/*
    
  4. Startup nginx secara interaktif dengan strace:

    # top of /etc/nginx/nginx.conf:
    
    daemon off; # todo testing remove me not for production use
    

    Lalu

     $ strace nginx 
    

Selanjutnya dapat dilakukan debugging dengan nginx yang dikompilasi --with-debug . Periksa dengan menjalankan:

    nginx -V 2>&1 | grep -- '--with-debug' # no output if not debug

Modul bagus lainnya yang tidak dikompilasi secara default adalah: HttpStubStatusModule . Dalam semua kemungkinan, setiap pengaturan yang layak akan membutuhkan nginx yang dikompilasi khusus (sangat direkomendasikan kemasan menggunakan alat pengemasan distro).

Sebagian besar tidak cocok untuk penggunaan produksi, lihat kompilasi nginx dengan gperf jika Anda membutuhkan lebih banyak statistik.

Yakub
sumber
pada langkah 2, berikut ini berfungsi untuk saya: tcpdump -saya tidak port 22 -vvv -s0 -q -XXX
ccppjava
5

Sepertinya Anda sedang men-debug situs lalu lintas tinggi.

Gunakan debugdengandebug_connection direktif sehingga log kesalahan nginx akan menampilkan log debug hanya dari IP Anda.

Setelah Anda mulai melihat beberapa log kesalahan yang berguna daripada mengaktifkan opsi debug untuk seluruh konfigurasi nginx, tambahkan error_log /path/to/some/file/ debug;direktif terpisah dilocation {..} blok yang bertanggung jawab untuk koneksi reverse_proxy.

Dengan cara ini Anda akan dapat mengisolasi log kesalahan debug dari IP Anda saja.

Cobalah mengaitkannya dengan permintaan yang Anda buat (dari browser Anda).

Misalnya, periksa: https://easyengine.io/tutorials/nginx/debugging/

Level selanjutnya, Anda dapat menggunakan Nginx's HttpEchoModule

rahul286
sumber
2

Saya tidak pernah menemukan Nginx menjadi hambatan, dalam banyak kasus ini lebih dari mampu daripada ujung belakang. Tetapi jika Anda menguji tanpa Nginx dan tidak menemukan kesalahan, maka itu akan menjadi (atau keduanya):

  1. Masalah konfigurasi nginx
    1. Nilai batas waktu hulu salah
    2. URL probe salah di hulu
    3. Terlalu sedikit pekerja
    4. Dll
  2. Sistem operasi bottleneck TCP / IP
    1. Bisa jadi proxy itu sendiri menyebabkan duplikasi port terbuka dan status. Baik itu deskriptor file, port, koneksi TCP

Tanpa melihat konfigurasi Nginx Anda, tidak ada yang dapat mengomentari yang sebelumnya. Dan tanpa output yang sesuai dari OS, tidak ada yang dapat mengomentari yang terakhir.

Ben Lessani - Sonassi
sumber