Apache 調優進階

workey發表於2020-11-14

Apache 執行模式-prefork-worker 執行模式介紹

Apache 不同執行模式調優

Web伺服器Apache 目前一共有三種穩定的MPM(Multi-Processing Module,多程式處理模組)模式。如:Prefork(程式模式)、worker(執行緒模式)、Event (事件模式,2.4 版本後開始穩定)

prefork 執行模式詳解

1、Prefork MPM : Prefork MPM 實現了一個非執行緒的、預派生的 web 伺服器。它在 Apache 啟動之初,就先預派生一些子程式,然後等待連線;可以減少頻繁建立和銷燬程式的開銷,每個子程式只有一個執行緒,在一個時間點內,只能處理一個請求。這是一個成熟穩定,可以相容新老模組,也不需要擔心執行緒安全問題,但是一個程式相對佔用資源,消耗大量記憶體,不擅長處理高併發的場景。最重要的是將 MaxClients 設定為一個足夠大的數值以處理潛在的請求高峰,同時又不能太大,以致需要使用的記憶體超出實體記憶體的大小。所以現在已經不常用這個模式了。 而且 Apache2.4 版本以後,預設使用的是 worker 模式。
注: Prefork 是基於多程式的模式
優點:因為每個程式使用獨立的記憶體空間,所以比較安全。一個程式壞了,不會影響其他程式。
缺點:佔用的記憶體比較大。
執行原理圖如下:

 

worker 執行模式詳解

2、Worker MPM : 和 prefork 模式相比,worker 使用了多程式和多執行緒的混合模式,worker模式也同樣會先預派生一些子程式,然後每個子程式建立一些執行緒,同時包括一個監聽執行緒,每個請求過來會被分配到一個執行緒來服務。執行緒比起程式會更輕量因為執行緒是通過共享父程式的記憶體空間,因此,記憶體的佔用會減少一些,在高併發的場景下會比 prefork 有更多可用的執行緒,表現會更優秀一些;另外,如果一個執行緒出現了問題也會導致同一程式下的執行緒出現問題,如果是多個執行緒出現問題,也只是影響Apache 的一部分,而不是全部。由於用到多程式多執行緒,需要考慮到執行緒的安全了,在使用 keep-alive長連線的時候,某個執行緒會一直被佔用,即使中間沒有請求,需要等待到超時才會被釋放(該問題在 prefork模式下也存在)。
執行原理圖如下:

注: Worker MPM 優點:可以處理海量請求,而系統資源的開銷小。原因:一個程式中包括多個執行緒。多個執行緒之間可以共享記憶體,所以佔用的記憶體資源比較少。
缺點:不太安全。如果一個執行緒壞了。 整個程式都要壞了。另外存在 keep-alive 長連線佔用資源時間過長。如何避免程式中某個執行緒壞了? 一個程式中所有執行緒完成一定數量的請求後,自動關閉,再重開啟。就可以避免記憶體溢位等問題。 就像一個電腦開機時間長了,會卡,需要重啟一下。
總結: 不管是 Worker 模式或是 Prefork 模式,Apache 總是試圖保持一些備用的(spare)或者是空閒的子程式(空閒的服務執行緒池)用於迎接即將到來的請求。這樣客戶端就不需要在得到服務前等候子程式的產生。這就是預先派生程式或執行緒。

Event 執行模式詳解

3、Event MPM:event 模式是在 2.4 版本中才可以穩定執行。這是 Apache 最新的工作模式,它和 worker 模式很像,不同的是在於它解決了 keep-alive 長連線的時候佔用執行緒資源被浪費的問題,在event 工作模式中,會有一些專門的執行緒用來管理這些 keep-alive 型別的執行緒,當有真實請求過來的時候,將請求傳遞給伺服器的執行緒,執行完畢後,又允許它釋放。這增強了在高併發場景下的請求處理。當某個連線沒有請求時,會主動關閉連線,在 work 模式下,必須等 keep-alive 超時,才可以釋放。

