基于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,显示如下图:

恭喜你,一个HTTP服务器已经搭建成功了!是不是很简单?接下来介绍如何具体定制化配置Apache服务器。

搭建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>

然后加入以下代码:

<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访问服务器。

注意:两个虚拟主机的根路径必须在服务器根路径下。

  • 更改本地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服务器已经配置成功了!

搭建HTTPS服务器

我们只需要在HTTP服务器的基础上配置HTTPS就可以了。

  • 创建自签名SSL/TLS证书
    首先使用OpenSSL创建私钥文件
openssl genrsa -out mywebsite.key 2048

然后利用私钥创建自签名证书

openssl req -new -x509 -key mywebsite.key -out mywebsite.cer

需要自己填写一些证书信息,如下图:

红框标注选项最好填写虚拟主机域名,如果不按要求填写也可以使用,同理我们创建另一个虚拟主机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服务器的基础配置,简单的实现了预期功能。服务器配置很细碎繁琐,能根据不同代码实现更为复杂精细的配置,更为详细的功能具体请参考官方文档,本人没有做深入研究。本文如有错误,希望指正,一起学习,共同进步,不胜感激!

参考链接

http://www.liuchungui.com/blog/2015/09/25/zi-jian-zheng-shu-pei-zhi-httpsfu-wu-qi/
http://beyondvincent.com/2014/03/17/2014-03-17-five-tips-for-using-self-signed-ssl-certificates-with-ios/
http://www.cnblogs.com/zemliu/archive/2012/04/18/2454655.html
http://httpd.apache.org/docs/2.4/

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,126评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,254评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,445评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,185评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,178评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,970评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,276评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,927评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,400评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,883评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,997评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,646评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,213评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,204评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,423评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,423评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,722评论 2 345

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,599评论 18 139
  • title: apache安装与反向代理配置date: 2017-11-04 21:13:48tags: apac...
    chase_阅读 2,015评论 0 0
  • http协议及Apache服务 http协议 什么是http? http全称为超文件传输协议(Hyper text...
    魏镇坪阅读 2,251评论 0 1
  • 服务器https配置 配置https操作说明文档 1、查看服务器环境配置(tomcat和apache合并使用) 2...
    南京杨小兵阅读 8,806评论 0 9
  • 上周四,与凡凡她们讨论模特时,就考虑到若出现变故,模特若不能正常出场,我们该如何应对? 那谁来当模特?当时第一个想...
    苗苗在故乡阅读 476评论 0 3