Nginx proxy_pass模块

guiyun affiliate

1、环境准备

序号

主机名

IP

操作系统

内核版本

备注

1

LB01-Server

192.168.100.133

CentOS release 6.6

2.6.32-504.el6.x86_64

主负载均衡

2

LB02-Server

192.168.100.134

CentOS release 6.6

2.6.32-504.el6.x86_64

备负载均衡

3

Web01-Server

192.168.100.135

CentOS release 6.6

2.6.32-504.el6.x86_64

网站服务

4

Web02-Server

192.168.100.136

CentOS release 6.6

2.6.32-504.el6.x86_64

网站服务


2、配置环境

[root@LB01-Server ~]# vim /etc/nginx/nginx.conf
user www www;
worker_processes  1;
events {
    worker_connections  1024;
}          
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    upstream bbs_server_pools {
        server 192.168.100.135:80 weight=1;
        server 192.168.100.136:80 weight=1;
    }
 
    server {
        listen       80;
        server_name  bbs.keysou.com;
        location / {
            proxy_pass http://bbs_server_pools;
        }
    }
}
[root@LB01-Server ~]# echo "192.168.100.133  bbs.keysou.com" >> /etc/hosts
[root@LB01-Server ~]# ping -c 1 bbs.keysou.com
PING www.keysou.com (192.168.100.133) 56(84) bytes of data.
64 bytes from LB01-Server (192.168.100.133): icmp_seq=1 ttl=64 time=1.39 ms
 
[root@Web01-Server ~]# echo "192.168.100.135  www.keysou.com  bbs.keysou.com" >> /etc/hosts
[root@Web01-Server ~]# ping -c 1 www.keysou.com
PING www.keysou.com (192.168.100.135) 56(84) bytes of data.
64 bytes from Web01-Server (192.168.100.135): icmp_seq=1 ttl=64 time=0.720 ms
[root@Web01-Server ~]# ping -c 1 bbs.keysou.com
PING www.keysou.com (192.168.100.135) 56(84) bytes of data.
64 bytes from Web01-Server (192.168.100.135): icmp_seq=1 ttl=64 time=0.190 ms
[root@Web01-Server ~]# curl www.keysou.com
www.keysou.com 192.168.100.135 Web01-Server
[root@Web01-Server ~]# curl bbs.keysou.com
bbs.keysou.com 192.168.100.135 Web01-Server
 
[root@Web02-Server ~]# echo "192.168.100.136  www.keysou.com  bbs.keysou.com" >> /etc/hosts
[root@Web02-Server ~]# ping -c 1 www.keysou.com
PING www.keysou.com (192.168.100.136) 56(84) bytes of data.
64 bytes from Web02-Server (192.168.100.136): icmp_seq=1 ttl=64 time=0.793 ms
[root@Web02-Server ~]# ping -c 1 bbs.keysou.com
PING www.keysou.com (192.168.100.136) 56(84) bytes of data.
64 bytes from Web02-Server (192.168.100.136): icmp_seq=1 ttl=64 time=0.174 ms
[root@Web02-Server ~]# curl www.keysou.com
www.keysou.com 192.168.100.136 Web02-Server
[root@Web02-Server ~]# curl bbs.keysou.com
bbs.keysou.com 192.168.100.136 Web02-Server

3、proxy_pass

设置被代理服务器的地址和被映射的URI

4、proxy_set_header

设置由后端服务器获取用户的主机名或真实的IP地址,以及代理服务器的真实IP地址

[root@LB01-Server ~]# for i in `seq 6`;do curl bbs.keysou.com;sleep 1;done
www.keysou.com 192.168.100.135 Web01-Server
www.keysou.com 192.168.100.136 Web02-Server
www.keysou.com 192.168.100.135 Web01-Server
www.keysou.com 192.168.100.136 Web02-Server
www.keysou.com 192.168.100.135 Web01-Server
www.keysou.com 192.168.100.136 Web02-Server

明明是请求bbs.keysou.com,为何会出现www.keysou.com呢?原因是用户通过代理请求bbs.keysou.com,代理服务器向后请求时不会携带用户请求报文中的请求头部信息,导致直接以IP和端口的方式访问后端服务器,后端服务器直接把第一个虚拟主机返回给代理服务器,也就是www.keysou.com