總結:在 configure 配置編譯引數的時候,可以使用 --with-mpm=prefork|worker|event 來指定編譯為那一種 MPM。也可以編譯為三種都支援:--enable-mpms-shared=all,這樣在編譯的時候會在modules 目錄下自動編譯出三個 MPM 檔案的 so,然後通過修改 httpd.conf 配置檔案更改 MPM

檢視 Apache 執行模式

[root@centos60 ~]# /usr/local/apache/bin/apachectl -V
Server version: xws/8.1.2-dev (Unix)
Server built:   Nov 13 2020 15:16:10
Server's Module Magic Number: 20120211:93
Server loaded:  APR 1.4.8, APR-UTIL 1.5.2
Compiled using: APR 1.4.8, APR-UTIL 1.5.2
Architecture:   64-bit
Server MPM:     worker
  threaded:     yes (fixed thread count)
    forked:     yes (variable process count)
Server compiled with....
 -D APR_HAS_SENDFILE
 -D APR_HAS_MMAP
 -D APR_HAVE_IPV6 (IPv4-mapped addresses enabled)
 -D APR_USE_SYSVSEM_SERIALIZE
 -D APR_USE_PTHREAD_SERIALIZE
 -D SINGLE_LISTEN_UNSERIALIZED_ACCEPT
 -D APR_HAS_OTHER_CHILD
 -D AP_HAVE_RELIABLE_PIPED_LOGS
 -D DYNAMIC_MODULE_LIMIT=256
 -D HTTPD_ROOT="/usr/local/apache"
 -D SUEXEC_BIN="/usr/local/apache/bin/suexec"
 -D DEFAULT_PIDLOG="logs/httpd.pid"
 -D DEFAULT_SCOREBOARD="logs/apache_runtime_status"
 -D DEFAULT_ERRORLOG="logs/error_log"
 -D AP_TYPES_CONFIG_FILE="conf/mime.types"
 -D SERVER_CONFIG_FILE="conf/httpd.conf"

實戰-對 prefork 模式效能優化

匯入 httpd-mpm.conf 配置檔案到 Apache 主檔案中:

[root@centos60 conf]# vim /usr/local/apache/conf/httpd.conf

[root@centos60 conf]# vim /usr/local/apache/conf/extra/httpd-mpm.conf

MinSpareServers 指令設定空閒子程式的最小數量。所謂空閒子程式是指沒有正在處理請求的子程式。如果當前空閒子程式數少於 MinSpareServers ,那麼 Apache 將以第一秒一個,第二秒兩個,第三秒四個,按指數遞增個數的速度產生新的子程式。如此按指數級增加建立的程式數,最多達到每秒 32 個,直到滿足 MinSpareServers 設定的值為止;這就是預派生(prefork)的由來;這種模式可以不必在請求到來時再產生新的程式,從而減小了系統開銷以增加效能;

MaxSpareServers 指令設定空閒子程式的最大數量。所謂空閒子程式是指沒有正在處理請求的子程式。如果當前有超過 MaxSpareServers 數量的空閒子程式,那麼父程式將殺死多餘的子程式。

可以調整 MinSpareServers 和 MaxSpareServers 這兩個引數,但是這兩個引數的值不能設得太大,否則 Apache 程式太多,會導致記憶體佔用太多。

注:在一臺壓力大(併發訪問 2000)的伺服器上,MaxSpareServers 這個值設定的是 200。保留最大併發數的 10 分之一。設定了這個值的好處是不會有太多的空閒的程式在消耗資源,關閉空閒 Apache 程式的同時,會釋放記憶體,進而減少系統資源消耗。

MaxRequestWorkers : 最大同時處理請求的程式數量,也是最大的同時連線數,表示了 Apache的最大請求併發能力,超過該數目後的請求,將排隊。

MaxConnectionsPerChild : 程式生命週期內,處理的最大請求數目。達到該數目後,程式將死掉。如果設定為 0,表示沒有限制。該引數的意義在於,避免了可能存在的記憶體洩露帶來的系統問題。

將 MaxConnectionsPerChild 設定成非零值有兩個好處:
* 可以防止(偶然的)記憶體洩漏無限進行,從而耗盡記憶體。
* 給程式一個有限壽命,從而有助於當伺服器負載減輕的時候減少活動程式的數量。

