Apache配置詳解

1. 虛擬主機概念

咱們要想實現一個web站點,並且可以在互聯網上被訪問,首先它再能運行在操做系統,並且這個操做系統還要運行在物理主機上(第一它是一個主機)。在互聯網上可以被訪問,那咱們須要一個主機,須要一個IP地址,須要一個時時在線的服務器,這須要多少資源?對衆多小型站點來說或者說對某種需求來說,有可能都用不到服務器,也就是天天就10我的左右訪問,只是須要咱們在線而已,若是咱們就爲這一點點的需求就投入重大的資源的話是很是浪費的。咱們就指望可以像咱們使用虛擬機同樣,虛擬的OS同樣或虛擬的PC同樣,可以在一臺物理主機上虛擬出來多個能夠同時運行的站點或者咱們把它稱爲主機所以就把它稱爲虛擬主機。php

2. Apache 主機的類型

1. 中心主機

2. 虛擬主機

  1. 基於IP: 端口相同,IP地址不一樣。
  2. 基於端口:IP相同,端口不一樣。
  3. 基於域名:IP地址相同,端口相同主機名不一樣

注意:全部的虛擬主機的配置咱們都須要取消中心主機,也就是註釋掉 DocumentRoot 這是配置虛擬主機的前提html

3. 基於域名的虛擬主機

例如我採用的 xampp 因此配置虛擬主機就在 C:\xampp\apache\conf\extra\httpd-vhosts.conf 中配置,因爲這個文件默認被 include 到主配置文件中了,因此在這裏的修改均可以生效。web

首先須要保證主配置文件中的中心主機被取消了也就是:apache

#DocumentRoot "C:/xampp/htdocs"
複製代碼

而後打開 httpd-vhosts.conf 配置文件,按照下面的格式配置虛擬主機瀏覽器

<VirtualHost *:80>
	DocumentRoot "C:/xampp/htdocs"
	ServerName localhost
	<Directory "C:/xampp/htdocs">
		Options Indexes FollowSymLinks Includes ExecCGI
		AllowOverride All
		Require all granted
	</Directory>
</VirtualHost>
複製代碼

1. <VirtualHost *:80>

apache監聽本機的全部 IP 和 80 端口作多域名虛擬主機bash

2. DocumentRoot

表示服務器的根目錄服務器

3. ServerName

就是表示域名,咱們採用域名方式配置虛擬主機,因此每一個虛擬主機的域名應該是不同的才行併發

4. Directory

對根目錄的規則應用,其中涉及到對於目錄的訪問權限和其餘配置問題app

5. 對於 Directory 指令解析

1. Options

配置在特定目錄使用哪些特性,經常使用的值和基本含義以下less

  1. ExecCGI: 在該目錄下容許執行CGI腳本。
  2. FollowSymLinks: 在該目錄下容許文件系統使用符號鏈接。
  3. Indexes: 當用戶訪問該目錄時,若是用戶找不到DirectoryIndex指定的主頁文件(例如index.html),則返回該目錄下的文件列表給用戶。
  4. SymLinksIfOwnerMatch: 當使用符號鏈接時,只有當符號鏈接的文件擁有者與實際文件的擁有者相同時才能夠訪問。

因此咱們通常在配置 PHP 的時候所配置的內容是

Options Indexes FollowSymLinks Includes ExecCGI
複製代碼

2. AllowOverride

容許存在於.htaccess文件中的指令類型(.htaccess文件名是能夠改變的,其文件名由AccessFileName指令決定):

  • None: 當AllowOverride被設置爲None時。不搜索該目錄下的.htaccess文件(能夠減少服務器開銷)。
  • All: 在.htaccess文件中可使用全部的指令。

建議關閉這個選項,由於apache在文檔中已經明確支持不建議使用它了,主要是會下降服務器性能,.htaccess 文件能夠作到的咱們均可以在 Directory 指令中作的更好。

3. Order

控制在訪問時Allow和Deny兩個訪問規則哪一個優先,也就是黑白名單的匹配順序

  • Allow:容許訪問的主機列表(可用域名或子網,例如:Allow from 192.168.0.0/16)。
  • Deny:拒絕訪問的主機列表。

