一、Nginx反向代理
Nginx中的ngx_http_proxy_module模块可以实现后端服务器的反向代理功能,这样就可以实现客户端请求的动静分离以及负载均衡功能。
1、实验场景
Nginx主机作为反向代理服务器将客户端请求发往node1主机web服务器
Nginx主机IP:192.168.0.110
node1主机IP:192.168.0.40
2、Nginx主机配置
grep -Ev "#|^$" server.conf server { listen 80; server_name localhost; location / { proxy_pass http://192.168.0.40; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } [[email protected] conf]# nginx -t nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful [[email protected] conf]# nginx -s reload
3、node1主机配置为apache服务器
[[email protected] ~]# service httpd start Starting httpd: httpd: Could not reliably determine the server‘s fully qualified domain name, using 192.168.0.15 for ServerName [ OK ] [[email protected] ~]# curl 192.168.0.40 This is node1
4、测试反向代理
5、注意事项
如果是/uri反向代理到后端,那么/uri在后端可以为/newuri;
如果/uri是使用模式匹配的,则直接补在代理链接后面
如果proxy之前有定义rewrite的话,那么proxy将使用rewrite后的uri做代理
proxy_pass http://192.168.0.40;
proxy_set_header Host $host; 自定义客户端请求的首部的值
proxy_set_header X-Real-IP $remote_addr; 自定义头部信息加入客户端IP
6、自定义头部信息后的日志信息
[[email protected] ~]# vim /etc/httpd/conf/httpd.conf LogFormat "%{X-Real-IP}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined [[email protected] ~]# service httpd reload [[email protected] ~]# cat /etc/httpd/logs/access_log 192.168.0.109 - - [06/Feb/2017:13:56:20 +0800] "GET /user/ HTTP/1.0" 304 - "-" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:51.0) Gecko/20100101 Firefox/51.0" 192.168.0.109 - - [06/Feb/2017:13:56:21 +0800] "GET /user/ HTTP/1.0" 304 - "-" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:51.0) Gecko/20100101 Firefox/51.0"
7、部分代理(动静分离)
Nginx部分
[[email protected] conf]# !grep grep -Ev "#|^$" server.conf server { listen 80; server_name localhost; location / { root html/xn1; index index.html; } location /user { proxy_pass http://192.168.0.40; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } [[email protected] conf]# nginx -s reload
node1部分
[[email protected] ~]# mkdir /var/www/html/user [[email protected] ~]# echo "This is node1 user" >> /var/www/html/user/index.html [[email protected] ~]# service httpd reload
测试:
本地处理请求的部分
反向代理的部分:
更多的proxy指令,详见:http://nginx.org/en/docs/http/ngx_http_proxy_module.html
二、proxy缓存功能
当Nginx将客户端请求反向代理至后端服务器时,建立的是keep-alive连接;代理服务器与客户端,代理服务器与后端web server都建立长链,这会降低Nginx性能,所以这时候,proxy模块的缓存功能就派上用场了,代理服务器与客户端之间依旧保持长链,而代理服务器与后端web server之间请求结束后,代理服务器将内容缓存在本地,与后端不建立长链,大大节省了系统资源;同时,当客户端请求来时,代理服务器会直接去缓存中寻找并返回给客户端。代理服务器将缓存存在内存中,以key-value形式存储,value存储的是指向本地文件系统中存储的URL的哈希值。
1、配置缓存功能
1.创建缓存目录 [[email protected] conf]# mkdir -pv /cache/nginx/ mkdir: 已创建目录 "/cache" mkdir: 已创建目录 "/cache/nginx/" [[email protected] conf]# chown -R nginx:nginx /cache/nginx 2.在配置文件的http段定义缓存目录 [[email protected] conf]# vim nginx.conf proxy_cache_path /cache/nginx/ keys_zone=mycache:32m; 3.在server或location区段均可调用,根据实际情况使用,此处在location区段调用 [[email protected] conf]# !grep grep -Ev "#|^$" server.conf server { listen 80; server_name localhost; location / { root html/xn1; index index.html; } location /user { proxy_cache mycache; proxy_cache_valid 200 3h; proxy_cache_valid 301 302 10m; proxy_cache_valid all 1m; proxy_cache_use_stale error timeout http_500 http_502 http_503; proxy_pass http://192.168.0.40; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } [[email protected] conf]# nginx -s reload 4.请求后,缓存目录中出现缓存 [[email protected] conf]# ll /cache/nginx/ 总用量 4 -rw------- 1 nginx nginx 462 2月 6 17:09 a8d7f3cb1968f4e6056774a5a3a73468 5.cache语句 proxy_cache_path /cache/nginx/ keys_zone=mycache:32m; 定义缓存在文件系统中的保存路径,定义key值在内存中的变量名与大小,其余诸多选项有默认配置,定义在哪个位置,就有哪些配置可使用缓存 proxy_cache mycache; 使用mycache缓存 proxy_cache_valid 200 3h; 以响应状态码定义缓存保存时长,可定义多个 proxy_cache_use_stale error timeout http_500 http_502 http_503; 定义在遇到什么情况下可以使用过期缓存响应客户端
2、补充说明
缓存功能可以定义在http,server,location区段,定义在哪个区段表示有哪些请求可以使用缓存;一般来说,我们把缓存路径定义在http段,调用缓存根据具体情况配置。
其他cache语句:http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_cache