Apache 的三種模式
prefork 多進(jìn)程模式
一個主進(jìn)程,負(fù)責(zé)生成多個子進(jìn)程,也稱工作進(jìn)程,進(jìn)程之間獨(dú)立,每個進(jìn)程之間只能有一個線程,優(yōu)點(diǎn)是穩(wěn)定,缺點(diǎn)是內(nèi)存占用大,每個進(jìn)程響應(yīng)一個用戶請求。
worker 多線程模式
一個主進(jìn)程生多個子進(jìn)程,每個子進(jìn)程生成多個線程,默認(rèn)25個,每個線程響應(yīng)一個用戶請求,優(yōu)點(diǎn):線程之間內(nèi)存共享,內(nèi)存利用率高,缺點(diǎn):安全性穩(wěn)定性較差,一個進(jìn)程崩掉,整個進(jìn)程內(nèi)的線程都一起掛。
event 事件驅(qū)動模式
一個進(jìn)程處理多個請求,前面兩種模型在處理高并發(fā)請求時,很快會耗光服務(wù)器的可用進(jìn)程,event 把進(jìn)程進(jìn)行分工,采用專用的進(jìn)程來監(jiān)聽請求保持連接,因?yàn)楸3诌B接只需要極少的資源。
查看運(yùn)行的模式
httpd -V
源碼安裝時打開以下參數(shù)可動態(tài)更換
./configure --enable-mpms-shared=all
更換模式
編輯/etc/sysconfi/httpd
HTTPD=安裝目錄/bin/httpd.prefork或httpd.worker
源碼安裝時打開以下參數(shù)指定模式
./configure --with-mpm=prefork
源碼安裝時其它常用參數(shù)
./configure //配置源代碼樹
--prefix=/usr/local/apache2 //apache的安裝目錄。如果沒有指定PREFIX,默認(rèn)會裝到/usr/local/apache2。
--enable-module=so //打開 so 模塊,so 模塊是用來提 dso 支持的 apache 核心模塊
--enable-deflate=shared //支持網(wǎng)頁壓縮 頁面請求,服務(wù)器把文本壓縮,發(fā)送過去更快
--enable-expires=shared //支持 http 控制 過期,網(wǎng)站讓瀏覽器緩存內(nèi)容多久
--enable-headers //http的頭
--enable-modules=moset //打開apache大部分模塊
--with-pmp =worker 指定apache的worker工作模式,默認(rèn)是prefork
--enable-rewrite=shared //支持 url 重寫 偽靜態(tài)
編譯安裝依賴
zlib-devel gcc gcc++ apr apr-devel pcre-devel
apache 啟動停止
安裝目錄/bin/httpd -k start | stop | restart | graceful #等待請求完成后重開進(jìn)程
httpd -t測試配置文件
yum 安裝的可以systemctl start |stop httpd
修改MPM模塊配置
Apace安裝目錄/conf/extra目錄中有一個名為httpd-mpm.conf的配置文件,編輯將相應(yīng)行的注釋去掉
# Server-pool management (MPM specific)
#Include conf/extra/httpd-mpm.conf (去掉該行前面的注釋符#)
------------------編輯httpd-mpm.conf----------------------
<IfModule mpm_prefork_module>
ServerLimit 150 #最大20000 大于等于MaxClients
StartServers 5 #開始進(jìn)程數(shù),推薦設(shè)置:小=默認(rèn) 中=20~50 大=50~100
MinSpareServers 5 #最小空閑進(jìn)程數(shù),推薦設(shè)置:與StartServers保持一致
MaxSpareServers 10 #最大空閑進(jìn)程數(shù),推薦設(shè)置:小=20 中=30~80 大=80~120
MaxClients 150 #最大連接數(shù)推薦設(shè)置:小=500 中=500~1500 大型=1500~3000
MaxRequestsPerChild 0 #進(jìn)程的生命周期,0永遠(yuǎn)不銷毀。推薦設(shè)置:小=10000 中或大=10000~500000
(此外,還需額外設(shè)置ServerLimit參數(shù),該參數(shù)最好與MaxClients的值保持一致。)
httpd 平均占用內(nèi)存計(jì)算KB
ps aux |awk '/httpd/&&!/awk/&&!/root/{sum+=$6 ;n++};END{print sum/n}'
排除awk本身以及主進(jìn)程(root用戶),可能是其它特征。如平均占用10M
可以根據(jù)情況配置當(dāng)前系統(tǒng)空閑內(nèi)存的80%給apache使用,如32G物理內(nèi)存,空閑28G,28*1024*0.8/10約為2000。
添加監(jiān)聽
在httpd.conf添加如下內(nèi)容
<location /server-status> //server-status 這個名字可以任意的取
SetHandler server-status
Order Deny,Allow
Deny from nothing //禁止的訪問地址,nothing 表示沒有禁止訪問的地址
Allow from all //表示允許的地址訪問;all 表示所有的地址都可以訪問
</location>
ExtendedStatus On //表示的是待會訪問的時候能看到詳細(xì)的請求信息
<Location /server-info> SetHandler server-info
Order allow,deny
Deny from nothing
Allow from all
</Location>
重啟apache訪問
http://IP地址:端口/server-status
http://IP地址:端口/server-info
http://IP地址:端口/server-status ?refresh=N
N將表示訪問狀態(tài)頁面可以每N秒自動刷新一次

其它配置
ServerRoot "/etc/httpd"
用于指定Apache的運(yùn)行目錄,服務(wù)啟動之后自動將目錄改變?yōu)楫?dāng)前目錄,在后面使用到的所有相對路徑都是想對這個目錄下
Listen 80
監(jiān)聽的端口,如有多塊網(wǎng)卡,默認(rèn)監(jiān)聽所有網(wǎng)卡
ServerAdmin root@localhost #管理員的郵箱,如果出現(xiàn)問題,會在首頁顯示
ServerName www.example.com:80
默認(rèn)是不需要指定的,服務(wù)器通過名字解析過程來獲得自己的名字,但如果解析有問題(如反向解析不正確),或者沒有DNS名字,也可以在這里指定IP地址,當(dāng)這項(xiàng)不正確的時候服務(wù)器不能正常啟動。
啟動Apache時候提示正在啟動 httpd:httpd: apr_sockaddr_info_get() failed forjustin httpd: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1forServerName。
解決方法就是啟動該項(xiàng)把www.example.com:80修改為自己的域名或者直接修改為localhost
DocumentRoot "/var/www/html"
apache的默認(rèn)web站點(diǎn)目錄路徑,結(jié)尾不要添加斜線
對根目錄的限制
<Directory />
Options FollowSymLinks # followsymlinks表示允許使用符號鏈接,默認(rèn)為禁用
AllowOverride None # 表示禁止用戶對目錄配置文件(.htaccess進(jìn)行修改)重載,普通站點(diǎn)不建議開啟
</Directory>
對/var/www/html目錄的一個權(quán)限的設(shè)置
<Directory "/var/www/html">
Options Indexes FollowSymLinks
AllowOverride None
Order allow,deny
Allow from all
</Directory>
默認(rèn)首頁文件名
DirectoryIndex index.html index.html.var #指定所要訪問的主頁的默認(rèn)主頁名字,默認(rèn)首頁文件名為index.html
默認(rèn)的網(wǎng)頁的類型
DefaultType text/plain
控制不讓web上的用戶來查看.htpasswd和.htaccess這兩個文件
<Files ~ "^.ht">
Order allow,deny
Deny from all
Satisfy All
</Files>
錯誤日志存放位置
ErrorLog "logs/error_log"
CustomLog "logs/access_log"