更詳細的用法可參看:order用法

匹配原則:

Allow,Deny
複製代碼

First, all Allow directives are evaluated; at least one must match, or the request is rejected. Next, all Deny directives are evaluated. If any matches, the request is rejected. Last, any requests which do not match an Allow or a Deny directive are denied by default.

Deny,Allow
複製代碼

First, all Deny directives are evaluated; if any match, the request is denied unless it also matches an Allow directive. Any requests which do not match any Allow or Deny directives are permitted.

4. DirectoryIndex

主頁文件設置 通常都是 index.html index.php

5. Deny /Allow

黑白名單書寫規則以下:

Allow from example.org
Allow from .net example.edu
Allow from 10.1.2.3
Allow from 192.168.1.104 192.168.1.205
Allow all
複製代碼

4. 基於端口的虛擬主機

對於同一個 ip 來作虛擬主機,就是須要監聽不一樣的端口,首先須要在主配置文件中添加新的監聽端口:

Listen 80
Listen 81
複製代碼

而後再虛擬主機裏面配置

<Virtualhost *:80>
	DocumentRoot "/var1"
</Virtualhost>
<Virtualhost *:81>
	DocumentRoot "/var2"
</Virtualhost>
複製代碼

5. 基於ip的虛擬主機

這個就不過多贅述了,徹底和基於端口的配置方式同樣。也就是修改的是ip 而非端口、

6.服務器的優化 (MPM: Multi-Processing Modules)

apache2主要的優點就是對多處理器的支持更好,在編譯時同過使用--with-mpm選項來決定apache2的工做模式。若是知道當前的apache2使用什麼工做機制,能夠經過httpd -l命令列出apache的全部模塊,就能夠知道其工做方式:

  • prefork:若是httpd -l列出prefork.c,則須要對下面的段進行配置。

    <IfModule prefork.c>
     StartServers 5 #啓動apache時啓動的httpd進程個數。
     MinSpareServers 5 #服務器保持的最小空閒進程數。
     MaxSpareServers 10 #服務器保持的最大空閒進程數。
     MaxClients 150 #最大併發鏈接數。
     MaxRequestsPerChild 1000 #每一個子進程被請求服務多少次後被kill掉。0表示不限制,推薦設置爲1000。
     </IfModule>
    複製代碼

在該工做模式下,服務器啓動後起動5個httpd進程(加父進程共6個,經過ps -ax|grep httpd命令能夠看到)。當有用戶鏈接時,apache會使用一個空閒進程爲該鏈接服務,同時父進程會fork一個子進程。直到內存中的空閒進程達到MaxSpareServers。該模式是爲了兼容一些舊版本的程序。我缺省編譯時的選項。

  • worker:若是httpd -l列出worker.c,則須要對下面的段進行配置:
<IfModule worker.c> 
    StartServers 2 #啓動apache時啓動的httpd進程個數。 
    MaxClients 150 #最大併發鏈接數。 
    MinSpareThreads 25 #服務器保持的最小空閒線程數。 
    MaxSpareThreads 75 #服務器保持的最大空閒線程數。 
    ThreadsPerChild 25 #每一個子進程的產生的線程數。 
    MaxRequestsPerChild 0 #每一個子進程被請求服務多少次後被kill掉。0表示不限制,推薦設置爲1000。 
</IfModule> 
複製代碼

該模式是由線程來監聽客戶的鏈接。當有新客戶鏈接時,由其中的一個空閒線程接受鏈接。服務器在啓動時啓動兩個進程,每一個進程產生的線程數是固定的(ThreadsPerChild決定),所以啓動時有50個線程。當50個線程不夠用時,服務器自動fork一個進程,再產生25個線程。

  • perchild:若是httpd -l列出perchild.c,則須要對下面的段進行配置:
