Cách tăng kết nối đồng thời trong Apache

Hôm nay tôi đến để nói chuyện với bạn một lần nữa về một trong những dịch vụ web được sử dụng nhiều nhất trên thế giới: Máy chủ web Apache2.

Đó là một chủ đề đã được nói đến nhiều lần, nhưng bây giờ tôi muốn nói với bạn về một tính năng khác cần tính đến với dịch vụ này: Giới hạn của kết nối đồng thời. Không quan trọng nếu chúng ta có rất cơ bản hoặc một phi thuyền với bộ xử lý i7 và 32 GB ram ...

Giới hạn kết nối đồng thời sẽ luôn bằng nhau trừ khi chúng ta thực hiện các biện pháp thích hợp, có nghĩa là nếu chúng ta muốn có nhiều người kết nối cùng lúc, chúng ta không chỉ yêu cầu phần cứng tốt mà còn phải có cấu hình tốt.

Trong trường hợp này không cần thiết phải cài đặt bất cứ thứ gì, mọi thứ đều dựa trên các khái niệm đơn giản phải được tính đến để cấu hình apache; các khái niệm phải rất rõ ràng trước khi muốn thực hiện bất kỳ thay đổi nào.

apache2_logo

Điều đầu tiên cần nghĩ đến là: Nhóm của tôi có năng lực gì? Thiết bị của tôi có thể hỗ trợ bao nhiêu kết nối đồng thời nếu tôi buộc nó càng nhiều càng tốt? Tất cả điều này phụ thuộc vào một yếu tố duy nhất; RAM (Bộ nhớ truy cập ngẫu nhiên).

RAM càng lớn, số lượng kết nối càng lớn, mặc dù không có giá trị cố định (nghĩa là X máy khách cho mỗi ram X), đó là lý do tại sao trước hết điều quan trọng là phải thực hiện một số phép tính nhỏ trên máy chủ web của chúng tôi, với để biết giới hạn của chúng tôi.

Điều đầu tiên bạn nên biết là trung bình mỗi kết nối tới Apache tiêu tốn bao nhiêu RAM, vì mỗi kết nối được thiết lập giả sử một mức tiêu thụ RAM nhất định trong hệ thống ... Rõ ràng là không phải tất cả các kết nối đều sử dụng cùng một ram, kết nối nào sẽ phải thực hiện một phương tiện ... Tất cả điều này có thể được lấy bằng lệnh sau:

ps -ylC apache2 - sắp xếp: rss | awk '{SUM + = $ 8; I + = 1} HẾT {print SUM / I / 1024} '

Kết quả thu được sẽ được biểu thị bằng megabyte và có thể thay đổi tùy thuộc vào số lượng kết nối đang hoạt động, loại trang được truy cập, v.v. Vì vậy, bạn nên thực hiện kiểm tra với các tab khác nhau đang mở; mỗi người trong số họ hiển thị các nội dung khác nhau nếu có thể. Trong trường hợp của tôi, chẳng hạn, kết quả là 9.5458, nếu chúng ta làm tròn nó lên đầu sẽ là 10 MB RAM tiêu thụ trung bình trên mỗi kết nối.

Điều quan trọng là phải biết lượng RAM được tiêu thụ bởi phần còn lại của các quy trình đang hoạt động trong hệ thống, vì dịch vụ web không phải là dịch vụ duy nhất chạy trong hệ điều hành và cần phải để lại bộ nhớ RAM trống trên máy chủ để nó có thể thực thi phần còn lại của các tác vụ. Điều này có thể nhận được bằng lệnh hiển thị bên dưới:

ps -N -ylC apache2 - sắp xếp: rss | awk '{SUM + = $ 8} HẾT {print SUM / 1024}'

Kết quả thu được cũng sẽ được biểu thị bằng megabyte và nó sẽ cho chúng ta thấy khá chính xác lượng RAM được tiêu thụ bởi phần còn lại của quá trình; trong trường hợp của tôi 800 MB. Với thông tin này, chúng tôi có thể tính toán chung về số lượng kết nối đồng thời mà chúng tôi có thể có; Tôi tính toán rằng chúng tôi sẽ có được thông qua một hoạt động rất đơn giản.

