Nginx 正向代理和反向代理

前言

最近在捣腾代理,要做个内网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命令查看监听端口,
这里写图片描述

接下来使用curl命令设置代理访问百度首页。
Nginx 正向代理和反向代理_第1张图片
访问成功。

五、反向代理配置

对于反向代理也很简单,如下,

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,
Nginx 正向代理和反向代理_第2张图片

然后我们再访问新浪,
Nginx 正向代理和反向代理_第3张图片
可以看出,此时虽然我们想访问的是新浪,但是实际返回的还是百度。下面我们在上面反向代理的基础上添加一个空的server配置,只返回404错误。
Nginx 正向代理和反向代理_第4张图片
此时,结果和我们预期的一致了,未匹配的全都走第一条server,返回404,也就控制了那些网站能访问,哪些不能访问,但是这明显不是nginx该考虑的。因为nginx的优势不在于控制访问,相比之下,squid的ACL才是更明智的选择,这就是后话了。

由此,我们可以看出,对于正向代理,Nginx没法控制用户访问的资源,对于所有访问只管转发。这对于内网需要管理网络访问来说肯定是不行的。而对比反向代理,是可以控制用户访问的网络资源的。只代理允许访问的网址,不允许访问的网址到了代理服务器也出不去。

你可能感兴趣的:(Nginx)