Nginx: ribuan nama_server

12

bagaimana cara mengkonfigurasi Nginx membatasi ke ribuan server_name yang berbeda tanpa membuat ribuan file konfigurasi eksternal atau menulis baris server_name yang sangat panjang?

Memang, saya ingin Nginx menjadi reverse-proxy hanya untuk server1.com, server2.com, dll ...

Solusi terbaik bagi saya adalah memiliki file konfigurasi eksternal tunggal yang berisi nama_data terbatas saya: server1.com, server2.com, dll ...

Apa itu mungkin ?


Ok, terima kasih atas jawaban Anda, itu berfungsi tanpa reg. ekspresi. Hanya daftar nama server besar seperti yang dijelaskan oleh kolbijack. Terima kasih.

Fred
sumber
Anda harus menerima jawaban kolbijack, jika itu yang membantu.
Oneiroi

Jawaban:

19

Anda dapat menempatkan direktif nama_dalam file dengan sendirinya dan kemudian hanya memasukkannya dari blok server Anda:

# example.com.conf
server {
  include /path/to/server_names;
  ...
}

# /path/to/server_names
server_name
  example.com
  domain.com
  foo.com
;

File server_names hanya perlu server_name di bagian atas dan; di bagian bawah menjadi arahan yang valid.

kolbyjack
sumber
Waspadalah terhadap keterlambatan / keterlambatan pencarian / penggunaan RAM jika Anda melakukan ini. Saya telah melakukan beberapa pengujian dengan daftar besar (sekitar 5.000 ServerAliasarahan dan hingga 16 juta Deny fromarahan) di Apache. 5.000 domain menghasilkan penundaan yang terukur tetapi kecil. Ketika menambah jumlahnya, saya menemukan penundaan mulai terlihat sekitar 50.000. Dengan Apache (dan mungkin juga dengan nginx), daftar disimpan dalam RAM yang berarti bahwa dengan set terbesar yang saya coba, saya hanya bisa memulai satu proses anak dalam RAM yang tersedia.
Ladadadada
1
@Ladadada LOL. Saya baru saja memeriksa. Nginx menggunakan 30Mb RAM untuk 100.000 domain dalam server_namearahan dan tanggapRequest rate: 36900.6 req/s (0.0 ms/req)
VBart
1
60Mb untuk 1 000 000 danRequest rate: 34716.8 req/s (0.0 ms/req)
VBart
Itu jauh lebih baik daripada yang dikelola Apache, setidaknya dengan MPM prefork. Berguna untuk tahu.
Ladadadada
7

The server_namedeklarasi di Anda server {}blok dapat menjadi ekspresi reguler, ini harus memungkinkan Anda untuk mencocokkan SERVER_NAME s dalam mengatur pola.

Informasi lebih lanjut tentang ini dapat dilihat di sini: http://nginx.org/en/docs/http/server_names.html#regex_names

Oneiroi
sumber
Terima kasih, tetapi saya tidak dapat mendeklarasikan daftar domain khusus saya dalam satu ekspresi reguler. server_name [zeus.domain.com | poseidon.domain.com | etc ...]; Itu akan terlalu lama.
Fred
1
@ Fred Bisakah Anda memberikan contoh kumpulan data? kecuali tidak ada satu domain seperti yang lain sama sekali saya akan cukup yakin bahwa pola Regex akan menyelesaikan masalah Anda.
Oneiroi
@Oneiroi: example use case = subdomain yang dibuat pengguna. Bayangkan produk perangkat lunak sebagai layanan di mana setiap pengguna mendapatkan subdomain mereka sendiri, dan Anda ingin menggunakan Nginx untuk merutekannya ke server yang berbeda. Dalam hal ini, tidak ada satu domain yang sama seperti domain lainnya.
m.stenta
@ m.stenta ah, titik adil. Kecuali ada beberapa kesamaan di subdomain maka ya regex tidak akan berfungsi. Atau Anda akan perlu untuk mengikat dalam penciptaan regex yang berasal dari domain itu sendiri yang imho mengalahkan tujuannya.
Oneiroi