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/