<IfModule perchild.c> 
    NumServers 5 #服務器啓動時啓動的子進程數 
    StartThreads 5 #每一個子進程啓動時啓動的線程數 
    MinSpareThreads 5 #內存中的最小空閒線程數 
    MaxSpareThreads 10 #最大空閒線程數 
    MaxThreadsPerChild 2000 #每一個線程最多被請求多少次後退出。0不受限制。 
    MaxRequestsPerChild 10000 #每一個子進程服務多少次後被從新fork。0表示不受限制。 
</IfModule> 
複製代碼

該模式下,子進程的數量是固定的,線程數不受限制。當客戶端鏈接到服務器時,又空閒的線程提供服務。 若是空閒線程數不夠,子進程自動產生線程來爲新的鏈接服務。該模式用於多站點服務器。

7.別名設置

對於不在DocumentRoot指定的目錄內的頁面,既可使用符號鏈接,也可使用別名。別名的設置以下:

Alias /download/ "/var/www/download/" #訪問時能夠輸入:http://www.custing.com/download/ 
 
<Directory "/var/www/download"> #對該目錄進行訪問控制設置 
    Options Indexes MultiViews 
    AllowOverride AuthConfig 
    Order allow,deny 
    Allow from all 
</Directory>
複製代碼

六、CGI設置

# 訪問時能夠:http://www.clusting.com/cgi-bin/,可是該目錄下的CGI腳本文件要加可執行權限
ScriptAlias /cgi-bin/ "/mnt/software/apache2/cgi-bin/" 
 
<Directory "/usr/local/apache2/cgi-bin"> #設置目錄屬性 
    AllowOverride None 
    Options None 
    Order allow,deny 
    Allow from all 
</Directory> 
複製代碼

八、日誌的設置

(1) 錯誤日誌的設置
  • ErrorLog logs/error_log :日誌的保存位置

  • LogLevel warn #日誌的級別

顯示的格式日下:

[Mon Oct 10 15:54:29 2005] [error] [client 192.168.10.22] access to /download/ failed, reason: user admin not allowed access 
複製代碼
(2) 訪問日誌設置

日誌的缺省格式有以下幾種:

  • LogFormat "%h %l %u %t "%r" %>s %b "%{Referer}i" "%{User-Agent}i"" combined
  • LogFormat "%h %l %u %t "%r" %>s %b" common #common爲日誌格式名稱
  • LogFormat "%{Referer}i -> %U" referer
  • LogFormat "%{User-agent}i" agent
  • CustomLog logs/access_log common

格式中的各個參數以下:

%h --客戶端的ip地址或主機名 
%l --The 這是由客戶端 identd 判斷的RFC 1413身份,輸出中的符號 "-" 表示此處信息無效。 
%u --由HTTP認證系統獲得的訪問該網頁的客戶名。有認證時纔有效,輸出中的符號 "-" 表示此處信息無效。 
%t --服務器完成對請求的處理時的時間。 
"%r" --引號中是客戶發出的包含了許多有用信息的請求內容。 
%>s --這個是服務器返回給客戶端的狀態碼。 
%b --最後這項是返回給客戶端的不包括響應頭的字節數。 
"%{Referer}i" --此項指明瞭該請求是從被哪一個網頁提交過來的。 
"%{User-Agent}i" --此項是客戶瀏覽器提供的瀏覽器識別信息。 
複製代碼

下面是一段訪問日誌的實例:

192.168.10.22 - bearzhang [10/Oct/2005:16:53:06 +0800] "GET /download/ HTTP/1.1" 200 1228 
192.168.10.22 - - [10/Oct/2005:16:53:06 +0800] "GET /icons/blank.gif HTTP/1.1" 304 - 
192.168.10.22 - - [10/Oct/2005:16:53:06 +0800] "GET /icons/back.gif HTTP/1.1" 304 – 
複製代碼

九、用戶認證的配置

(1) httpd.conf用戶認證配置:
AccessFileName .htaccess 
......... 
Alias /download/ "/var/www/download/" 
<Directory "/var/www/download"> 
    Options Indexes 
    AllowOverride AuthConfig 
</Directory> 
複製代碼
(2) create a password file:
/usr/local/apache2/bin/htpasswd -c /var/httpuser/passwords bearzhang
複製代碼
(3) configure the server to request a password and tell the server which users are allowed access.
vi /var/www/download/.htaccess: 
 
