在本文中,我們將深入探討伺服器負載增加的原因,並討論最佳化高負載流程的各種方法。我們將特別關注 Apache/Nginx 和 MySQL 中的程式碼最佳化,我們將討論快取作為輔助工具,並考慮可能的外部威脅,例如 DDOS 攻擊及其預防方法。
為什麼會發生伺服器負載
在進行伺服器最佳化之前,需要對目前資源負載進行徹底的分析。這包括測量 CPU 負載、RAM 使用情況、網路活動和其他關鍵參數。了解動態和尖峰負載可以識別瓶頸並優化資源分配,從而提高伺服器基礎架構的穩定性和效能。
對於伺服器負載過高的問題,我們建議先進行常規伺服器診斷。如果診斷結果不足以解決問題,則需要對伺服器資源進行更詳細的分析。作為輔助工具,查看Linux伺服器日誌會很有幫助,因為大多數情況下,問題的根源都隱藏在日誌中。
最佳化 Apache/Nginx 伺服器
由於索引而增加的伺服器負載
例如,當搜尋引擎掃描您網站上的大量頁面時,可能會由於伺服器索引而導致負載增加。這會導致伺服器資源的使用增加,從而降低網站的效能。確定原因相對簡單;您需要開啟位於以下位置的文件:
/var/www/httpd-logs/sitename.access.log
當被搜尋引擎索引時,使用者將看到以下性質的條目:
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)"
為了減輕網站負載,您可以先在不需要被索引的頁面上設定「noindex」和「nofollow」元標籤。其次,您可以修改.htaccess文件,在其中添加與特定搜尋引擎對應的條目,例如,要阻止Yandex和Google抓取頁面:
SetEnvIfNoCase User-Agent "^Yandex" search_bot
SetEnvIfNoCase User-Agent "^Googlebot" search_bot
Order Allow,Deny
Allow from all
Deny from env=search_bot
同樣,也需要針對其他搜尋引擎進行相應的修改。需要注意的是,.htaccess 檔案的功能不僅限於封鎖索引。我們建議您閱讀文章,更深入地了解其主要功能。
使用快取設定
伺服器快取設定不當也會導致負載過高。要最佳化此參數,需要在設定檔或.htaccess檔中進行相應的變更。對於 Apache 伺服器,建議使用 .htaccess 檔案;對於 Nginx 伺服器,建議使用 .htaccess 檔案。
在Apache伺服器上,您需要開啟.htaccess檔案並插入以下程式碼:
<FilesMatch ".(flv|gif|jpg|jpeg|png|ico|swf|js|css|pdf|doc|docx)$">
Header set Cache-Control "max-age=2592000"
</FilesMatch>
然後,使用以下命令啟用Expires模組:
sudo a2enmod expires
之後重新啟動 Web 伺服器:
sudo service apache2 restart
並透過指定以下內容來啟動模組:
ExpiresActive On
在Nginx伺服器上,只需將以下程式碼新增至設定檔即可:
location ~* .(jpg|jpeg|gif|png|ico|css|swf|flv|doc|docx)$ {
root /var/www/yoursite.com;
}
並執行服務重新載入:
sudo service nginx restart
請注意,使用這些設定後,將繞過Allow和Deny指令。
使用資料壓縮
在 Apache 和 Nginx Web 伺服器上啟用Gzip資料壓縮有助於減少伺服器和用戶端之間傳輸的資料量,從而提高效能並縮短網頁載入時間。
要在Apache上啟用Gzip,您需要啟動mod_deflate模組:
sudo a2enmod deflate
然後,重新啟動 Web 伺服器:
sudo service apache2 restart
最後,將以下區塊新增至設定檔或 .htaccess 中:
<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>
此配置對某些類型的檔案啟用壓縮,並停用映像壓縮。
對於Nginx,設定操作在設定檔中的http程式碼區塊內進行。需要新增以下程式碼:
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;
與Apache類似,這裡也設定了特定類型檔案的壓縮參數。對任何 Web 伺服器進行變更後,都需要重新載入服務:
sudo service apache2 restart
Or
sudo service nginx restart
伺服器遭受 DDOS 攻擊
DDoS 攻擊可能會導致伺服器負載過高。透過監控流量突然增加、異常請求和伺服器效能下降可以識別 DDoS 攻擊的存在。查看來自一個 IP 位址的重複請求或連接埠掃描日誌也可以指示可能存在的 DDoS 攻擊。保護措施有很多,但我們只討論基本措施。
使用內容傳遞網路 (CDN)。 CDN 可以作為您的 Web 伺服器和使用者之間的中介,分發流量並快取內容,從而減輕 DDoS 攻擊的影響。 CDN 還可以內建 DDoS 防護機制,包括負載平衡和流量過濾。
配置防火牆和入侵偵測系統 (IDS/IPS)。防火牆可以設定為根據各種標準(例如 IP 位址和連接埠)過濾流量。 IDS/IPS 可以偵測異常流量行為並阻止可疑連線。這些工具可以有效地追蹤和阻止潛在的惡意流量。
設定 Apache 和 Nginx Web 伺服器以減輕 DDoS 攻擊的影響。
針對 Apache 的此問題,我們啟用mod_evasive模組。為此,請在httpd.conf或apache2.conf設定檔中取消註解或新增以下行:
LoadModule evasive20_module modules/mod_evasive.so
在同一個文件中,您需要新增一個設定區塊:
<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>
同樣地,我們啟動mod_ratelimit模組:
LoadModule ratelimit_module modules/mod_ratelimit.so
並新增配置:
<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>
Nginx的設定與Apache類似。在nginx.conf設定檔中,需要使用以下指令:
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;
...
}
}
對每個服務進行更改後,需要重新載入:
sudo systemctl restart apache2
或者:
sudo systemctl restart nginx
這些範例僅提供了基本配置,可以根據具體要求和攻擊性質進一步調整。
最佳化 MySQL 查詢
優化 Web 伺服器上的 MySQL 資料庫查詢可以透過多種方式實現,其中一種方法是正確配置設定檔。通常,該檔案名稱為my.cnf或my.ini,位於/etc/或/etc/mysql/目錄下。您需要打開該文件並進行以下更改:
[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
我們也考慮一些可以促進與伺服器資料庫互動的其他建議:
- 購買 說明 在 SQL 查詢之前執行命令來分析其執行情況。這使您可以獲得查詢的執行計劃並確定使用了哪些索引、掃描了哪些表等。
- 索引可以加快資料搜尋速度,因此合理設計的索引可以顯著提高查詢效能。注意經常使用的列 WHERE or 註冊 條件。
- 避免使用 選擇 *。僅指定查詢真正需要的列,而不是選擇表格中的所有列。
- 避免在以下位置使用函數 WHERE 狀況。使用函數(例如 降低, 上, 左, RIGHT)in WHERE 條件可能會使索引變得無用。盡量避免在條件中直接使用它們。
- 使用 INNER JOIN 盡可能這樣做,因為這樣通常更有效率。另外,確保連接的相應列有索引。
- 使用 LIMIT 如果您只需要取得一定數量的結果,則限制傳回的行數。
- 考慮快取查詢結果,特別是當它們很少改變時,以減少伺服器負載。
郵件伺服器造成伺服器高負載
在本節中,我們將探討如何判斷郵件伺服器是否負載過高,以及可以採取哪些措施來最佳化其運行,包括檢查郵件佇列和設定伺服器參數。首先檢查郵件佇列。 mailq工具可以幫助我們完成這項操作,要啟動它,請在終端機中輸入相應的命令:
mailq
如果有的話,這將顯示佇列中的消息清單。每個訊息將顯示其唯一識別碼和有關發送狀態的資訊。透過查看郵件用戶端日誌可以獲得類似的結果。
大多數情況下,當伺服器受到威脅並開始發送垃圾郵件時,就會出現高負載。然而,如果管理員檢查後確信伺服器沒有受到外部攻擊,且使用者沒有忽視垃圾郵件,那麼就該開始優化郵件伺服器了。以下步驟將有所幫助:
- 確保您的網域的 DNS 記錄配置正確,包括 SPF, 德基姆以及 DMARC 記錄以提高郵件傳遞率並防止垃圾郵件。正確的參數配置可以在以下文章中找到 郵件伺服器診斷.
- 檢查網路設置,包括防火牆配置和路由規則,以避免阻塞並加快郵件投遞。
- 根據伺服器負載配置訊息隊列參數。這可能包括設定最大隊列大小和逾時。
- 考慮一下我們之前在本文中討論過的解決方案。定期優化郵件伺服器資料庫以提高效能,使用快取機制加快資料搜尋和處理,例如DNS查詢。
- 如果郵件伺服器仍然經常遇到高負載,請考慮擴充選項,例如使用郵件伺服器叢集或雲端解決方案。
結語
伺服器負載的增加直接影響網站載入速度,最終影響使用者體驗和搜尋引擎的聲譽。因此,有效地管理這種負載對於確保資源的持續功能和提高訪客的可訪問性起著關鍵作用。