网站建设

apache https反向代理设置方案

通过设置一台apache服务器完成对
https://10.6.177.66内容的访问,后来经过学习才了解,我们其实就是需要在自己的apache服务器中,创建一个https://10.6.177.66的反向代理。首先介绍一下何为反向代理:
一.反向代理的概念
反向代理也就是通常所说的WEB服务器加速,它是一种通过在繁忙的WEB服务器和Internet之间增加一个高速的WEB缓冲服务器(即:WEB反向代理服务器)来降低实际的WEB服务器的负载。
Web服务器加速(反向代理)是针对Web服务器提供加速功能的。它作为代理Cache,但并不针对浏览器用户,而针对一台或多台特定Web服务器(这也是反向代理名称的由来)。实施反向代理(如上图所示),只要将Reverse Proxy Cache设备放置在一台或多台Web服务器前端即可。当互联网用户访问某个WEB服务器时,通过DNS服务器解析后的IP地址是Reverse Proxy Server的IP地址,而非原始Web服务器的IP地址,这时Reverse Proxy Server设备充当Web服务器,浏览器可以与它连接,无需再直接与Web服务器相连。因此,大量Web服务工作量被卸载到反向代理服务上。不但能够防止外部网主机直接和web服务器直接通信带来的安全隐患,而且能够很大程度上减轻web服务器的负担,提高访问速度。
二.win+apache实现ssl
首先,到http://hunter.campbus.com/去下载和自己的apache版本相同的的Apache_xxx-xxxOpenssl_xxx-Win32.zip。
我用的是Apache_2.0.59,
安装程序地址: http://apache.justdn.org/httpd/binaries/win32/apache_2.0.59-win32-x86-no_ssl.msi
Apache_2.0.59-Openssl_0.9.8c-Win32.zip地址:
http://209.61.202.80/apache/Apache_2.0.59-Openssl_0.9.8c-Win32.zip)。
解压缩后找到这5个文件mod_ssl.so(modules目录),ssl.conf,ssl.default.conf(conf目录, 其中default.conf作为备份),libeay32.dll, ssleay32.dll(这2个都在bin目录)。把它们全都复制到你自己的apahce下的对应目录 。
###############################################################################
接下来,更改设置文件
对于httpd.conf和ssl.conf,如果你的服务器没有域名,那么servername就填ip好了。
比如:ServerName 172.18.42.123:80(httpd.conf)
ServerName 172.18.42.123:443(ssl.conf)

打开httpd.conf:
找到#LoadModule ssl_module modules/mod_ssl.so,去掉前面的‘#‘,这样就在启动时加载了ssl模块。

