Nginx反向代理/缓存配置 - Go语言中文社区

Nginx反向代理/缓存配置


什么是反向代理?

1、有两台服务器A和B属于同一内网段,但是A不通外网,B通外网,客户端C只有外网
2、C想通过B访问A,就需要在服务器B上做反向代理
3、客户端C通过外网与服务器B通信,服务器B通过内网转发客户端C的请求与服务器A通信。

测试场景:

服务器A 内网IP地址:192.168.234.128 部署了上一篇文章中的bbs网站
服务器B 内网IP:192.168.234.130 外网IP:192.168.111.128
客户端C 外网IP:192.168.111.101

需求:

客户端C能访问到服务器A的bbs网站

1.测试客户端C与服务器B通过外网通信:
在这里插入图片描述
#客户端C与服务器B的可以通过外网通信

2.新建并编辑服务器B的nginx虚拟主机配置文件:

[root@centos02 ~]# vi /etc/nginx/conf.d/nginx_proxy.conf

添加如下内容:

server
{
        listen 80;
        server_name test.bbs.com;

        location /
         {
            proxy_pass http://192.168.234.128;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
         }
}

配置说明:

proxy_pass:协议(http/https)+ web服务器IP(如果不是80端口,需要带上端口号,示例:192.168.234.128:8080)如果使用域名,需要在/etc/hosts文件中将域名映射到web服务器地址

当location需要匹配目录时,示例:location /dir/ {},proxy_pass需要配置成:ip:port/dir/;

proxy_set_header Host:如果不设置,web服务器有多个nginx虚拟主机的情况,就容易出错

proxy_set_header X-Real-IP和proxy_set_header X-Forwarded-For: 设置被代理端接收到的客户端IP,如不配置,nginx访问日志来源IP会全部是反向代理服务器的地址

3.从客户端C访问服务器A的bbs网站:

修改Windows系统C:WindowsSystem32driversetchosts文件:
在这里插入图片描述
#由于服务器A的bbs网站域名test.bbs.com为自定义域名,所以需要在客户端C修改hosts文件,使浏览器访问test.bbs.com网站是指向到服务器B的外网地址

客户端C打开浏览器访问test.bbs.com:
在这里插入图片描述
#已成功打开bbs网站页面,nginx反向代理配置完成

4.查看服务器A的nginx访问日志:

[root@linux nginx]# tail -1  access.log
192.168.234.130 - - [17/Oct/2019:16:43:29 +0800] "GET /favicon.ico HTTP/1.0" 200 5558 "http://test.bbs.com/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.75 Safari/537.36" "192.168.111.1"

#来源IP192.168.234.130,真实IP:192.168.111.1

补充:

由于测试的客户端C和服务器B属于同一内网,所以真实IP显示的是192.168.111.0/24网段的网关,演示需要,将客户端C与服务器B的网段虚构成外网,所以两个不想通的内网段,也可以通过该方法配置nginx反向代理

nginx反向代理配置参数补充:

proxy_redirect:用来修改被代理服务器返回的响应头中的Location头域和refresh头域,假设web服务器使用8080端口,proxy_pass http://192.168.234.128:8080; 访问反向代理服务器后满足301重定向的条件后返回的http头部中Location会包含被重定向的地址和端口,为了避免可以配置proxy_redirect http://$host:8080/ /;

nginx的proxy_buffering和proxy_cache:

proxy_buffering:主要是实现被代理服务器的数据和客户端的请求异步。

当proxy_buffering开启,客户端发起请求到代理服务器,代理服务器再到web服务器,web服务器返回的数据先到代理服务器的buffer上,存在内存中,然后代理服务器会根据proxy_busy_buffer_size参数的值来决定什么时候开始把数据传输给客户端。在此过程中,如果所有的buffer被写满,数据将会写入到temp_file中。

相反,如果proxy_buffering关闭,web服务器返回的数据会实时地通过代理服务器传输给客户端。

以下配置,针对每一个http请求

proxy_buffering on;
该参数设置是否开启proxy的buffer功能,参数的值为on或者off。
如果这个设置为off,那么proxy_buffers和proxy_busy_buffers_size这两个指令将会失效。
但是无论proxy_buffering是否开启,proxy_buffer_size都是生效的

proxy_buffer_size 4k;
该参数用来设置一个特殊的buffer大小的。
从web服务器上获取到的第一部分响应数据内容到代理服务器上,通常是http header,就存到了这个buffer中,如果该参数设置太小,会出现502错误码,这是因为这部分buffer不够存储header信息,一般设置为4k。

proxy_buffers 2 4k;
这个参数设置存储web服务器上返回的数据所占用的buffer的个数和每个buffer的大小,所有buffer的占内存的大小为这两个数字的乘积。

proxy_busy_buffer_size 4k;
在所有的buffer里,我们需要规定一部分buffer把自己存的数据传给客户端,这部分buffer就叫做busy_buffer,proxy_busy_buffer_size参数用来设置处于busy状态的buffer有多大。

1)如果完整数据量小于busy_buffer大小,当数据传输完成后,马上传给客户端;
2)如果完整数据量大于busy_buffer大小,则装满busy_buffer后,马上传给客户端;

