apache安裝及工做模式

博文結構
安裝apache
工做模式javascript

一.編譯安裝apache2.4.23

新版本的 httpd-2.4 新增如下特性;
新增模塊; mod_proxy_fcgi(可提供 fcgi 代理)
mod_ratelimit(限制用戶帶寬)
mod_request(請求模塊,對請求作過濾)
mod_remoteip(匹配客戶端的 IP 地址)
對於基於 IP 的訪問控制作了修改,再也不支持 allow,deny,order 機制,而是統一使用 require 進行 php

  • 新增如下幾條新特性;
    一、MPM 支持在運行時裝載;不過要開啓這種特性,在編譯安裝要啓用這三種功能; --enable-mpms-shared=all --with-mpm=event
    二、支持 event
    三、支持異步讀寫
    四、在每一個模塊及每一個目錄上指定日誌級別
    五、加強版的表達式分析器
    六、每請求配置:<If>, <Elseif>
    七、毫秒級別的 keepalive timeout
    八、基於 FQDN 的虛擬主機再也不須要 NameVirtualHost 指令
    九、支持使用自定義變量 css

  • 安裝環境:操做系統:Centos7.2,關閉 selinux 檢查 httpd 包是否安裝,如查安裝則卸載

下載源碼包java

注:apr(Apache Portable Runtime)Apache 可移植運行庫,它是一個對操做系統調用的抽 象庫,用來實現 Apache 內部組件對操做系統的使用,提升系統的可移植性。 安裝 apr 和 apr-util
linux

  • 解壓縮
[root@localhost media]# ls
apr-1.5.2.tar.gz       cronolog-1.6.2.tar.gz  openssl-1.0.1u.tar.gz
apr-util-1.5.4.tar.gz  httpd-2.4.23.tar.gz    pcre-8.39.tar.gz
[root@localhost media]# tar zxf apr-1.5.2.tar.gz -C /usr/src/
[root@localhost media]# tar zxf apr-util-1.5.4.tar.gz  -C /usr/src/
[root@localhost media]tar zxf zlib-1.2.8.tar.gz   -C /usr/src/
[root@localhost media]# tar zxf pcre-8.39.tar.gz -C /usr/src/
[root@localhost media]# tar zxf httpd-2.4.23.tar.gz -C /usr/src/
[root@localhost media]# tar zxf openssl-1.0.1u.tar.gz -C /usr/src/
  • 安裝
[root@localhost src]# cd /usr/src/
[root@localhost src]# ls
apr-1.5.2  apr-util-1.5.4  debug  httpd-2.4.23  kernels  openssl-1.0.1u  pcre-8.39
[root@localhost src]# cd apr-1.5.2/
[root@www apr-1.5.2]# ./configure --prefix=/usr/local/apr 
[root@www apr-1.5.2]# make && make install 
[root@www ~]# cd apr-util-1.5.4/ 
[root@www apr-util-1.5.4]# ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr 
[root@www apr-util-1.5.4]# make && make install
  • 安裝zlib
[root@www ~]# cd zlib-1.2.8/ 
[root@www zlib-1.2.8]# ./configure --prefix=/usr/local/zlib 
[root@www zlib-1.2.8]# make && make install
  • 安裝pcre
[root@www ~]# cd pcre-8.39/
[root@www pcre-8.39]# ./configure --prefix=/usr/local/pcre 
[root@www pcre-8.39]# make && make install
  • 安裝openssl

安裝 apache2.4.23 時提示 openssl 版本太低,centos7 自帶版本 openssl-1.0.1e web

[root@www ~]# cd openssl-1.0.1u/
[root@www openssl-1.0.1u]# ./config -fPIC --prefix=/usr/local/openssl enable-shared
[root@www openssl-1.0.1u]# make && make install
[root@www ~]# mv /usr/bin/openssl /usr/bin/openssl.1.0.1e
[root@www ~]# ln -s /usr/local/openssl/bin/openssl /usr/bin/openssl apache

  • 安裝 apache2.4.23
