როგორ გავზარდოთ ერთდროული კავშირები Apache- ში

დღეს მოვედი კიდევ ერთხელ გესაუბროთ მსოფლიოში ერთ-ერთ ყველაზე ხშირად გამოყენებულ ვებ – სერვისზე: ვებ – სერვერი Apache2.

ეს არის თემა, რომელზეც ბევრჯერ ისაუბრეს, მაგრამ ახლა მე მოვედი გითხრათ კიდევ ერთი მახასიათებლის შესახებ, რომელიც უნდა გაითვალისწინოთ ამ სერვისით: ერთდროული კავშირების ლიმიტი. არ აქვს მნიშვნელობა, ჩვენ გვაქვს ძალიან მარტივი ან კოსმოსური ხომალდი i7 პროცესორით და 32 გბ RAM– ით ...

ერთდროული კავშირის ლიმიტი ყოველთვის იგივე იქნება, თუ არ მივიღებთ შესაბამის ზომებს, რაც იმას ნიშნავს, რომ თუ გვინდა, რომ ერთდროულად ბევრი ადამიანი იყოს დაკავშირებული, ჩვენ არა მხოლოდ კარგი აპარატურა, არამედ კარგი კონფიგურაციაც დაგვჭირდება.

ამ შემთხვევაში არაფრის დაყენება არ არის საჭირო, ყველაფერი ეფუძნება მარტივ კონცეფციებს, რომლებიც მხედველობაში უნდა იქნეს მიღებული აპაჩის კონფიგურაციისთვის; ცნებები, რომლებიც ძალიან მკაფიო უნდა იყოს, სანამ რაიმე ცვლილების შეტანას მოისურვებთ.

apache2_logo

პირველი, რაზეც უნდა ვიფიქროთ არის: რა შესაძლებლობები აქვს ჩემს გუნდს? რამდენი ერთდროული კავშირის მხარდაჭერა შეუძლია ჩემს აღჭურვილობას, თუ მას მაქსიმალურად ვაიძულებ? ეს ყველაფერი დამოკიდებულია ერთ ფაქტორზე; ოპერატიული მეხსიერება (შემთხვევითი წვდომის მეხსიერება).

რაც მეტია ოპერატიული მეხსიერება, მით უფრო მეტია კავშირის რაოდენობა, თუმცა არ არის ფიქსირებული მნიშვნელობა (ეს არის X კლიენტი თითოეული X ram– სთვის), ამიტომ პირველ რიგში მნიშვნელოვანია ჩვენს ვებ – სერვერზე მცირე გათვლების გაკეთება, იმისათვის, რომ იცოდეთ ჩვენი საზღვრები.

პირველი, რაც უნდა იცოდეთ, რამდენს მოიხმარს ოპერატიული მეხსიერება საშუალოდ Apache– ს თითოეულ კავშირს, რადგან ყოველი დამყარებული კავშირი ითვალისწინებს RAM– ის გარკვეულ მოხმარებას სისტემაში ... ცხადია, ყველა კავშირი არ მოიხმარს ერთ RAM– ს, რომელთანაც თქვენ მოგიწევთ გააკეთეთ მედია ... ამ ყველაფრის მიღება შეგიძლიათ შემდეგი ბრძანებით:

ps -ylC apache2 - დალაგება: rss | awk '{SUM + = $ 8; I + = 1} END {ბეჭდვითი SUM / I / 1024} '

მიღებული შედეგი მეგაბაიტებში იქნება წარმოდგენილი და შეიძლება იცვლებოდეს აქტიური კავშირების რაოდენობის, ხელმისაწვდომი გვერდების ტიპისა და ა.შ., ამ მიზეზით სასურველია ტესტის ჩატარება სხვადასხვა ჩანართით; თითოეული მათგანი, თუ შესაძლებელია, აჩვენებს სხვადასხვა შინაარსს. ჩემს შემთხვევაში, მაგალითად, შედეგი იყო 9.5458, რაც თუ მას თავზე დავაბრუნებთ, იქნებოდა 10 MB ოპერატიული მეხსიერება მოიხმარა საშუალოდ თითო კავშირით.