如:MaxConnectionsPerChild 25000。當程式處理了 25000 個請求後,Apache 管理程式會去終止此程式繼續處理新的請求,當此程式處理完所有的已建立的請求後,管理程式會殺掉此程式,重新生成一個新的程式

當 KeepAlive 為 On, 開啟長連結時,傳送的請求,在 MaxConnectionsPerChild 裡面只算一個,不管這個連線傳送了多少個請求。

實戰:對 worker、event 模式效能優化

優點:記憶體佔用比 prefork 模式低,適合高併發高流量 HTTP 服務。
缺點:假如一個執行緒崩潰,整個程式就會連同其他任何執行緒一起“死掉”。由於執行緒共享記憶體空間,所以一個程式在執行時必須被系統識別為“每個執行緒都是安全的”。服務穩定性不如 prefork 模式。後期根據每個程式處理的請求數,重啟 worker 程式,

匯入 httpd-mpm.conf 配置檔案到 Apache 主檔案中:

[root@centos60 conf]# vim /usr/local/apache/conf/httpd.conf

[root@centos60 conf]# vim /usr/local/apache/conf/extra/httpd-mpm.conf

StartServers 3 #最初建立的子程式
MinSpareThreads 75 #基於整個伺服器監視的最小空閒執行緒數,如果空閒的執行緒小於設定值,Apache 會自動建立執行緒,如果伺服器負載大的話,可以考慮加大此參考值。
MaxSpareThreads 250 #基於整個伺服器監視的最大空閒執行緒數,如果空閒的執行緒大於設定值,Apache 會自動 kill 掉多餘的執行緒,如果伺服器負載大的話,可以考慮加大此參考值。
ThreadsPerChild 25 #表示每個程式包含的執行緒數,如果是併發量比較大,可以考慮加大這個值。此引數在 worker 模式中,是影響最大的引數。
MaxRequestWorkers 400 #所有執行緒數量的最大值,通常表示了一個 web 服務的最大併發值。MaxRequestWorkers 必須是 ThreadsPerChild 的整數倍,否則 Apache 會提示調整到一個相近的值。MaxRequestWorkers=StartServers* ThreadsPerChild
MaxConnectionsPerChild 0 #每個子程式可以處理的最大請求數。達到該數目後,程式將死掉。如果設定為 0,表示沒有限制。

<IfModule mpm_worker_module>
StartServers 8 #啟動時程式數。
MinSpareThreads 75 #最小空閒執行緒數。
MaxSpareThreads 250 #最大空閒執行緒數。
ThreadsPerChild 250 #每個程式可以啟動的執行緒數量。
MaxRequestWorkers 400 #所有執行緒數量的最大值 ,最大同時處理請求的程式數量,也是最大的同時連線數,超過則排隊。
MaxConnectionsPerChild 25000 #一個程式生命週期內最多處理的請求數,達到這個數量,該程式終止。
</IfModule>

上述引數配置思路:一個程式中有 250 個執行緒。 一個程式處理 25000 個請求。 平均一個執行緒處理25000/250=100 個請求。這樣配置還是合理的。

實戰:Apache 基於 worker 模式的生產環境配置例項

1、檢視每個程式使用的記憶體大小

連線數理論上是越大越好,但是得根據硬體,伺服器的 CPU,記憶體,頻寬等因素,來配置當前的 Apache連線數。
#檢視預設連線數是 3,第一個以 root 身份執行的 httpd 程式,是 Apache 的父程式,它不會處理使用者請求,是用來管理 httpd 程式的。所以一共是 3個程式。

檢視 httpd 佔用記憶體的平均數: 使用 ps 檢視 RSS 列,每個程式佔用的記憶體容量


預設單位是 K,可以看到三個程式每個使用的是 4768k記憶體,一共使用了 4768*3=14.3M 記憶體,這是初始的記憶體大小。