[root@www ~]# cd httpd-2.4.23/ 
[root@www httpd-2.4.23]# ./configure --prefix=/usr/local/http-2.4.23 --enable-so --enable-cgi --enable-cgid --enable-ssl --with-ssl=/usr/local/openssl --enable-rewrite  --with-pcre=/usr/local/pcre --with-z=/usr/local/zlib --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util --enable-modules=most --enable-mods-shared=most --enable-mpms-shared=all --with-mpm=event--enable-proxy --enable-proxy-fcgi --enable-expires --enable-deflate 
[root@www httpd-2.4.23]# make && make install 
[root@www httpd-2.4.23]# ln -s /usr/local/http-2.4.23/bin/* /usr/local/bin/ 
\\優化 http 程序執行路徑 
[root@www httpd-2.4.23]# ln -s /usr/local/http-2.4.23/bin/* /usr/local/bin
\\修改配置文件 httpd.conf,設置其中的 ServerName 值 
[root@www /]# /usr/local/http-2.4.23/apachectl start
[root@www httpd-2.4.23]# cp /usr/local/http-2.4.23/bin/apachectl /etc/init.d/httpd 
\\開機後自動啓動 
[root@www httpd-2.4.23]# vi /etc/init.d/httpd   \\添加下面倆行帶#
# chkconfig: 35 85 15 (在 3 和 5 啓動模式下的--啓動優先級)
# description: apache 2.4.23 
[root@www httpd-2.4.23]# chkconfig --add httpd 
[root@www httpd-2.4.23]# chkconfig httpd on
\\將 Apache 加入開機自動啓動
[root@www httpd-2.4.23]# service  httpd start 
[root@www httpd-2.4.23]# netstat -anplt | grep 80 tcp6      
0      0 :::80                   :::*       LISTEN      4807/httpd

參數解釋:vim

--enable-so:支持動態共享模塊(即打開 DSO 支持)
--enable-rewrite:支持 url 重寫 
--enable-ssl:支持 ssl --with-ssl=/usr/local/openssl:指定 ssl 安裝位置 
--enable-cgi:啓用 cgi --enable-cgid:MPM 使用的是 event 或 worker 要啓用 cgid -
-enable-modules=most:明確指明要靜態編譯到 httpd 二進制文件的模塊,<MODULE-LIST>爲 空格分隔的模塊名列表、all 或者 most,all 表示包含全部模塊,most 表示包含大部分經常使用模 塊 
--enable-mods-shared=most:明確指明要以 DSO 方式編譯的模塊,<MODULE-LIST>爲空格分隔 的模塊名列表、all 或者 most,all 表示包含全部模 塊,most 表示包含大部分模塊 
--enable-mpms-shared=all:啓用 MPM 全部支持的模式,這樣 event、worker、prefork 就會以 模塊化的方式安裝,要用哪一個就在 httpd.conf 裏配置就行了。 
--with-mpm=event:指定啓用的 mpm 模式,默認使用 enevt 模式,在 apache 的早期版本 2.0 默認 prefork,2.2 版本是 worker,2.4 版本是 event. 
--with-pcre=/usr/local/pcre:支持 pcre 
--with-z=/usr/local/zlib:使用 zlib 壓縮庫
--with-apr=/usr/local/apr:指定 apr 的安裝路徑 
--with-apr-util=/usr/local/apr-util:指定 apr-util 的安裝路徑

二.apache的優化及模塊解釋

apache 所運行的硬件環境都是對性能影響最大的因素,即便不能對硬件進行升級,也最好 給 apache 一個單獨的主機以避免受到其餘應用的干擾。各個硬件指標中,對性能影響最大的 是內存,對於靜態內容(圖片、javascript 文件、css 文件等),它決定了 apache 能夠緩存多 少內容,它緩存的內容越多,在硬盤上讀取內容的機會就越少,大內存能夠極大提升靜態站 點的速度;對動態高負載站點來講,每一個請求保存的時間更多一些,apache 的 mpm 模塊會 爲每一個請求派生出相應的進程或線程分別處理,而進程或線程的數量與內存的消耗近似成正 比,所以增大內存對提升動態站點的負載和運行速度也極爲有利  其次是硬盤的速度,靜態站點尤其突出,apache 不斷的在讀取文件併發送給相應的請求, 硬盤的讀寫是極其頻繁的;動態站點也要不斷的加載 web 程序(php 等),一個請求甚至要讀 取十幾個文件才能處理完成,所以儘量的提升硬盤速度和質量對提升 apache 的性能是有 積極意義的。  最後是 cpu 和網絡,cpu 影響的是 web 程序執行速度,網絡影響流量大小。
  • 工做模式

Apache HTTP 服務器被設計爲一個強大的、靈活的可以在多種平臺以及不一樣環境下工做的服 務器。這種模塊化的設計就叫作「多進程處理模塊」(Multi-Processing Module,MPM),也叫 作工做模式centos

注:若是要更改工做模式裏面的進程須要到主配置文件裏面把
[root@www ~]# vi /usr/local/http-2.4.23/conf/httpd.conf
Include conf/extra/httpd-mpm.conf \這條前面#去掉就能夠更改進程了(大約在456頁搜索mpm)