ასევე მნიშვნელოვანია ვიცოდეთ რამდენს მოიხმარს ოპერატიული მეხსიერება სისტემაში აქტიური დანარჩენი პროცესების მიერ, ვინაიდან ვებ – სერვისი არ არის ერთადერთი, რომელიც მუშაობს ოპერაციულ სისტემაში და საჭიროა უფასო RAM მეხსიერების დატოვება სერვერი ისე, რომ მას შეუძლია შეასრულოს დანარჩენი ამოცანები. ამის მიღება შესაძლებელია ქვემოთ ნაჩვენები ბრძანებით:

ps -N -ylC apache2 - დალაგება: rss | awk '{SUM + = $ 8} END {print SUM / 1024}'

მიღებული შედეგი ასევე მეგაბაიტებში იქნება წარმოდგენილი და ის საკმაოდ ზუსტად დაგვანახვებს დანარჩენი პროცესების მიერ მოხმარებული ოპერატიული მეხსიერების რაოდენობას; ჩემს შემთხვევაში 800 MB. ამ ინფორმაციის საშუალებით ჩვენ შეგვიძლია გავაკეთოთ ზოგადი გამოთვლა იმ ერთდროული კავშირების რაოდენობისა, რაც შეიძლება გქონდეს; მე ვთვლი, რომ ჩვენ მივიღებდით ძალიან მარტივი ოპერაციის საშუალებით.

(RAMTOTAL - RAM_RESTOPROCESOS) / RAM_POR_CONNEXIÓN

ამ ფორმულის ხელთ, წარმოვიდგინოთ, რომ გვაქვს კომპიუტერი 4 გბ ოპერატიული მეხსიერებით, ანუ 4096 მბაიტი და რომ ჩვენმა კომპიუტერმა აჩვენა ზემოაღნიშნული შედეგები; გაანგარიშება იქნება:

(4096 - 800) / 10 = 329 ერთდროული კავშირი

ამ გაანგარიშების პრობლემა არის ის, რომ ეს არის ძალიან ექსტრემალური, რადგან ის მოიხმარს მთელ RAM მეხსიერებას (სერვერს სჭირდება swap) და ასევე მონაცემთა ბაზის არსებობის შემთხვევაში, როგორიცაა MySQL ან ნებისმიერი სხვა, მასთან დაკავშირებული კავშირები ასევე მოიხმარს ოპერატიული მეხსიერება, ამიტომ მიღებული ნომერი შეიძლება შეფასდეს როგორც უტოპიური ნომერი. ამიტომ, მეხსიერების გასათავისუფლებლად შესაძლო დამატებითი პროცესებისთვის და ასევე იმის გათვალისწინებით, რომ მონაცემთა ბაზასთან კავშირი შესრულდება, შევამცირებთ კავშირების რაოდენობას 250.

ახლა, როდესაც ჩვენ გვაქვს ერთდროული კავშირის მაქსიმალური რაოდენობა, უნდა მოვამზადოთ Apache ამ ნომრის მისაღებად, რაც გაკეთებულია ამ ზარის კონფიგურაციის ფაილში. apache2.conf, რომელიც მასპინძლობს ქ / etc / apache2.

მოცემული ფაილი მიჰყვება სტრუქტურას, რომელიც დაფუძნებულია მოდულებითითოეულს თავისი სახელი აქვს, მაგრამ ჩვენ მხოლოდ ერთი მათგანი დაგვინტერესებს, ვისი სახელია  mpm_prefork_module. მოცემულ მოდულს სტანდარტულად აქვს შემდეგი მონაცემები:

StartServers 5 MinSpareServers 5 MaxSpareServers 10 MaxClients 150 MaxRequestsPerChild 0

ამ მოდულს აქვს ძალიან მნიშვნელოვანი პარამეტრების სერია, თუმცა არსებობს ერთი მათგანი, რომელიც განსაკუთრებით დაგვინტერესებს, ე.წ. მაქს კლიენტები. ეს პარამეტრი განსაზღვრავს ერთდროული კავშირის მაქსიმალურ რაოდენობას და უნდა შეიცვალოს შემდეგით 250.

