• Nginx 反向代理工作原理简介与配置详解


    Nginx反向代理工作原理简介与配置详解

     

    by:授客  QQ1033553122

     

    测试环境

    CentOS 6.5-x86_64

     

    nginx-1.10.0

    下载地址:http://nginx.org/en/download.html

    下载地址:http://pan.baidu.com/s/1skNT7zv

     

    安装nginx

    [root@localhost mnt]# tar -xzvf nginx-1.10.0.tar.gz

    [root@localhost mnt]# cd nginx-1.10.0

    [root@localhost nginx-1.10.0]# ./configure --prefix=/usr/local/ngnix --with-pcre=/mnt/pcre-8.36

    Configuration summary

      + using PCRE library: /mnt/pcre-8.36

      + OpenSSL library is not used

      + using builtin md5 code

      + sha1 library is not found

      + using system zlib library

     

      nginx path prefix: "/usr/local/ngnix"

      nginx binary file: "/usr/local/ngnix/sbin/nginx"

      nginx modules path: "/usr/local/ngnix/modules"

      nginx configuration prefix: "/usr/local/ngnix/conf"

      nginx configuration file: "/usr/local/ngnix/conf/nginx.conf"

      nginx pid file: "/usr/local/ngnix/logs/nginx.pid"

      nginx error log file: "/usr/local/ngnix/logs/error.log"

      nginx http access log file: "/usr/local/ngnix/logs/access.log"

      nginx http client request body temporary files: "client_body_temp"

      nginx http proxy temporary files: "proxy_temp"

      nginx http fastcgi temporary files: "fastcgi_temp"

      nginx http uwsgi temporary files: "uwsgi_temp"

      nginx http scgi temporary files: "scgi_temp"

     

    注:

    1、编译时,指定了pcre安装目录,但是安装出错,解决方法如上,指定源码所在目录

    2、如果不指定--with-pcre 选项,会报类似如下的错误

    3、需要预先安装gcc-c++

     

    [root@localhost nginx-1.10.0]# make && make install

    启动ngnix

    [root@localhost nginx-1.10.0]# /usr/local/ngnix/sbin/nginx -c /usr/local/ngnix/conf/nginx.conf

     

    反向代理工作原理

    客户端向反向代理发送请求,接着反向代理转发请求至目标服务器,并把获得的内容返回给客户端

    反向代理配置

    测试链接:

    http://192.168.1.104/zentaopms/www/index.php

    http://192.168.1.104/zentaopms/www/index.php?m=project&f=create

     

    如上,想通过192.168.1.103代理服务器访问上述测试链接,具体咋操作呢?如下

     

    编辑所使用的配置文件

    [root@localhost nginx-1.10.0]# vim /usr/local/ngnix/conf/nginx.conf

     

    找到“Server”结点,增加入下带背景色内容

        server {

            listen       80;

            server_name  localhost;

     

            #charset koi8-r;

     

            #access_log  logs/host.access.log  main;

     

            location / {

                root   html;

                index  index.html index.htm;

            }

     

            #error_page  404              /404.html;

     

            # redirect server error pages to the static page /50x.html

            #

            error_page   500 502 503 504  /50x.html;

            location = /50x.html {

                root   html;

            }

     

            location /zentaopms/www/ {

                proxy_pass http://192.168.1.104;

            }

            # proxy the PHP scripts to Apache listening on 127.0.0.1:80

            #

            #location ~ .php$ {

            #    proxy_pass   http://127.0.0.1;

            #}

     

    重新加载配置文件

    [root@localhost nginx-1.10.0]# /usr/local/ngnix/sbin/nginx -s reload

     

    访问测试url

    如下,OK

     

     

    说明:

    传递请求给被代理服务器

    为了把请求传递给被代理服务器,需要在location中指定proxy_pass机制。如下

     

    location /some/path/ {

        proxy_pass http://www.example.com/link/;

    }

     

    proxy_pass既可以是ip地址,也可以是域名,同时还可以指定端口

     

    location ~ .php {

        proxy_pass http://127.0.0.1:8000;

    }

     

    注意:如果proxy_pass指定的地址携带了URI,如上例中 /link/,那么这里的URI将替换请求URI中匹配location参数的部分,比如 请求 /some/path/page.html,将被替换为http://www.example.com/link/page.html

     

    另外,如果请求不是发往http类型的被代理服务器,则选择如下之一:

     

    请求也可以发往一命名的组服务器,这种请求下,将根据指定方法,在这些服务器之中进行请求的分发。

     

    传递请求头

    默认的,nginx在被代理请求中定义两个头域:HostConnection,并且清除包含空值的头域。Host被设置为$proxy_host变量,而Connection则被设置为close

     

    使用proxy_set_header机制可修改默认配置及其它头域的值。可以在location中,server上下文,http块或者其它更高层级中指定这种机制。

     

    例子:

    location /some/path/ {

        proxy_set_header Host $host;

        proxy_set_header X-Real-IP $remote_addr;

        proxy_pass http://localhost:8000;

    }

     

    如果想阻止某个头域被传递给被代理服务器,可以如下设置头域的值为空

    location /some/path/ {

        proxy_set_header Accept-Encoding "";

        proxy_pass http://localhost:8000;

    }

     

    配置缓冲(Buffer)

    默认的,Ngnix buffering来自被代理服务器的响应。Ngnix在内部buffering中存储响应,直到收到整个响应后才发送给客户端。对于慢客户端来说,buffering可优化性能,这样,如果响应从Nginx同步传递给客户端,这将会浪费被代理服务器的时间。但是,如果开启bufferingNginx允许被代理服务器快速处理请求,因为Nginx会尽可能久的存储来自被代理服务器的响应,直到客户端下载它们。

     

    使用proxy_buffering机制开启或关闭缓冲。默认的,开启缓冲。

     

    proxy_buffers控制buffer大小和分配给请求的buffer数量。来自被代理服务器响应中的第一部分被存储在单一的buffer中,该buffer的大小由proxy_buffer_size设定。该部分通常包含一个相对较小的响应头,其大小可以设置成比用于存储剩余响应部分buffer小。

     

    例子:

    location /some/path/ {

        proxy_buffers 16 4k;

        proxy_buffer_size 2k;

        proxy_pass http://localhost:8000;

    }

     

    如果关闭buffering,当从被代理服务器接收到响应时,将被同步把响应发往客户端。这对于想尽快收到请求的快速交互客户端来说。这是其想要的。

     

    例子:关闭buffering

    location /some/path/ {

        proxy_buffering off;

        proxy_pass http://localhost:8000;

    }

     

    这种情况下,nginx只用proxy_buffer_size来存储响应的当前部分。

     

    选择一个出口 IP地址

    如果代理服务器有多个网络接口,有时候需要选择特定的源ip地址来连接到代理服务器。当被代理服务器被设置为只接受来自特定IP地址或者IP范围的连接请求时,这特别有用。

     

    例:

    location /app1/ {

        proxy_bind 127.0.0.1;

        proxy_pass http://example.com/app1/;

    }

     

    location /app2/ {

        proxy_bind 127.0.0.2;

        proxy_pass http://example.com/app2/;

    }

     

    ip地址也可以是一个变量

    例:

    location /app3/ {

        proxy_bind $server_addr;

        proxy_pass http://example.com/app3/;

    }

     

    参考链接:

    https://www.nginx.com/resources/admin-guide/reverse-proxy/

     

  • 相关阅读:
    [Vijos] 天才的记忆
    [Vijos] 河蟹王国
    [Vijos] SuperBrother打鼹鼠
    [Vijos] 弱弱的战壕
    [洛谷P3792] 由乃与大母神原型和偶像崇拜
    【模板】乘法逆元
    [USACO13NOV]空荡荡的摊位Empty Stalls
    [USACO08OPEN]牛的车Cow Cars
    [SCOI2005]扫雷
    [USACO16OPEN]关闭农场Closing the Farm_Silver
  • 原文地址:https://www.cnblogs.com/shouke/p/10157754.html
Copyright © 2020-2023  润新知