咱們要想實現一個web站點,並且可以在互聯網上被訪問,首先它再能運行在操做系統,並且這個操做系統還要運行在物理主機上(第一它是一個主機)。在互聯網上可以被訪問,那咱們須要一個主機,須要一個IP地址,須要一個時時在線的服務器,這須要多少資源?對衆多小型站點來說或者說對某種需求來說,有可能都用不到服務器,也就是天天就10我的左右訪問,只是須要咱們在線而已,若是咱們就爲這一點點的需求就投入重大的資源的話是很是浪費的。咱們就指望可以像咱們使用虛擬機同樣,虛擬的OS同樣或虛擬的PC同樣,可以在一臺物理主機上虛擬出來多個能夠同時運行的站點或者咱們把它稱爲主機所以就把它稱爲虛擬主機。php
注意:全部的虛擬主機的配置咱們都須要取消中心主機,也就是註釋掉 DocumentRoot 這是配置虛擬主機的前提html
例如我採用的 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>
複製代碼
<VirtualHost *:80>
apache監聽本機的全部 IP 和 80 端口作多域名虛擬主機bash
表示服務器的根目錄服務器
就是表示域名,咱們採用域名方式配置虛擬主機,因此每一個虛擬主機的域名應該是不同的才行併發
對根目錄的規則應用,其中涉及到對於目錄的訪問權限和其餘配置問題app
配置在特定目錄使用哪些特性,經常使用的值和基本含義以下less
因此咱們通常在配置 PHP 的時候所配置的內容是
Options Indexes FollowSymLinks Includes ExecCGI
複製代碼
容許存在於.htaccess文件中的指令類型(.htaccess文件名是能夠改變的,其文件名由AccessFileName指令決定):
建議關閉這個選項,由於apache在文檔中已經明確支持不建議使用它了,主要是會下降服務器性能,.htaccess 文件能夠作到的咱們均可以在 Directory 指令中作的更好。
控制在訪問時Allow和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.
主頁文件設置 通常都是 index.html index.php
黑白名單書寫規則以下:
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
複製代碼
對於同一個 ip 來作虛擬主機,就是須要監聽不一樣的端口,首先須要在主配置文件中添加新的監聽端口:
Listen 80
Listen 81
複製代碼
而後再虛擬主機裏面配置
<Virtualhost *:80>
DocumentRoot "/var1"
</Virtualhost>
<Virtualhost *:81>
DocumentRoot "/var2"
</Virtualhost>
複製代碼
這個就不過多贅述了,徹底和基於端口的配置方式同樣。也就是修改的是ip 而非端口、
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。該模式是爲了兼容一些舊版本的程序。我缺省編譯時的選項。
<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個線程。
<IfModule perchild.c>
NumServers 5 #服務器啓動時啓動的子進程數
StartThreads 5 #每一個子進程啓動時啓動的線程數
MinSpareThreads 5 #內存中的最小空閒線程數
MaxSpareThreads 10 #最大空閒線程數
MaxThreadsPerChild 2000 #每一個線程最多被請求多少次後退出。0不受限制。
MaxRequestsPerChild 10000 #每一個子進程服務多少次後被從新fork。0表示不受限制。
</IfModule>
複製代碼
該模式下,子進程的數量是固定的,線程數不受限制。當客戶端鏈接到服務器時,又空閒的線程提供服務。 若是空閒線程數不夠,子進程自動產生線程來爲新的鏈接服務。該模式用於多站點服務器。
對於不在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>
複製代碼
# 訪問時能夠: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>
複製代碼
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
複製代碼
日誌的缺省格式有以下幾種:
格式中的各個參數以下:
%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 –
複製代碼
AccessFileName .htaccess
.........
Alias /download/ "/var/www/download/"
<Directory "/var/www/download">
Options Indexes
AllowOverride AuthConfig
</Directory>
複製代碼
/usr/local/apache2/bin/htpasswd -c /var/httpuser/passwords bearzhang
複製代碼
vi /var/www/download/.htaccess:
AuthType Basic
AuthName "Restricted Files"
AuthUserFile /var/httpuser/passwords
Require user bearzhang
#Require valid-user #all valid user
複製代碼
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>
複製代碼
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>
複製代碼
# 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>
複製代碼
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>
複製代碼
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>
複製代碼
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>
複製代碼
首先在配置以前先來了解一些基本概念:
a. 證書的概念:首先要有一個根證書,而後用根證書來簽發服務器證書和客戶證書,通常理解:服務器證書和客戶證書是平級關係。SSL必須安裝 服務器證書來認證。 所以:在此環境中,至少必須有三個證書:根證書,服務器證書,客戶端證書。 在生成證書以前,通常會有一個私鑰,同時用私鑰生成證書請求,再利用證書服務器的根證來簽發證書。 SSL所使用的證書能夠本身生成,也能夠經過一個商業性CA(如Verisign 或 Thawte)簽署證書。
b. 簽發證書的問題:若是使用的是商業證書,具體的簽署方法請查看相關銷售商的說明;若是是知己簽發的證書,可使用openssl自帶的CA.sh 腳本工具。
若是不爲單獨的客戶端簽發證書,客戶端證書能夠不用生成,客戶端與服務器端使用相同的證書。
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>
複製代碼
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
複製代碼
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/
複製代碼
參考文章: