Nginx 反向代理的高级应用
我们通常说的「代理」,都是指客户端向外界发起请求时,并不直接与目标服务器连接,而是将所有请求交给一个代理服务器,由它负责连接外界的目标服务器。同时,从服务器返回的数据,也经过代理服务器返回客户端。在外界看来,所有请求都来自这台代理服务器,这样,它就成功地将客户端隐藏在自己背后,起到了保护客户端的作用.
虽然谈到反向代理必然会有负载均衡,在这里暂且只考虑反向代理,在 Nginx 中则是ngx_http_proxy_module
模块
详情见 ngx_http_proxy_module 官方文档
以下是一些常用配置项说明
location / { proxy_pass http://127.0.0.1:8080; proxy_redirect off; proxy_set_header X-Real-IP $remote_addr; #后端的 Web 服务器可以通过 X-Forwarded-For 获取用户真实 IP proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; #以下是一些反向代理的配置,可选。 proxy_set_header Host $host; client_max_body_size 10m; #允许客户端请求的最大单文件字节数 client_body_buffer_size 128k; #缓冲区代理缓冲用户端请求的最大字节数, ##代理设置 以下设置是 nginx 和后端服务器之间通讯的设置## proxy_connect_timeout 90; #nginx 跟后端服务器连接超时时间(代理连接超时) proxy_send_timeout 90; #后端服务器数据回传时间(代理发送超时) proxy_read_timeout 90; #连接成功后,后端服务器响应时间(代理接收超时) proxy_buffering on; #该指令开启从后端被代理服务器的响应内容缓冲 此参数开启后 proxy_buffers 和 proxy_busy_buffers_size 参数才会起作用 proxy_buffer_size 4k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小 proxy_buffers 4 32k; #proxy_buffers 缓冲区,网页平均在 32k 以下的设置 proxy_busy_buffers_size 64k; #高负荷下缓冲大小(proxy_buffers*2) proxy_max_temp_file_size 2048m; #默认 1024m, 该指令用于设置当网页内容大于 proxy_buffers 时,临时文件大小的最大值。如果文件大于这个值,它将从 upstream 服务器同步地传递请求,而不是缓冲到磁盘 proxy_temp_file_write_size 512k; #这是当被代理服务器的响应过大时 nginx 一次性写入临时文件的数据量。 proxy_temp_path /var/tmp/nginx/proxy_temp; ##定义缓冲存储目录,之前必须要先手动创建此目录 proxy_headers_hash_max_size 51200; proxy_headers_hash_bucket_size 6400; }
以下是一些工作中用到的需求:
访问网站的一个资源,如果该资源不存在,则尝试通过反向代理访问
今天遇到一个需求,复制一个 wordpress 站点到一个测试的服务器,但是该网站下图片素材较多(可能 30-100g 以上) ,所以只能规避 uploads 这个目录复制代码,在测试服务器上通过反向代理的方式加载静态资源等,但是在测试服务器上也需要上传静态资源,这就导致了一个问题,文件虽然上传了,但是如果 uploads 目录如果被反向代理到原网站则访问不到新上传的图片,所以需要一个判断,如果该资源存在,就访问自身的 uploads 目录,如果该目录下不存在该资源,则通过反向代理访问.
以下是我的配置
location /wp-content/uploads/ { try_files $uri $uri/ /index.php?args @proxy; } location @proxy { proxy_pass http://44.22.33.11;##原站所在服务器 ip proxy_redirect off; proxy_http_version 1.1; proxy_set_header Host www.xxx.com;##原站域名 proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; }
在这里应用了 location @ 内部配置