天天看點

Linux網站架構系列之Apache----進階篇

本篇博文為Linux網站架構系列之apache的第二篇,我将帶大家一起學習apache的編譯參數,目錄結構和配置檔案等方面的知識,實作對apache服務的進一步掌握,并使之能更好的應用到生産實戰中去。

一、編譯參數

在上篇的apache部署中,我們用了大量的編譯參數,其實apache的編譯參數并不止這些,這些隻是我們生産環境中常用的。我們在apache的源碼包目錄下,用以下指令可以将他們都輸出出來

[[email protected] httpd-2.4.6]# ./configure --help      

此指令的輸出這裡就不貼出來了,一大堆呢,估計你也不看,有些參數一百年也用不到一次。如果想了解這些參數,你可以百度一下。

這裡我将詳細為大家說明一下我們常用的編譯參數的作用

--prefix=/usr/local/apache-2.4.6 \    #表示指定apache安裝路徑為/application/apache2.2.25。如果不指定安裝路徑,則預設路徑為/usr/local/apache2
--with-apr=/usr/local/apr \           #指定apr安裝路徑,不然會報錯
--with-apr-util=/usr/local/apr-util \ #指定apr-util安裝路徑,不然會報錯
--with-pcre \                         #支援perl的正規表達式,不然會報錯
--enable-so \                         #激活apache服務的DSO(全稱Dynamic Shared Object,動态共享對象)支援,即在以後可以以DSO的方式編譯安裝共享子產品,這個子產品本身不能以DSO方式編譯。
--enable-ssl \                        #基于ssl加密傳輸
--enable-cgi \                        #開啟CGI腳本
--enable-rewrite \                    # 提供基于URL規則的重寫功能。即根據已知URL位址,轉換其它想要的URL位址。如前文講解的僞靜态功能就是這個子產品實作的。這是apache生産環境中必用的一個重要功能。
--with-zlib \                         #支援壓縮
--enable-deflate \                    # 提供對内容的壓縮傳輸編碼支援,一般html,js,css等内容的站點,使用此參數功能會大大提高傳輸速度,提升通路者通路體驗。在生産環境中,這是apache調優的一個重要選項之一。
--enable-expires \                    # 激活允許通過配置檔案控制HTTP的“Expires:”和“Cache-Control:”頭内容,即對網站圖檔、js、css等内容,提供在用戶端遊覽器緩存的設定。這是apache調優的一個重要選項之一。
--enable-headers \                    #提供允許對HTTP請求頭的控制
--enable-modules=most \               #支援大多數子產品
--enable-mpms-shared=all \            #mpm子產品的動态切換
--with-mpm=worker                     #選擇apache mpm的模式為worker模式。因worker模式原理是更多的使用線程來處理請求,是以可以處理更多的并發請求,而系統資源的開銷小于基于程序的MPM prefork。如果不指定此參數,預設的模式是prefork程序模式。這兩者的關系,在調優篇裡面我會詳細為大家講解。      

二、apache目錄結構介紹

熟悉apache的目錄結構,對我們對apache知識點的了解和掌握尤為重要,下面我将帶大家一起來對apache的目錄結構進行了解。

[[email protected] /]# tree -L 3 /usr/local/apache/    #以下我對輸出做了精簡,僅保留常用的
./
├── bin         #存放apache指令的目錄,如apache啟動指令apachectl
  ├── ab        #apache http伺服器性能測試工具,簡單、易用。同類軟體還有jmeter、loadrunner、webbench等
  ├── apachectl  #apache的啟動程式,需重點掌握,apachectl是一個腳本
  ├── apxs       #apxs是一個為apache HTTP伺服器編譯和安裝擴充子產品的工具,在進行DSO方式子產品編譯時會用到。後面在編譯php軟體時就用到了這個指令,如:--with-apxs2=/application/apache/bin/apxs
  ├── htcacheclean #這是清理磁盤緩沖區的指令,需要在編譯時指定相關參數才可使用,一般用的很少。
  ├── htpasswd   #建立和更新基本認證檔案,如:配置nagios等監控服務時會用到。
  ├── httpd      #httpd為apache的控制指令程式,apachectl執行時會調用httpd
  └── rotatelogs #apache自帶的日志輪詢工具,也還可以用,但在老師工作場景中習慣由cronolog替代之
├── build
├── cgi-bin
├── conf   #這是apache的所有的配置檔案的目錄,極其重要
  ├── extra #這是額外的apache配置檔案目錄,這個目錄裡的檔案我們會經常通路修改
   ├── httpd-dav.conf   #dav支援配置
   ├── httpd-default.conf    #這個檔案裡配置的是apache的相關服務參數:逾時時間,保持連接配接時間等。
   ├── httpd-languages.conf  #語言支援配置
   ├── httpd-mpm.conf   #伺服器池管理,也就是優化apache的一個配置檔案,如:選擇apache的模式及配置連接配接數等,常用的模式有worker模式和profork模式,預設情況是profork模式。
   ├── httpd-ssl.conf   #這是apache SSL支援配置檔案
   └── httpd-vhosts.conf  #這是虛拟主機的配置檔案
  └── httpd.conf  #apache的主配置檔案,這個檔案我們會經常通路修改,其每一行的參數作用都應弄清楚明白
