Apache 調優進階
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 伺服器。
相關文章
- 調優 | Apache Hudi應用調優指南Apache
- Java面試題中高階進階(JVM調優篇)Java面試題JVM
- 【JVM進階之路】十:JVM調優總結JVM
- JVM效能調優與實戰進階篇-上JVM
- Apache SeaTunnel Committer 進階指南ApacheMIT
- Webpack 實戰:入門、進階與調優(中卷)Web
- 《MySQL 進階篇》十七:資料庫其他調優策略MySql資料庫
- 快取Apache Spark RDD - 效能調優快取ApacheSpark
- 【JAVA進階架構師指南】之五:JVM效能調優Java架構JVM
- 【進階之路】執行緒池配置與調優的一些高階選項(一)執行緒
- Tomcat高階特性及效能調優Tomcat
- spark效能調優指南高階篇Spark
- Spark 效能調優--開發階段Spark
- Apache Flink 進階入門(二):Time 深度解析Apache
- Apache Flink 進階(一):Runtime 核心機制剖析Apache
- 單調棧進階-接雨水-最大矩形
- Redis基礎、高階特性與效能調優Redis
- Redis 基礎、高階特性與效能調優Redis
- Apache Flink 進階(五):資料型別和序列化Apache資料型別
- Android高階效能調優;不可思議的OOM!AndroidOOM
- JS進階系列 --- ajax請求優化JS優化
- 前端進階(1)Web前端效能優化前端Web優化
- Apache Flink 進階(三):Checkpoint 原理解析與應用實踐Apache
- Vue進階系列 --- 頁面架構優化Vue架構優化
- Redux 進階 — 優雅的處理 async actionRedux
- Redux 進階 -- 優雅的處理 async actionRedux
- 網站效能調優開發工具: Lighthouse, Puppeteer 以及進階部分丨 Google 開發者大會 2018網站Go
- Spark 效能調優--資源調優Spark
- 面試之 Redis 基礎、高階特性與效能調優面試Redis
- 在Linux中,如何進行系統效能調優?Linux
- 大廠是怎麼進行SQL調優的?SQL
- apache網頁優化Apache網頁優化
- 人工智慧進階-TensorFlow核心之剪枝優化人工智慧優化
- Flutter進階 | Flutter 優質練手專案以及優質外掛Flutter
- Apache網頁優化與安全優化Apache網頁優化
- 移動web效能優化從入門到進階Web優化
- APICloud開發者進階之路 | 編碼優化(一)APICloud優化
- APICloud開發者進階之路 | 編碼優化(二)APICloud優化