proxy_temp_path
语法:proxy_temp_path path [level1 level2 level3]
定义proxy的临时文件存在目录以及目录的层级,当busy_buffer像客户端返回数据时,还未写入的数据就会暂时存放到临时目录

例:proxy_temp_path /usr/local/nginx/proxy_temp 1 2;
其中/usr/local/nginx/proxy_temp为临时文件所在目录,1表示层级1的目录名为一个数字(0-9),2表示层级2目录名为2个数字(00-99)

proxy_max_temp_file_size
设置临时文件的总大小,例如 proxy_max_temp_file_size 20M;

proxy_temp_file_wirte_size 8k
设置同时写入临时文件的数据量的总大小,通常设置为8k或者16k。

proxy_buffering示例

server
{
    listen 80;
    server_name bbs.test.com;
    proxy_buffering on;
	proxy_buffer_size 4k;
    proxy_buffers 2 4k;
    proxy_busy_buffers_size 4k;
    proxy_temp_path /tmp/nginx_proxy_tmp 1 2;
	proxy_max_temp_file_size 20M;
	proxy_temp_file_write_size 8k;
	
	location /
	{
	    proxy_pass      http://192.168.234.128:8080/;
        proxy_set_header Host   $host;
        proxy_set_header X-Real-IP      $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
	}

}

proxy_cache

将从web服务器上获取到的数据根据预设规则存放到代理服务器上(内存+磁盘)留着备用,客户端请求代理服务器时,代理服务器会把缓存的这些数据直接给客户端,而不需要再去向web服务器去获取。

proxy_cache
语法:proxy_cache zone|off

默认为off,即关闭proxy_cache功能,zone为用于存放缓存的内存区域名称。
例:proxy_cache my_zone;

从nginx 0.7.66版本开始,proxy_cache机制开启后会检测被代理端的HTTP响应头中的"Cache-Control"、"Expire"头域,Cache-Control为no-cache时,是不会缓存数据的。

proxy_cache_bypass
语法:proxy_cache_bypass string;

该参数设定,什么情况下的请求不读取cache而是直接从后端的服务器上获取资源。
这里的string通常为nginx的一些变量。

例:proxy_cahce_bypass $cookie_nocache $arg_nocache$arg_comment;
意思是,如果$cookie_nocache $arg_nocache $arg_comment这些变量的值只要任何一个不为0或者不为空时,则响应数据不从cache中获取,而是直接从后端的服务器上获取。

proxy_no_cache
语法:proxy_no_cache string;

该参数和proxy_cache_bypass类似,用来设定什么情况下不缓存。

例:proxy_no_cache $cookie_nocache $arg_nocache $arg_comment;
表示,如果$cookie_nocache $arg_nocache $arg_comment的值只要有一项不为0或者不为空时,不缓存数据。

proxy_cache_key
语法:proxy_cache_key string;

定义cache key,如:proxy_cache_key $scheme $proxy_host $uri $is_args$args; (该值为默认值,一般不用设置)

proxy_cache_path
语法:proxy_cache_path path [levels=levels] keys_zone=name:size [inactive=time] [max_size=size]

path设置缓存数据存放的路径,levels设置目录层级,如levels=1:2,表示有两级子目录,第一个目录名取md5值的倒数第一个值,第二个目录名取md5值的第2和3个值,如下图:
在这里插入图片描述
keys_zone设置内存zone的名字和大小,如keys_zone=my_zone:10m

inactive设置缓存多长时间就失效,当硬盘上的缓存数据在该时间段内没有被访问过,就会失效了,该数据就会被删除,默认为10s。

max_size设置硬盘中最多可以缓存多少数据,当到达该数值时,nginx会删除最少访问的数据。

例:proxy_cache_path /data/nginx_cache/ levels=1:2 keys_zone=my_zone:10m inactive=300s max_size=5g

proxy_cache示例

http 
{
    
    proxy_cache_path /data/nginx_cache/ levels=1:2 keys_zone=my_zone:10m inactive=300s max_size=5g;
    
    server
    {
        listen 80;
        server_name www.aminglinux.com;
        proxy_buffering on;
    	proxy_buffer_size 4k;
        proxy_buffers 2 4k;
        proxy_busy_buffers_size 4k;
        proxy_temp_path /tmp/nginx_proxy_tmp 1 2;
    	proxy_max_temp_file_size 20M;
    	proxy_temp_file_write_size 8k;
	
	
	
	    location /
	    {
	        proxy_cache my_zone; #定义缓存存放的内存区名称
	        proxy_pass      http://192.168.234.128:8080/;
            proxy_set_header Host   $host;
            proxy_set_header X-Real-IP      $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
	    }
    }
}

注意:proxy_cache_path必须定义在http{}中,可以定义在nginx.conf配置文件中,使之变为全局的,也可以定义在虚拟主机配置文件中

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/Powerful_Fy/article/details/102609219
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2020-02-24 22:21:34
  • 阅读 ( 1317 )
  • 分类:Go Web框架

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