(RAMTOTAL - RAM_RESTOPROCESOS) / RAM_POR_CONNEXIÓN

Với công thức này trong tay, hãy tưởng tượng rằng chúng ta có một máy tính có RAM 4 GB, tức là 4096 MB và máy tính của chúng ta đã hiển thị các kết quả nói trên; phép tính sẽ là:

(4096 - 800) / 10 = 329 kết nối đồng thời

Vấn đề với phép tính này là quá cực đoan, vì nó sẽ ngốn hết RAM (làm cho máy chủ tiêu thụ trao đổi) và ngoài ra, trong trường hợp có cơ sở dữ liệu, chẳng hạn như MySQL hoặc bất kỳ cơ sở dữ liệu nào khác, các kết nối đến nó cũng sẽ ngốn RAM, với số lượng thu được có thể được coi là một con số không tưởng. Do đó, để giải phóng bộ nhớ cho các quy trình bổ sung có thể có và cũng xem xét khả năng các kết nối đến cơ sở dữ liệu được thực thi, chúng tôi sẽ giảm số lượng kết nối xuống 250.

Bây giờ chúng ta đã có số lượng kết nối đồng thời tối đa, chúng ta sẽ phải chuẩn bị Apache để có thể nhận số này, điều này được thực hiện trong tệp cấu hình của cuộc gọi này apache2.conf, được lưu trữ trong / etc / apache2.

Tệp được đề cập tuân theo cấu trúc dựa trên mô-đun, mỗi người có tên tương ứng, nhưng chúng tôi sẽ chỉ quan tâm đến một trong số họ, tên là  mpm_prefork_module. Mô-đun được đề cập có dữ liệu sau theo mặc định:

StartServers 5 MinSpareServers 5 MaxSpareServers 10 MaxClients 150 MaxRequestsPerChild 0

Mô-đun này có một loạt các tham số rất quan trọng, mặc dù có một trong số chúng mà chúng tôi đặc biệt quan tâm, được gọi là MaxClients. Tham số này chỉ định số lượng kết nối đồng thời tối đa và nên được sửa đổi thành 250.

Một chi tiết cần lưu ý là khi một giá trị khác với giá trị mặc định được chỉ định trong tham số đã nói, cần phải thêm một giá trị khác ngay TRƯỚC tham số này. Tham số này được gọi là ServerLimit và đặt giới hạn kết nối mà máy chủ có thể "giữ" ngay cả khi nó nằm ngoài giới hạn.

Tham số ServerLimit luôn phải cao hơn một chút so với MaxClients và ở đây, vì có rất ít chỗ để điều động, giới hạn 270. Điều này sẽ làm cho mô-đun trông giống như sau:

StartServers 5 MinSpareServers 5 MaxSpareServers 10 ServerLimit 270 MaxClients 250 MaxRequestsPerChild 0

Bây giờ chỉ cần khởi động lại dịch vụ Apache bằng lệnh: 

/etc/init.d/apache2 khởi động lại

Với điều này, chúng tôi đã có thể tận hưởng máy chủ web được tối ưu hóa của mình.

Chúc mừng.


Để lại bình luận của bạn

địa chỉ email của bạn sẽ không được công bố. Các trường bắt buộc được đánh dấu bằng *

*