打开ssl.conf:
找到#;和#;,把前面的’#‘号都去掉,否则启动apache时还要加参数,麻烦。
如下设置:
SSLMutex default
SSLCertificateFile conf/server.crt(服务器证书的位置)
SSLCertificateKeyFile conf/server.key (服务器私钥的位置)
SSLCACertificateFile conf/ca.crt (CA根证书的位置,进行客户端验证时需要)
上面的文件被放到了conf目录下。
DocumentRoot “xxxxx” (指向要ssl加密认证的文档目录,比如”f:/http”)
SSLVerifyClient require (去掉前面的‘#’号,进行客户端验证时需要)
SSLVerifyDepth 1 (去掉前面的‘#’号,把10改为1,进行客户端验证时需要)

##############################################################################
现在,就要制作证书了
去openvpn.net下载并安装openvpn。
http://openvpn.net/release/openvpn-2.0.9-install.exe
这是一个虚拟个人网络制作工具,他能完美的在win(linux,BSD也行)下制作根、服务器、客户端证书。
安装完毕后,开始-程序-附件-命令提示符,进到openvpn的easy-rsa目录,比如:
c:program filesopenvpneasy-rsa>
输入: init-config 回车
会产生几个文件,切换出来,打开vars.bat文件,修改其中的KEY_COUNTRY(国家2位字母), KEY_PROVINCE(省2位字母), KEY_CITY(城市), KEY_ORG(组织), KEY_EMAIL(电子邮箱)这几个参数,免的后面制证时

反复输入麻烦。保存退出,继续使用命令提示符。
依次输入以下两个命令,当然是分别回车喽:
vars
clean-all (这两个是准备工作)

####################################################################################
1. 建立CA根证书
输入build-ca 回车(这个就是建立CA根证书啦)
然后显示:
ai:/usr/share/openvpn/easy-rsa # ./build-ca
Generating a 1024 bit RSA private key
…………++++++
………..++++++
writing new private key to ‘ca.key’
—–
You are about to be asked to enter information that will be incorporated into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blan k
For some fields there will be a default value,
If you enter ‘.’, the field will be left blank.
—–
Country Name (2 letter code) [KG]: 国家名2位字母,默认的参数就是我们刚才修改过的。
State or Province Name (full name) [NA]: 省、州名2位字母
Locality Name (eg, city) [BISHKEK]: 城市名
Organization Name (eg, company) [OpenVPN-TEST]: 组织名
Organizational Unit Name (eg, section) []: 组织里的单位名
Common Name (eg, your name or your server’s hostname) []:这个是关键,应该输入颁发根证书单位的域名
,不过因为是根证书,所以怎么填都无所谓。只有服务器证书才需要认真填。
Email Address [me@myhost.mydomain]: 电子邮箱

好了,CA根证书制作完成!在keys目录下,它的名字就叫ca.crt,CA的私钥是ca.key

#######################################################################
2. 制作服务器证书:
在命令提示符下,输入
build-key-server server 回车
你会看到和上面很相似的东西,但要注意
这里的Common Name (eg, your name or your server’s hostname) []: 这个才是真正的关键。这里应该输入服务器的域名比如www.xxx.com。
如果没有域名,就应该填ip,与httpd.conf和ssl.conf里的设置对应,
ServerName 172.18.42.123:80(httpd.conf)
ServerName 172.18.42.123:443(ssl.conf)
也就是说填:172.18.42.123

接下来看到 a challenge password []:填不填随便
an optional company name []: 填不填随便

sign the certificate? [y/n] 敲y回车。用CA根证书对服务器证书签字认证。
1 out 1 certificate requests certified,commit? [y/n] 敲y回车,确认。

好了,建好了在keys目录下的server.crt(证书)和server.key(私钥) #######################################################################
3. 制作客户端证书:
在命令提示符下,输入
build-key client1 回车
又是一通国家省市组织等等,comman name也是随便填的。
然后 :
a challenge password []:填不填随便
an optional company name []: 填不填随便

sign the certificate? [y/n] 敲y回车。用CA根证书对客户端证书签字认证。
1 out 1 certificate requests certified,commit? [y/n] 敲y回车,确认。

好了,建好了在keys目录下的client1.crt(客户端证书)和client1.key(私钥)

等等, .crt的客户端证书是不能使用的,必须把它转化为.pfx格式的文件!!
所以,还是在命令提示符下,输入
openssl 回车
看到openssl>;
再输入 :
pkcs12 -export –in keys/client1.crt -inkey keys/client1.key -out keys/client1.pfx 回车,
看到Enter export password:会要求你建立客户端证书的输出密码
verifying-Enter export password再确认一遍,好了!
######################################################################## 把keys目录下的ca.crt和server.crt,server.key都复制到apache的conf目录下,(ssl.conf需要) ca.key自己保留吧,找个合适的地方储存起来.

#########################################################################
客户端安装证书
打开internet explorer(IE),工具-internet选项-内容-证书,点选’个人’ 再点击导入,把客户端证书client1.pfx导入到个人组里(别忘了扩展名是pfx)。这里还要输入刚才建立的输出密码才能导入呢。
接着,点选’受信任的根证书颁发机构’,点击导入,把CA根证书ca.crt导入到受信任的根证书颁发机构里。
#########################################################################
好啦,重新启动apache,打开IE,
在地址栏里输入https://172.18.42.123或者域名,弹出个窗口要选择个人的数字证书。
点选,然后确定。
如果服务器证书的common name填写正确的话,你就可以直接进入网站了,看到右下角的小锁头(可靠的SSL128位)。
如果服务器证书的common name填写不正确,就会弹出个‘安全警报’框,告诉你3条:
1.安全证书由信任的站点颁发
(如果说是由不信任的站点颁发,那就是你的ca根证书ca.crt没有导入到ie的受信任的根证书颁发机构里)

2.安全证书的日期有效
(这个日期缺省是10年,可以在openvpn的easy-rsa目录下的openssl.cnf里调整修改,然后重新制作一整套证书(openssl.cnf看起来像拨号网络的快捷方式,要用记事本,写字板打开修改))

3.“安全证书上的名称无效,或者与站点名称不匹配”
这就是服务器证书的common name填写不正确所致,不过这也没关系,有人好像愿意这样。我是不想看到这个警告框,烦人。

即使有安全警报,你仍能进入网站,看到右下角的小锁头(可靠的SSL128位)

#################################
最后,成功啦!用吧。
三.设置反向代理
修改confhttpd.conf文件
先启动两个模块
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so
然后在文件最后加上
SSLProxyEngine on
ProxyRequests Off
ProxyPass / https://10.6.177.66
ProxyPassReverse / https://10.6.177.66

ok了,重新启动apache,输入https://172.18.42.123 ,什么效果,自己试试就知道了!

apache做http和https反向代理

首先是库之类的环境配置,

如果是编译的,./configure附加–enable-proxy参数,把代理模块编译进来。

然后/usr/sbin/httpd -l,显示

Loaded Modules:
core.c
mod_access.c
mod_auth.c
mod_include.c
mod_log_config.c
mod_env.c
mod_setenvif.c
mod_proxy.c
proxy_connect.c
proxy_ftp.c
proxy_http.c
prefork.c
http_core.c
…….
带有proxy前缀的模块即表示已经启用代理。
如果是安装好的,就在配置文件http.conf里启用相应的模块

LoadModule proxy_module modules/mod_proxy.so

LoadModule proxy_http_module modules/mod_proxy_http.so

可以通过/usr/sbin/httpd -D DUMP_MODULES,显示

Loaded Modules:

……

proxy_module (shared)
proxy_http_module (shared)
proxy_connect_module (shared)

就可以了。

现在可以开始配置虚拟主机——

如:

<VirtualHost *:80>
ServerAdmin webmaster@dummy-host.example.com
ServerName www.b.org
ProxyRequests Off
<Proxy *>
Order deny,allow
Allow from all
</Proxy>
ProxyPass / http://127.0.0.1:9000/
ProxyPassReverse / http://127.0.0.1:9000/
</VirtualHost>

将www.b.org这个网址指向传递到htttp://127.0.0.1:9000这个地址

这样对www.b.org的访问,返回的数据将是来自http://127.0.0.1:9000

配置https访问,即ssl加密访问:

首先要开启apache的ssl访问能力,跟随http://blog.csdn.net/ownfire/article/details/7686746所写配置即可。

NameVirtualHost *:443    或者    NameVirtualHost www.abc.net:443

<VirtualHost www.abc.net:443>
ServerName www.abc.net
SSLEngine on
SSLProxyEngine on
SSLCertificateFile /etc/httpd/conf/server.crt
SSLCertificateKeyFile /etc/httpd/conf/server.key

ProxyRequests Off
<Proxy *>
Order deny,allow
Allow from all
</Proxy>

ProxyPass /test https://127.0.0.1/
ProxyPassReverse /test https://127.0.0.1/
</VirtualHost>

将对https://www.abc.net/test这个网址的访问指向https://127.0.0.1/,SSLCertificateFile和SSLCertificateKeyFile分别是配置ssl时生成使用的密钥文件。

apache下开启ssl访问,即https

openssl Windows下已编译好的命令行程序:

http://downloads.sourceforge.net/gnuwin32/openssl-0.9.8h-1-bin.zip

 

lamp开启ssl

首先需要安装openssl和apache的ssl模块,执行:

yum install openssl mod_ssl -y

即可,接下来的配置方法和以下内容类似

 

wamp开启SSL
1.#修改httpd.conf文件
LoadModule ssl_module modules/mod_ssl.so
Include conf/extra/httpd-ssl.conf
#去掉上面两行前的”#”
2.#修改conf/extra/httpd-ssl.conf
SSLCertificateFile “D:/wamp/Apache2/bin/server.crt”
SSLCertificateKeyFile “D:/wamp/Apache2/bin/server.key”
3.#修改为你生成证书的文件位置
DocumentRoot “E:/www”  #修改 DocumentRoot的值与httpd.conf文件的DocumentRoot保持一致.
4.#解决APACHE无法启动
68:SSLMutex  “file:D:/ProgramFiles2003/wamp/wamp/Apache2/logs/ssl_mutex”
#修改为68: SSLMutex  default
5.#把httpd-ssl.conf文件中所有的apache的路径替换为你的APACHE的路径

#到此配置文件修改完毕

二,证书生成的方法
#命令行中进入apache/bin目录下执行如下:
openssl req -config ../conf/openssl.cnf -new -out server.csr -keyout server.pem

其中openssl.cnf为apache自带的openssl配置文件,引用到该文件的完整路径

输入两次密码,随便什么密码,然后一直回车,跳过下面的输入

#签发证书
openssl rsa -in server.pem -out server.key

输入刚才制定的密码

#生成密钥文件
openssl x509 -in server.csr -out server.crt -req -signkey server.key -days 365
#生成证书文件

把  server.key,server.crt copy到conf文件夹下

重新启动APACHE
OK,恭喜你可以正常使用HTTPS来访问你的根目录了。

 

当然我们还需要ssl的虚拟主机

那就要配置虚拟主机文件,在文件中专门写一个监听443端口的虚拟主机,例如:

<VirtualHost woosau:443>
DocumentRoot /home/ownfire/www/woosau
ServerName woosau
SSLEngine on
SSLCertificateFile /etc/httpd/conf/server.crt
SSLCertificateKeyFile /etc/httpd/conf/server.key
</VirtualHost>

因为规定主机名是woosau,所以还要写一个虚拟主机名规则

NameVirtualHost woosau:443

好了,完毕,这样就可以访问https://woosau

 

apache mod_rewrite uri重写 http转https

一:目的

本文旨在提供如何用Apache重写规则来解决一些常见的URL重写方法的问题,通过常见的
实例给用户一些使用重写规则的基本方法和线索。

二:为什么需要用重写规则?
一个网站,如果是长期需要放在internet上提供服务,必定会有不断地更新和维护,如临
时转移到其它服务器进行维护,重新组织目录结构,变换URL甚至改变到新的域名等等,
而为了让客户不会因此受到任何影响,最好的方法就是使用Apache Rewrite Rule(重写
规则)。

三: 重写规则的作用范围
1) 可以使用在Apache主配置文件httpd.conf中
2) 可以使用在httpd.conf里定义的虚拟主机配置中
3) 可以使用在基本目录的跨越配置文件.htaccess中

