反向代理: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;