*

  1. Chịu trách nhiệm về dữ liệu: Miguel Ángel Gatón
  2. Mục đích của dữ liệu: Kiểm soát SPAM, quản lý bình luận.
  3. Hợp pháp: Sự đồng ý của bạn
  4. Truyền thông dữ liệu: Dữ liệu sẽ không được thông báo cho các bên thứ ba trừ khi có nghĩa vụ pháp lý.
  5. Lưu trữ dữ liệu: Cơ sở dữ liệu do Occentus Networks (EU) lưu trữ
  6. Quyền: Bất cứ lúc nào bạn có thể giới hạn, khôi phục và xóa thông tin của mình.

  1.   zetatin dijo

    Cảm ơn vì bài đăng!

    1.    drassill dijo

      Tôi rất vui vì bạn thấy nó hữu ích.

      Chúc mừng.

  2.   Miguel Ángel dijo

    Có một cách để phân cụm Apache và hai máy chủ, bạn có thể giải thích cách hoạt động của nó không?

    1.    drassill dijo

      Mặc dù tôi đã đọc một số lý thuyết về nó, nhưng tôi chưa bao giờ áp dụng nó vào thực tế. Tuy nhiên, có lẽ bài viết này có thể cung cấp cho bạn một số hướng dẫn về vấn đề này, mặc dù tôi nhắc lại rằng tôi chưa có cơ hội áp dụng nó vào thực tế:

      http://www.muspells.net/blog/2011/04/alta-disponibilidad-con-apache2-y-heartbeat-en-debian-squeeze/

    2.    Edward Khalil dijo

      Bạn đã hỏi trong một thời gian dài, nếu bạn không giải quyết; Tôi có một lược đồ cân bằng với bên thứ ba hoạt động như một hệ thống tệp, bạn trỏ các thư mục trong var / www / html / (trong trường hợp của tôi) vào hệ thống tệp, vì vậy chúng chia sẻ cùng một thông tin và bạn có thể yêu cầu một ip ảo phản hồi và chuyển hướng đến ips của apaches, vì điều này, bạn có thể chiếm một haproxy và nếu bạn muốn nó ở trạng thái sẵn sàng cao, bạn có thể tích hợp keepalive trong trường hợp một cái bị rơi, cái kia tiếp tục phản hồi hoặc nếu bạn đã có miền cho ứng dụng, bạn có thể cân bằng với pound thực hiện phụ trợ cho cả hai máy chủ, đối với các trường hợp cụ thể như moodle hoặc một số ứng dụng nhất định kết nối với cơ sở dữ liệu trong mysql, bạn sẽ phải tạo một người dùng trên mỗi máy chủ ứng dụng trỏ đến cùng một cơ sở dữ liệu .

  3.   shamaru dijo

    Cảm ơn bạn rất nhiều về bài viết, bạn hoàn toàn đúng, ram là phép tính chính, mặc dù tôi tưởng tượng rằng chúng tôi cũng tính toán số quá trình tối đa mà bộ xử lý của chúng tôi có thể xử lý (tất nhiên, trước tiên thực hiện tính toán bộ nhớ chính) và cách đĩa sẽ được phân phối cứng (Ví dụ phân vùng / var = 1TR).

    1.    drassill dijo

      Bạn đúng; mọi thứ đều quan trọng, như kiểm soát nhiệt độ trong số những thứ khác. Rõ ràng là một bộ xử lý mạnh mẽ có thể thực hiện đồng thời nhiều tác vụ hơn với hiệu suất cao, nhưng mục tiêu của bài đăng này là giải thích tầm quan trọng của RAM đối với số lượng kết nối đồng thời.

      Một cách tốt để kiểm soát tất cả các yếu tố này và xem liệu bộ xử lý của chúng ta có bị bão hòa hay không hoặc nếu chúng ta có ít RAM trống, đó là sử dụng tập lệnh bash. Có thể bài viết này tôi đã thực hiện một vài ngày trước về nó sẽ thú vị cho bạn, mà tôi để lại cho bạn trong liên kết sau; Nó là một giám sát toàn cầu nhưng nó có thể thú vị cho một:

      http://bytelearning.blogspot.com.es/2015/07/controlando-la-salud-del-equipo-con-bash.html

      Liên quan

  4.   Sergio S. dijo

    Lưu ý rất tốt, cảm ơn bạn rất nhiều!

    1.    drassill dijo

      Cảm ơn rất nhiều! Tôi hy vọng bạn đã có thể tận dụng nó.

  5.   chú hề dijo

    Tôi không muốn trở thành một kẻ ngu ngốc ...
    … Nhưng bằng cách tăng số lượng kết nối, bạn không để lại nguy cơ bị tấn công DDoS nhiều hơn?

    1.    drassill dijo

      Đó không phải là một câu hỏi khó hiểu. Sự thật là bằng cách tăng số lượng kết nối đồng thời, chúng tôi phần nào củng cố Apache chống lại các cuộc tấn công DDOS, vì bạn phải tính đến rằng số lượng kết nối đồng thời tối đa được thiết lập trên máy chủ là tổng số kết nối tối đa, không phải kết nối đến từ một người dùng duy nhất. Do đó, mặc dù lúc đầu chúng tôi chỉ có thể hỗ trợ 150 kết nối đồng thời (cho dù chúng có phải là kết nối từ một nguồn hợp pháp hay không) thì bây giờ chúng tôi có thể tin tưởng vào số lượng kết nối mà máy chủ của chúng tôi hỗ trợ, yêu cầu số lượng kết nối lớn hơn cùng lúc. dịch vụ. Rõ ràng, tăng số lượng kết nối tối đa không phải là cách để bảo vệ bạn khỏi kiểu tấn công này, mà bạn sẽ phải thực hiện các chính sách tường lửa. Ví dụ: nếu dịch vụ web mà bạn muốn đặt sắp được tiếp xúc với internet, thì một biện pháp bảo mật có thể được thực hiện sẽ là việc bổ sung các dòng này vào tường lửa của chúng tôi:

      iptables -A INPUT -p tcp –syn –dport 80 -m connlimit –connlimit-up to 10 -m state –state MỚI -j CHẤP NHẬN

      iptables -A INPUT -p tcp –dport 80 -m state –state ĐƯỢC THIẾT LẬP, LIÊN QUAN -j CHẤP NHẬN

      iptables -A INPUT -p tcp –dport 80 -j DROP

      1.    Thằng hề dijo

        Một trong những đặc điểm của các cuộc tấn công DDoS là kẻ tấn công có thể gửi gói tin từ nhiều hướng khác nhau, điều này ngăn chặn luồng gói tin chỉ đến từ một hướng.

    2.    drassill dijo

      Bạn hiểu đúng khi cho rằng tường lửa như cái mà tôi đã thiết lập không hiệu quả lắm để chống lại cuộc tấn công DDOS, vì nó đến từ các nguồn khác nhau. Tuy nhiên, tốt hơn là giới hạn số lượng kết nối ở mức 10 cho mỗi nguồn này hơn là không có giới hạn, để mỗi nguồn có thể thiết lập một trăm kết nối trở lên.

      Trong mọi trường hợp, câu hỏi đặt ra là máy chủ càng hỗ trợ nhiều kết nối đồng thời thì càng khó đánh sập nó bằng một cuộc tấn công DDOS, điều này sẽ khiến trang bị tấn công càng khó. .

      Chúc mừng.

  6.   eliotime3000 dijo

    Tốt. Hiện tại, tôi tiếp tục với NGINX trên trang web của mình để không phải tra tấn VPS mà tôi có.

  7.   Bruno cascio dijo

    Bài đăng tốt đẹp @Drassill!

    Tôi muốn đóng góp một cái gì đó có lẽ mang tính thống kê hơn là cấu hình.
    Mặc dù cách dễ nhất và nhanh nhất để tính toán tham số tiêu thụ là với giá trị trung bình, nhưng có lẽ chúng ta có thể khắt khe hơn và sử dụng "trung vị" thay vì "trung bình". Điều gì sẽ cứu chúng ta? Đó là các con số sẽ tăng lên trong trường hợp một kết nối đã tiêu tốn nhiều bộ nhớ. Ví dụ: giả sử các máy khách sau sử dụng các giá trị sau, trong đơn vị bộ nhớ mà họ muốn (KB, MB, MiB, v.v.):

    10, 15, 150, 5, 7, 10, 11, 12

    Mức trung bình sẽ cho khoảng ~ 30

    Và điều này bởi vì chúng ta có một cực trị rất lớn (150), và các phép tính là điên rồ. Trung vị bao gồm sắp xếp thứ tự các dữ liệu này, chia số lượng mẫu cho 2 (trung tâm của chúng tôi) và sau đó lấy số lượng của vị trí đó. Với điều này, chúng tôi sẽ có một cái gì đó giống như

    5, 7, 10, 10, 11, 12, 15, 150

    Vì vậy, giá trị trung bình của chúng ta sẽ là: 8/2 = 4 tức là ~ 10

    Ở đây bạn có thể thấy rằng cho dù sự cực đoan có điên rồ đến đâu, nó sẽ luôn mang lại cho chúng ta một giá trị thực tế hơn. Nếu chúng ta thêm một khách hàng tiêu thụ 200, mức trung bình của chúng ta sẽ là 11, trong khi mức trung bình có thể là …….

    Nó chỉ là một đóng góp, và nó là rất đáng tranh luận, bởi vì với các kết nối nó không được vặn.

    Ôm người linuxera 🙂

  8.   Carlos dijo

    Xin chào, tôi đã gặp sự cố trên máy chủ chuyên dụng của mình và đó là mỗi khi số lượng khoảng 250 người trực tuyến tiếp cận, theo google analytics trong thời gian thực, máy chủ của tôi như bị sập và kết nối trở nên chậm chạp cho đến khi mất kết nối lên trang web và không bao giờ tải lên nhiều hơn số lượng người dùng trực tuyến đó, nhưng khi tôi xem hiệu suất của máy chủ chuyên dụng có ram 8gb, nó hiển thị 10% sử dụng, cpu: 5% sử dụng và đĩa cứng: 1.99%. sử dụng.
    Bạn có thể giúp tôi được không? Tôi không thể tìm thấy phải làm gì, thực hiện các bước này có phải là giải pháp không?

    1.    drassill dijo

      Carlos tốt.

      Sự cố bạn mô tả rất phổ biến khi máy chủ không được chuẩn bị đúng cách. Máy chủ của bạn có thể sẽ chấp nhận số lượng kết nối đồng thời ít hơn nhiều và khi đạt đến 250 kết nối, nó sẽ bị sập. Làm theo hướng dẫn này, bạn sẽ có thể giải quyết vấn đề, mặc dù nếu bạn có cơ sở dữ liệu trên máy chủ đó, bạn cũng sẽ phải tối ưu hóa cơ sở dữ liệu đó.

      Chúc mừng.

      1.    Carlos dijo

        Drassill ơi, mình đã thực hiện cấu hình mà bạn nêu và thấy ưng ý, hôm qua mình đạt 280 người dùng online và máy chủ không bị treo, mình rất hài lòng với kết quả này, và mình cũng muốn làm việc khác mà bạn dặn để tối ưu cơ sở dữ liệu, ¿Làm cách nào để đạt được điều này?

    2.    drassill dijo

      Khái niệm cơ sở dữ liệu khá mở; Việc sử dụng mysql làm postgres (ví dụ) không giống nhau. Rõ ràng là tôi không biết tất cả các cơ sở dữ liệu; Tôi đã thử mysql và postgres, và sự gia tăng của các kết nối đồng thời trong các kết nối này sẽ dựa trên các kết nối tối đa tham số; Tối ưu hóa mysql sẽ được thực hiện trong /etc/my.conf và tham số kết nối tối đa sẽ phải được thay đổi (trong số những người khác). Đối với postgres thay vào đó, tôi có một bài viết trên blog của mình giải thích cách tối ưu hóa nó có thể hữu ích cho bạn hoặc bạn có thể sử dụng nó làm tài liệu tham khảo cho cơ sở dữ liệu của mình:

      http://bytelearning.blogspot.com.es/2016/02/postgresql-una-alternativa-mysql-en.html

      Chúc mừng.

  9.   Erickson vasquez dijo

    Xin chào, khi tôi ném lệnh đầu tiên, nó hiển thị cho tôi giá trị 0. Nó có thể là gì?

  10.   Daniel Ojeda dijo

    Cám ơn vì bài viết.

  11.   Rolando Aguilera Salazar dijo

    Thật là một hướng dẫn tốt, thông tin đó là một phần của những gì tôi đang tìm kiếm... cảm ơn!

    Nhưng bây giờ, nếu tôi muốn rằng khi vượt quá 250 khách truy cập đó, khách truy cập 251 sẽ chuyển đến trang chờ hoặc hàng đợi ảo, tôi có thể thực hiện điều đó từ cùng cấu hình này không?

    Xin chào và cảm ơn!