AuthType Basic 
AuthName "Restricted Files" 
AuthUserFile /var/httpuser/passwords 
Require user bearzhang 
#Require valid-user #all valid user 
複製代碼

十、虛擬主機的配置總結

(1)基於IP地址的虛擬主機配置
Listen 80 
 
<VirtualHost 172.20.30.40> 
    DocumentRoot /www/example1 
    ServerName www.example1.com 
</VirtualHost> 
 
<VirtualHost 172.20.30.50> 
    DocumentRoot /www/example2 
    ServerName www.example2.org 
</VirtualHost> 
複製代碼
(2) 基於IP和多端口的虛擬主機配置
Listen 172.20.30.40:80 
Listen 172.20.30.40:8080 
Listen 172.20.30.50:80 
Listen 172.20.30.50:8080 
 
<VirtualHost 172.20.30.40:80> 
    DocumentRoot /www/example1-80 
    ServerName www.example1.com 
</VirtualHost> 
 
<VirtualHost 172.20.30.40:8080> 
    DocumentRoot /www/example1-8080
    ServerName www.example1.com 
</VirtualHost> 
 
<VirtualHost 172.20.30.50:80> 
    DocumentRoot /www/example2-80 
    ServerName www.example1.org 
</VirtualHost> 
 
<VirtualHost 172.20.30.50:8080> 
    DocumentRoot /www/example2-8080 
    ServerName www.example2.org 
</VirtualHost> 
複製代碼
(3) 單個IP地址的服務器上基於域名的虛擬主機配置:
# Ensure that Apache listens on port 80 
Listen 80 
 
# Listen for virtual host requests on all IP addresses 
NameVirtualHost *:80 
 
<VirtualHost *:80> 
    DocumentRoot /www/example1 
    ServerName www.example1.com 
    ServerAlias example1.com. *.example1.com 
    # Other directives here 
</VirtualHost> 
 
<VirtualHost *:80> 
    DocumentRoot /www/example2 
    ServerName www.example2.org 
    # Other directives here 
</VirtualHost> 
複製代碼
(4) 在多個IP地址的服務器上配置基於域名的虛擬主機:
Listen 80 
 
# This is the "main" server running on 172.20.30.40 
ServerName server.domain.com 
DocumentRoot /www/mainserver 
 
# This is the other address 
NameVirtualHost 172.20.30.50 
 
<VirtualHost 172.20.30.50> 
    DocumentRoot /www/example1 
    ServerName www.example1.com 
    # Other directives here ... 
</VirtualHost> 
 
<VirtualHost 172.20.30.50> 
    DocumentRoot /www/example2 
    ServerName www.example2.org 
    # Other directives here ... 
</VirtualHost> 
複製代碼
(5) 在不一樣的端口上運行不一樣的站點(基於多端口的服務器上配置基於域名的虛擬主機):
Listen 80 
Listen 8080 
 
NameVirtualHost 172.20.30.40:80 
NameVirtualHost 172.20.30.40:8080 

<VirtualHost 172.20.30.40:80> 
    ServerName www.example1.com 
    DocumentRoot /www/domain-80 
</VirtualHost> 
 
<VirtualHost 172.20.30.40:8080> 
    ServerName www.example1.com
    DocumentRoot /www/domain-8080 
</VirtualHost> 
 
<VirtualHost 172.20.30.40:80>
    ServerName www.example2.org 
    DocumentRoot /www/otherdomain-80 
</VirtualHost> 
 
<VirtualHost 172.20.30.40:8080> 
    ServerName www.example2.org 
    DocumentRoot /www/otherdomain-8080 
</VirtualHost> 
複製代碼
(6) 基於域名和基於IP的混合虛擬主機的配置:
Listen 80 
 
NameVirtualHost 172.20.30.40 
 
<VirtualHost 172.20.30.40> 
    DocumentRoot /www/example1 
    ServerName www.example1.com 
</VirtualHost> 
 
<VirtualHost 172.20.30.40> 
    DocumentRoot /www/example2 
    ServerName www.example2.org 