後期隨著 Apache 程式處理的 web 請求的增加,每個程式使用的記憶體數量還會增加的。 因為每個人的網站和業務不一樣。所以每個 Apache 程式使用的記憶體大小也不一樣。但是大家可以在自己的伺服器上線1 天后,使用此命令檢視一下,每個程式使用的記憶體大小,這樣可以準確算出每個程式使用的記憶體數量。

檢視程式使用的記憶體的總大小:
[root@centos60 conf]# ps aux |  grep httpd |  awk '{sum += $6;n++};END{print sum}'
18332

檢視每個程式使用記憶體的平均:
[root@centos60 conf]# ps aux |  grep httpd |  awk '{sum += $6;n++};END{print sum/n}'
3667.2

2、擴充套件:在選擇伺服器時,如何確認 cpu 和記憶體搭配?
通用型伺服器選擇標準:cpu 核心和記憶體大小,一般比例為 1:4 ,如 8 核 cpu,32G 記憶體;16 核心CPU,64G記憶體。
計算型伺服器選擇標準:cpu 核心和記憶體大小,一般比例為 1:2 ,如 8 核 cpu,16G 記憶體;16 核心CPU,32G記憶體。
記憶體型伺服器選擇標準:cpu 核心和記憶體大小,一般比例為 1:8 ,如 8 核 cpu,64G 記憶體;16 核心CPU,128G記憶體

3、實戰場景:一臺伺服器,16 核心 CPU,64G記憶體。 Apache 最大可以設定多少個 work 程式。

思路:先減去伺服器系統本身所需要的資源,剩下的才能給 Apache 使用。具體分配記憶體場景,可以參考以下案例。

例 1:當一臺伺服器是 8G 記憶體時,2G留給系統使用,6G留給 Apache 使用。
例 2:當一臺伺服器是 16G 記憶體時,4G留給系統使用,12G留給 Apache 使用。
例 3:當一臺伺服器是 32G 記憶體時,8G留給系統使用,24G留給 Apache 使用。
例 4:當一臺伺服器是 64G 記憶體時,8G留給系統使用,56G留給 Apache 使用。
總結:系統最多使用 8G 記憶體,就足夠了穩定執行了。

那麼對於 64G 記憶體的伺服器,Apache 可以使用 56G 記憶體,假如每個 work 程式穩定執行時,平均使用 56M 記憶體。最大 work 程式數為:56*1024/56=1024 個。

根據上述情況,修改後的 http-mpm.conf 的 worker 的配置後為:

<IfModule mpm_worker_module>
StartServers 1024
MinSpareThreads 750
MaxSpareThreads 2500
ThreadsPerChild 250
MaxRequestWorkers 25000
MaxConnectionsPerChild 25000
</IfModule>

重啟 Apache,再開啟網站看看是否還會有慢的問題了。

動態觀察 Apache 的最大連線數:
[root@centos60 conf]# watch -n 1 "pgrep httpd|wc -l"

生產環境配置例項

實戰環境:一臺伺服器 cpu 是 8 核心,物理是記憶體 32G ,想達到 2000 併發的 apache,worker模式的配置引數如下:

<IfModule mpm_worker_module>
StartServers 16
MinSpareThreads 75
MaxSpareThreads 1250
ThreadsPerChild 125
MaxRequestWorkers 2000
MaxConnectionsPerChild 12500
</IfModule>

