Bu makalede, artan sunucu yükünün neden oluştuğunu inceleyeceğiz ve yüksek yüklü süreçleri optimize etmenin çeşitli yollarını tartışacağız. Apache/Nginx ve MySQL'de kod optimizasyonuna özel dikkat gösterilecek, yardımcı bir araç olarak önbelleğe alma hakkında konuşacağız ve ayrıca DDOS saldırıları gibi olası dış tehditleri ve bunları önlemenin yollarını ele alacağız.
Sunucu Yükü Neden Oluşur
Sunucu optimizasyonuna geçmeden önce, kaynaklardaki mevcut yükün kapsamlı bir analizini yapmak gerekir. Bu, CPU yükünü, RAM kullanımını, ağ etkinliğini ve diğer önemli parametreleri ölçmeyi içerir. Dinamikleri ve tepe yüklerini anlamak, darboğazları belirlemeye ve kaynak tahsisini optimize etmeye olanak tanır, böylece sunucu altyapısının kararlılığı ve performansı artar.
Yüksek sunucu yükünün ilk sorun gidermesi için bir genel sunucu tanılamasıBu yeterli olmazsa, daha ayrıntılı bir kaynakların analizi gereklidir. Yardımcı bir araç olarak, keşfetmek Linux günlükleri sunucu yardımcı olabilir, çünkü sorunun kaynağı çoğu durumda burada bulunur.
Apache/Nginx Sunucusunu Optimize Etme
Dizinleme Nedeniyle Artan Sunucu Yükü
Örneğin, arama motorları sitenizdeki çok sayıda sayfayı taradığında sunucudaki dizinleme nedeniyle artan yük meydana gelebilir. Bu, sunucu kaynaklarının daha fazla kullanılmasına ve sonuç olarak sitenin performansının yavaşlamasına yol açabilir. Nedeni belirlemek nispeten basittir; şu konumda bulunan dosyayı açmanız gerekir:
/var/www/httpd-logs/sitename.access.log
Arama motorları tarafından indekslendiğinde kullanıcı aşağıdaki nitelikteki girdileri görecektir:
11.22.33.44 - - [Date and Time] "GET /your-page-path HTTP/1.1" 200 1234 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
Yükü azaltmak için ilk çözüm olarak meta etiketlerinin ayarını kullanabilirsiniz "indeks yok" ve "takip etme" dizine eklenmesi gerekmeyen sayfalarda. İkinci çözüm ise .htaccess Örneğin, Yandex ve Google'dan gizlemek için, belirli arama motorlarına karşılık gelen girdilerin eklenmesi gereken dosya:
SetEnvIfNoCase User-Agent "^Yandex" search_bot
SetEnvIfNoCase User-Agent "^Googlebot" search_bot
Order Allow,Deny
Allow from all
Deny from env=search_bot
Benzer şekilde, diğer arama motorları için de düzenlemeler yapılması gerekir. .htaccess'in yeteneklerinin yalnızca dizinlemeyi engellemekle sınırlı olmadığı unutulmamalıdır. Başlıca özellikleriyle daha fazla tanışmanızı öneririz göre.
Önbelleğe Alma Ayarlarını Kullanma
Sunucudaki yanlış önbellekleme ayarları da yüksek yüke yol açabilir. Bu parametrenin optimize edilmesi için yapılandırma dosyalarında veya ilgili değişikliklerin yapılması gerekir. .htaccessApache için ikinci seçenek, Nginx için ise ilk seçenek tercih edilebilir.
Üzerinde Apache sunucuyu açmanız gerekiyor .htaccess dosyaya aşağıdaki kodu ekleyin:
<FilesMatch ".(flv|gif|jpg|jpeg|png|ico|swf|js|css|pdf|doc|docx)$">
Header set Cache-Control "max-age=2592000"
</FilesMatch>
Ardından, etkinleştirin Bitiş tarihi şu komutu kullanarak modül:
sudo a2enmod expires
Daha sonra web sunucusunu yeniden başlatın:
sudo service apache2 restart
Ve modülü şu şekilde belirterek aktifleştirin:
ExpiresActive On
Bir Açık nginx Sunucuda, yapılandırma dosyasına aşağıdaki kodu eklemeniz yeterlidir:
location ~* .(jpg|jpeg|gif|png|ico|css|swf|flv|doc|docx)$ {
root /var/www/yoursite.com;
}
Ve bir servis yeniden yüklemesi gerçekleştirin:
sudo service nginx restart
Bu ayarlarla, şunu unutmayın: izin vermek ve Reddet yönergeler atlatılacak.
Veri Sıkıştırma Kullanımı
Veri sıkıştırmayı kullanarak etkinleştirme gzip Apache ve Nginx web sunucularında, sunucu ile istemci arasında iletilen veri miktarının azaltılmasına yardımcı olur, bu da performansı artırır ve web sayfası yükleme süresini azaltır.
Etkinleştirmek gzip on Apacheetkinleştirmeniz gerekiyor mod_deflate modülü:
sudo a2enmod deflate
Daha sonra web sunucusunu yeniden başlatın:
sudo service apache2 restart
Ve son olarak, yapılandırma dosyasına veya .htaccess'e aşağıdaki bloğu ekleyin:
<IfModule mod_deflate.c>
# Configure compression for specified file types
AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css text/javascript application/javascript application/x-javascript application/json
# If the browser matches the specified pattern, apply compression only to text/html files
BrowserMatch ^Mozilla/4 gzip-only-text/html
# If the browser matches the specified version patterns of Mozilla 4.0.6, 4.0.7, 4.0.8, disable compression
BrowserMatch ^Mozilla/4\.0[678] no-gzip
# If the browser is MSIE (Internet Explorer), disable compression for all files except text/html
BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
# If the request contains the specified pattern (extensions of image files), disable compression
SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png)$ no-gzip
</IfModule>
Bu yapılandırma, belirli dosya türleri için sıkıştırmayı etkinleştirir ve resimler için devre dışı bırakır.
Halinde nginx, yapılandırma şu şekilde gerçekleşir: http Yapılandırma dosyasının bloğu. Aşağıdaki kodun eklenmesi gerekiyor:
gzip on;
gzip_disable "msie6";
# Adds the Vary header, indicating that the response may change depending on the Accept-Encoding header value
gzip_vary on;
# Enables compression for any proxy servers
gzip_proxied any;
# Sets the compression level. A value of 6 provides a good balance between compression efficiency and resource use
gzip_comp_level 6;
# Sets the size of the buffer for compressed data (16 buffers of 8 kilobytes each)
gzip_buffers 16 8k;
# Specifies that data compression should be used only for HTTP version 1.1 and higher
gzip_http_version 1.1;
# Sets the file types that can be compressed
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
Benzer Apache, burada belirli dosya türleri için sıkıştırma parametreleri ayarlanır. Web sunucularından herhangi birinde değişiklik yapıldıktan sonra, bir hizmet yeniden yüklemesi gerekir:
sudo service apache2 restart
Or
sudo service nginx restart
Sunucuya DDOS Saldırısı
Yüksek sunucu yükü bir DDoS saldırısının sonucu olarak ortaya çıkabilir. Bir DDoS saldırısının varlığını belirlemek, trafikte ani bir artış, anormal istekler ve sunucu performansı düşüşlerini izleyerek yapılabilir. Bir IP adresinden gelen tekrarlanan istekler için günlükleri incelemek veya port taramaları da olası bir DDoS saldırısını gösterebilir. Birçok koruma önlemi vardır, ancak yalnızca temellerini tartışacağız.
CDN (İçerik Dağıtım Ağı) Kullanımı. Bir CDN, web sunucunuz ve kullanıcılar arasında bir aracı görevi görebilir, trafiği dağıtabilir ve DDoS saldırısının etkisini azaltmak için içeriği önbelleğe alabilir. CDN'ler ayrıca yük dağıtımı ve trafik filtrelemesi gibi yerleşik DDoS koruma mekanizmalarına sahip olabilir.
Güvenlik duvarlarını ve saldırı tespit sistemlerini (IDS/IPS) yapılandırma. Güvenlik duvarları, IP adresleri ve bağlantı noktaları gibi çeşitli ölçütlere göre trafiği filtrelemek üzere yapılandırılabilir. IDS/IPS anormal trafik davranışını algılayabilir ve şüpheli bağlantıları engelleyebilir. Bu araçlar, potansiyel olarak kötü amaçlı trafiği izleme ve engellemede etkili olabilir.
DDoS saldırılarının etkisini azaltmak için Apache ve Nginx web sunucularının yapılandırılması.
Apache için bir çözüm olarak, şunu etkinleştiriyoruz: mod_evasive modül. Bunu yapmak için, aşağıdaki satırı yorum satırından çıkarın veya ekleyin httpd.conf or apache2.conf yapılandırma dosyası:
LoadModule evasive20_module modules/mod_evasive.so
Aynı dosyaya bir ayarlar bloğu eklemeniz gerekiyor:
<IfModule mod_evasive20.c>
# Hash table size for storing request information
DOSHashTableSize 3097
# Number of requests to one page before activating protection
DOSPageCount 2
DOSPageInterval 1
# Number of requests to all pages before activating protection
DOSSiteCount 50
DOSSiteInterval 1
# Blocking period in seconds for IP addresses
DOSBlockingPeriod 10
</IfModule>
Benzer şekilde, şunu etkinleştiriyoruz: mod_oran_sınırı modülü:
LoadModule ratelimit_module modules/mod_ratelimit.so
Ve şu yapılandırmayı ekleyin:
<IfModule mod_ratelimit.c>
# Setting the output filter for rate limiting (Rate Limit)
SetOutputFilter RATE_LIMIT
# Beginning of the settings block for the location "/login"
<Location "/login">
# Setting the environment variable rate-limit with a value of 1
SetEnv rate-limit 1
# Ending of the settings block for the location "/login"
</Location>
</IfModule>
Yapılandırma için nginx benzer Apache. In nginx.conf Yapılandırma dosyasında aşağıdaki yönergelerin kullanılması gerekir:
http {
...
# Defining a zone for connection limits
limit_conn_zone $binary_remote_addr zone=addr:10m;
# Defining a zone for request limits
limit_req_zone $binary_remote_addr zone=req_zone:10m rate=1r/s;
server {
...
# Configuring connection limits
limit_conn addr 10;
# Configuring request limits
limit_req zone=req_zone burst=5;
...
}
}
Her bir serviste değişiklik yapıldıktan sonra bunların yeniden yüklenmesi gerekir:
sudo systemctl restart apache2
Veya:
sudo systemctl restart nginx
Bu örnekler yalnızca temel bir yapılandırma sağlar; bu yapılandırma, özel gereksinimlere ve saldırıların niteliğine bağlı olarak daha da uyarlanabilir.
MySQL Sorgularını Optimize Etme
Bir web sunucusunda MySQL veritabanı sorgularını optimize etmek çeşitli yollarla gerçekleştirilebilir ve bunlardan biri de yapılandırma dosyasının uygun şekilde yapılandırılmasıdır. Genellikle bu dosya şu şekilde adlandırılır: benim.cnf or benim.ini ve içinde bulunur /vb/ or /etc/mysql/ Dizini açmanız ve aşağıdaki değişiklikleri yapmanız gerekir:
[mysqld]
# Location of the file for recording slow queries. Be sure to replace it with your path
log-slow-queries = /var/log/mariadb/slow_queries.log
# Threshold time for considering slow queries (in seconds)
long_query_time = 5
# Enabling recording of queries that do not use indexes
log-queries-not-using-indexes = 1
# Disabling query caching
query_cache_size = 0
query_cache_type = 0
query_cache_limit = 1M
# Size of temporary tables
tmp_table_size = 16M
max_heap_table_size = 16M
# Size of the thread cache
thread_cache_size = 16
# Disabling name resolving
skip-name-resolve = 1
# Size of the InnoDB buffer pool. Set to 50-70% of available RAM
innodb_buffer_pool_size = 800M
# Size of the InnoDB log file
innodb_log_file_size = 200M
Sunucu veritabanıyla etkileşimi kolaylaştırabilecek ek önerileri de göz önünde bulunduralım:
- Kullan AÇIKLAYINIZ SQL sorgusunun yürütülmesini analiz etmek için bir SQL sorgusundan önce komut. Bu, sorgu için bir yürütme planı almanıza ve hangi dizinlerin kullanıldığını, hangi tabloların tarandığını vb. belirlemenize olanak tanır.
- Dizinler veri aramasını hızlandırır, bu nedenle düzgün tasarlanmış dizinler sorgu performansını önemli ölçüde iyileştirebilir. Sık kullanılan sütunlara dikkat edin NEREDE or JOIN koşulları.
- Kullanmaktan kaçın SEÇ *. Bir tablodaki tüm sütunları seçmek yerine, yalnızca sorgunuz için gerçekten gerekli olan sütunları belirtin.
- Fonksiyonları kullanmaktan kaçının NEREDE koşullar. Fonksiyonları kullanarak (örneğin LOWER, ÜST, SOL, SAĞ) içinde NEREDE koşullar dizinleri işe yaramaz hale getirebilir. Koşullarda doğrudan kullanımlarından kaçınmaya çalışın.
- Kullanım INNER JOIN mümkünse, genellikle daha verimli olduğu için. Ayrıca, birleştirme için karşılık gelen sütunların dizinlere sahip olduğundan emin olun.
- Kullanım LİMİT Eğer sadece belirli sayıda sonuç almak istiyorsanız, döndürülen satır sayısını sınırlamak için.
- Sunucu yükünü azaltmak için, özellikle nadiren değişen sorgu sonuçlarını önbelleğe almayı düşünün.
Posta Sunucusu Sunucuda Yüksek Yük Oluşturur
Bu bölümde, posta sunucusunun yüksek yük yaşadığını nasıl belirleyeceğimizi ve ileti kuyruğunu kontrol etme ve sunucu parametrelerini yapılandırma dahil olmak üzere çalışmasını optimize etmek için hangi adımların atılabileceğini inceleyeceğiz. İleti kuyruğunu kontrol ederek başlayın. posta yardımcı program bu konuda yardımcı olabilir, etkinleştirmek için terminale ilgili komutu girin:
mailq
Bu, varsa kuyruktaki mesajların bir listesini görüntüler. Her mesaj, benzersiz tanımlayıcısı ve gönderme durumuyla ilgili bilgilerle görüntülenir. Posta istemcisi günlüklerini inceleyerek benzer bir sonuç elde edilebilir.
Çoğu durumda, sunucu spam göndermeye başladığında sunucu tehlikeye girdiğinde yüksek yük oluşur. Ancak, yönetici kontrol ettikten sonra sunucunun dışarıdan saldırıya uğramadığından ve kullanıcıların spam'i ihmal etmediğinden eminse, posta sunucusunu optimize etmeye geçme zamanı gelmiştir. İşte yardımcı olacak adımlar:
- Alan adınızın DNS kayıtlarının doğru şekilde yapılandırıldığından emin olun; buna şunlar dahildir: SPF, DKIM, ve DMARC posta dağıtımını iyileştirmek ve spam'e karşı koruma sağlamak için kayıtlar. Parametrelerin doğru yapılandırması şu makalede bulunabilir: posta sunucusu tanılaması.
- Engellemeleri önlemek ve e-posta teslimatını hızlandırmak için güvenlik duvarı yapılandırması ve yönlendirme kuralları dahil olmak üzere ağ ayarlarınızı kontrol edin.
- İleti kuyruğu parametrelerini sunucu yüküne göre yapılandırın. Bu, maksimum kuyruk boyutunu ve zaman aşımlarını ayarlamayı içerebilir.
- Bu makalede daha önce ele aldığımız çözümleri göz önünde bulundurun. Performansı iyileştirmek için posta sunucusu veritabanını periyodik olarak optimize edin, veri arama ve işlemeyi hızlandırmak için DNS sorguları gibi önbelleğe alma mekanizmalarını kullanın.
- Posta sunucusu hala düzenli olarak yüksek yük ile karşılaşıyorsa, posta sunucuları kümesi veya bulut çözümleri kullanmak gibi ölçeklendirme seçeneklerini göz önünde bulundurun.
Sonuç
Artan sunucu yükü doğrudan web sitesi yükleme hızını etkiler ve sonuç olarak kullanıcı deneyimini ve arama motorlarındaki itibarı etkiler. Bu nedenle, bu yükü etkili bir şekilde yönetmek, kaynağın sürekli işlevselliğini sağlamada ve ziyaretçiler için erişilebilirliğini artırmada önemli bir rol oynar.