Kata pengantar
Artikel ini adalah beberapa catatan bagi saya untuk mempelajari Nginx, konten utama menceritakan beberapa konsep dasar yang diperlukan untuk memahami Nginx.
Kemudian membahas struktur organisasi modular Nginx, serta klasifikasi, metode kerja, tanggung jawab, dan instruksi terkait yang diberikan oleh setiap modul.
Terutama mencapai tujuan berikut:
Tentang Nginx
Nginx adalah server HTTP berorientasi kinerja yang dapat membalikkan proxy HTTP, HTTPS, dan tautan protokol terkait email (SMTP, POP3, IMAP). Dan menyediakan load balancing dan cache HTTP.
Desainnya memanfaatkan sepenuhnya model peristiwa asinkron, mengurangi overhead penjadwalan konteks, dan meningkatkan kapabilitas konkurensi server.
Ini mengadopsi desain modular dan menyediakan modul pihak ketiga dengan modul yang melimpah.
Tentang Nginx, ada tag berikut: "asynchronous" "event" "modular" "high performance" "high concurrency" "reverse proxy" "load balancing"
konsep dasar
Model proses
Proses Nginx menggunakan model klasik "Master-Worker".
Setelah Nginx dimulai, akan ada proses master dan beberapa proses pekerja.
Proses master terutama digunakan untuk mengelola proses pekerja, termasuk: menerima sinyal dari dunia luar, mengirimkan sinyal ke setiap proses pekerja, memantau status proses pekerja yang sedang berjalan, dan secara otomatis memulai kembali proses pekerja baru ketika proses pekerja keluar (dalam kondisi abnormal) .
Proses pekerja terutama menangani peristiwa jaringan dasar. Beberapa proses pekerja bersifat peer-to-peer. Proses tersebut bersaing secara setara untuk permintaan dari klien, dan setiap proses tidak bergantung satu sama lain. Perlu dicatat bahwa setiap Pekerja hanya memiliki utas utama, yang disebut "utas tunggal".
Permintaan hanya dapat diproses dalam satu proses pekerja, dan proses pekerja tidak dapat memproses permintaan dari proses lain.
Jumlah proses pekerja dapat disetel, dan umumnya disetel agar konsisten dengan jumlah inti CPU mesin. Alasannya tidak terlepas dari model proses nginx dan model pemrosesan peristiwa. Untuk memanfaatkan fitur multi-core dengan lebih baik, nginx menyediakan opsi pengikatan afinitas cpu. Kita dapat mengikat proses tertentu ke inti tertentu sehingga cache tidak akan dibatalkan karena peralihan proses. Lebih banyak pekerja hanya akan menyebabkan proses bersaing untuk mendapatkan sumber daya cpu.
Model proses Nginx.png
Model acara
Nginx mengimplementasikan peristiwa dengan cara "non-pemblokiran asinkron".
Asynchronous dan non-asynchronous, blocking dan non-blocking adalah dua konsep yang berbeda. Yang pertama lebih untuk aplikasi, dan yang kedua lebih untuk CPU:
Metode "asynchronous non-blocking" Nginx, ketika berhubungan dengan panggilan sistem, adalah panggilan sistem seperti select / poll / epoll / kqueue. Mereka menyediakan mekanisme yang memungkinkan Anda untuk memantau beberapa acara pada saat yang sama. Memanggilnya memblokir, tetapi Anda dapat menyetel waktu tunggu. Dalam periode waktu tunggu, jika sebuah acara siap, kembali.
Epoll adalah implementasi event di Linux, dan kqueue adalah model event yang mirip dengan epoll di sistem operasi OpenBSD atau FreeBSD.
Jadi fokuslah menjelaskan model epoll:
epoll event model.png
Solusi ini adalah mekanisme pemberitahuan peristiwa I / O yang paling efisien di Linux. Jika peristiwa I / O tidak terdeteksi saat memasuki pemungutan suara, ia akan tidur sampai peristiwa membangunkannya. Ini sebenarnya menggunakan metode pemberitahuan kejadian dan eksekusi callback daripada melintasi kueri, sehingga tidak membuang-buang CPU dan memiliki efisiensi eksekusi yang lebih tinggi.
Proksi terbalik
Untuk memahami "reverse proxy", Anda harus terlebih dahulu mengetahui apa itu "proxy server" dan "forward proxy"
Server proxy
Di jaringan, klien memulai permintaan untuk mendapatkan sumber daya dari server. Saluran langsung tidak dibuat di antara mereka, tetapi diteruskan oleh server proxy.
Server proxy bertindak sebagai media dalam jaringan untuk mengembalikan sumber daya yang diperoleh di Internet ke klien yang relevan.
Proksi yang biasanya kami rujuk umumnya mengacu pada "proksi penerusan", yang relatif terhadap klien.
Misalnya, saya terhubung ke VPN. Ketika saya mengunjungi Google, klien memulai permintaan ke VPN. VPN membantu meneruskan permintaan ke server Google, dan kemudian mengembalikan tanggapan Google ke klien. Dalam proses ini, VPN bertindak sebagai "server proxy penerusan".
Server proxy.png
Proksi terbalik
Tidak seperti "forward proxy", istilah "reverse proxy" ditujukan pada sisi server. Permintaan klien datang ke server proxy, dan server proxy meneruskan permintaan ke server yang berbeda sesuai dengan permintaan klien. Dalam proses ini, dalam "load balancing", dua permintaan yang sama juga akan terjadi, dan mereka akan diteruskan ke tempat yang sangat berbeda Situasi di server.
"Reverse proxy" adalah prasyarat untuk realisasi "load balancing". Justru karena proxy server memiliki kemampuan untuk menyelesaikan permintaan dan mendistribusikan permintaan, load balancing dapat dicapai dan beban pada setiap server dapat dikurangi.
Menggunakan "proxy balik", selain mencapai penyeimbangan beban, Anda juga dapat mencapai fungsi seperti: enkripsi SSL, cache konten statis, kompresi gzip, upload lambat, keamanan, dll.
Membalikkan proxy.png
Penyeimbang beban
Load balancing adalah teknologi jaringan komputer yang digunakan untuk mendistribusikan beban di antara beberapa server untuk mengoptimalkan penggunaan sumber daya, memaksimalkan throughput, meminimalkan waktu respons, dan menghindari kelebihan beban.
Menggunakan beberapa komponen server dengan load balancing sebagai ganti satu komponen dapat meningkatkan keandalan melalui redundansi. Realisasi layanan load balancing dapat diwujudkan melalui perangkat lunak dan perangkat keras.
Dalam distribusi load balancing, umumnya ada beberapa set algoritma untuk menangani masalah distribusi.
Koneksi
Di nginx, koneksi adalah enkapsulasi koneksi tcp, yang mencakup soket yang terhubung, acara baca, dan acara tulis. Dengan koneksi yang dienkapsulasi oleh nginx, kita dapat dengan mudah menggunakan nginx untuk menangani hal-hal yang berhubungan dengan koneksi, seperti membuat koneksi, mengirim dan menerima data, dll.
Pemrosesan permintaan http di nginx didasarkan pada koneksi, jadi nginx dapat digunakan tidak hanya sebagai server web, tetapi juga sebagai server email.
Tentu saja, dengan menggunakan koneksi yang disediakan oleh nginx, kita dapat menangani layanan back-end apa pun.
Jumlah koneksi maksimum
Di nginx, setiap proses memiliki batas atas maksimum dari jumlah koneksi, yang berbeda dari batas sistem di fd.
Dalam sistem operasi, melalui ulimit -n, kita bisa mendapatkan jumlah maksimum fd yang dapat dibuka oleh suatu proses, yaitu nofile, karena setiap koneksi soket akan menempati satu fd, jadi ini juga akan membatasi jumlah koneksi maksimum dari proses kita. Tentu saja, ini juga akan secara langsung mempengaruhi jumlah maksimum konkurensi yang dapat didukung oleh program kita. Ketika fd digunakan, ketika soket dibuat lagi, itu akan gagal.
Nginx menetapkan jumlah koneksi maksimum yang didukung oleh setiap proses dengan menyetel worker_connectons. Jika nilainya lebih besar dari nofile, maka jumlah koneksi maksimum sebenarnya adalah nofile dan nginx akan memperingatkan Anda.
Ketika nginx diimplementasikan, ia dikelola melalui sebuah kumpulan koneksi. Setiap proses pekerja memiliki sebuah kumpulan koneksi independen, dan ukuran kumpulan koneksi adalah worker_connections. Pool koneksi di sini sebenarnya bukan koneksi yang sebenarnya, ini hanya sebuah array dari struktur ngx_connection_t dengan ukuran worker_connections. Selain itu, nginx menyimpan semua ngx_connection_t gratis melalui daftar tautan free_connections. Setiap kali koneksi diperoleh, ia memperolehnya dari daftar koneksi gratis, dan kemudian memasukkannya kembali ke daftar koneksi gratis setelah digunakan.
Oleh karena itu, jumlah koneksi maksimum yang dapat dibuat oleh nginx: worker_connections * worker_processes,
Jika nginx digunakan sebagai reverse proxy, karena permintaan nginx perlu membuat permintaan klien dan server, jumlah koneksi maksimum adalah: worker_connections * worker_processes / 2
Minta Permintaan
Di nginx, kami merujuk ke permintaan http, dan struktur data di nginx adalah ngx_http_request_t.
Ini adalah enkapsulasi permintaan http, nginx menyimpan data yang terkait dengan permintaan analisis dan respons keluaran melalui ngx_http_request_t.
Permintaan http mencakup baris permintaan, header permintaan, isi permintaan, baris respons, header respons, dan isi respons.
Proses pemrosesan permintaan jaringan umum adalah:
Ada beberapa perbedaan kecil saat nginx memproses permintaan, misalnya saat header permintaan dibaca, ia mulai memproses permintaan.
Proses permintaan pemrosesan Nginx
Proses konseptual abstrak dari nginx memproses permintaan:
Struktur data dasar
Dalam mengejar efisiensi ekstrim, penulis nginx telah mengimplementasikan banyak struktur data dan fungsi publik bergaya nginx yang khas. Misalnya, nginx menyediakan string dengan panjang, dan fungsi salinan string ngx_copy dioptimalkan sesuai dengan opsi compiler.
ps: Pembagian garis bawah adalah gaya nama variabel dari bahasa C.
Deskripsi Struktur Data ngx_str_t enkapsulasi string ngx_pool_t menyediakan mekanisme untuk membantu mengelola serangkaian sumber daya (memori, file) struktur array ngx_array_t ngx_chain_t terutama digunakan untuk realisasi daftar tertaut transfer data antar modul ngx_buf_t adalah implementasi aktual dari setiap node dari daftar tertaut ngx_chain_t , Atas nama beberapa data tertentu. Implementasi struktur data daftar ngx_list_t dan implementasi tabel hash daftar tertaut ganda ngx_hash_t diimplementasikan oleh ngx_queue_t ngx_hash_wildcard_t Struktur tabel hash ngx_combinded_t diimplementasikan untuk menangani masalah pencocokan dengan nama domain wildcard Ini untuk menyediakan wadah praktis yang berisi tiga jenis tabel hash_t ngx_key Konfigurasi kelas tambahan untuk membangun jenis hash lainnya
Sistem konfigurasi nginx terdiri dari file konfigurasi utama dan beberapa file konfigurasi tambahan lainnya. Semua file konfigurasi ini adalah file teks biasa, semuanya terletak di direktori conf di bawah direktori instalasi nginx.
Instruksi disediakan oleh berbagai modul nginx, dan modul yang berbeda memberikan instruksi yang berbeda untuk mengimplementasikan konfigurasi.
Selain instruksi berupa Key-Value, juga terdapat instruksi lingkup.
Informasi konfigurasi di nginx.conf diklasifikasikan menurut pengertian logisnya, yang dibagi menjadi beberapa cakupan, atau disebut konteks instruksi konfigurasi. Cakupan yang berbeda berisi satu atau beberapa item konfigurasi.
Instruksi konteks berikut lebih banyak digunakan:
Directive Description Contains Directive main Beberapa parameter yang tidak ada hubungannya dengan fungsi bisnis tertentu (seperti layanan http atau proxy layanan email) ketika nginx sedang berjalan, seperti jumlah proses kerja, identitas yang berjalan, dll. user, worker_processes, error_log, events, http, mail http Beberapa parameter konfigurasi terkait dengan penyediaan layanan http. Misalnya: apakah akan menggunakan keepalive, apakah akan menggunakan gzip untuk kompresi, dll. Layanan http server server mendukung beberapa host virtual. Setiap host virtual memiliki item konfigurasi server yang sesuai, yang berisi konfigurasi yang terkait dengan host virtual. Saat menyediakan proxy untuk layanan email, beberapa server juga dapat dibuat.Setiap server dibedakan berdasarkan alamat mendengarkan. mendengarkan, server_name, access_log, lokasi, protokol, proxy, smtp_auth, lokasi xclient Dalam layanan http, serangkaian item konfigurasi yang sesuai dengan URL tertentu tertentu. index, root mail Saat menerapkan proxy SMTP / IMAP / POP3 terkait email, beberapa item konfigurasi dibagikan (karena beberapa proxy dapat diterapkan, bekerja pada beberapa alamat yang mendengarkan). server, http, modul imap_capabilities
Nginx mengatur berbagai modul fungsional ke dalam sebuah rantai. Saat sebuah permintaan tiba, permintaan tersebut melewati beberapa atau semua modul dalam rangkaian ini untuk diproses. Setiap modul mengimplementasikan fungsi tertentu. Misalnya, modul yang mengimplementasikan dekompresi permintaan, modul yang mengimplementasikan SSI, modul yang mengimplementasikan komunikasi dengan server upstream, dan modul yang mengimplementasikan komunikasi dengan layanan FastCGI.
Ada tiga jenis modul:
Menurut tata letak dokumen resmi, modul tambahan juga dibagi ke dalam kategori berikut:
Menurut fungsinya, dapat dibagi menjadi beberapa kategori berikut:
akhir
Artikel ini menjelaskan beberapa konsep dasar Nginx.
Model threading Nginx adalah mode Master-Worker. Setiap pekerja adalah single-threaded, artinya memproses permintaan adalah single-threaded. Model peristiwa konkurensi single-threaded adalah model "I / O non-pemblokiran asinkron".
Ini juga menjelaskan konsep "reverse proxy" dan "load balancing", yang merupakan salah satu alasan mengapa nginx dapat menangani konkurensi tinggi dengan kinerja tinggi.
Nginx memiliki konsep dan enkapsulasi Koneksi dan Permintaan untuk permintaan jaringan.
Struktur organisasi kode sumber Nginx adalah modular, modul yang berbeda menerapkan tanggung jawab yang berbeda, dan kemudian mereka terhubung bersama untuk melakukan tugas utama.Mengetahui klasifikasi modul dapat memberi tahu kami cara menemukan dokumen resmi.
Sebelum saya melihat perintah mana dan perintah mana yang memiliki fungsi apa, saya tidak bisa sepenuhnya mengetahui jenis fungsi yang disediakan nginx. Kemudian tunggu sebentar, lalu berpegang pada gagasan "semua orang bisa memikirkannya dan menyadarinya" Gunakan nginx. Sebagai layanan proxy, Nginx dapat melakukan apapun yang Anda inginkan di tengah.
Penulis: JC_Huang
Tautan: https://www.jianshu.com/p/1648d4e936f2
- Skin champion yang paling diinginkan JKL adalah dia! Siaran langsung dengan kepala sekolah untuk mengungkap berita tentang skin champion
- Karya baru Hu Mei "Into the Capital" ditetapkan untuk 10 Mei, Ma Yili dan Fu Dalong membuat penampilan yang menakjubkan