配置Apache實現url轉發

  1. 目的

    公司內網的服務或業務系統不宜直接暴露到外部公網上,常見做法是在DMZ區域配置一臺服務器,實現http或https轉發。本次實驗要實現的目標,即在linux服務器上安裝apache httpd server,通過配置實現http/https轉發。

  2. 環境及文件準備

    2.1. 目標系統爲Oracle linux虛擬機,已預裝openssl-0.9.8a, apache-2.2.3

    2.2. apache:apache httpd-2.2.29

    2.3. 依賴包:

      openssl:openssl-1.0.2a.tar.gz

      apr: apr-1.5.1.tar.gz, apr-util-1.5.4.tar.gz,

      zlib: zlib-1.2.8.tar.gz

    注:本文安裝程序採用的是下載源文件後編譯並安裝的方式。

  3. 操作步驟

    主要包括三個步驟,安裝openssl等apache依賴的其他相關程序 -> 安裝apache httpd並設置http代理與反向代理 -> 生成ssl證書並配置虛擬機以及https代理與反向代理。

    步驟1、安裝依賴包

    #### 安裝 apr
    # 首先,解壓tar包
    tar zxvf apr-1.5.1.tar.gz
    # 然後,轉到解壓後的目錄
    cd apr-1.5.1
    # 最後,依次執行configure、編譯和安裝命令
    ./configure --prefix=/usr/local/apr
    make
    make install
    
    #### 安裝 apr-util,步驟基本同上,在執行configure時,指定apr位置
    ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr
    
    #### 安裝 openssl1.0.2a,步驟基本同上,configure命令按如下:
    ./config --prefix=/usr/local/openssl
    # make && make install後的額外步驟:
    # 1)、在/usr/local目錄下添加一個軟鏈接,便於以後設置ssl
    ln -s openssl ssl
    # 2)、在/etc/ld.so.conf文件的最後面,添加如下內容:/usr/local/openssl/lib
    # 3)、執行ldconfig
    ldconfig
    # 4)、添加openssl的環境變量:
    # 在 etc/ 的profile的最後一行,添加:
    export OPENSSL=/usr/local/openssl/bin
    export PATH=$OPENSSL:$PATH:$HOME/bin
    # 5)、退出當前Terminal 命令界面,並重新登陸。注意此步驟不能缺少。
    # 6)、檢測openssl的安裝情況
    cd /usr/local
    ldd /usr/local/openssl/bin/openssl
    # 此步驟執行後會出現類似如下信息:
        linux-vdso.so.1 =>  (0x00007fff3bc73000)
        libdl.so.2 => /lib64/libdl.so.2 (0x00007fc5385d7000)
        libc.so.6 => /lib64/libc.so.6 (0x00007fc538279000)
        /lib64/ld-linux-x86-64.so.2 (0x00007fc5387db000)
    # 查看路徑
    which openssl
    # 顯示:/usr/local/openssl/bin/openssl
    # 查看版本
    openssl version
    # 顯示: OpenSSL 1.0.2a 27 Mar 2015
    # 至此,openssl-1.0.2a安裝完畢。
    
    #### 安裝zlib,步驟同上
    ./configure

    步驟2、安裝httpd並配置httpd.conf

    tar zxvf httpd-2.2.29.tar.gz
    cd httpd-2.2.29
    # 在執行configure之前,先執行這句(*詳見:問題及解決辦法4.4章節)
    export LDFLAGS=-ldl
    # 執行configure
    ./configure --prefix=/usr/local/apache --enable-so --enable-ssl=static --with-ssl=/usr/local/openssl --enable-mods-shared=all --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util
    # 編譯和安裝
    make
    make install

    步驟3、生成ssl證書及配置https代理及反向代理

    ssl證書生成過程見問題及解決辦法4.5章節,本處假定已經生成server.crt、server.key文件。則http/https的代理及反向代理配置方法:

    #### 修改apache虛擬機主機配置文件 usr/local/apache/conf/extra/httpd-vhost.conf:
    #使用vi在文件中相應位置添加:
    NameVirtualHost *:443
    
    <VirtualHost *:443>
         DocumentRoot /usr/local/apache/htdocs
         ServerName TechRunner
         SSLEngine on
         SSLProxyEngine on
         SSLCertificateFile /usr/local/apache/conf/server.crt
         SSLCertificateKeyFile /usr/local/apache/conf/server.key
         ProxyRequests off
         ProxyPass / https://****.com/
         ProxyPa***everse / https://****.com/
    </VirtualHost>
    
    #### 配置apache /usr/local/apache/conf/httpd.conf:
    # 指定虛擬主機配置文件並將其附加到主配置文件
    Include conf/extra/httpd-vhosts.conf
    # 指定SSL配置文件並將其附加到主配置文件
    Include conf/extra/httpd-ssl.conf

    最後,啓動apache

    # 若本機僅安裝了一個apache服務器,則可使用如下命令關閉/啓動/重啓/查看狀態:
    service httpd stop/start/restart/status
    # 否則,可通過指定httpd程序和httpd.conf配置文件的方式啓動:
    /usr/local/apache/bin/httpd  -f /usr/local/apache/conf/httpd.conf -k start
  4. 問題及解決辦法

    4.1. 端口占用
    當系統安裝了多個httpd時,若配置不當,可能存在端口(默認80)佔用。此時需要查找並關閉佔用80端口的程序。

    #查看佔用80端口的進程(顯示pid): 
    netstat -pan | grep :80
    #查找並kill掉佔用80端口的所有進程:
    lsof -i :80|grep -v "PID"|awk '{print "kill -9",$2}'|sh

    4.2. 啓動多個httpd進程
    使用命令:
    /usr/local/apache/bin/httpd -f /路徑1/httpd.conf -k start
    /usr/local/apache/bin/httpd -f /路徑2/httpd.conf -k start
    這樣就可以加載不同的配置文件httpd.conf,從而啓動多個httpd(apache)進程了。

    4.3. 如何加載ssl_module
    網上查到的內容,需要通過修改httpd.conf,啓用LoadModule ssl_module modules/mod_ssl.so,但實際上httpd-2.2.26版本httpd.conf文件中無此項,這是因爲它已經內建ssl,不需要再聲明加載此模塊。

    4.4. 安裝httpd時報錯:configure: error: ... Error, SSL/TLS libraries were missing or unusable
    解決辦法:在configure之前,執行如下一句設置環境變量:
    export LDFLAGS=-ldl
    參見:http://www.metsky.com/archives/563.html

    4.5. 製作ssl證書

    一般步驟:

    # 首先,生成服務器密鑰(採用des3算法):
    openssl genrsa -des3 -out server.key 1024
    # 或者採用默認的128位rsa算法,生成密鑰,得到server.key文件
    # openssl genrsa 1024 >server.key
        
    # 其次,生成服務器證書請求文件,並按要求逐一填些相關證書信息:
    openssl req -new -key server.key -out server.csr
    
    # 最終,生成證書(簽證):    
    openssl x509 -req -days 700 -in server.csr -signkey server.key -out server.cert
    # 其中,-days參數指明證書有效期,單位爲天。
    # Signature ok,將crt和key文件放到指定的conf目錄下:
    cp server.crt server.key /usr/local/apache/conf

    4.6. 關於單獨加載proxy_modules

    httpd 安裝完成後,檢查httpd.conf文件,發現未加載proxy_module和proxy_http_module。若存在這種問題,將導致無法配置實現http/https代理與反向代理。經查詢,此問題可以通過單獨編譯和加載proxy_modules的方式來解決。

    首先,進入apache解壓後源碼目錄下的modules/proxy目錄,
    然後,運行如下命令自動編譯、安裝和修改httpd.conf文件,激活mod_proxy模塊:

    apachepath/bin/apxs -c -i -a mod_proxy.c proxy_util.c
    apachepath/bin/apxs -c -i -a mod_proxy_http.c proxy_util.c
    
    # apxs命令選項說明:
    -c 執行編譯操作
    -i 安裝操作,安裝一個或多個動態共享對象到服務器的modules目錄
    -a 自動增加一個LoadModule行到httpd.conf文件,以激活此模塊,若此行存在則啓用之
    -A 與-a類似,但是它增加的LoadModule行前有井號前綴(#)
    -e 需要執行編輯操作,可與-a和-A選項配合使用,
    與-i操作類似,修改httpd.conf文件,但並不安裝此模塊

    執行完後,檢查httpd.conf,發現proxy_modules, proxy_http_modules已經加載。
    最後,重啓apache。

  5. 測試結果及總結
    通過配置apache虛擬機,實現了http/https的自動轉發。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章