NGINX学习(三)--nginx做反向代理

NGINX很重要的一个应用是做反向代理,

反向代理(Reverse Proxy)方式是指通过代理服务器来接受Internet上的连接请求,然后将请求转发给内部网络上的服务器,并且从内部网络服务器上得到的结果返回给Internet上请求连接的客户端,此时代理服务器对外就表现为一台服务器。当一台代理服务器能够代理外部网络上的访问请求来访问内部网络时,这种代理服务器的方式成为反向代理服务。反向代理服务器经常用于web服务器,此时代理服务器在外部网络看来就是一台web服务器,而实际上反向代理服务器并没有保存任何网页的真实数据,所有的静态网页和动态程序都保存在内部网络的web服务器上。因此,对反向代理服务器的攻击并不会使web网站数据遭到破坏,这在一定程度上增强了web服务器的安全性。

反向代理服务器通常也称为web服务加速器,此时反向代理服务器就具有了代理缓存的功能,也就是说,反向代理服务器在接收客户端的请求后,首先从源服务器(内部网络上的web服务器)上获取内容,然后把内容返回给用户,同时,也会把内容保存到代理服务器上一份,这样日后再接收同样的信息请求时,他会把本地缓存里的内容直接发给用户,以此减少后端web服务器的压力,提高响应速度。这其实就是缓存服务器所实现的功能。

server {  
      listen      80;                                                        
      server_name  localhost;                                              
      client_max_body_size 1024M;

      location / {
          proxy_pass http://localhost:8080;
          proxy_set_header Host $host:$server_port;
      }
  } 

1.1多域名跳转应用实例

         多域名跳转的需求在web应用配置中经常会用到,Apache虽然也可以实现类似功能,但是实现比较复杂,而通过nginx可以轻松实现。

         这里列举一个简单的应用实例。假设一个网站有2个域名,分别是www.fjp.com和www.gxl.com,要实现当用户访问域名www.fjp.com请求通过nginx代理到192.168.66.90的8080端口的web目录下,而当管理员访问www.fjp.com/admin时请求代理到192.168.66.90的8080端口的admin目录下,而当用户访问www.gxl.com时将请求代理到192.168.66.90的8080端口的wap目录下。只需要再nginx配置中做如下设置即可。

         为了重点说明反向代理的配置。这里仅列出nginx配置文件中的server配置段,而省略了其他段的配置:

         server       www.fjp.com

         location    /        {

         proxy_pass       http:192.168.66.90:8080/web/;

         }

         location    /admin     {

         proxy_pass       http:192.168.66.90:8080/admin;

         }

         server       www.gxl.com

         location    /        {

         proxy_pass       http:192.168.66.90:8080/wap/;

         }

 

1.2通过nginx重定向实现新旧域名过渡

         在web应用中,需要网页重定向的情况有很多种,例如网页目录结构变动,网页的扩展名改变,网站域名改变,网页重命名等。当因为某种需求,需将网站老的域名用新的域名进行替换,单同时为了不丢失来自搜索引擎的流量,旧的域名也需要在一段时间内能够访问,并且要实现在用旧的域名访问网站请求自动转到新的域名上,这个时候就需要配置新旧域名过渡。在nginx下配置域名过渡的方法非常简单,有两种方法可以实现:

要求:访问www.fjp.com的请求,自动跳转到www.gxl.com对应的URL路径下

         srver {

        server_name  www.fjp.com;

        rewrite ^/(.*)$ http://www.gxl.com/$1 permanent;

        }

    server {

        listen       80;

        server_name  www.gxl.com;

         这个配置使用了nginx的重定向功能,通过rewrite模块的permanent参数实现永久重定向的HTTP状态301.

        

         另外也可以通过判断nginx核心变量host实现重定向功能:

             server {

        listen       80;

        server_name  www.gxl.com www.fjp.com;

        if ($host != 'www.gxl.com') {

        rewrite ^/(.*)$ http://www.gxl.com/$1 permanent;

        }

 

1.3location命令应用实例

         location命令在Nginx配置中最常见,也最灵活。通过location命令能完整web系统中的各种特殊功能和配置。下面介绍location命令常见的匹配规则以及规则的优先级,首先看下面四个例子:

         location = / {

                  [ config A ]

}

 

location / {

         [ config B ]

}

 

location ^~ /images/ {

         [ config C ]

}

 

location ~* .(gif|jpg|jpeg|swf)$ {

         [ config D ]

}

 

         在这个例子中,第一个例子表示只匹配“/”目录的查询,优先级最高,其他三个例子中的匹配优先级依次降低。第二个例子匹配以“/”开始的所有查询,即所有查询都匹配。第三个例子匹配以“/images/”开始的查询,不再检查正则表达式。第四个例子匹配以gif,jpg,jpeg,swf结尾的文件,但匹配优先级低于第三个例子。

 

nginx功能强大,它几乎可以实现Apache所有的功能,下面简单介绍nginx中目录权限控制,IP访问控制,文件访问权限如何实现。

要实现如apache一样的目录列表,可添加如下配置:

可以看到,我们现在无法看到根目录下的这个文件,等我们在主配置文件中添加如下配置端:

location / {

root   html;

index  index.html index.php;

autoindex on;                                                 #开启目录浏览功能

autoindex_exact_size off;                          #显示目录的详细大小

autoindex_localtime on;                             #显示目录的详细时间

}

重启nginx服务以后,再在浏览器里面访问:

提示:这个意思就是我们可以浏览root定义的目录下面的文件,如果,我们想在整个网站中都开启这个功能,那么我们需要在server段里面定义网站的根目录。

 

要实现IP访问控制,需要使用ngx_http_access_module模块,此模块可以限制某些IP地址的客户端访问,看下面一个例子:

location / {

root   html;

index  index.html index.php;

autoindex on;

autoindex_exact_size off;

autoindex_localtime on;

allow 192.168.147.136;

deny 192.168.147.0/32

deny all;

}

这样就是只允许136这台主机访问,拒绝其他所有主机。

 

要禁止访问某个目录,可添加如下设置:

    location ~* ^/work/ {

        deny all;

    }

里面不能设置单个ip或者允许单个IP。

 

要禁止访问以TXT或doc为后缀的文件,可添加如下设置:

location ~* .(txt|doc)$ {

root html;

deny all;

}

通过上面这些功能介绍,可以发现nginx非常灵活,功能也非常强大,是一台高性能的Web服务器。

个人理解,如有错误,欢迎指正!
原文地址:https://www.cnblogs.com/gllegolas/p/11720299.html