macOS Sierra(10.12.5)
Apache/2.4.25 (Unix)
OpenSSL 1.0.2l
Mac系統默認安裝了Apache服務器,你只須要在終端裏輸入sudo apachectl start
命令,而後打開瀏覽器,輸入網址http://localhost/index
,顯示以下圖:php
恭喜你,一個HTTP服務器已經搭建成功了!是否是很簡單?接下來介紹如何具體定製化配置Apache服務器。html
/private/etc/apache2/httpd.conf
,更改系統默認的根路徑DocumentRoot
爲自定義路徑(由於系統默認的根路徑要求管理員權限,更改比較繁瑣,若是須要用系統默認的根路徑,能夠跳過此步驟)。DocumentRoot "/Users/libo/apache_server"
<Directory "/Users/libo/apache_server">
複製代碼
/private/etc/apache2/httpd.conf
,去掉#Include /private/etc/apache2/extra/httpd-vhosts.conf
前面的#
,保存並退出。而後打開/private/etc/apache2/extra/httpd-vhosts.conf
,註釋掉如下代碼:#<VirtualHost *:80>
# ServerAdmin webmaster@dummy-host.example.com
# DocumentRoot "/usr/docs/dummy-host.example.com"
# ServerName dummy-host.example.com
# ServerAlias www.dummy-host.example.com
# ErrorLog "/private/var/log/apache2/dummy-host.example.com-error_log"
# CustomLog "/private/var/log/apache2/dummy-host.example.com-access_log" common
#</VirtualHost>
#<VirtualHost *:80>
# ServerAdmin webmaster@dummy-host2.example.com
# DocumentRoot "/usr/docs/dummy-host2.example.com"
# ServerName dummy-host2.example.com
# ErrorLog "/private/var/log/apache2/dummy-host2.example.com-error_log"
# CustomLog "/private/var/log/apache2/dummy-host2.example.com-access_log" common
#</VirtualHost>
複製代碼
而後加入如下代碼:ios
<VirtualHost *:80>
# ServerAdmin webmaster@dummy-host.example.com
DocumentRoot "/Users/libo/apache_server/mywebsite"
ServerName mywebsite.com
ErrorLog "/private/var/log/apache2/mywebsite.com-error_log"
CustomLog "/private/var/log/apache2/mywebsite.com-access_log" common
<Directory />
Options Indexes FollowSymLinks MultiViews
AllowOverride all
Order deny,allow
Allow from all
</Directory>
</VirtualHost>
<VirtualHost *:80>
# ServerAdmin webmaster@dummy-host2.example.com
DocumentRoot "/Users/libo/apache_server/mywebsite2"
ServerName mywebsite2.com
ErrorLog "/private/var/log/apache2/mywebsite2.com-error_log"
CustomLog "/private/var/log/apache2/mywebsite2.com-access_log" common
<Directory />
Options Indexes FollowSymLinks MultiViews
AllowOverride all
Order deny,allow
Allow from all
</Directory>
</VirtualHost>
複製代碼
咱們也配置兩個虛擬主機,由於HTTP不顯式指定訪問端口號時默認爲80號端口,爲了訪問方便,咱們設置服務器訪問端口號爲80,固然你也能夠設置其它端口號,好比8080,這時還須要配置httpd.conf
,加入Listen 8080
。但有些端口有特殊意義,不能隨便設置,好比443端口號默認是HTTPS訪問端口。 <Directory /></Directory>
之間的配置是一些比較細化的服務器配置選項,AllowOverride all
是容許覆蓋全部的文件,Order deny,allow
是命令的兩種類型,Allow from all
是容許全部的客戶端(或代理)訪問本服務器,你也能夠配置 Allow from #IP
或Deny from #IP
來控制容許或者禁止特定的IP訪問服務器。git
注意:兩個虛擬主機的根路徑必須在服務器根路徑下。web
/private/etc/hosts
,把咱們的服務器域名對應到回送地址127.0.0.1
上,這樣就能夠直接本地進行域名訪問。文件前3行配置是系統默認配置,咱們平時訪問的localhost
就是經過該文件直接解析成對應的IP地址進行本地訪問的,其中127.0.0.1
是IPv4
標準,::1
是IPv6
標準。其實咱們平時經過域名訪問網址時,都會首先訪問這個本地的hosts
文件來查找IP地址,若是找不到對應的結果纔會訪問DNS服務器進行DNS解析來進行後續的步驟。##
# Host Database
#
# localhost is used to configure the loopback interface
# when the system is booting. Do not change this entry.
##
127.0.0.1 localhost
255.255.255.255 broadcasthost
::1 localhost
127.0.0.1 mywebsite.com
127.0.0.1 mywebsite2.com
複製代碼
說明咱們的HTTP服務器已經配置成功了!apache
咱們只須要在HTTP服務器的基礎上配置HTTPS就能夠了。瀏覽器
openssl genrsa -out mywebsite.key 2048
複製代碼
而後利用私鑰建立自簽名證書安全
openssl req -new -x509 -key mywebsite.key -out mywebsite.cer
複製代碼
須要本身填寫一些證書信息,以下圖:bash
紅框標註選項最好填寫虛擬主機域名,若是不按要求填寫也可使用,同理咱們建立另外一個虛擬主機mywebsite2.com證書。服務器
修改服務器配置
去掉#Include /private/etc/apache2/extra/httpd-ssl.conf
前面的#
, 去掉#LoadModule ssl_module libexec/apache2/mod_ssl.so
前面的#
, 去掉#LoadModule socache_shmcb_module libexec/apache2/mod_socache_shmcb.so
前面的#
。
修改httpd-ssl.conf配置
打開/private/etc/apache2/extra/httpd-ssl.conf
文件,找到對應的SSLCertificateFile
和SSLCertificateKeyFile
字段,加入以下代碼:
SSLCertificateFile "/Users/libo/apache_server/mywebsite/mywebsite.cer"
SSLCertificateFile "/Users/libo/apache_server/mywebsite2/mywebsite2.cer"
複製代碼
SSLCertificateKeyFile "/Users/libo/apache_server/mywebsite/mywebsite.key"
SSLCertificateKeyFile "/Users/libo/apache_server/mywebsite2/mywebsite2.key"
複製代碼
443
,配置服務器證書SSLCertificateFile
和私鑰SSLCertificateKeyFile
,以下:<VirtualHost *:443>
# ServerAdmin webmaster@dummy-host.example.com
DocumentRoot "/Users/libo/apache_server/mywebsite"
ServerName mywebsite.com
ErrorLog "/private/var/log/apache2/mywebsite.com-error_log"
CustomLog "/private/var/log/apache2/mywebsite.com-access_log" common
SSLCertificateFile "/Users/libo/apache_server/mywebsite/mywebsite.cer"
SSLCertificateKeyFile "/Users/libo/apache_server/mywebsite/mywebsite.key"
<Directory />
Options Indexes FollowSymLinks MultiViews
AllowOverride all
Order deny,allow
Allow from all
</Directory>
</VirtualHost>
<VirtualHost *:443>
# ServerAdmin webmaster@dummy-host2.example.com
DocumentRoot "/Users/libo/apache_server/mywebsite2"
ServerName mywebsite2.com
ErrorLog "/private/var/log/apache2/mywebsite2.com-error_log"
CustomLog "/private/var/log/apache2/mywebsite2.com-access_log" common
SSLCertificateFile "/Users/libo/apache_server/mywebsite2/mywebsite2.cer"
SSLCertificateKeyFile "/Users/libo/apache_server/mywebsite2/mywebsite2.key"
<Directory />
Options Indexes FollowSymLinks MultiViews
AllowOverride all
Order deny,allow
Allow from all
</Directory>
</VirtualHost>
複製代碼
sudo apachectl restart
,瀏覽器訪問,以下圖:能夠看到咱們的HTTPS服務器已經搭建成功了,儘管不是「安全」的訪問!接下來咱們要進行一些操做使訪問變得「安全」。
建立CA私鑰:
openssl genrsa -des3 -out Apache_CA.key 2048
複製代碼
這裏使用-des3進行加密,須要4~1023位密碼。
建立CA證書:
openssl req -new -x509 -days 365 -key Apache_CA.key -out Apache_CA.cer
複製代碼
這裏須要輸入剛纔設置的CA私鑰密碼並填寫一些證書信息。
建立服務器證書私鑰:
openssl genrsa -out mywebsite.key 2048
複製代碼
生成證書請求文件CSR:
openssl req -new -key mywebsite.key -out mywebsite.csr
複製代碼
這裏一樣須要填寫一些證書信息,一樣,紅框標註選項最好填寫虛擬主機域名。
生成證書配置文件v3.ext:
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
subjectAltName = @alt_names
[alt_names]
DNS.1 = mywebsite.com
複製代碼
DNS.1
要寫配置證書的服務器域名。
用本身的CA簽發證書:
openssl x509 -req -in mywebsite.csr -CA Apache_CA.cer -CAkey Apache_CA.key -CAcreateserial -out mywebsite.cer -days 365 -sha256 -extfile v3.ext
複製代碼
而後須要輸入生成Apache_CA.key時設置的密碼。
恭喜你,證書已經建立成功!而後咱們按照前面提到的步驟替換掉服務器的證書,重啓服務器sudo apachectl restart
。
設置系統始終信任CA證書:
雙擊點開Apache_CA.cer
,而後在鑰匙串中找到該證書,右鍵->顯示簡介->信任
,設置爲始終信任。而後分別再次訪問網址https://mywebsite.com/index
和https://mywebsite2.com/index
。訪問結果以下:
恭喜你!mywebsite.com
服務器的訪問已經變成「安全」的了,同理能夠配置mywebsite2.com
服務器。可是,你要注意一點,這種「安全」只是相對的安全,或者說是一種假象,由於你的CA證書是本身建立頒發的,別人也能夠經過竊取你的CA私鑰或者其餘方式來僞造證書。更爲穩妥的辦法仍是要向正規的證書頒發機構去申請私鑰和證書,這點必定要注意。
在搭建正向代理服務器以前,咱們先說下正向代理和反向代理的區別。咱們平時訪問網上的資源,絕大多數狀況是要通過各類(正向或反向或其餘)代理的,只是這對用戶來講是無感知的。正向代理能夠理解爲一層跳板,咱們訪問資源的目的IP地址是服務器,只是通過正向代理這個節點。而反向代理是咱們訪問資源的目的IP地址就是反向代理服務器,反向代理服務器和最終的服務器進行交互,獲取資源。下圖能夠很清晰的展現這兩種關係:
下面咱們開始配置正向代理服務器。
/private/etc/apache2/httpd.conf
,去掉如下module
前面的#
。#LoadModule proxy_module libexec/apache2/mod_proxy.so
#LoadModule proxy_connect_module libexec/apache2/mod_proxy_connect.so
#LoadModule proxy_ftp_module libexec/apache2/mod_proxy_ftp.so
#LoadModule proxy_http_module libexec/apache2/mod_proxy_http.so
複製代碼
經過以上module
的命名咱們能夠了解到mod_proxy.so
是基礎的代理配置,mod_proxy_http.so
支持HTTP
請求,mod_proxy_ftp.so
支持FTP
請求,mod_proxy_connect.so
支持HTTPS
請求(HTTPS
請求頭和報文是加密的,代理服務器不能經過識別請求頭來獲取目的服務器的地址,因此在最開始創建鏈接時代理服務器須要打開一條從客戶端到服務器的端到端connect
通道)。
80
,加入正向代理設置。<VirtualHost *:80>
# ServerAdmin webmaster@dummy-host.example.com
DocumentRoot "/Users/libo/apache_server/mywebsite"
ServerName mywebsite.com
ErrorLog "/private/var/log/apache2/mywebsite.com-error_log"
CustomLog "/private/var/log/apache2/mywebsite.com-access_log" common
SSLCertificateFile "/Users/libo/apache_server/mywebsite/mywebsite.cer"
SSLCertificateKeyFile "/Users/libo/apache_server/mywebsite/mywebsite.key"
<Directory />
Options Indexes FollowSymLinks MultiViews
AllowOverride all
Order deny,allow
Allow from all
</Directory>
#正向代理設置
ProxyRequests On
ProxyVia Full
<Proxy *>
Order deny,allow
#Deny from all
Allow from all
</Proxy>
</VirtualHost>
複製代碼
ProxyVia Full
能夠爲咱們打出最詳細的代理服務器信息。
mywebsite.pac
文件來配置代理。function FindProxyForURL(url, host) {
if (host == "www.jianshu.com") {
return "PROXY 127.0.0.1:80";
}
return 'DIRECT;';
}
複製代碼
咱們有選擇的只要求訪問簡書www.jianshu.com
域名時通過咱們的代理服務器,其餘域名進行DIRECT
直連。
配置代理配置 打開系統偏好設置**->網絡->高級->代理,選中自動代理配置,配置mywebsite.pac
文件的路徑地址,而後點擊好->**應用。
驗證
瀏覽器打開簡書首頁http://www.jianshu.com/
,打開開發者模式:
經過Via
字段,咱們發現此次請求通過了咱們的代理服務器,說明咱們的配置成功了!
修改服務器配置
咱們須要用PHP
腳原本測試反向代理,Apache
服務器自身支持PHP
,只須要打開配置文件/private/etc/apache2/httpd.conf
,去掉#LoadModule php5_module libexec/apache2/libphp5.so
前面的#
。
修改虛擬主機配置
咱們把mywebsite.com
和mywebsite2.com
的默認端口號改成80
,讓mywebsite2.com
做爲反向代理服務器,mywebsite.com
做爲原始服務器,經過訪問反向代理服務器間接訪問原始服務器資源。配置代碼以下:
<VirtualHost *:80>
# ServerAdmin webmaster@dummy-host2.example.com
DocumentRoot "/Users/libo/apache_server/mywebsite2"
ServerName mywebsite2.com
ErrorLog "/private/var/log/apache2/mywebsite2.com-error_log"
CustomLog "/private/var/log/apache2/mywebsite2.com-access_log" common
SSLCertificateFile "/Users/libo/apache_server/mywebsite2/mywebsite2.cer"
SSLCertificateKeyFile "/Users/libo/apache_server/mywebsite2/mywebsite2.key"
<Directory />
Options Indexes FollowSymLinks MultiViews
AllowOverride all
Order deny,allow
Allow from all
</Directory>
#反向代理設置
ProxyPass / http://mywebsite.com/
ProxyPassReverse / http://mywebsite.com/
</VirtualHost>
複製代碼
ProxyPass / http://mywebsite.com/
是把全部訪問當前主機http://mywebsite2.com/
的請求轉發給http://mywebsite.com/
主機,至於ProxyPassReverse / http://mywebsite.com/
的做用,咱們稍後再說。
"/Users/libo/apache_server/mywebsite"
路徑下建立兩個PHP
文件:redirect.php
<?php
function redirect($url)
{
header("Location: $url");
exit();
}
$url = "http://mywebsite.com/test.php";
redirect($url);
?>
複製代碼
test.php
<?php
phpinfo();
?>
複製代碼
重啓服務器,訪問http://mywebsite2.com/redirect.php
。
能夠看到請求的Request URL
的host
仍是mywebsite2.com
,可是它確實是由 mywebsite.com
來處理的,經過訪問mywebsite.com
資源redirect.php
文件,進而重定向到test.php
文件。說明咱們反向代理服務器已經搭建成功了!
如今咱們介紹下ProxyPassReverse
的做用,咱們把配置文件的這一項配置去掉,重啓服務器再次訪問http://mywebsite2.com/redirect.php
。
和上圖對比能夠看到請求的Request URL
的host
是mywebsite.com
而不是 mywebsite2.com
,這是由於配置了ProxyPassReverse
後,mywebsite.com/redirect.php
在重定向到mywebsite.com/test.php
時,Apache會將它調整回 mywebsite2.com/test.php
, 而後Apache再將mywebsite2.com/test.php
轉發給mywebsite.com/test.php
。因此說配置了ProxyPassReverse
後,即便在請求過程當中發生了重定向,Apache也會幫你擦去這些痕跡。
以上都是我對Apache
服務器的基礎配置,簡單的實現了預期功能。服務器配置很細碎繁瑣,能根據不一樣代碼實現更爲複雜精細的配置,更爲詳細的功能具體請參考官方文檔,本人沒有作深刻研究。本文若有錯誤,但願指正,一塊兒學習,共同進步,不勝感激!
www.liuchungui.com/blog/2015/0…
beyondvincent.com/2014/03/17/… www.cnblogs.com/zemliu/arch… httpd.apache.org/docs/2.4/