ერთი დეტალი, რომელიც უნდა გახსოვდეთ არის ის, რომ როდესაც აღნიშნულ პარამეტრში ნაგულისხმევის გარდა სხვა მნიშვნელობაა მითითებული, საჭიროა დაამატოთ კიდევ ერთი, უბრალოდ, ამ ერთის წინ. ამ პარამეტრს ეწოდება სერვერის ლიმიტი და ადგენს კავშირების ლიმიტს, რომელსაც სერვერი შეიძლება "ინახავდეს" მაშინაც კი, როდესაც იგი ლიმიტს არ არის.

ServerLimit პარამეტრი ყოველთვის უნდა იყოს ოდნავ უფრო მაღალი ვიდრე MaxClients და აქ, რადგან მანევრის მცირე სივრცეა, 270. ეს მოდულს ასე გამოიყურება:

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

ახლა მხოლოდ საჭირო იქნება Apache სერვისის გადატვირთვა ბრძანების გამოყენებით: 

/etc/init.d/apache2 გადატვირთეთ

ამით უკვე შეგვიძლია დატკბეთ ჩვენი ოპტიმიზირებული სერვერით.

ულოცავენ.


სტატიის შინაარსი იცავს ჩვენს პრინციპებს სარედაქციო ეთიკა. შეცდომის შესატყობინებლად დააჭირეთ ღილაკს აქ.

21 კომენტარი დატოვე შენი

დატოვე კომენტარი

თქვენი ელფოსტის მისამართი გამოქვეყნებული არ იყო. აუცილებელი ველები აღნიშნულია *

*

*

  1. მონაცემებზე პასუხისმგებელი: მიგელ ანგელ გატონი
  2. მონაცემთა მიზანი: სპამის კონტროლი, კომენტარების მართვა.
  3. ლეგიტიმაცია: თქვენი თანხმობა
  4. მონაცემთა კომუნიკაცია: მონაცემები არ გადაეცემა მესამე პირებს, გარდა სამართლებრივი ვალდებულებისა.
  5. მონაცემთა შენახვა: მონაცემთა ბაზა, რომელსაც უმასპინძლა Occentus Networks (EU)
  6. უფლებები: ნებისმიერ დროს შეგიძლიათ შეზღუდოთ, აღადგინოთ და წაშალოთ თქვენი ინფორმაცია.

  1.   ზეტატინო დიჯო

    მადლობა პოსტისთვის!

    1.    დრასილი დიჯო

      მოხარული ვარ, რომ თქვენთვის სასარგებლო აღმოჩნდა.

      ულოცავენ.

  2.   მიგელ ანხელ დიჯო

    არსებობს Apache– ით და ორი სერვერის კლასტერიზაციის მეთოდი, შეგიძლია ახსნა როგორ მუშაობს?

    1.    დრასილი დიჯო

      მიუხედავად იმისა, რომ ამის შესახებ გარკვეული თეორია წავიკითხე, პრაქტიკაში არასდროს გამომიყენებია. ასეც რომ იყოს, შესაძლოა ამ სტატიამ გარკვეული მითითებები მოგცეთ ამ მხრივ, თუმცა კიდევ ერთხელ ვიმეორებ, რომ არ მქონდა ამის პრაქტიკაში გამოყენების შესაძლებლობა:

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

    2.    ედუარდო ჯალილი დიჯო

      ცოტა ხნით ითხოვეთ, თუ არ მოაგვარეთ; მე მაქვს მესამე მხარესთან დაბალანსების სქემა, რომელიც მოქმედებს როგორც ფაილური სისტემა, თქვენ მიუთითებთ საქაღალდეებს, რომლებიც არიან var / www / html / (ჩემს შემთხვევაში) ფაილურ სისტემაში, ასე რომ ისინი იზიარებენ ერთსა და იმავე ინფორმაციას, და მოითხოვს ვირტუალურ IP- ს, რომელიც რეაგირებს და გადამისამართდება აპაჩების ip- ზე, ამისათვის შეგიძლიათ დაიჭიროთ haproxy და თუ გინდათ ის მაღალ ხელმისაწვდომობაში, შეგიძლიათ ინტეგრირდეთ Keepalive- ს შემთხვევაში, თუ ერთი დაეცემა, მეორე აგრძელებს რეაგირებას, ან ასევე თუ უკვე გაქვთ პროგრამის დომენი, შეგიძლიათ დააბალანსოთ გირვანქით ორივე სერვერის უკუგანვითარებით, კონკრეტული შემთხვევებისთვის, როგორიცაა moodle ან გარკვეული პროგრამები, რომლებიც დაკავშირებულია მონაცემთა ბაზაში mysql, თქვენ უნდა შექმნათ მომხმარებელი თითო აპის სერვერზე, რომელიც მიუთითებს იმავე მონაცემთა ბაზაზე .

  3.   შამარუ დიჯო

    დიდი მადლობა პოსტისთვის, თქვენ აბსოლუტურად მართალი ხართ, ram არის ძირითადი გაანგარიშება, თუმცა წარმომიდგენია, რომ ჩვენ ასევე გამოვთვლით პროცესების მაქსიმალურ რაოდენობას, რომელსაც ჩვენი პროცესორი შეძლებს გაუმკლავდეს (რა თქმა უნდა, პირველ რიგში, ძირითადი მეხსიერების გაანგარიშება) და როგორ დისკზე მყარი განაწილება მოხდება (მაგალითი ტიხრები / var = 1TR).

    1.    დრასილი დიჯო

      Მართალი ხარ; ყველაფერი მნიშვნელოვანია, ისევე როგორც ტემპერატურის კონტროლი სხვა საკითხებთან ერთად. ცხადია, რომ მძლავრი პროცესორს შეუძლია ერთდროულად შეასრულოს დავალებების მეტი რაოდენობა დიდი ეფექტურობით, მაგრამ ამ პოსტის მიზანი იყო RAM– ს მნიშვნელობის ახსნა ერთდროული კავშირის რაოდენობასთან დაკავშირებით.

      ყველა ამ ფაქტორის კონტროლის კარგი გზა და იმის დანახვა, არის თუ არა ჩვენი პროცესორი გაჯერებული, ან გვაქვს თუ არა მცირე მეხსიერება, ეს იქნება bash სკრიპტის გამოყენებით. იქნებ თქვენთვის საინტერესოა ეს პოსტი, რომელიც რამდენიმე დღის წინ გავაკეთე ამის შესახებ, რომელსაც შემდეგ ბმულზე გიტოვებთ; ეს არის გლობალური მონიტორინგი, მაგრამ შეიძლება საინტერესო იყოს ერთისთვის:

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

      დაკავშირებით

  4.   სერხიო ს დიჯო

    ძალიან კარგი შენიშვნა, დიდი მადლობა!

    1.    დრასილი დიჯო

      Დიდი მადლობა! იმედი მაქვს, რომ თქვენ ისარგებლეთ ამით.

  5.   Clown დიჯო

    არ მსურს ვიყო ხუმრობა ...
    … მაგრამ კავშირების რაოდენობის გაზრდით თქვენ უფრო დაუცველს არ დატოვებთ DDoS შეტევას?

    1.    დრასილი დიჯო

      ეს არ არის მშვიდი კრეტინის საკითხი. სიმართლე ისაა, რომ ერთდროული კავშირების რაოდენობის გაზრდით, ჩვენ ნაწილობრივ ვაძლიერებთ Apache– ს DDOS შეტევების წინააღმდეგ, რადგან უნდა გაითვალისწინოთ, რომ სერვერზე დადებული მაქსიმალური ერთდროული კავშირების რაოდენობა არის მაქსიმალური კავშირების რიცხვი და არა მათგან ერთი მომხმარებელი. ამრიგად, მაშინ, როდესაც დასაწყისში მხოლოდ 150 ერთდროული კავშირის მხარდაჭერა შეგვეძლო (იქნება ეს ლეგიტიმური წყაროდან მიღებული კავშირი თუ არა), ახლა ჩვენ შეგვიძლია იმედი გვქონდეს იმდენზე, რამდენსაც ჩვენი სერვერი მხარს უჭერს, რაც მოითხოვს კავშირის მეტ რაოდენობას მომსახურების გარეშე. ცხადია, რომ კავშირების მაქსიმალური რაოდენობის გაზრდა არ არის ამ ტიპის თავდასხმისგან თავის დასაცავად, არამედ უნდა განხორციელდეს Firewall– ის პოლიტიკა. თუ, მაგალითად, ვებ – სერვისი, რომლის განთავსებაც გსურთ, გახდება ინტერნეტი, უსაფრთხოების ზომები, რომლის განხორციელებაც შეიძლება, იქნება ამ ხაზების დამატება ჩვენს ეკრანზე:

      iptables -A INPUT -p tcp –syn –dport 80 -m connlimit –connlimit-up 10-m state –state NEW -j ACCEPT

      iptables -A INPUT -p tcp –dport 80 -m სახელმწიფო –შტაბი დამყარებულია, დაკავშირებულია –j ACCEPT

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

      1.    clown დიჯო

        DDoS შეტევების ერთ-ერთი მახასიათებელია ის, რომ თავდამსხმელმა შეიძლება გამოაგზავნოს პაკეტები რამდენიმე სხვადასხვა მიმართულებით, რაც ხელს უშლის პაკეტების ნაკადის მხოლოდ ერთი მიმართულებით მოსვლას.

    2.    დრასილი დიჯო

      თქვენ მართალი ხართ იმ გაგებით, რომ ისეთი firewall, როგორიც მე დავაყენე, არ არის ძალიან ეფექტური DDOS შეტევის წინააღმდეგ, რადგან ის სხვადასხვა წყაროდან მოდის. მიუხედავად ამისა, უმჯობესია შეზღუდოთ კავშირების რაოდენობა თითოეული ამ წყაროსთვის 10 – ით, ვიდრე არ ჰქონდეს ზღვარი, ასე რომ თითოეულ წყაროს შეუძლია დაამყაროს ასი კავშირი ან მეტი.

      ნებისმიერ შემთხვევაში, კითხვა არის ის, რომ რაც უფრო მეტ ერთდროულ კავშირს უზრუნველყოფს სერვერი, მით უფრო რთული იქნება მისი დანგრევა DDOS შეტევით, რაც უფრო გაართულებს თავდამსხმელის მიერ გვერდის ჩამოშლას .

      ულოცავენ.

  6.   ელიოტიმე 3000 დიჯო

    კარგი ახლა მე ვაგრძელებ NGINX– ს ჩემს საიტზე, რომ არ აწამონ ის VPS რაც მაქვს.

  7.   ბრუნო კასკიო დიჯო

    კარგი პოსტი @ Drassill!

    მინდოდა შემეტანებინა რაღაც უფრო სტატისტიკური, ვიდრე კონფიგურაცია.
    მიუხედავად იმისა, რომ მოხმარების პარამეტრის გამოსათვლელად მარტივი და სწრაფი გზაა საშუალო მნიშვნელობა, შეიძლება ვიყოთ უფრო მკაცრები და "საშუალო" ნაცვლად გამოვიყენოთ "საშუალო". რას გადაგვარჩენდა ეს? ციფრების გამორთვის შემთხვევაში კავშირი დიდ მეხსიერებას ხარჯავს. მაგალითად, წარმოიდგინეთ შემდეგი კლიენტები, რომლებიც მოიხმარენ შემდეგ მნიშვნელობებს, მეხსიერების მათთვის საჭირო ერთეულში (KB, MB, MiB და ა.შ.):

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

    საშუალოდ დაახლოებით 30 ფუნტი სტერლინგი

    და ეს იმიტომ, რომ ჩვენ ძალიან დიდი დასასრული გვაქვს (150) და გამოთვლები გიჟურია. მედიანა მოიცავს ამ მონაცემების შეკვეთას, ნიმუშების რაოდენობის დაყოფას 2-ზე (ჩვენი ცენტრი) და შემდეგ ამ პოზიციის რაოდენობის მიღებაზე. ამით ჩვენ მსგავსი რამ გვექნებოდა

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

    ჩვენი საშუალო იქნება: 8/2 = 4, ეს არის 10 ~

    აქ ხედავთ, რომ რაც არ უნდა გიჟი იყოს ექსტრემი, ის ყოველთვის უფრო რეალისტურ ღირებულებას მოგვცემს. თუ ჩვენ დავუმატებთ მომხმარებელს, რომელიც 200-ს მოიხმარს, ჩვენი მედიანა იქნება 11, მაშინ როდესაც საშუალო შეიძლება იყოს.

    ეს მხოლოდ კონტრიბუციაა და ძალიან სადავოა, რადგან კავშირებით ის არ ბრალია.

    ჩაეხუტე ხალხს linuxera

  8.   Carlos დიჯო

    გამარჯობა, მე მქონდა პრობლემა ჩემს ერთგულ სერვერზე და ეს არის ის, რომ ყოველ ჯერზე, როდესაც დაახლოებით 250 ადამიანი მიდის ონლაინ რეჟიმში, google analytics– ის თანახმად რეალურ დროში, ჩემი სერვერი იშლება და კავშირი ნელდება, სანამ არ შეწყვეტს კავშირს ვებსაიტზე და არასოდეს ატვირთავს მომხმარებლების ამ რაოდენობაზე მეტი ინტერნეტით, მაგრამ როდესაც მე ვხედავ გამოყოფილი სერვერის მუშაობას, რომელიც არის 8 GB RAM, ეს აჩვენებს გამოყენების 10% -ს, CPU: 5% და მყარი დისკი 1.99% გამოყენების.
    Შეგიძლიათ დამეხმაროთ? ვერ ვხვდები რა გავაკეთო, ამ ნაბიჯების გაკეთება გამოსავალია?

    1.    დრასილი დიჯო

      კარგი კარლოსი.

      თქვენს მიერ აღწერილი პრობლემა ძალიან ხშირია, როდესაც სერვერი არ არის სათანადოდ მომზადებული. თქვენი სერვერი სავარაუდოდ მიიღებს გაცილებით მცირე რაოდენობის ერთდროულ კავშირებს და როდესაც 250 კავშირს მიაღწევს, ის გაფუჭდება. სახელმძღვანელოს შესაბამისად, თქვენ უნდა შეეძლოთ პრობლემის მოგვარება, თუმცა თუ სერვერზე გაქვთ მონაცემთა ბაზა, ამ მონაცემთა ბაზის ოპტიმიზაციაც მოგიწევთ.

      ულოცავენ.

      1.    Carlos დიჯო

        დრასილ, მე გავაკეთე თქვენს მიერ ნახსენები კონფიგურაცია და დამაკმაყოფილებელიც იყო, გუშინ მივაღწიე 280 მომხმარებელს ინტერნეტით და სერვერი არ გამიხეთქავს, ძალიან კმაყოფილი ვარ ამ შედეგით და მინდა გავაკეთო სხვა რამ, რასაც მეუბნები ოპტიმიზაციისთვის მონაცემთა ბაზა, ¿როგორ მივაღწიო ამას?

    2.    დრასილი დიჯო

      მონაცემთა ბაზის კონცეფცია საკმაოდ ღიაა; mysql- ის გამოყენება არ არის იგივე postgres (მაგალითად). ცხადია, მე არ ვიცი ყველა მონაცემთა ბაზა; მე შევეცადე mysql და postgres, და ამაში ერთდროული კავშირების გაზრდა იქნება პარამეტრი მაქსიმალური კავშირების საფუძველზე; mysql– ის ოპტიმიზაცია მოხდება /etc/my.conf– ში და პარამეტრის მაქსიმალური კავშირები უნდა შეიცვალოს (სხვათა შორის). ამის ნაცვლად, postgres- ისთვის, ჩემს ბლოგზე მაქვს სტატია, რომელშიც აღწერილია, თუ როგორ უნდა ოპტიმიზირდეს ის, რაც შეიძლება სასარგებლო იყოს თქვენთვის ან რომელიც შეგიძლიათ გამოიყენოთ როგორც მონაცემთა ბაზის მითითება:

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

      ულოცავენ.

  9.   ერიქსონ ვასკესი დიჯო

    გამარჯობა, როდესაც პირველ ბრძანებას ვაგდებ, ის მაჩვენებს 0. მნიშვნელობას?

  10.   დანიელ ოჟედა დიჯო

    გმადლობთ ამ პოსტისთვის.