VPS测评 VPS推荐 VPS优惠
Linux运维

nginx实现http反向代理和缓存功能

反向代理:reverse proxy

指的是代理外网用户的请求到内部的指定的服务器,并将数据返回给用户的一种方式。

Nginx 除了可以在企业提供高性能的web服务之外,还可以将其不能处理的请求通过某种预定义的协议转发至其它服务器处理。不同的协议就是Nginx服务器与其他服务器进行通信的一种规范,在不同的场景使用以下模块实现不同的功能。

  • ngx_http_proxy_module

将客户端请求以http协议转发至指定服务器

  • ngx_http_upstream_module

用于定义为proxy_pass,fastcgi_pass,uwsgi_pass等指令引用的后端服务器分组

  • ngx_stream_proxy_module

将客户端的请求以TCP协议转发至指定服务器处理

  • ngx_http_fastcgi_module

将客户端对php的请求以fastcgi协议转发至指定服务器处理

  • ngx_http_uwsgi_module

将客户端对Python的请求以uwsgi协议转发至指定服务器处理

反向代理参数配置

proxy_pass

用来设置将客户端请求转发给的后端服务器的主机,可以是主机名(将转发至后端服务做为主机头首部)、IP地址:端口的方式 也可以代理到预先设置的主机群组,需要模块ngx_http_upstream_module支持

示例1:

端口后面没有”/”符号,所以会把location后面的/web附加到proxy_pass指定的url后面。

location /web {
index index.html;
proxy_pass http://10.0.0.18:8080;
}
#http://HOSTNAME/web --> http://10.0.0.18:8080/web

示例2:

端口后面有”/”符号,实际访问的就是proxy_pass后面的url内容。

location /web {
index index.html;
proxy_pass http://10.0.0.18:8080/;
}
#http://HOSTNAME/web --> http://10.0.0.18:8080/
location /web {
root /var/www/html;
proxy_pass https://baidu.com/;
}

示例3:

如果location定义uri时使用了正则表达式(包括~,~*,但不包括^~),则proxy_pass之后必须不能使用uri;用户请求时传递的uri将直接附加至后端服务器之后。

location ~|~* /uri/ {
proxy_pass http://host:port;
}
#http://HOSTNAME/uri/ --> http://host:port/uri/

示例4:

针对特定的资源实现代理

    location ~ \.(jpe?g|png|bmp|gif)$ {
    proxy_pass http://175.24.227.179;
  }

proxy_pass_header field

默认nginx在响应报文中不传递后端服务器的首部字段Date, Server, X-Pad, X-Accel等参数,如果要传递的话则要使用 proxy_pass_header field声明将后端服务器返回的值传递给客户端。首部字段大小写不敏感。

示例5:

透传后端服务器的Server和Date首部,同时不再显示前端服务器的Server字段

proxy_pass_header Server;
proxy_pass_header Date;
配置前后返回的响应报文对比

如何让后端服务器知道客户端的真实IP?

proxy_set_header

默认的日志只会显示代理服务器的IP,这样就不知道客户到底是从哪里来的。可更改或添加客户端的请求头部信息内容并转发至后端服务器,比如在后端服务器想要获取客户端的真实IP的时候,就要更改每一个报文的头部.。

示例5:

proxy_set_header http_x_forwarded_for $proxy_add_x_forwarded_for;

同时在后端服务器开启日志(以nginx为例),再观察日志的时候就可以看到客户端的IP了

log_format  main  '$remote_addr - $remote_user [$time_local]  "$request" '
                '$status $body_bytes_sent "$http_referer" '
                '"$http_user_agent" "$http_x_forwarded_for"';

access_log logs/access.log main;

反向代理缓存

开启缓存功能可以加快用户的访问速度从而提升服务器的性能。

首先在http块定义缓存信息

这里定义了存放缓存的路径、目录结构、缓存名称和大小、过期时间、最大磁盘占用空间

proxy_cache_path /var/cache/nginx/proxy_cache
levels=1:2:2
keys_zone=proxycache:20m
inactive=120s
max_size=1g;

然后在server/location块中调用刚才定义的缓存配置

proxy_cache proxycache;       #引用刚才定义的名字
proxy_cache_key $request_uri; #nginx实现http反向代理和缓存功能
proxy_cache_valid 200 302 301 10m; #指定的状态码返回的数据缓存多长时间
proxy_cache_valid any 5m;
再次向代理服务器请求资源后,可以看到文件夹里生成了缓存文件。
未经允许不得转载:青蛙主机 » nginx实现http反向代理和缓存功能

VPS相关常用工具

PING测试工具自用毛子接码站