[root@www /]# ps -ef | grep httpd \看進程
[root@www /]# apachectl -t \jian檢查語法緩存

  • Prefork 模式(一個非線程型的)

其工做方式:當Apache服務啓動後,mpm_prefork模塊會預先建立多個子進程(默認爲5個),每一個子進程只有一個線程,當接收到客戶端請求後,mpm_prefork模塊再將請求轉交給子進程進行處理,而且每一個子進程同時只能用於單個請求。若是當前的請求數將超過預先建立的子進程數時,mpm_prefork模塊就會建立新的子進程來處理額外的請求。

apache安裝及工做模式

  • 開啓prefork模式的方法:
[root@localhost ~]# vim /usr/local/http-2.4.23/conf/httpd.conf
//編寫httpd的主配置文件,修改一下內容
Include conf/extra/httpd-mpm.conf                     //默認存在刪除「#」號便可
#LoadModule mpm_event_module modules/mod_mpm_event.so
//添加#號
LoadModule mpm_prefork_module modules/mod_mpm_prefork.so
//默認存在,刪除#號便可!
#LoadModule mpm_worker_module modules/mod_mpm_worker.so
//這三行即是apache的三種工做模式,可根據實際狀況進行切換
[root@localhost ~]# systemctl restart httpd      //從新啓動httpd服務
[root@localhost ~]# systemctl start httpd     //手動再啓動一下
[root@localhost ~]# httpd -V      //查看httpd的工做模式
//找到這一行便可
Server MPM:     prefork                //能夠看到如今Apache工做在prefork模式
[root@www ~]# apachectl –l  //小寫 L,只顯示靜態模塊)
  • 修改 prefork 參數
[root@www ~]# vi /usr/local/http-2.4.23/conf/extra/httpd-mpm.conf 
//設置prefork模式也就只有這幾個參數,具體含義:
<IfModule mpm_prefork_module>            //這就是prefork工做模式的參數-
    StartServers             5                //apache啓動時默認開啓的子進程數
    MinSpareServers          5                  //最小的閒置子進程數
    MaxSpareServers         10               //最大的閒置子進程數
    MaxRequestWorkers      250        // 設置了容許同時的最大接入請求數量
    MaxConnectionsPerChild   0         //0表示每一個子進程處理完數據後進程永不銷燬,設置成非0時,可防止內存泄漏,服務器在負載小時自動減小本身進程數
</IfModule>

apache安裝及工做模式

  • 注 1:MaxRequestWorkers 是這些指令中最爲重要的一個,設定的是 Apache 能夠同時處理 的請求,是對 Apache 性能影響最大的參數。若是請求總數已達到這個值(可經過 ps -ef|grep http|wc -l 來確認),那麼後面的請求就要排隊,直到某個已處理請求完畢。這就是系統資源 還剩下不少而 HTTP 訪問卻很慢的主要緣由。雖然理論上這個值越大,能夠處理的請求就越 多,建議將初始值設爲(以 Mb 爲單位的最大物理內存/2),而後根據負載狀況進行動態調整。 好比一臺 4G 內存的機器,那麼初始值就是 4000/2=2000
  • 注 2:prefork 控制進程在最初創建「StartServers」個子進程後,爲了知足 MinSpareServers 設置的須要建立一個進程,等待一秒鐘,繼續建立兩個,再等待一秒鐘,繼續建立四個……如 此按指數級增長建立的進程數,最多達到每秒 32 個,直到知足 MinSpareServers 設置的值爲止。這種模式 能夠沒必要在請求到來時再產生新的進程,從而減少了系統開銷以增長性能。 MaxSpareServers 設置了最大的空閒進程數,若是空閒進程數大於這個 值,Apache 會自動 kill 掉一些多餘進程。這個值不要設得過大,但若是設的值比 MinSpareServers 小,Apache 會自 動把其調整爲 MinSpareServers+1。若是站點負載較大,可考慮同時加大 MinSpareServers 和 MaxSpareServers。
  • 注 3:ServerLimit 和 MaxClients(MaxRequestWorkers)有什麼區別呢? 是由於在 apache1 時代,控制最大進程數只有 MaxClients 這個參數,而且這個參數最大值爲 256,而且是寫死了的,試圖設置爲超過 256 是無效的,這是因爲 apache1 時代的服務器硬 件限制的。可是 apache2 時代因爲服務器硬件的升級,硬件已經再也不是限制,因此使用 ServerLimit 這個參數來控制最大進程數,ServerLimit 值>=MaxClient 值纔有效。ServerLimit 要放在 MaxClients 以前,值要不小於 MaxClients