[root@LB01-Server ~]# vim /etc/nginx/nginx.conf
user www www;
worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    upstream bbs_server_pools {
        server 192.168.100.135:80 weight=1;
        server 192.168.100.136:80 weight=1;
    }
 
    server {
        listen       80;
        server_name  bbs.keysou.com;
        location / {
            proxy_pass http://bbs_server_pools;
            proxy_set_header Host      $host;
        }
    }
}
[root@LB01-Server ~]# for i in `seq 6`;do curl bbs.keysou.com;sleep 1;done
bbs.keysou.com 192.168.100.135 Web01-Server
bbs.keysou.com 192.168.100.136 Web02-Server
bbs.keysou.com 192.168.100.135 Web01-Server
bbs.keysou.com 192.168.100.136 Web02-Server
bbs.keysou.com 192.168.100.135 Web01-Server
bbs.keysou.com 192.168.100.136 Web02-Server

后端服务器日志记录格式如下

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '

                      '$status $body_bytes_sent "$http_referer" '

                      '"$http_user_agent" "$http_x_forwarded_for"';

[root@Web01-Server ~]# tail -1 /usr/local/nginx/logs/access.log
192.168.100.133 - - [16/Jun/2017:10:17:26 +0800] "GET / HTTP/1.0" 200 43 "-" "curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.15.3 zlib/1.2.3 libidn/1.18 libssh2/1.4.2" "-"
[root@Web02-Server ~]# tail -1 /usr/local/nginx/logs/access.log
192.168.100.133 - - [16/Jun/2017:10:17:26 +0800] "GET / HTTP/1.0" 200 43 "-" "curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.15.3 zlib/1.2.3 libidn/1.18 libssh2/1.4.2" "-"

为何后端服务器访问日志只记录代理服务器IP地址呢?原因是跟上面的情况类似,需要把用户的真实IP地址传递给后端服务器

[root@LB01-Server ~]# cat /etc/nginx/nginx.conf
user www www;
worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    upstream bbs_server_pools {
        server 192.168.100.135:80 weight=1;
        server 192.168.100.136:80 weight=1;
    }
 
    server {
        listen       80;
        server_name  bbs.keysou.com;
        location / {
            proxy_pass http://bbs_server_pools;
            proxy_set_header Host      $host;
            proxy_set_header X-Forward-For $remote_addr;
        }
    }
}
[root@LB01-Server ~]# for i in `seq 6`;do curl bbs.keysou.com;sleep 1;done
bbs.keysou.com 192.168.100.135 Web01-Server
bbs.keysou.com 192.168.100.136 Web02-Server
bbs.keysou.com 192.168.100.135 Web01-Server
bbs.keysou.com 192.168.100.136 Web02-Server
bbs.keysou.com 192.168.100.135 Web01-Server
bbs.keysou.com 192.168.100.136 Web02-Server
[root@Web01-Server ~]# tail -1 /usr/local/nginx/logs/access.log
192.168.100.133 - - [16/Jun/2017:10:17:26 +0800] "GET / HTTP/1.0" 200 43 "-" "curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.15.3 zlib/1.2.3 libidn/1.18 libssh2/1.4.2" "192.168.100.135"
[root@Web02-Server ~]# tail -1 /usr/local/nginx/logs/access.log
192.168.100.133 - - [16/Jun/2017:10:17:26 +0800] "GET / HTTP/1.0" 200 43 "-" "curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.15.3 zlib/1.2.3 libidn/1.18 libssh2/1.4.2" "192.168.100.135"

5、proxy_connect_timeout

后端服务器连接的超时时间,即发起握手等候响应的超时时间

6、proxy_send_timeout

后端服务器数据回传超时时间,即在规定的时间内后端服务器必须传完所有数据

7、proxy_read_timeout

连接成功后等候后端服务器响应时间,其实已经进入后端的排队中等候处理,也就是后端服务器处理请求的时间

8、proxy_buffer_size

设置缓冲区大小,用于接收后端服务器response的第一部分

9、proxy_buffers

如果关闭此参数,Nginx不会尝试获取到后端服务器所有响应数据之后才会返回给用户,Nginx会尽快把数据传给用户,在数据传完之前,Nginx接收到的最大缓存大小不能超过proxy_buffer_size

 

如果开启此参数,Nginx将会尽可能的读取后端服务器的数据到buffer,直到proxy_buffers设置的所有buffer被写满或者数据被读取完,此时Nginx开始向客户端传输数据,如果数据很大的话,Nginx会接收并把他们写入到temp_file里去,大小由proxy_max_temp_file_size 控制

10、proxy_busy_buffers_size

设置系统繁忙时可用的缓存区大小,官方推荐的大小为proxy_buffers*2

11、proxy_temp_file_write_size

设置缓存区临时文件大小

12、proxy_max_temp_file_size

设置缓存区临时文件最大大小

13、proxy_temp_path

设置缓存区临时文件路径


guiyun affiliate

作者头像
南宫俊逸创始人

君子好学,自强不息~

上一篇:Win10无法修改保存hosts文件
下一篇:PHP扩展模块 memcache 安装

相关推荐

4

发表评论