</VirtualHost> 
 
<VirtualHost 172.20.30.40> 
    DocumentRoot /www/example3 
    ServerName www.example3.net 
</VirtualHost> 
複製代碼

11.SSL加密的配置

首先在配置以前先來了解一些基本概念:

a. 證書的概念:首先要有一個根證書,而後用根證書來簽發服務器證書和客戶證書,通常理解:服務器證書和客戶證書是平級關係。SSL必須安裝 服務器證書來認證。 所以:在此環境中,至少必須有三個證書:根證書,服務器證書,客戶端證書。 在生成證書以前,通常會有一個私鑰,同時用私鑰生成證書請求,再利用證書服務器的根證來簽發證書。 SSL所使用的證書能夠本身生成,也能夠經過一個商業性CA(如Verisign 或 Thawte)簽署證書。

b. 簽發證書的問題:若是使用的是商業證書,具體的簽署方法請查看相關銷售商的說明;若是是知己簽發的證書,可使用openssl自帶的CA.sh 腳本工具。

若是不爲單獨的客戶端簽發證書,客戶端證書能夠不用生成,客戶端與服務器端使用相同的證書。

(1) conf/ssl.conf 配置文件中的主要參數配置以下:

Listen 443 
 
SSLPassPhraseDialog buildin 
#SSLPassPhraseDialog exec:/path/to/program 
SSLSessionCache dbm:/usr/local/apache2/logs/ssl_scache 
SSLSessionCacheTimeout 300 
SSLMutex file:/usr/local/apache2/logs/ssl_mutex 
 
<VirtualHost _default_:443> 
# General setup for the virtual host 
DocumentRoot "/usr/local/apache2/htdocs" 
ServerName www.example.com:443 
ServerAdmin you@example.com 
ErrorLog /usr/local/apache2/logs/error_log 
TransferLog /usr/local/apache2/logs/access_log 
  
SSLEngine on 
SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL 
  
SSLCertificateFile /usr/local/apache2/conf/ssl.crt/server.crt 
SSLCertificateKeyFile /usr/local/apache2/conf/ssl.key/server.key 
CustomLog /usr/local/apache2/logs/ssl_request_log "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x "%r" %b" 
</VirtualHost> 
複製代碼

(2) 建立和使用自簽署的證書:

a. Create a RSA private key for your Apache server

/usr/local/openssl/bin/openssl genrsa -des3 -out /usr/local/apache2/conf/ssl.key/server.key 1024 
複製代碼

b. Create a Certificate Signing Request (CSR)

/usr/local/openssl/bin/openssl req -new -key /usr/local/apache2/conf/ssl.key/server.key -out /usr/local/apache2/conf/ssl.key/server.csr 
複製代碼

c. Create a self-signed CA Certificate (X509 structure) with the RSA key of the CA

/usr/local/openssl/bin/openssl req -x509 -days 365 -key /usr/local/apache2/conf/ssl.key/server.key -in /usr/local/apache2/conf/ssl.key/server.csr -out /usr/local/apache2/conf/ssl.crt/server.crt 
/usr/local/openssl/bin/openssl genrsa 1024 -out server.key 
/usr/local/openssl/bin/openssl req -new -key server.key -out server.csr 
/usr/local/openssl/bin/openssl req -x509 -days 365 -key server.key -in server.csr -out server.crt 
複製代碼

(3) 建立本身的CA(認證證書),並使用該CA來簽署服務器的證書。

mkdir /CA 
cd /CA 
cp openssl-0.9.7g/apps/CA.sh /CA 
./CA.sh -newca 
openssl genrsa -des3 -out server.key 1024 
openssl req -new -key server.key -out server.csr 
cp server.csr newreq.pem 
./CA.sh -sign 
cp newcert.pem /usr/local/apache2/conf/ssl.crt/server.crt 
cp server.key /usr/local/apache2/conf/ssl.key/
複製代碼

參考文章

深刻理解Apache虛擬主機

Apache配置文件httpd.conf詳解

Apache文檔

相關文章
相關標籤/搜索