優勢:成熟,兼容全部新老模塊。進程之間徹底獨立,使得它很是穩定。同時,不須要擔憂線程安全的問題。(咱們經常使用的mod_php,PHP的拓展不須要支持線程安全)

缺點:一個進程相對佔用更多的系統資源,消耗更多的內存。並且,它並不擅長處理高併發請求,在這種場景下,它會將請求放進隊列中,一直等到有可用進程,請求才會被處理。

  • Worker 模式(多線程多進程)

和 prefork 模式相比,worker 使用了多進程和多線程的混合模式,worker 模式也一樣會先預派生一些子進程,而後每一個子進程建立一些線程,同時包括一個監聽線程,每一個請求過來會 被分配到一個線程來服務。線程比起進程會更輕量,由於線程是經過共享父進程的內存空間, 所以,內存的佔用會減小一些,在高併發的場景下會比 prefork 有更多可用的線程,表現會 更優秀一些;另外,若是一個線程出現了問題也會致使同一進程下的線程出現問題,若是是 多個線程出現問題,也只是影響 Apache 的一部分,而不是所有。因爲用到多進程多線程, 須要考慮到線程的安全了,在使用 keep-alive 長鏈接的時候,某個線程會一直被佔用,即便 中間沒有請求,須要等待到超時纔會被釋放(該問題在 prefork 模式下也存在) 總的來講,prefork 方式速度要稍高於 worker,然而它須要的 cpu 和 memory 資源也稍多於 woker。

apache安裝及工做模式

  • work模式的配置
/自行修改httpd主配置文件,切換模式並重啓服務,接下來
[root@localhost ~]# vim /usr/local/http-2.4.23/conf/extra/httpd-mpm.conf 
<IfModule mpm_worker_module>       //這是worker工做模式的參數
    StartServers             3                  //apache啓動時默認開始的子進程數
    MinSpareThreads         75            //最小空閒數量的工做線程-
    MaxSpareThreads        250          //最大空閒數量的工做線程-
    ThreadsPerChild         25              //每一個子進程產生的線程數量
    MaxRequestWorkers      400        //每一個進程最大接受的請求數量
    MaxConnectionsPerChild   0         //表示永不銷燬
</IfModule>

apache安裝及工做模式

Worker模式下所能同時處理的請求總數是由子進程總數乘以ThreadsPerChild 值決定的,應該大於等於MaxRequestWorkers。若是負載很大,現有的子進程數不能知足時,控制進程會派生新的子進程。默認最大的子進程總數是16,加大時 也須要顯式聲明ServerLimit(最大值是20000)。須要注意的是,若是顯式聲明瞭ServerLimit,那麼它乘以 ThreadsPerChild的值必須大於等於MaxRequestWorkers,並且MaxRequestWorkers必須是ThreadsPerChild的整數倍,不然 Apache將會自動調節到一個相應值。

優勢:佔據更少的內存,高併發下表現更優秀。

缺點:必須考慮線程安全的問題,由於多個子線程是共享父進程的內存地址的。若是使用keep-alive的長鏈接方式,也許中間幾乎沒有請求,這時就會發生阻塞,線程被掛起,須要一直等待到超時纔會被釋放。若是過多的線程,被這樣佔據,也會致使在高併發場景下的無服務線程可用。(該問題在prefork模式下,一樣會發生)。

  • Event 模式 多進程+多線程+epoll

這是 Apache 最新的工做模式,是 worker 模式的變種,它把服務進程從鏈接中分離出來,一 worker 模式不一樣的是在於它解決了 keep-alive 長鏈接的時候佔用線程資源被浪費的問題,在 event 工做模式中,會有一些專門的線程用來管理這些 keep-alive 類型的線程,當有真實請
求過來的時候,將請求傳遞給服務器的線程,執行完畢後,又容許它釋放。這加強了在高並 發場景下的請求處理。event 模式不能很好的支持 https 的訪問(HTTP 認證相關的問題)。

apache安裝及工做模式

  • 進程與線程的區別
地址空間:進程內的一個執行單元;進程至少有一個線程;它們共享進程的地址空間;而進程有本身獨立的地址空間;
資源擁有:進程是資源分配和擁有的單位,同一個進程內的線程共享進程的資源;
線程是處理器調度的基本單位,但進程不是;
兩者都可併發執行;
相關文章
相關標籤/搜索