四:重写规则的应用条件
只有当用户的WEB请求最终被导向到某台WEB服务器的Apache后台,则这台WEB服务器接受
进来的请求,根据配置文件该请求是主配置还是虚拟主机,再根据用户在浏览器中请求的
URI来配对重写规则并且根据实际的请求路径配对.htaccess中的重写规则。最后把请求
的内容传回给用户,该响应可能有两种:

1) 对浏览器请求内容的外部重定向(Redirect)到另一个URL。
让浏览器再次以新的URI发出请求(R=301或者R=302,临时的或是永久的重定向)
如:一个网站有正规的URL和别名URL,对别名URL进行重定向到正规URL,或者网站改换
成了新的域名
则把旧的域名重定向到新的域名(Redirect)

2) 也可能是由Apache内部子请求代理产生新的内容送回给客户[P,L] 这是Apache内部根据重写后的URI内部通过代理模块请求内容并送回内容给客户,而客户
端浏览器并
不知道,浏览器中的URI不会被重写。但实际内容被Apache根据重写规则后的URI得到。
如:在公司防火墙上运行的Apache启动这种代理重写规则,代理对内部网段上的WEB服务
器的请求。

五:重写规则怎样工作?
我们假定在编译Apache时已经把mod_rewrite编译成模块,确信你的httpd.conf中有
LoadModule rewrite_module libexec/mod_rewrite.so
并且在Addmodule中有
Addmodule mod_rewrite.c
则可以使用重写规则。
当外部请求来到Apache,Apache调用重写规则中的定义来重写由用户浏览器指定请求的
URI,最后被重写的URI如果是重定向,则送由浏览器作再一次请求;如果是代理则把重写
后的URI交给代理模块请求最终的内容(Content),最后把内容送回给浏览器。