├── htdocs   #這是編譯安裝時apache的預設站點目錄,前面已說明。
  └── index.html #預設的首頁檔案,在實際環境中,大家習慣用index.html、index.php、index.jsp來做首頁檔案,首頁檔案名字是在httpd.conf中事先定義好的。具體參數:Directoryindex index.html
├── logs  #存放apache預設的日志路徑,包括錯誤日志及訪日志問
  ├── access_log  #這是apache的預設通路日志檔案。
  ├── error_log   #這是apache的錯誤日志檔案,如果apache出現啟動故障等問題,一定要看看這個錯誤日志。
 └── httpd.pid    #httpd的pid檔案,httpd程序啟動後,會把所有程序的ID号寫到此檔案。
└── modules  #apache的子產品目錄,比如php.memcache等子產品編譯後都在這裡。      

以上就是apache的目錄結構說明了,大家了解一下知道做什麼用就可以了。

三、apache主配置檔案詳解

下面我将為大家詳細介紹apache的主配置檔案,我們通過下面的指令将apache預設開啟的行篩選出來

[[email protected] /]# egrep -v "^$|#" /usr/local/apache/conf/httpd.conf|cat -n
     1  ServerRoot "/usr/local/apache-2.4.6"   #apache的根目錄,應隻能root通路,一般不需要更改此配置
     2  Listen 80  #apache監聽的端口,預設為80端口,如果同時監聽81可以增加一行,如 Listen 81
     3  LoadModule authn_file_module modules/mod_authn_file.so
     4  LoadModule authn_core_module modules/mod_authn_core.so
     5  LoadModule authz_host_module modules/mod_authz_host.so
     6  LoadModule authz_groupfile_module modules/mod_authz_groupfile.so
     7  LoadModule authz_user_module modules/mod_authz_user.so
     8  LoadModule authz_core_module modules/mod_authz_core.so
     9  LoadModule access_compat_module modules/mod_access_compat.so
    10  LoadModule auth_basic_module modules/mod_auth_basic.so
    11  LoadModule reqtimeout_module modules/mod_reqtimeout.so
    12  LoadModule filter_module modules/mod_filter.so
    13  LoadModule mime_module modules/mod_mime.so
    14  LoadModule log_config_module modules/mod_log_config.so
    15  LoadModule env_module modules/mod_env.so
    16  LoadModule headers_module modules/mod_headers.so
    17  LoadModule setenvif_module modules/mod_setenvif.so
    18  LoadModule version_module modules/mod_version.so
    19  LoadModule mpm_worker_module modules/mod_mpm_worker.so
    20  LoadModule unixd_module modules/mod_unixd.so
    21  LoadModule status_module modules/mod_status.so
    22  LoadModule autoindex_module modules/mod_autoindex.so
    23  LoadModule dir_module modules/mod_dir.so
    24  LoadModule alias_module modules/mod_alias.so
    25  <IfModule unixd_module>
    26  User daemon   #apache的使用者,預設為daemon,建議修改為特定普通使用者,如sunsky
    27  Group daemon  #apache的使用者組,預設為daemon,建議修改為特定普通使用者,如sunsky
    28  </IfModule>
    29  ServerAdmin [email protected]   #系統管理者的郵箱
    30  <Directory />   #這将禁止通路檔案系統所在的目錄,并添加你希望允許通路的目錄塊
    31      AllowOverride none  #表示禁止使用者對目錄配置檔案(.htaccess進行修改)重載,普通站點目錄此項建議不開
    32      Require all denied   #拒絕所有請求
    33  </Directory>
    34  DocumentRoot "/usr/local/apache-2.4.6/htdocs"
    35  <Directory "/usr/local/apache-2.4.6/htdocs">
    36      Options Indexes FollowSymLinks   #允許目錄遊覽和符号連結,生産環境預設這裡為None一項也不打開
    37      AllowOverride None  #表示禁止使用者對目錄配置檔案(.htaccess進行修改)重載,普通站點目錄此項建議不開
    38      Require all granted   #授權所有請求
    39  </Directory>
    40  <IfModule dir_module>
    41      DirectoryIndex index.html  #配置預設的apache首頁檔案,如虛拟主機沒有此配置,預設應用這裡的配置。首頁檔案可以有多個,每個檔案用空格分開,調用時,前面優先比對。
    42  </IfModule>
    43  <Files ".ht*">     #防止.htaccess和.htpasswd等重要隐藏檔案被web使用者檢視
    44      Require all denied
    45  </Files>
    46  ErrorLog "logs/error_log"  #錯誤日志路徑,logs為apache安裝目錄的相對路徑,遇到apache錯誤要記得檢視此檔案
    47  LogLevel warn
    48  <IfModule log_config_module>
    49      LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined   #通路日志格式
    50      LogFormat "%h %l %u %t \"%r\" %>s %b" common #普通通路日志格式
    51      <IfModule logio_module>
    52        LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio
    53      </IfModule>
    54      CustomLog "logs/access_log" common   #預設站點通路日志配置
    55  </IfModule>
    56  <IfModule alias_module>
    57      ScriptAlias /cgi-bin/ "/usr/local/apache-2.4.6/cgi-bin/"    #配置cgi别名,ScriptAlias 方法可以學習。
    58  </IfModule>
    59  <IfModule cgid_module>
    60  </IfModule>
    61  <Directory "/usr/local/apache-2.4.6/cgi-bin">   #允許cgi-bin路徑通路
    62      AllowOverride None
    63      Options None
    64      Require all granted
    65  </Directory>
    66  <IfModule mime_module>
    67      TypesConfig conf/mime.types
    68      AddType application/x-compress .Z    #AddEncoding允許你在資訊傳送中使用(Mosaic/X 2.1+)解壓縮資訊。不是所有遊覽器的支援這個選項。
    69      AddType application/x-gzip .gz .tgz
    70  </IfModule>
    71  <IfModule proxy_html_module>
    72  Include conf/extra/proxy-html.conf
    73  </IfModule>
    74  <IfModule ssl_module>
    75  SSLRandomSeed startup builtin
    76  SSLRandomSeed connect builtin
    77  </IfModule>      

