Nginx: hàng ngàn server_name


12

Làm cách nào tôi có thể định cấu hình Nginx giới hạn ở hàng nghìn server_name khác nhau mà không tạo hàng nghìn tệp cấu hình bên ngoài hoặc viết một dòng server_name rất dài?

Thật vậy, tôi muốn Nginx là một proxy ngược chỉ dành cho server1.com, server2.com, v.v ...

Giải pháp tốt nhất cho tôi là có một tệp cấu hình bên ngoài có chứa server_names bị hạn chế của tôi: server1.com, server2.com, v.v ...

Có thể không?


Ok, cảm ơn bạn đã trả lời, nó hoạt động mà không cần reg. biểu thức. Chỉ cần một danh sách server_name lớn như được giải thích bởi kolbijack. Cám ơn.


bạn nên chấp nhận câu trả lời của kolbijack, nếu đó là câu giúp.
Oneiroi

Câu trả lời:


19

Bạn có thể tự đặt chỉ thị server_name trong một tệp và sau đó chỉ bao gồm nó từ khối máy chủ của bạn:

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

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

Tệp server_names chỉ cần server_name ở đầu và; ở phía dưới để là một chỉ thị hợp lệ.


Cảnh giác với độ trễ / độ trễ tra cứu / sử dụng RAM nếu bạn làm điều này. Tôi đã thực hiện một số thử nghiệm với các danh sách lớn (khoảng 5.000 ServerAliaschỉ thị và lên tới 16 triệu Deny fromchỉ thị) trong Apache. 5.000 tên miền tạo ra độ trễ có thể đo được nhưng nhỏ. Khi tăng số lượng, tôi thấy sự chậm trễ bắt đầu trở nên đáng chú ý ở mức khoảng 50.000. Với Apache (và có lẽ cũng với nginx), danh sách được giữ trong RAM, điều đó có nghĩa là với bộ lớn nhất tôi đã thử, tôi chỉ có thể bắt đầu một tiến trình con trong RAM có sẵn của mình.
Ladadadada

1
@Ladadadada LOL. Tôi vừa mới kiểm tra. Nginx sử dụng 30Mb RAM cho 100 000 tên miền trong server_namechỉ thị và phản hồiRequest rate: 36900.6 req/s (0.0 ms/req)
VBart

1
60Mb cho 1 000 000 vàRequest rate: 34716.8 req/s (0.0 ms/req)
VBart

Điều đó tốt hơn đáng kể so với Apache quản lý, ít nhất là với MPM prefork. Tiện dụng để biết.
Ladadadada

7

Các server_nametuyên bố trong bạn server {}khối có thể là một biểu hiện thường xuyên, điều này sẽ cho phép bạn để phù hợp với server_name s trong một mẫu thiết lập.

Thông tin thêm về điều này có thể được nhìn thấy ở đây: http://nginx.org/en/docs/http/server_names.html#regex_names


Cảm ơn bạn, nhưng tôi không thể khai báo danh sách tên miền tùy chỉnh của mình trong một biểu thức chính quy duy nhất. server_name [zeus.domain.com | poseidon.domain.com | vv ...]; Nó sẽ quá dài.
Fred

1
@fred Bạn có thể đưa ra một tập dữ liệu mẫu không? trừ khi không có một tên miền nào giống như tất cả, tôi hoàn toàn tin tưởng rằng mẫu Regex sẽ giải quyết vấn đề của bạn.
Oneiroi

@Oneiroi: ví dụ use case = tên miền phụ do người dùng tạo. Hãy tưởng tượng một sản phẩm dưới dạng dịch vụ nơi mỗi người dùng có tên miền phụ của riêng họ và bạn muốn sử dụng Nginx để định tuyến chúng đến các máy chủ khác nhau. Trong trường hợp đó, không một tên miền nào giống như tên miền nào cả.
m.stenta

@ m.stenta ah, điểm công bằng. Trừ khi có một số điểm chung trong các tên miền phụ thì yeah regex sẽ không hoạt động. Hoặc bạn sẽ cần phải liên kết với việc tạo regex bắt nguồn từ chính miền mà imho đánh bại mục đích.
Oneiroi
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.