六: 何时使用.htaccess中的重写规则定义?
假如你对你的的网站内容所在的服务器没有管理员权限,或者你的网站放在ISP的服务器
上托管等等条件下,你无法改写主配置文件,然而你可以对你的WEB站点内容所在的目录
有写权限,则你可以设置自己的.htaccess
文件达到同样的目的。但你需要确定主配置文件中对你的网站所在的目录定义了下面的内
容:

Options Indexes FollowSymLinks
AllowOverride all

否则你的.htaccess不会工作。

七: 应用举例
假定Apache被编译安装在主机192.168.1.56的/usr/local/apache/ 目录下面,我们编
译进了重写和代理模块。

1) 隐藏Apache下的某个目录,使得对该目录的任何请求都重定向到另一个文件。

a> httpd.conf的实现方法

我们放下面的部分到/usr/local/apache/conf/httpd.conf
options Indexes followsymlinks
allowoverride all
rewriteengine on
rewritebase /
rewriterule ^(.*)$ index.html.en [R=301] 注:rewriteengine on 为重写引擎开关,如果设为off,则任何重写规则定义将不被应
用,该开关的另一好处就是如果为了临时拿掉重写规则,则改为off再重启动Apache即
可,不必将下面一条条的重写规则注释掉。
rewritebase / 的作用是如果在下面的rewriterule定义中被重写后的部分(此处为文件
名index.html.en)前面没有/,则是相对目录,相对于这个rewritebase后面的定义也就
是/usr/local/apache/htdocs/index.html.en,否则,如果此处没有rewritebase /这
一项,则被重写成
http://192.168.1.56/usr/local/apache/htdocs/manual/index.html.en ,显然是
不正确的。