以上是我們編譯安裝完成apache後,apache的預設主配置檔案。其中有個别行暫時沒有解開注釋的,我會在用的時候給大家提到。

四、虛拟主機配置檔案

生産環境中,我們通常都要用到apache的擴充檔案中的虛拟主機配置檔案,它位于apache安裝目錄下的conf/extra/httpd-vhost.conf。注意,如果要讓該配置檔案的内容起作用,我們需要解鎖apache主配置檔案httpd.conf中擴充虛拟主機的配置行

[[email protected] /]# grep httpd-vhost /usr/local/apache/conf/httpd.conf
#Include conf/extra/httpd-vhosts.conf   #将此行解鎖即可      

此處我們可以用一鍵解鎖指令

[[email protected] apache]# sed -i 's#\#Include conf/extra/httpd-vhosts.conf#Include conf/extra/httpd-vhosts.conf#g' /usr/local/apache/conf/httpd.conf #使用sed指令一鍵替換
[[email protected] apache]# grep httpd-vhost /usr/local/apache/conf/httpd.conf  #檢視替換結果
Include conf/extra/httpd-vhosts.conf      

現在開始為大家講解httpd-vhost.conf這個檔案,我們依舊隻顯示解開注釋的行

[[email protected] apache]# egrep -v "^$|#" /usr/local/apache/conf/extra/httpd-vhosts.conf|cat -n
     1 <VirtualHost *:80>  #定義一個虛拟主機,監聽本機所有IP位址80端口上提供的http服務請求
     2     ServerAdmin [email protected]   #這裡可以配置管理者的郵箱
     3     DocumentRoot "/usr/local/apache-2.4.6/docs/dummy-host.example.com"  #提供服務的程式目錄,也稱站點目錄
     4     ServerName dummy-host.example.com #這是配置提供服務的域名,如www.baidu.com,如果是生産環境需要把www.baidu.com解析到伺服器上配置的外網VIP或IP上。如果僅為測試,可以直接在本機上做測試。
     5     ServerAlias www.dummy-host.example.com  #這是配置虛拟主機的别名,也就是可以配置多個域名通路同一站點,如此處配置baidu.com後,當輸入baidu.com可以得到和www.baidu.com同樣的結果。此功能需要apache mod_alias子產品支援。
     6     ErrorLog "logs/dummy-host.example.com-error_log"  #這裡可以配置apache錯誤日志的路徑。錯誤日志是調試apache的一個非常重要的日志。有什麼錯誤資訊這裡一般都會有記錄。
     7     CustomLog "logs/dummy-host.example.com-access_log" common #通路日志配置。在生産環境中,我們一般用combined格式替代common格式,以擷取更多的日志格式輸出。
     8 </VirtualHost>    #這是一個虛拟主機的結尾,如果需要添加新的虛拟主機,則可以增加<VirtualHost></VirtualHost>即可
     9
    10     ServerAdmin [email protected]
    11     DocumentRoot "/usr/local/apache-2.4.6/docs/dummy-host2.example.com"
    12     ServerName dummy-host2.example.com
    13     ErrorLog "logs/dummy-host2.example.com-error_log"
    14     CustomLog "logs/dummy-host2.example.com-access_log" common
    15 </VirtualHost>      

預設配置檔案會準備出來兩個虛拟主機模闆,此處我們僅拿一個做講解,兩者内容是相通的。

到這裡本篇博文就結束了,相信對于編譯參數,apache目錄結構,主配置檔案和虛拟主機配置檔案的内容,大家已經了然于心了。下一篇将是非常重要的針對生産環境的apache的調優介紹了。希望能幫助到大家。