<IfModule mpm_worker_module>
StartServers 16 #啟動時程式數。一般設同 cpu 核心數一樣或是 cpu核心數的 2 倍。我調成 16 和 cpu 核心一樣。
MinSpareThreads 75 #最小空閒執行緒數。假設一個網站每天正常被使用者使用的時間為早上 7:00 到晚上 2:00。那麼 MinSpareThreads 應該配置為,這一時間段,最小併發訪問量的 3倍。比如 7:00 最少併發為 25,那就配置成 75。
MaxSpareThreads 1250 #最大空閒執行緒數。一般配置為 1 天中最大併發量的 1半。如這臺伺服器能處理的最大並量為 2500。那麼此值應該為 1250。因為記憶體閒著也是閒著,可以按 linux下儘可能使用記憶體的原則,配置成 1250.這樣在突然到來更多訪問量時,響應會更及時。
ThreadsPerChild 125 #每個程式可以啟動的執行緒數量。生產環境中,在頻寬和硬碟效能充足的情況下,希望這個這臺可以完成 2000 左右的併發。那麼此值應該為:2000/
StartServers 的值(我這裡是 16)=125 。但是一個程式不可能包括無數的執行緒,包括太多,會導致程式不穩定,容易崩潰。所以我們認為一個程式最多包括 125 執行緒,就很好了。所以如果還想處理更多的請求,可以把 StartServers 的值增加,而不是增大ThreadsPerChild 的值。 因為 ThreadsPerChild 值過大,會導致 Apache 執行不穩定。系統調優,穩定是一切的前提。
MaxRequestWorkers 2000 #所有執行緒數量的最大值,通常表示了一個 web 服務的最大併發值。MaxRequestWorkers 必須是 ThreadsPerChild 的整數倍,否則 Apache 會提示調整到一個相近的值。MaxRequestWorkers=StartServers* ThreadsPerChild。 我們這裡是:16*125=2000
MaxConnectionsPerChild 12500 # 最大連線數限制。每個子程式可以處理的最大請求數。如果設定為 0,表示沒有限制。 我們設定為 MaxConnectionsPerChild 12500。當程式處理了12500 個請求後,Apache 管理程式會去終止此程式繼續處理新的請求,當此程式處理完所有的已建立的請求後,管理程式會殺掉此程式,重新生成一個新的程式。結合當前的配置,我們得出結論:Apache 一個程式中有 125 個執行緒。 Apache 一個程式處理 12500 個請求。 平均一個執行緒處理 12500/125=100個請求。這樣配置還是合理的。一個執行緒處理太多的請求,也會出現記憶體溢位,導致程式崩潰。

event 模式調優

[root@centos60 conf]# vim /usr/local/apache/conf/extra/httpd-mpm.conf

<IfModule mpm_event_module>
    StartServers             3
    MinSpareThreads         75
    MaxSpareThreads        250
    ThreadsPerChild         25
    MaxRequestWorkers      400
    MaxConnectionsPerChild   0
</IfModule>
event 模式調優和 worker 模式一樣的,不同的是在於它解決了 keep-alive 長連線的時候佔用執行緒資源被浪費的問題。所以理倫上 event 模式比 worker 模式好。
總結:生產環境下對於要求更高伸縮性的站點可以選擇使用 worker 或 event 模式; 需要可靠性或者與舊軟體相容的站點可以使用 prefork 模式。現在網站使用 worker 模式比較多。worker 也比較成熟。event 模式從 Apache2.4 版本才開始有。

rewrite-禁止網站下某個目錄執行 PHP 檔案-Apache 調優總結

1、Rewirte 主要的功能就是實現 URL 的跳轉,它的正規表示式是基於 Perl 語言。可基於伺服器級的(httpd.conf)和目錄級的 (.htaccess)兩種方式。如果要想用到 rewrite 模組,必須先安裝或載入rewrite 模組。

安裝 Rewirte 模組兩種方式:
方法一:是編譯 Apache 的時候就直接 安裝 rewrite 模組。
方法二:編譯 Apache 時以 DSO 模式安裝 Apache,然後再利用原始碼和 apxs 來安裝 rewrite 模組。

2、基於伺服器級的(httpd.conf)有兩種方法:
方法 1:在 httpd.conf 的全域性下 直接利用 RewriteEngine on 來開啟 rewrite 功能;
方法 2:在區域性裡利用 RewriteEngine on 來開啟 rewrite 功能,下面將會舉例說明,需要注意的是,必須在每個 virtualhost 裡用 RewriteEngine on 來開啟 rewrite 功能。否則 virtualhost 裡沒有RewriteEngine on 它裡面的規則也不會生效。

檢視是否安裝了rewrite模組

[root@centos60 conf]# apache -M | grep rewrite
[root@centos60 modules]# cd /usr/local/apache/modules
[root@centos60 modules]# ls *write*
mod_rewrite.so

[root@centos60 conf]# vim httpd.conf
LoadModule rewrite_module modules/mod_rewrite.so       #取消註釋