不过这里我们也可以不用rewritebase / , 而改为
rewriteengine on
rewriterule ^(.*)$ /index.html.en [R=301] 或者
rewriteengine on
rewriterule ^(.*)$ http://192.168.1.56/index.html.en [R=301]

b> .htaccess的实现方法

我们先放下面的部分到httpd.conf
options Indexes followsymlinks
allowoverride all
然后放下面的部分到/usr/local/apache/htdocs/manual/.htaccess中
rewriteengine on
rewritebase /
rewriterule ^(.*)$ index.html.en [R=301]

注:对文件.htaccess所作的任何改动不需要重启动Apache.

问:要是把这个manual目录重定向到用户jephe的自己的主目录呢?
用下面的.htaccess方案。
rewriteengine on
rewritebase /~jephe/
rewriterule ^(.*)$ $1 [R=301]

则对manual目录下任何文件的请求被重定向到~jephe目录下相同文件的请求。

2) 转换www.username.domain.com的对于username的主页请求为
www.domain.com/username

对于HTTP/1.1的请求包括一个Host: HTTP头,我们能用下面的规则集重写
http://www.username.domain.com/anypath 到 /home/username/anypath

Rewriteengine on
rewritecond %{HTTP_HOST} ^www.[^.]+.host.com$
rewriterule ^(.+) %{HTTP_HOST}$1 [C] rewriterule ^www.([^.]+).host.com(.*) /home/$1$2

注:
rewritecond 条件重写规则,当满足后面定义的条件后才会应用下面的重写规则,
rewritecond有各种变量
,请查阅相关文档。

3) 防火墙上的重写规则代理内部网段上服务器的请求。

NameVirtualhost 1.2.3.4
servername www.domain.com
rewriteengine on
proxyrequest on
rewriterule ^/(.*)$ http://192.168.1.3/$1 [P,L] 注:当外部浏览器请求www.domain.com时被解析到IP地址1.2.3.4 ,Apache 交出
mod_rewrite处理转换成
http://192.168.1.3/$1后再交由代理模块mod_proxy得到内容后传送回用户的浏览器。
4) 基本预先设定的转换MAP表进行重写 rewritemap

转换www.domain.com/{countrycode}/anypath 到Map表中规定的URI,上面是虚拟主机
中的定义

rewritelog /usr/local/apache/logs/rewrite.log
rewriteloglevel 9

rewriteengine on
proxyrequest on
rewritemap sitemap txt:/usr/local/apache/conf/rewrite.map
rewriterule ^/([^/]+)+/(.*)$ http://%{REMOTE_HOST}::$1 [C] rewriterule (.*)::([a-z]+)$ ${sitemap:$2|http://h.i.j.k/} [R=301,L]

文件/usr/local/apache/conf/rewrite.map的内容如下:

sg http://a.b.c.d/
sh http://e.f.g.h/

注: 当用户请求http://www.domain.com/sg/anypath时被重写为
http://a.b.c.d/anypath .
当需要调试时请用rewritelog and rewriteloglevel 9联合,9为最大即得到最多的调试
信息
最小为1,最小的调试信息,默认为0,没有调试信息。
sitemap的语法是${sitemap: LookupKey | Defaultvalue} ,有些书上把$写成了%是错
误的。

Related Articles

发表回复

Back to top button