安裝環境:
[root@apache ~]# cat /etc/redhat-release CentOS release 6.6 (Final) [root@apache ~]# uname -r 2.6.32-504.el6.x86_64
Apache簡介
APACHE是世界上最流行的Web服務器軟件之一,當然,提供WWW服務的還有微軟的IIS,它是由微軟開發的,只能用在微軟的操作系統上,而APACHE是一個自由軟件。說到APACHE,還要聯想到LAMP,這個近年來也是應用得非常廣泛,LAMP就是:linux+apache+mysql+php。Apache的特點是簡單、速度快、性能穩定。
Apache的特點
功能強大,配置簡單,速度快,應用廣泛,性能穩定可靠,並可做代理服務器或負載均衡來使用。
Apache的應用場合
使用Apache運行靜態HTML網頁,圖片(處理靜態小文件能力不及Nginx)
使用Apache結合PHP引擎運行PHP,Perl等程序,LAMP被稱之為經典組合
使用Apache結合Tomcat/Resin運行JSP,JAVA等程序,成為中小企業的首選
使用Apache作代理,負載均衡,rewrite規則過濾等等
安裝Apache
1:卸載系統默認安裝的Apache軟件包
一般來說,操作系統自帶或者apache rpm包方法安裝的apache版本都比較低,且更新不及時,因此我們需要卸載掉安裝操作系統時默認被安裝上的apache軟件
通過rpm -qa httpd*命令,查詢當前系統中已安裝的apache軟件包,具體查詢操作過程如下:
rpm -qa httpd* rpm -e --nodeps httpd-2.2.3-43.el5.centos.3
通過rpm -e --nodeps后面分別接查詢到的apache軟件包完整名稱,即可卸載當前系統中通過rpm安裝方式安裝的apache軟件包
--nodeps:Don’t do a dependency check,意思是不做軟件間的依賴檢查
對於具備一定經驗的朋友,也可以直接執行下面的shell腳本命令來批量刪除系統自帶的apache軟件包
for name in `rpm -qa httpd*`;do rpm -e --nodeps $name;done
2:安裝zlib-devel包
yum install zlib-devel -y
3:開始安裝Apache
Apache-2.2.31版本下載地址:
微雲下載:https://share.weiyun.com/08ed2869f08f997cd6120b89e4e3b3b1
百度下載:http://pan.baidu.com/s/1pLoAS2n
tar zxvf httpd-2.2.31.tar.gz cd httpd-2.2.31
4:創建安裝目錄
[root@apache httpd-2.2.31]# mkdir /application
5:編譯
./configure \ --prefix=/application/apache2.2.31 \ --enable-deflate \ --enable-expires \ --enable-headers \ --enable-modules=most \ --enable-so \ --with-mpm=worker \ --enable-rewrite
#編譯參數說明:
#1. --prefix=/application/apache2.2.31 表示指定安裝路徑為:/application/apache2.2.31。如果不指定安裝路徑,則默認路徑為:/usr/local/apache2
#2. --enable-deflate 提供對內容的壓縮傳輸編碼支持,一般html,js,css等內容的站點,使用此參數功能會大大提高傳輸速度,提升訪問者訪問體驗。在生產環境中,這是apache調優的一個重要選項之一
#3. --enable-expires 激活允許通過配置文件控制http的“expires”和“cahe-control:”頭內容,即對網站圖片,JS,CSS等內容,提供在客戶端瀏覽器緩存的設置。這是apache調優的一個重要選項之一
#4. --enable-headers 提供允許對HTTP請求頭的控制
#5. --with-mpm=worker 選擇apache mpm的模式為worker模式,因為worker模式原理是更多的使用線程處理請求,所以可以處理更多的並發請求,而系統資源的開銷小於基於進程的mpm prefork。如果不指定此參數,默認的模式是prefork進程模式。有關apache模式的知識,后文會有詳細闡述。這是apache調優的一個重要選項之一
#6. --enable-rewrite 提供基於URL規則的重寫功能。即根據已知URL地址,轉換其它想要的URL地址。如前文講解的偽靜態功能就是這個模塊實現的。這是APACHE在生產環境中必用的一個重要功能。
#7. --enable-so 激活APACHE服務的DSO(全稱dynamic shared object,動態共享對象)支持,即在以后可以以DSO的方式編譯安裝共享模塊。這個模塊本身不能以DSO方式編譯。有關DSO的知識,后文講解。
上面如果沒有安裝zlib-devel包,這步編譯時會報如下錯誤:
checking for zlib location... not found checking whether to enable mod_deflate... configure: error: mod_deflate has been requested but can not be built due to prerequisite failures
上面編譯無誤后執行下面的命令開始安裝:
make make install
6:創建軟鏈接
[root@apache application]# ln -s apache2.2.31 apache [root@apache application]# ll total 4 lrwxrwxrwx 1 root root 12 Feb 15 10:30 apache -> apache2.2.31 drwxr-xr-x 15 root root 4096 Feb 15 10:30 apache2.2.31
查看APACHE編譯的模塊:
[root@apache application]# /application/apache/bin/apachectl -l Compiled in modules: core.c mod_authn_file.c mod_authn_dbm.c mod_authn_anon.c mod_authn_dbd.c mod_authn_default.c mod_authz_host.c mod_authz_groupfile.c mod_authz_user.c mod_authz_dbm.c mod_authz_owner.c ....................................................
7:啟動APACHE並測試
[root@apache application]# /application/apache/bin/apachectl start httpd: Could not reliably determine the server's fully qualified domain name, using 192.168.17.16 for ServerName #第一次啟動時,此提示可暫時忽略
查看80端口:
[root@apache application]# lsof -i :80 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME httpd 58925 root 4u IPv6 50990 0t0 TCP *:http (LISTEN) httpd 58927 daemon 4u IPv6 50990 0t0 TCP *:http (LISTEN) httpd 58928 daemon 4u IPv6 50990 0t0 TCP *:http (LISTEN) httpd 58929 daemon 4u IPv6 50990 0t0 TCP *:http (LISTEN)
查看httpd進程:
[root@apache application]# ps -ef|grep httpd root 58925 1 0 10:32 ? 00:00:00 /application/apache2.2.31/bin/httpd -k start daemon 58926 58925 0 10:32 ? 00:00:00 /application/apache2.2.31/bin/httpd -k start daemon 58927 58925 0 10:32 ? 00:00:00 /application/apache2.2.31/bin/httpd -k start daemon 58928 58925 0 10:32 ? 00:00:00 /application/apache2.2.31/bin/httpd -k start daemon 58929 58925 0 10:32 ? 00:00:00 /application/apache2.2.31/bin/httpd -k start
APACHE啟動成功后,在瀏覽器輸入該服務器IP地址,可看到It works!字樣:
[root@apache application]# ifconfig eth0|awk -F '[ :]+' 'NR==2{print $4}' 192.168.17.21
如果出不來it works的內容頁面,請從下面原因中依次排查:
1:iptables防火牆和selinux是否關閉
[root@apache application]# /etc/init.d/iptables stop
#這是關閉防火牆的命令,如果是生產環境請允許80端口的訪問,而不是關閉防火牆
#允許命令如下:
iptables -I INPUT -p tcp --dport 80 -j ACCEPT
關閉selinux:
臨時關閉:setenforce 0
永久關閉(修改配置文件):cat /etc/selinux/config|grep SELINUX=disabled
2:通過下面命令確認httpd端口80是否存在
[root@apache application]# netstat -lnput|grep 80 tcp 0 0 :::80 :::* LISTEN 58925/httpd
3:查看是否有httpd進程存在
[root@apache application]# ps -ef|grep http root 58925 1 0 10:32 ? 00:00:00 /application/apache2.2.31/bin/httpd -k start daemon 58926 58925 0 10:32 ? 00:00:00 /application/apache2.2.31/bin/httpd -k start daemon 58927 58925 0 10:32 ? 00:00:00 /application/apache2.2.31/bin/httpd -k start daemon 58928 58925 0 10:32 ? 00:00:00 /application/apache2.2.31/bin/httpd -k start daemon 58929 58925 0 10:32 ? 00:00:00 /application/apache2.2.31/bin/httpd -k start daemon 59016 58925 0 10:34 ? 00:00:00 /application/apache2.2.31/bin/httpd -k start
4:在服務器本地wget http://192.168.17.16 測試
注意:如果前面第2步和第3步都不符合要求,這步就不用查了,一定不行,直接下一步檢查
這里把服務器本地當作客戶端模擬用戶檢查http服務,此條的檢查比第2步第3步的檢查會更准確。同時可以排除防火牆的干擾來檢查http服務,如果正常訪問,說明apache服務沒問題,那么就是網絡或防火牆等問題了。
5:查看apache的錯誤日志看看是否有特殊異常
如果以上5條全都注意到了,基本問題就可以解決,如果是2,3步異常,則可以查看apache錯誤日志,獲取信息
[root@apache application]# tail -10 /application/apache/logs/error_log
APACHE的默認站點目錄,是安裝目錄下的/apache/htdocs,這可以從APACHE主配置文件/application/apache/conf/httpd.conf中可以查到:
[root@Web-Lamp application]# grep -i documentroot ./apache/conf/httpd.conf # DocumentRoot: The directory out of which you will serve your DocumentRoot "/application/apache2.2.31/htdocs" # This should be changed to whatever you set DocumentRoot to. # access content that does not live under the DocumentRoot.
此時,如果要部署網站服務,只需要把開發好的程序放置到/application/apache2.2.32/htdocs目錄下即可!至此Apache的安裝已完成!
APACHE的目錄結構
[root@Web-Lamp apache]# tree bin bin ├── ab #APACHE HTTP服務器性能測試工具,簡單,易用。同類軟件還有jmeter,loadrunner,webbench等 ├── apachectl #這是APACHE的啟動命令,需重點掌握,apachectl是一個腳本 ├── apxs #apxs是一個為apache http服務器編譯和安裝擴展模塊的工具,在進行DSO方式模塊編譯時會用到 #后文在編譯php軟件時就用到此命令,如:--with-apxs2=/application/apache/apxs ├── htcacheclean #這是清理磁盤緩沖區的命令,需要在編譯時指定相關參數才可使用,一般用的很少 ├── htpasswd #建立和更新基本認證文件,如:配置nagios等監控服務時會用到 ├── httpd #此為apache的控制命令程序,apachectl執行時會調用httpd └── rotatelogs #apache自帶的日志輪詢命令,也還可以用,但在實際生產環境中習慣由cronolog替換它 提示:以上目錄只列出了工作中比較常用的命令,其它末使用過的略過! [root@Web-Lamp apache]# tree conf conf ├── extra #這是額外的apache配置文件目錄,這個目錄里的文件會經常訪問修改:如httpd-vhosts.conf ├── httpd.conf #apache的主配置文件,這個文件我們會經常訪問修改,其中的每一行參數都應該弄清楚
APACHE擴展的配置文件
apache的擴展配置文件是通過在httpd.conf主配置文件中嵌入include命令實現的,不過默認情況下是注釋狀態。如下所示:
395 # Virtual hosts 396 #Include conf/extra/httpd-vhosts.conf
通過tree命令列出apache擴展的配置文件的在目錄的配置文件
[root@Web-Lamp apache]# tree conf/extra conf/extra ├── httpd-autoindex.conf ├── httpd-dav.conf ├── httpd-default.conf #這個文件里配置的是apache的相關服務參數,如:超時時間,保持連接時間等 ├── httpd-info.conf ├── httpd-languages.conf #語言支持配置 ├── httpd-manual.conf ├── httpd-mpm.conf #服務器池管理,也就是優化apache的一個配置文件,如:選擇apache的模式連接數等,常用的模式有worker模式和profork模式,默認情況下是profork模式! ├── httpd-multilang-errordoc.conf ├── httpd-ssl.conf #提供apache SSL支持配置文件 ├── httpd-userdir.conf └── httpd-vhosts.conf #虛擬主機配置文件
APACHE虛擬主機的配置文件
[root@Web-Lamp apache]# grep -Ev "^#|^$" conf/extra/httpd-vhosts.conf NameVirtualHost *:80 #這里表示使用基於名稱的虛擬主機配置,這是生產環境下最常用的配置。*:80中的*表示監聽本機所有IP地址,80表示在80端口上提供http服務。如果*改為具體IP,就表示監聽本機指定IP地址的服務請求 <VirtualHost *:80> #定義一個虛擬主機,監聽本機所有IP地址80端口上提供的http服務請求 ServerAdmin webmaster@dummy-host.example.com DocumentRoot "/application/apache2.2.31/docs/dummy-host.example.com" ServerName dummy-host.example.com ServerAlias www.dummy-host.example.com #這是配置虛擬機的別名,也就是可以配置多個域名訪問同一個站點,如:此處配置成baidu.com,則輸入baidu.com可以得到和www.baidu.com同樣的結果,此功能需要apache mode_alias模塊支持 ErrorLog "logs/dummy-host.example.com-error_log" CustomLog "logs/dummy-host.example.com-access_log" common </VirtualHost> <VirtualHost *:80> ServerAdmin webmaster@dummy-host2.example.com DocumentRoot "/application/apache2.2.31/docs/dummy-host2.example.com" ServerName dummy-host2.example.com ErrorLog "logs/dummy-host2.example.com-error_log" CustomLog "logs/dummy-host2.example.com-access_log" common </VirtualHost>
基於域名的虛擬主機實戰配置
開啟主配置文件httpd.cond中包含httpd-vhost.conf文件的配置:
[root@Web-Lamp apache]# vim /application/apache/conf/httpd.conf 395 # Virtual hosts 396 Include conf/extra/httpd-vhosts.conf #將此行前面的#號去掉
配置httpd-vhosts.conf文件:
[root@Web-Lamp extra]# cp httpd-vhosts.conf httpd-vhosts.conf.poe.20161010
備份后把httpd-vhosts.conf文件中的<VirtualHost *.80></VirtualHost>刪除,只保留一個,然后在這一個的基礎上修改
[root@Web-Lamp extra]# vi httpd-vhosts.conf ##修改完后的配置文件如下 <VirtualHost *:80> ServerAdmin 33794712@qq.com DocumentRoot "/application/apache/htdocs/blog" ServerName blog.ginvip.com ErrorLog "logs/blog-error_log" CustomLog "logs/blog-access_log" common </VirtualHost>
在主配置文件httpd.conf中添加如下內容:
############## blog.ginvip.com config by Gin ################## <Directory "/application/apache/htdocs/blog"> Options -Indexes FollowSymLinks AllowOverride None Order allow,deny Allow from all </Directory>
添加域名IP到/etc/hosts文件中
192.168.17.21 blog.ginvip.com
在/application/apache/htdocs/blog目錄中添加測試文件(blog目錄如果沒有,新建):
[root@Lamp apache]# echo "this is apache test" >/application/apache/htdocs/blog/index.html
檢查修改過的apache配置文件的語法:
生產環境中這一步,特別重要,它讓你在重起前可以查出配置文件中的錯誤,如果沒有此步,很可能會因為配置錯誤,而導致網站短時宕機,這在正規互聯網公司是無法接受的,即使公司可以接受,我們也要表現的更專業。
[root@Lamp apache]# /application/apache/bin/apachectl -t Syntax OK
httpd:Coun dot......這一行的提示解決方案:
[root@Web-Lamp conf]# vim httpd.conf 96 # If your host doesn't have a registered DNS name, enter its IP address here. 97 #如果你沒有注冊的DNS域名,這里可以輸入IP地址 98 #ServerName www.example.com:80 99 100 ServerName 192.168.17.21
再次檢查語法:
[root@Web-Lamp conf]# /application/apache/bin/apachectl -t Syntax OK
語法檢查通過后,執行graceful參數重起apache服務:
[root@Web-Lamp apache]# bin/apachectl graceful
注意:這里是graceful參數,而不是restart參數,graceful表示優雅地重啟,這個參數可以在重啟時使正在瀏覽器的訪問的用戶無感知,即重啟時不會強行中斷用戶的訪問請求,而是處理完畢后再重新啟動。這個graceful參數在生產環境中是非常重要,請在重啟時務必使用graceful替代restart參數
win主機上測試:
Linux主機測試:
[root@Lamp apache]# curl -I blog.ginvip.com HTTP/1.1 200 OK ##狀態碼為200說明OK Date: Sun, 19 Feb 2017 11:05:05 GMT Server: Apache/2.2.31 (Unix) DAV/2 Last-Modified: Sun, 19 Feb 2017 11:02:51 GMT ETag: "3f9df-14-548e0168e5df0" Accept-Ranges: bytes Content-Length: 20 Content-Type: text/html
apache服務Forbidden403問題
通常情況下(但不限於此)的原因有:
1)apache配置文件中沒有對站點目錄的權限許可配置,這通常是在初始安裝apache后,更改了默認的apache站點目錄所致!如編譯安裝apache(假定安裝目錄為/application/apache2.2.32)后,將站點目錄更改為其他路徑:/var/html,則在apache配置文件中的配置也要相應的改變此目錄路徑
2)站點目錄下無首頁(index)文件,而apache的配置又禁止了目錄瀏覽器,就會提示403錯誤
3)Directory權限問題
4)站點目錄原因,站點目錄需要apache的用戶訪問權限
APACHE日志輪詢
Apache自帶的rotatorog輪詢功能,有可能會丟失日志,所以生產場景不用!而使用cronolog
微雲下載:https://share.weiyun.com/ab4674560b19babd028640e5c9676bcf
百度下載:http://pan.baidu.com/s/1dE2SltZ
tar zxvf cronolog-1.6.2.tar.gz cd cronolog-1.6.2 ./configure make make install ll /usr/local/sbin/cronolog /usr/local/sbin/cronolog
cronolog日志按天輪詢輪詢配置說明:(生產環境常見用法,推薦使用):
<VirtualHost *:80> ServerAdmin 33794712@qq.com DocumentRoot "/application/apache/htdocs/blog" ServerName blog.ginvip.com ErrorLog "logs/blog-error_log" #CustomLog "logs/blog-access_log" common CustomLog "|/usr/local/sbin/cronolog /application/apache/logs/access_www_%Y%m%d.log" combined </VirtualHost>
按其它時間輪詢:
access_www_%Y%m%d.log ===》按天輪詢
access_www_%Y%m%d%H.log ===》按小時輪詢
access_www_%w.log ===》按周輪詢
注意:日志路徑不能使用相對路徑,一定要使用絕對路徑
Apache日志不記錄指定格式元素日志
當計算日志PV時一般不希望統計圖片元素的日志,因為,打開一個頁面才是一個PV,而RS服務器也不希望記錄來自前端負載均衡健康檢查的無用日志。整個配置需要mod_setenvif模塊的支持!看下面的案例:
案例1:Apache不記錄圖片的日志
統計日志PV時一個頁面才算一個PV,而圖片,JS,CSS等只是圖片的元素,如果記錄在日志里,然后按日志行計算PV就不准確了,所以可考慮不記錄圖片等的日志
編輯httpd.conf文件,在文件中加入以下幾行:
<FilesMath "\.(css|js|gif|png|ico|jpeg|swf)"> SetEnv IMAG 1 </FilesMath>
編輯httpd-vhosts.conf文件,修改cronolog日志一行為:
CustomLog “|/usr/local/sbin/cronolog /app/logs/%Y/%m/%m/access_%Y%m%d.log” combined env=!IMAG
案例2:RS服務器不記錄負載均衡健康檢查日志
虛擬主機不記錄負載均衡向下健康檢查文件的日志(check.txt):
SetEnvIf Request_URI “^/check\.txt$” dontlog CustomLog /var/log/httpd/vhost_access.log combined env=!dontlog
案例3:日志IP統計
#法一: [root@apache apache]# awk '{++S[$1]} END {for (key in S) print S[key],key}' logs/access_madsale_20170215.log |sort -rn -k1 20 192.168.17.1 1 192.168.17.16 #法二: [root@apache apache]# awk '{print $1}' logs/access_madsale_20170215.log|sort|uniq -c 20 192.168.17.1 1 192.168.17.16
worker/prefork模式說明及優化配置
查看已安裝的是worker還是prefork模式:
[root@Lamp apache]# /application/apache/bin/apachectl -l|grep -E "worker|prefork" worker.c
prefork模式:
prefork使用的是多個子進程,而每個子進程只有一個線程,每個進程在某個確定的時間只能維持一個連接
工作原理:
控制進程最初建立若干個子進程,為了不在請求到來時再生成子進程,所以要根據需求不斷的創建新的子進程,最大可以達到每秒32個直到滿足需求為止。
安裝方法:
在編譯的過程中,加入--with-mpm=prefork,如果不加也可以,因為默認就是采用prefork模式
優點:效率高,穩定,安全。對於線程調試困難的平台來說,調試更加容易些
缺點:和worker模式比消耗資源多
配置參數說明:
<IfModule mpm_prefork_module> StartServers 5 #-->最初建立的子進程 MinStartServers 5 #-->最小空閑進程數,如果空閑的進程小於設定值,APACHE會自動建立進程,如果服務器並發及負載大的話,可以考慮加大 MaxSpareServer 10 #-->最大空閑進程數,如果空閑的進程大於設定值,APACHE會自動kill掉多余的進程,如果服務器負載大的話,可以考慮加大 MaxClients 150 #-->設定的是APACHE可以同時處理的請求,是對APACHE性能影響最大的參數,就是APACHE可以同時處理的請求數,就是說,如果有150個用戶在訪問,那第第151個用戶就要等之前的訪問結束后才能訪問 MaxRequestPerChild 0 #-->每個子進程可處理的請求數。每個子進程在處理了“maxrequestsperchild”個請求后將自動銷毀。0意味着無限,即子進程永不銷毀。雖然缺省設為0可以使每個子進程處理更多的請求。但如果設成非0值也有兩點重要的好處:(1)可防止意外的內存泄漏 (2)在服務器負載下降的時候會自動減少子進程數。 </IfModule>
常用配置參考:
<IfModule mpm_prefork_module> StartServer 10 MinSpareServers 10 MaxSpareServers 15 ServerLimit 2000 MaxClients 1000 MaxRequestPerChild 5000 </IfModule>
worker模式
worker模式是Apache2.x新引進的模式,是線程與進程的結合,在workder模式下會有多個子進程,每個子進程又會有多個線程。每個線程在某相確定的時間只能維持一個連接
工作原理:
由主控制進程生成若干個子進程,而每個子進程中又包含固定的線程數,各個線程獨立處理請求,同樣為了不在請求到來時再生成線程,在配置文件中設置了最小和最大的空閑線程數及所有子進程中的線程總數,如果現有子進程中的線程總數不能滿足並發及負載,控制進程將派生新的子進程。
安裝方法:
在配置編譯的過程中,加入參數--with-mpm=worker,如果不加的話系統會采用默認的worker模式
優點:內存占用比prefork模式低,適合高並發流量HTTP服務
缺點:假如一個線程崩潰,整個進程就會連同其任何線程一起“死掉”,由於線程共享內存空間,所以一個程式在運行時必須被系統識別為“每個線程都是安全的”。服務穩定性不如prefork模式
配置說明:
<IfModule mpm_worker_module> StartServers 2 #服務器啟動時建立的子進程數,默認值是"3"。 MaxClients 150 #允許同時伺服的最大接入請求數量(最大線程數量)。任何超過MaxClients限制的請求都將進入等候隊列。默認值是"400",16(ServerLimit)乘以25(ThreadsPerChild)的結果。因此要增加MaxClients的時候,你必須同時增加ServerLimit的值。 MinSpareThreads 25 #最小空閑線程數,默認值是"75"。這個MPM將基於整個服務器監視空閑線程數。如果服務器中總的空閑線程數太少,子進程將產生新的空閑線程。 MaxSpareThreads 75 #設置最大空閑線程數。默認值是"250"。這個MPM將基於整個服務器監視空閑線程數。如果服務器中總的空閑線程數太多,子進程將殺死多余的空閑線程。MaxSpareThreads的取值范圍是有限制的。Apache將按照如下限制自動修正你設置的值:worker要求其大於等於MinSpareThreads加上ThreadsPerChild的和。 ThreadsPerChild 25 #每個子進程建立的常駐的執行線程數。默認值是25。子進程在啟動時建立這些線程后就不再建立新的線程了。 MaxRequestsPerChild 0 #設置每個子進程在其生存期內允許伺服的最大請求數量。到達MaxRequestsPerChild的限制后,子進程將會結束。如果MaxRequestsPerChild為"0",子進程將永遠不會結束。將MaxRequestsPerChild設置成非零值有兩個好處:1.可以防止(偶然的)內存泄漏無限進行,從而耗盡內存。2.給進程一個有限壽命,從而有助於當服務器負載減輕的時候減少活動進程的數量。 注意對於KeepAlive鏈接,只有第一個請求會被計數。事實上,它改變了每個子進程限制最大鏈接數量的行為。 </IfModule>
常用配置參考:
生產場景配置1:
<IfModule mpm_worker_module> StartServers 3 MaxClients 2000 ServerLimit 25 MinSpareThreads 50 MaxSpareThreads 200 ThreadLimit 200 ThreadsPerChild 100 MaxRequestsPerChild 0 </IfModule>
生產場景配置2:
<IfModule mpm_worker_module> StartServers 5 MaxClients 9600 ServerLimit 64 MinSpareThreads 25 MaxSpareThreads 500 ThreadLimit 200 ThreadsPerChild 150 MaxRequestsPerChild 0 </IfModule>
生產場景配置3:
<IfModule mpm_worker_module> StartServers 2 MaxClients 500 ServerLimit 25 MinSpareThreads 25 MaxSpareThreads 75 ThreadsPerChild 25 MaxRequestsPerChild 0 </IfModule>
生產場景配置4:
<IfModule mpm_worker_module> StartServers 3 MaxClients 1600 ServerLimit 25 MinSpareThreads 50 MaxSpareThreads 200 ThreadLimit 200 ThreadsPerChild 64 </IfModule>
worker模式下所能同時處理的請求總數是由子進程總數乘以Threadsperchild值決定的,應該大於等於maxclients。如果負載很大,現有的子進程數不能滿足時,控制進程會派生新的子進程。
默認最大的子進程總數是16,如需加大時也需要顯式聲明serverlimit的值(最大值是20000)
特別說明:
如果顯式聲明了serverlimit,那么乘以ThreadsPerChild的值必須大於等於MaxClients,而且MaxClients必須是threadperchild的整數倍,否則APACHE將會自動調節到一個相應值(可能是個非期望值)
數學表達:
MaxClient <= 總的進程數(ServerLimit)*線程數(ThreadsPerChild)
MaxClient%ThreadsPerChild=0
注意:
worker MPM也有不完善的地方,如果一個線程崩潰,整個進程就會連同其所有線程一起“死掉”
配置方法:
vim /application/apache/conf/httpd.conf 377 # Server-pool management (MPM specific) 378 Include conf/extra/httpd-mpm.conf #默認是注釋的 vim conf/extra/httpd-mpm.conf #在下面調整參數 51 <IfModule mpm_worker_module> 52 StartServers 2 53 MaxClients 150 54 MinSpareThreads 25 55 MaxSpareThreads 75 56 ThreadsPerChild 25 57 MaxRequestsPerChild 0 58 </IfModule>
基於IP的虛擬機主機實戰配置
1:增加IP
如果要配置基於IP的虛擬主機,就需要每個虛擬主機有不同的IP,此處我們以增加別名的方式來臨時增加一個IP(在負載均衡里此IP也被稱為VIP):
[root@Web-Lamp poe]# ifconfig eth0:181 192.168.17.181 netmask 255.255.255.0 up [root@Web-Lamp poe]# ifconfig eth0:181 eth0:181 Link encap:Ethernet HWaddr 00:0C:29:C4:DA:53 inet addr:192.168.17.181 Bcast:192.168.17.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 Interrupt:19 Base address:0x2000
如果需要刪除該IP重新配置的話,使用命令:ifconfig eth0:181 donw即可刪除重新配置;配置完成后,本虛擬機上就有兩個IP:
[root@Web-Lamp poe]# ifconfig -a eth0 Link encap:Ethernet HWaddr 00:0C:29:C4:DA:53 inet addr:192.168.17.12 Bcast:192.168.17.255 Mask:255.255.255.0 inet6 addr: fe80::20c:29ff:fec4:da53/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:2465 errors:0 dropped:0 overruns:0 frame:0 TX packets:1581 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:279948 (273.3 KiB) TX bytes:263645 (257.4 KiB) Interrupt:19 Base address:0x2000 eth0:181 Link encap:Ethernet HWaddr 00:0C:29:C4:DA:53 inet addr:192.168.17.181 Bcast:192.168.17.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 Interrupt:19 Base address:0x2000
2:配置虛擬主機
[root@Web-Lamp extra]# cp httpd-vhosts.conf httpd-vhosts.conf.poe.20161011 #備份該文件 [root@Web-Lamp extra]# grep -Ev "#" httpd-vhosts.conf NameVirtualHost *:80 <VirtualHost 192.168.17.20:80> ServerAdmin 33794712@qq.com DocumentRoot "/application/apache/htdoc/blog" ServerName 192.168.17.12 #ServerAlias adminba.com ErrorLog "logs/blog-error_log" CustomLog "|/usr/local/sbin/cronolog /application/apache/logs/access_blog_%Y%m%d.log" combined </VirtualHost>
基於端口的虛擬主機實戰配置
基於端口的虛擬主機在生產環境中的應用也不多見,僅偶爾會用到,一般是為公司內部人員提供訪問的,如頁面的后台,CMS發布,PHPMYADMIN等。下面我們來講其相關配置部署。
1:增加監聽的端口
[root@Web-Lamp conf]# vim httpd.conf [root@Web-Lamp conf]# grep "Listen" httpd.conf Listen 80 Listen 8091 Listen 8092
提示:保留80端口,新增加8091與8092兩個端口
2:配置httpd-vhosts.conf
[root@Web-Lamp conf]# grep -Ev "#" extra/httpd-vhosts.conf <VirtualHost 192.168.17.12:8091> ServerAdmin 33794712@qq.com DocumentRoot "/var/html/blog" ServerName 192.168.17.12 ServerAlias adminba.com ErrorLog "logs/blog-error_log" CustomLog "|/usr/local/sbin/cronolog /app/logs/access_www_%Y%m%d.log" combined </VirtualHost>
mod_deflate壓縮模塊應用指南
模塊提供了DEFLATE 輸出過濾器,允許服務器在將輸出內容發送到客戶端以前進行壓縮,以節約帶寬,同時提升用戶體驗。
A:編譯安裝httpd情況時是否已安裝mod_flate
[root@Lamp apache]# /application/apache/bin/apachectl -l|grep mod_deflate mod_deflate.c
B:如果是以DSO方式編譯,則查看方法為:
特別說明:以上兩種情況下不能同時存在,否則可能會沖突!如果已經編譯安裝完了,就不需要再用DSO的方法編譯安裝了!
C:mod_deflate DSO安裝方法
[root@Web-Lamp poe]# cd /server/tools/httpd-2.2.31/modules/filters [root@Web-Lamp filters]# ll mod_deflate.c -rw-r--r-- 1 1000 1000 63745 May 11 2015 mod_deflate.c [root@Web-Lamp filters]# /application/apache/bin/apxs -c -i -a mod_deflate.c [root@Web-Lamp filters]# grep defla /application/apache/conf/httpd.conf LoadModule deflate_module modules/mod_deflate.so
apxs參數說明:
-c 此選項表示需要執行編譯操作。它首先會編譯C源程序(.c)files為對應的目標代碼文件(.o),然后連接這些目標代碼和files中其余的目標代碼文件(.o and .a),以生成動態共享對象dsofile。如果沒有指定-o選項,則此輸出文件名由files中的第一個文件名推測得到,也就是默認為mod_name.so
-i 此選項表示需要執行安裝操作,以安裝一個或多個動態共享對象到服務器的modules目錄中
-a 此選項自動增加一個LoadModuls行到httpd.conf文件中,以激活此模塊,或者,如果此行已經存在,則啟用之
DSO安裝完后,檢查語法,重啟APACHE即可!
deflate在httpd.conf中應用:
整個配置十分簡單,只需要把下面內容完整的復制到httpd.conf結尾保存即可使所有的虛擬主機生效。
環境1:可以在主配置中配置,也可以在虛擬主機中配置
<ifmodule mod_deflate.c> DeflateCompressionLevel 9 #壓縮等級,越大效率越高,耗C也高 SetOutPutFilter DEFLATE #啟用壓縮 AddOutPutFilterEvType DEFLATE test/html text/plain text/xml #以下3行設置壓縮的類型 AddOutPutFilterEvType DEFLATE application/javascript AddOutPutFilterEvType DEFLATE test/css #DeflateFilterNote ratio #在日志中放置壓縮率標記,下面是記錄日志的,這個功能一般不用。 #LogFormat #CustomLog logs/deflate_log.log deflate </ifmodule>
環境2:
<ifmodule mod_deflate.c> DeflateCompressionLevel 9 SetOutPutFilter DEFLATE DeflateFilterNote Input instream DeflateFilterNote Output outstream DeflateFilterNote Ratio ratio AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css application/javascript </ifmodule>
環境3:某公司曾經的生產配置
<ifmodule mod_deflate.c> DeflateCompressionLevel 9 SetOutPutFilter DEFLATE DeflateFilterNote Input instream DeflateFilterNote Ouput outstream DeflateFilterNote Ration ration </ifmodule>
apache優化實戰
錯誤頁面優雅顯示
可以將404等的錯誤信息頁面重定向到網站首頁或其它頁面,提升用戶體驗
[root@Web-Lamp apache]# vim /application/apache/conf/httpd.conf 347 # Some examples: 348 #ErrorDocument 500 "The server made a boo boo." 349 #ErrorDocument 404 /missing.html 350 #ErrorDocument 404 "/cgi-bin/missing_handler.pl" 351 #ErrorDocument 402 http://www.example.com/subscription_info.html 352 # 353 ErrorDocument 404 http://www.baidu.com #增加404頁面
mod_deflate文件壓縮功能
Gzip的思想就是把文件先在服務器端進行壓縮,然后再傳輸,這樣可以顯著減少文件傳輸的大小。傳輸完畢后瀏覽器會重新對壓縮過的內容進行解壓縮,沒特殊情況,所有的文本內容都應該被gzip壓縮:html(php),js,css,xml,txt...,因為首頁上還有很多廣告代碼投放的JS,這些廣告代碼擁有都的網站的JS沒有經過gzip壓縮,是由於需要每次加載進而統計來訪信息。
添加以下內容到指定的虛擬主機中(也可加入到主配置文件中,這樣就對全局生效):
<ifmodule mod_deflate.c> DeflateCompressionLevel 9 SetOutputFilter DEFLATE DeflateFilterNote Input instream DeflateFilterNote Output outstream DeflateFilterNote Ratio ratio #LogFormat ‘”%r” %{outstream}n/%{instream}n (%{ratio}n%%)’ deflate #CunstomLog logs/deflate_log.log deflate </ifmodule>
如:
36 <VirtualHost 192.168.17.181:8092> 37 ServerAdmin 33794712@qq.com 38 DocumentRoot "/var/html/bbs" 39 ServerName 192.168.17.181 40 ServerAlias adminba.com 41 ErrorLog "logs/bbs-error_log" 42 CustomLog "|/usr/local/sbin/cronolog /app/logs/access_bbs_%Y%m%d.log" combined 43 <ifmodule mod_deflate.c> 44 DeflateCompressionLevel 9 45 SetOutputFilter DEFLATE 46 DeflateFilterNote Input instream 47 DeflateFilterNote Output outstream 48 DeflateFilterNote Ratio ratio 49 #LogFormat ‘”%r” %{outstream}n/%{instream}n (%{ratio}n%%)’ deflate 50 #CunstomLog logs/deflate_log.log deflate 51 </ifmodule> 52 </VirtualHost>
僅壓縮限制特定的MIME類型文件:
AddOutputFilterByType DEFLATE text/html text/plain text/xml 或 AddOutputFilterByType DEFLATE text/html text/plain text/xml test/css application/javascript
壓縮測試工具:火狐瀏覽器插件 --> Yslow
mod_expires緩存功能
添加Expire/Cache-Control 頭:Add Expires Header
現在越來越多的圖片,腳本,CSS,FLASH被嵌入到頁面中,當我們訪問他們的時候勢必會做許多次的http請求,其實我們可以通過設置expires header來緩存這些文件。Expires其實就是通過header報文來指定特定類型的文件在瀏覽器中緩存時間。大多數的圖片,flash在發布后都是不需要經常修改的,做了緩存以后這樣瀏覽器以后就不需要再從服務器下載這些文件而是直接從緩存中讀取,這樣再次訪問頁面的速度會大大加快。一個典型的HTTP1.1協議返回的頭信息:
[root@Web-Lamp blog]# curl -I http://192.168.17.12:8091/ HTTP/1.1 200 OK Date: Sun, 04 Dec 2016 12:25:15 GMT Server: Apache/2.2.31 (Unix) DAV/2 Last-Modified: Sun, 04 Dec 2016 12:12:57 GMT ETag: "424ee-e2-542d4176e35e6" Accept-Ranges: bytes Content-Length: 226 Vary: Accept-Encoding Content-Type: text/html
配置方法
1)針對虛擬主機或者主配置文件
ExpiresActive on ExpiresDefault "access plus 12 month" ExpiresByType text/html "access plus 12 months" ExpiresByType text/css "access plus 12 months" ExpiresByType image/gif "access plus 12 months" ExpiresByType image/jpeg "access plus 12 months" ExpiresByType image/jpg "access plus 12 months" ExpiresByType image/png "access plus 12 months" EXpiresByType application/x-shockwave-flash "access plus 12 months" EXpiresByType application/x-javascript "access plus 12 months" ExpiresByType video/x-flv "access plus 12 months"
將上面的代碼加入到httpd-vhosts.conf配置文件中,如下:
<VirtualHost 192.168.17.12:8091> ServerAdmin 33794712@qq.com DocumentRoot "/var/html/blog" ServerName 192.168.17.12 ServerAlias adminba.com ErrorLog "logs/blog-error_log" #CustomLog "logs/blog-access_log" common CustomLog "|/usr/local/sbin/cronolog /app/logs/access_www_%Y%m%d.log" combined <ifmodule mod_deflate.c> DeflateCompressionLevel 9 SetOutputFilter DEFLATE DeflateFilterNote Input instream DeflateFilterNote Output outstream DeflateFilterNote Ratio ratio #LogFormat ‘”%r” %{outstream}n/%{instream}n (%{ratio}n%%)’ deflate #CunstomLog logs/deflate_log.log deflate </ifmodule> ExpiresActive on ExpiresDefault "access plus 12 month" ExpiresByType text/html "access plus 12 months" ExpiresByType text/css "access plus 12 months" ExpiresByType image/gif "access plus 12 months" ExpiresByType image/jpeg "access plus 12 months" ExpiresByType image/jpg "access plus 12 months" ExpiresByType image/png "access plus 12 months" EXpiresByType application/x-shockwave-flash "access plus 12 months" EXpiresByType application/x-javascript "access plus 12 months" ExpiresByType video/x-flv "access plus 12 months" </VirtualHost>
測試:
[root@Web-Lamp blog]# /application/apache/bin/apachectl -t Syntax OK [root@Web-Lamp blog]# /application/apache/bin/apachectl graceful [root@Web-Lamp blog]# netstat -lnt|grep 80 [root@Web-Lamp blog]# curl -I http://192.168.17.12:8091/images/09.jpg HTTP/1.1 200 OK Date: Sun, 04 Dec 2016 13:03:46 GMT Server: Apache/2.2.31 (Unix) DAV/2 Last-Modified: Mon, 06 Jun 2016 03:44:43 GMT ETag: "424e8-1d238-53493e48f80c0" Accept-Ranges: bytes Content-Length: 119352 Cache-Control: max-age=31104000 Expires: Wed, 29 Nov 2017 13:03:46 GMT #如果配置無誤,此行就是緩存時間, Vary: Accept-Encoding Content-Type: image/jpeg
2)針對目錄的特殊用法
<Directory ~ “/application/.*/(all|tuijian)”> ExpiresActive on ExpiresDefault "access plus 5 minutes" ExpiresByType text/html "access plus 1 day" ExpiresByType text/css "access plus 1 day" ExpiresByType image/gif "access plus 1 day" ExpiresByType image/jpeg "access plus 1 day" ExpiresByType image/png "access plus 1 day" ExpiresByType audio/mpeg "access plus 1 day" ExpiresByType audio/x-ms-wma "access plus 1 year" ExpiresByType video/mpeg "access plus 1 year" ExpiresByType video/x-msvideo "access plus 1 month" EXpiresByType application/x-shockwave-flash "access plus 12 months" EXpiresByType application/x-javascript "access plus 1 day" ExpiresByType application/javascript "access plus 1 day" </Directory>
提示:本節僅僅是演示,因此后面的過期按1天讀者可以根據需求自己修改。
生產環境mod_expires優點:
1)提升用戶體驗
2)節約網站帶寬成本
3)節約網站服務器及維護成本
控制expires方法:
如果網站更新功能或更新文件后,用戶再訪問時的內容還是舊的,怎么解決這個問題?
解答:
1)首先,對於大多公司業務來說,圖片等資源一般很少會去修改。因此taobao,京東等公司可以肆無忌憚的把expires設置為10年,一年節省費用可達上億人民幣
2)對於js , css偶爾會變化的資源,一般expires設置時間會比較短,如1-30天
3)在更新文件上采取策略,如:更新后以新的文件名發布,這樣對於用戶又是新的資源
更改APACHE的默認用戶
創建apache用戶,用於子進程和線程
[root@Web-Lamp ~]# useradd -M -s /sbin/nologin apache
編輯apache配置文件:
[root@Web-Lamp ~]# vim /application/apache/conf/httpd.conf 62 # If you wish httpd to run as a different user or group, you must run 63 # httpd as root initially and it will switch. 64 # 65 User apache 66 Group apache
#添加用戶與用戶組
提示:建議不要使用apache用戶,最好使用不容易被人猜出來的用戶
屏蔽apache版本等敏感信息
編譯程序之前可修改:
[root@apache apache]# cat /home/poe/tools/httpd-2.2.31/include/ap_release.h #define AP_SERVER_BASEVENDOR "Apache Software Foundation" #define AP_SERVER_BASEPROJECT "Apache HTTP Server" #define AP_SERVER_BASEPRODUCT "Apache" #define AP_SERVER_MAJORVERSION_NUMBER 2 #define AP_SERVER_MINORVERSION_NUMBER 2 #define AP_SERVER_PATCHLEVEL_NUMBER 31 #define AP_SERVER_DEVBUILD_BOOLEAN 0
[root@apache apache]# cat /home/poe/tools/httpd-2.2.31/os/unix/os.h 35 #define PLATFORM "Unix" ##修改此行
編譯安裝完之后的修改:
1)修改httpd.conf文件,打開httpd-default.conf模塊
55 ServerTokens Full #值修改為Prod 65 ServerSignature On #值修改為Off
2)apachectl graceful 使配置生效
apache防盜鏈功能
<IfModule rewrite_module> RewriteEngince On RewriteCond % {HTTP_REFERER} !^http://adminba.com/.*$ [NC] RewriteCond % {HTTP_REFERER} !^http://adminba.com$ [NC] RewriteCond % {HTTP_REFERER} !^http://www.adminba.com/.*$ [NC] RewriteCond % {HTTP_REFERER} !^http://www.adminba.com$ [NC] RewriteRule .*\.(gif|jpg|swf)$ http://www.51cto.com [R,NC] #RewriteRule .*\.(gif|jpg|swf)$ http://www.adminba.com/about/nolink.png [R,NC] <IfModule>
關閉CGI
ScriptAlias /cgi-bin/ “/application/apache2.3.2/cgi-bin/” <Directory “/application/apache2.3.2/cgi-bin”> AllowOverride None Options None Order allow,deny Allow from all </Directory> ##注釋以上內容
避免使用.htaccess文件(分布式配置文件)
首先是性能考慮。如果AllowOverride啟用了.htaccess文件,則APACHE需要在每個目錄中查找.htaccess文件,因此,無論是否真正用到,啟用.htaccess都會導致性能的下降。另外,對每一個請求,都需要讀取一次.htaccess文件。
其次是安全考慮。這樣會允許用戶自己修改服務器的配置,這可能會導致某些意想不到的修改,所以請認真考慮是否應當給予用戶這樣的特權。
默認在Unix平台下能夠使用.htaccess來對目錄進行規則定義,但是這是不安裝的,建議關閉,默認的選項:
AccessFileName .htaccess
建議改為:
#AccessFileName .htaccess
全部目錄權限定義使用httpd.conf中的定義,不使用 .htaccess
APACHE日志授予root 700權限
chown -R root.root logs
chmod -R 700 logs
不需要在日志目錄上給apache用戶讀或者寫許可