[root@centos60 conf]# apache -M | grep write
 rewrite_module (shared)

如果編譯時沒有安裝則使用DSO 方式安裝

[root@centos60 conf]# cd /usr/local/src/httpd-2.4.46/modules/mappers/
[root@centos60 mappers]# ls mod_rewrite.c
mod_rewrite.c
[root@centos60 mappers]# /usr/local/apache/bin/apxs -cia /usr/local/src/httpd-2.4.46/modules/mappers/mod_rewrite.c

Apache mod_rewrite 規則重寫的標誌引數說明

1) R[=code](force redirect) 強制外部重定向。
強制在替代字串加上 http://thishost[:thisport]/字首重定向到外部的 URL.如果 code 不指定,將用預設的 302 HTTP 狀態碼。
2) F(force URL to be forbidden)禁用 URL,返回 403HTTP 狀態碼。
3) G(force URL to be gone) 強制 URL 為 GONE,返回 410HTTP 狀態碼。
4) P(force proxy) 強制使用代理轉發。
5) L(last rule) 表明當前規則是最後一條規則,停止分析以後規則的重寫。
6) N(next round) 重新從第一條規則開始執行重寫過程。
7) C(chained with next rule) 與下一條規則關聯。如果規則匹配則正常處理,該標誌無效,如果不匹配,那麼下面所有關聯的規則都跳過。
8) T=MIME-type(force MIME type) 強制 MIME 型別。
9) NS (used only if no internal sub-request) 只用於不是內部子請求。
10) NC(no case) 不區分大小寫
11) QSA(query string append) 追加請求字串。
12) NE(no URI escaping of output) 不在輸出轉義特殊字元。例如:RewriteRule /foo/(.*) /bar?arg=P1\%3d$1 [R,NE] 將能正確的將/foo/zoo 轉換成/bar?arg=P1=zed
13) PT(pass through to next handler) 傳遞給下一個處理。
14) S=num(skip next rule(s)) 跳過 num 條規則。
15) E=VAR:VAL(set environment variable) 設定環境變數。

實戰 1實現 client 請求的主機字首不是 www.centos.cn 和 192.168.0.60 都跳轉到主機字首為http://www.centos.cn 。例如當使用者在位址列寫入 http://centos.cn 和 bbs.centos.com 直接跳轉到 http://www.centos.cn 登入網站。

[root@centos60 conf]# vim /usr/local/apache/conf/httpd.conf

LoadModule rewrite_module     modules/mod_rewrite.so  #在模組下插入
RewriteEngine on
RewriteCond %{HTTP_HOST} !^www.centos.cn [NC]
RewriteCond %{HTTP_HOST} !^192.168.0.60 [NC]
RewriteCond %{HTTP_HOST} !^$
RewriteRule ^/(.*) http://www.centos.cn/ [L]
<IfModule unixd_module>

註釋:
RewriteEngine on #開啟 rewirte 功能。
RewriteCond %{HTTP_HOST} !^www.centos.cn [NC] #宣告 Client 請求的主機中字首不是。www.centos.cn,[NC]的意思是忽略大小寫。
RewriteCond %{HTTP_HOST} !^192.168.0.60 [NC] #宣告 Client 請求的主機中字首不是。192.168.0.60,[NC]的意思是忽略大小寫。
RewriteCond %{HTTP_HOST} !^$ #宣告Client請求的主機中字首不為空,[NC]的意思是忽略大小寫。
RewriteRule ^/(.*) http://www.centos.cn/ [L]
RewriteRule 含義是如果 Client 請求的主機中的字首符合上述條件,則直接進行跳轉到
http://www.centos.cn/,[L]意味著立即停 止重寫操作,並不再應用其他重寫規則。這裡的.*是指匹配所有 URL 中不包含換行字元,()括號的功能是把所有的字元做一個標記,以便於後面的應用. 就是引用前面裡的(.*)字元。


輸入www.kill.com 會跳轉到 www.centos.cn

LoadModule rewrite_module     modules/mod_rewrite.so
RewriteEngine on
RewriteCond %{HTTP_HOST} ^www.kill.com [NC]
RewriteRule ^/(.*) http://www.centos.cn/ [L]
<IfModule unixd_module>

對 Apache 進行防盜鏈的配置

實戰場景:一些小網站為了盈利,通過盜鏈來實現對自己網站內容的豐富,這無疑加大了企業的空間和流量的成本,因此我們需要對 Apache 進行防盜鏈的配置。

RewriteEngine on

HTTP Referer是header的一部分,當瀏覽器向web伺服器傳送請求的時候,一般會帶上Referer,告訴伺服器該網頁是從哪個頁面連結過來的,伺服器因此可以獲得一些資訊。這樣防盜鏈就是利用這個資訊進行處理,!^http://www.centos.cn/.*$ 非此連結來請求資源,都進行跳轉.

重啟服務即可生效。

RewriteEngine on 啟用規則

RewriteEngine off 關閉規則

我們通過修改 Apache 主配置檔案 httpd.conf 中的<Directory></Directory>標籤內的 Options選項引數來實現禁用目錄瀏覽。

 

禁止瀏覽目錄和 php 檔案被解析-使用 CDN 做網站加速

由於開啟目錄瀏覽會讓我們整個目錄下的內容全部都暴露到外面,因此我們必須要禁止目錄瀏覽功能。當然一些目錄開放給客戶做下載的,可以忽略此項優化。我們通過修改 Apache 主配置檔案 httpd.conf 中的<Directory></Directory>標籤內的 Options選項引數來實現禁用目錄瀏覽。

[root@centos60 htdocs]# cp -r /boot/grub2/ /usr/local/apache/htdocs/       #先複製一些測試資料
[root@centos60 htdocs]# chown apache:apache /usr/local/apache/htdocs/grub2 -R

要想顯示出來,要確保執行apache程式的使用者必須與該grub2目錄的所屬使用者一致。

Options FollowSymLinks  只要去掉Indexes就可以禁止 Apache 顯示該目錄結構。

禁止網站中某個目錄中的 php 檔案被解析

實戰場景:企業的站點有時會提供使用者進行上傳操作,比如讓使用者上傳一個檔案或頭像圖片,而使用者上傳檔案的存放目錄,我們是不能給 php 的解析許可權的,否則會對 Apache 服務和系統造成危害。

[root@centos60 htdocs]# mkdir /usr/local/apache/htdocs/abc
[root@centos60 conf]# vim /usr/local/apache/conf/httpd.conf

<Directory "/usr/local/apache/htdocs/abc">
 <Files ~ ".php">
  Order allow,deny
  Deny from all
 </Files>

使用 CDN 做網站加速

簡單地說,就是通過在現有的 Internet 中增加一層新的網路架構,將網站的內容釋出到最接近使用者的快取伺服器內。通過 DNS 負載均衡的技術,判斷使用者來源就近訪問 cache 伺服器取得所需的內容,杭州的使用者訪問接近杭州伺服器上的內容,北京訪問接近北京伺服器上的內容。這樣可以有效減少資料在網路上傳輸的事件,提高速度。把靜態內容釋出到 CDN 減少了使用者的響應時間 20%或更多。

CDN 技術示意圖:

國內有名的 CDN 公司:網宿,藍汛(chinacache),快網

Apache 網站架構優化

好的網站架構是網站效能強大關鍵,更是網站安全的關鍵。
在生產環境中建議將程式頁面伺服器、圖片附件伺服器和上傳伺服器三者的功能儘量分離。
分離方法:
1、分離最佳方式是分別使用獨立的伺服器(需要程式支援)
2、次選方案在前端負載均衡器通過 haproxy/nginx 來根據使用者請求的目錄或副檔名來對後端的伺服器發出請求。
例如:請求 http://www.xuegod.cn/a/b.jpg 就拋給圖片伺服器(CDN 最好),這裡是根據副檔名.jpg 分發請求 http:// /www.xuegod.cn /upload/login.php 就拋給 Apache 伺服器,這裡是根據 URL 路徑分發。
均不符合上面兩個要求的,預設就都是拋給主 web 伺服器。

相關文章