基於Apache搭建HTTP HTTPS 正向代理 反向代理服務器

實際環境

  • 系統環境 macOS Sierra(10.12.5)
  • Apache Apache/2.4.25 (Unix)
  • OpenSSL OpenSSL 1.0.2l

引言

Mac系統默認安裝了Apache服務器,你只須要在終端裏輸入sudo apachectl start命令,而後打開瀏覽器,輸入網址http://localhost/index,顯示以下圖:php

恭喜你,一個HTTP服務器已經搭建成功了!是否是很簡單?接下來介紹如何具體定製化配置Apache服務器。html

搭建HTTP服務器

  • 修改服務器默認根路徑
    打開配置文件/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 #IPDeny from #IP來控制容許或者禁止特定的IP訪問服務器。git

注意:兩個虛擬主機的根路徑必須在服務器根路徑下。web

  • 更改本地DNS配置文件
    打開配置文件/private/etc/hosts,把咱們的服務器域名對應到回送地址127.0.0.1上,這樣就能夠直接本地進行域名訪問。文件前3行配置是系統默認配置,咱們平時訪問的localhost就是經過該文件直接解析成對應的IP地址進行本地訪問的,其中127.0.0.1IPv4標準,::1IPv6標準。其實咱們平時經過域名訪問網址時,都會首先訪問這個本地的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
複製代碼
  • 驗證
    最後咱們在配置的服務器根路徑下加入測試的HTML文件來進行測試,結果以下:

說明咱們的HTTP服務器已經配置成功了!apache

搭建HTTPS服務器

咱們只須要在HTTP服務器的基礎上配置HTTPS就能夠了。瀏覽器

  • 建立自簽名SSL/TLS證書
    首先使用OpenSSL建立私鑰文件
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文件,找到對應的SSLCertificateFileSSLCertificateKeyFile字段,加入以下代碼:

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服務器已經搭建成功了,儘管不是「安全」的訪問!接下來咱們要進行一些操做使訪問變得「安全」。

  • 建立安全的HTTPS訪問
    所謂建立安全的HTTPS訪問,就是讓瀏覽器信任服務器頒發的公鑰證書,由於咱們的證書沒有添加到瀏覽器信任列表,因此瀏覽器會提示咱們「不安全」。廢話很少說,首先建立CA根證書:

建立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/indexhttps://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.commywebsite2.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 URLhost仍是mywebsite2.com,可是它確實是由 mywebsite.com來處理的,經過訪問mywebsite.com資源redirect.php文件,進而重定向到test.php文件。說明咱們反向代理服務器已經搭建成功了!

如今咱們介紹下ProxyPassReverse的做用,咱們把配置文件的這一項配置去掉,重啓服務器再次訪問http://mywebsite2.com/redirect.php

和上圖對比能夠看到請求的Request URLhostmywebsite.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/

相關文章
相關標籤/搜索