最近在捣腾代理,要做个内网yum源代理,之前没接触过代理这些个东西,折腾完记录一下吧。
目前Nginx一般都是使用源码编译,没有现成的rpm包。下载网址:http://nginx.org/download/。里面有各个版本的Nginx,随便找个版本下载即可,尽量使用新版本,至少bug少一点,功能支持也多一点。
Nginx依赖一些组件,需要提前安装好,比如pcre和zlib,如果要使用https相关模块,还需要安装openssl组件。如果是CentOS系统的话,直接用yum命令安装就好了,方便快捷。
yum install openssl* pcre* zlib*
依赖组件安装好后,就可以开始编译Nginx了。解压Nginx压缩包,进入到目录,执行千篇一律的编译命令。
./configure
make && make install
如果需要使用ssl模块,在configure时添加ssl模块,
./configure --with-http_ssl_module
make && make install
然后就OK了。
Nginx的默认安装根目录是/usr/local/nginx,因此它的命令,配置文件都在这个目录。为了方便,可以把Nginx的命令路径添加到环境变量中,这样就不要用绝对路径调用命令了。
export PATH=$PATH:/usr/local/nginx/sbin
代理一般分为正向代理和反向代理。
正向代理是一个位于客户端和原始服务器之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。
反向代理实际运行方式是代理服务器接受网络上的连接请求。它将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给网络上请求连接的客户端,此时代理服务器对外就表现为一个服务器。
可以这么认为,对于正向代理,代理服务器和客户端处于同一个局域网内;而反向代理,代理服务器和源站则处于同一个局域网内。
Nginx的配置文件为/usr/local/nginx/conf/nginx.conf。一般我们不直接在该文件里配置我们的代理,转而使用include的方式,把我们的配置独立成另一个配置文件。
...
http {
...
keepalive_timeout 65;
include yumproxy.conf;//添加自己的配置文件
}
这样我们就可以在yumproxy.conf文件里配置我们的代理了。
正向代理的配置很简单,其实两个语句就行了。
server {
resolver 192.168.0.1;
location / {
proxy_pass http://$http_host$request_uri;
}
}
其中,
resolver表示DNS服务器
location表示匹配用户访问的资源,并作进一步转交和处理,可用正则表达式匹配
proxy_pass表示需要代理的地址
$http_host 表示用户访问资源的主机部分
$request_uri 表示用户访问资源的URI部分。
如,http://nginx.org/download/nginx-1.6.3.tar.gz,则$http_host=nginx.org,$request_uri=/download/nginx-1.6.3.tar.gz。
可以不设置监听端口号,nginx默认监听80端口,除非你要修改监听端口,可以用listen字段指定。
可以看出,对于正向代理,只是对用户的访问进行一个转发,不做其他处理。
下面我们实际验证一下这个正向代理是否有效,找了两台虚拟机,一台用nginx搭建正向代理,另一台使用该代理访问,以百度为例。
先确认nginx服务启动,用netstat命令查看监听端口,
对于反向代理也很简单,如下,
server {
server_name www.baidu.com;
location / {
proxy_pass http://www.baidu.com/;
}
}
其中,server_name字段用于匹配用户访问资源的主机名称。proxy_pass字段同样表示转交的访问。
与正向代理不同,反向代理是指定了特定的网址。其实也就是限定了访问的对象。指定用户访问www.baidu.com时,只能去百度。如果你把proxy_pass的网址替换为新浪的,那就会出现用户明明要访问百度,却跑到新浪去了。这就是代理劫持了。另外,server_name可以匹配多个主机名,用空格分开即可,也可以用正则表达式匹配主机名。
但是特别要注意一点,对于没有匹配到的访问,nginx会默认走第一条server配置,所以一般我们将第一条server设置为阻止页面。
我们可以实际验证一下。先按上述配置反向代理,访问百度,正常返回,注意百度的ETAG,
然后我们再访问新浪,
可以看出,此时虽然我们想访问的是新浪,但是实际返回的还是百度。下面我们在上面反向代理的基础上添加一个空的server配置,只返回404错误。
此时,结果和我们预期的一致了,未匹配的全都走第一条server,返回404,也就控制了那些网站能访问,哪些不能访问,但是这明显不是nginx该考虑的。因为nginx的优势不在于控制访问,相比之下,squid的ACL才是更明智的选择,这就是后话了。
由此,我们可以看出,对于正向代理,Nginx没法控制用户访问的资源,对于所有访问只管转发。这对于内网需要管理网络访问来说肯定是不行的。而对比反向代理,是可以控制用户访问的网络资源的。只代理允许访问的网址,不允许访问的网址到了代理服务器也出不去。