Nginx|一篇就学会Nginx做代理缓存服务器

前言 正向代理: 用于代理内部网络对 Internet 的连接请求(如 VPN/NAT),客户端指定代理服务器,并将本来要直接发送给目标 Web 服务器的 HTTP 请求先发送到代理服务器上, 然后由代理服务器去访问 Web 服务器, 并将 Web 服务器的 Response 回传给客户端。
反向代理: 与正向代理相反,如果局域网向 Internet 提供资源,并让 Internet 上的其他用户可以
访问局域网内资源, 也可以设置一个代理服务器, 它提供的服务就是反向代理. 反向代理服 务器接受来自 Internet 的连接,然后将请求转发给内部网络上的服务器,并将 Response 回传给Internet 上请求连接的客户端。
nginx反向代理:web服务器的调度器 Nginx|一篇就学会Nginx做代理缓存服务器
文章图片

从上图可以看出:反向代理服务器代理网站 Web 服务器接收 Http 请求,对请求进行转发。 而且nginx作为反向代理服务器可以根据用户请求的内容把请求转发给后端不同的web服务 器,例如静动分离,再例如在 nginx 上创建多个虚拟主机,这样就成功的做到了在浏览器中输入不同域名(url)的时候访问后端的不同 web 服务器或 web 群集。
反向代理的作用

  • 保护网站安全:任何来自 Internet 的请求都必须先`经过代理服务器;
  • 通过配置缓存功能加速 Web 请求:可以缓存真实 Web 服务器上的某些静态资源,减轻真实 Web 服务器的负载压力;
  • 实现负载均衡:充当负载均衡服务器均衡地分发请求,平衡集群中各个服务器的负载压力;
Nginx|一篇就学会Nginx做代理缓存服务器
文章图片

Nginx+apache 构筑 Web 服务器集群的负载均衡
目的:配置 nginx 作为反向代理和负载均衡,同时利用其缓存功能,将静态页面在 nginx 缓存,以达到降低后端服务器连接数的目的并检查后端 web 服务器的健康状况。
分析:
结合 proxy 和 upstream 模块实现后端 web 负载均衡
使用 proxy 模块实现静态文件缓存
使用 nginx-sticky-module扩展模块实现 Cookie 会话黏贴(保持会话)
使用 ngx_cache_purge实现更强大的缓存清除功能
注:(上面提到的 2 个模块都属于第三方扩展模块,需要提前下好源码,然后编译时通过
–add-moudle=src_path 一起安装)
Nginx|一篇就学会Nginx做代理缓存服务器
文章图片

环境:
OS: centos7.2
nginx:192.168.10.2
apache1:192.168.10.1
apache2:192.168.10.5
nginx编译如下:
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module --with-http_realip_module --with-http_ssl_module --with-http_gzip_static_module --http-client-body-temp-path=/var/tmp/nginx/client --http-proxy-temp-path=/var/tmp/nginx/proxy --http-fastcgi-temp-path=/var/tmp/nginx/fcgi --with-pcre --add-module=../ngx_cache_purge-2.3 --with-http_flv_module --add-module=../nginx-goodies-nginx-sticky-module-ng-08a395c66e42

其中,nginx-goodies-nginx-sticky-module-ng-08a395c66e42源码包是:https://pan.baidu.com/s/1eO2_RbxaxVJ01TXDtk9ulA
提取码:oj99
ngx_cache_purge-2.3源码包是:https://pan.baidu.com/s/16rbzuyzs2dCAHFp8iX1mxg
提取码:243t
注:如果你想在已安装好的 nginx 上添加第三方模块,依然需要重新编译,但为了不覆盖你原有的配置,请不要 make install,而是直接拷贝可执行文件
# nginx –V [root@www nginx-1.14.2]./configure --add-module=……#你的第三方模块 [root@www nginx-1.14.2] make 后不要 make install,改为手动拷贝,先备份 [root@www nginx-1.14.2] cp /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.bak [root@www nginx-1.10.2] cp objs/nginx /usr/local/nginx/sbin/nginx

nginx-sticky-module 模块:
这个模块的作用是通过 cookie 黏贴的方式将来自同一个客户端(浏览器)的请求发送到同一个后端服务器上处理,这样一定程度上可以解决多backend servers 的 session 同步的问题。nginx-sticky-module 的 cookie 过期时间,默认浏览器关闭就过期。这个模块并不合适不支持 Cookie 或手动禁用了 cookie 的浏览器,此时默认 sticky 就会切换成 rr(轮询)。配置如下:
例如: upstream backend { server 192.168.10.1:80 weight=1; server 192.168.10.5:80 weight=1; sticky; }

配置起来超级简单,一般来说一个 sticky 指令就够了。相关信息可以查看官方文档 https://bitbucket.org/nginx-goodies/nginx-sticky-module-ng
实现负载均衡配置 严格来说,nginx 自带是没有针对负载均衡后端节点的健康检查的,但是可以通过默认自带的 ngx_http_proxy_module模块和
ngx_http_upstream_module 模块中的相关指令来完成当后端节点出现故障时,自动切换到下一个节点来提供访问。
{ http ...... upstream backend {#建立负载群集名为backend sticky; #与sticky模块一起用,开启黏连 server 192.168.10.1:80 weight=1 max_fails=2 fail_timeout=10s; server 192.168.10.5:80 weight=1 max_fails=2 fail_timeout=10s; ...... } } server{ ...... location / { proxy_pass http://backend; #backend里的主机将被代理,也可以接URL地址 } ...... }

max_fails :允许请求失败的次数,默认为 1。当超过最大次数时,返回proxy_next_upstream 模块定义的错误。
fail_timeout: 有两层含义,一是在 10s 时间内最多容许 2 次失败;二是在经历了 2 次失败以后,10s 时间内不分配请求到这台服务器。
nginx 的 proxy 缓存使用: 缓存也就是将 js、css、image 等静态文件从后端服务器缓存到 nginx 指定的缓存目录下,既可以减轻后端服务器负担,也可以加快访问速度,但这样缓存及时清理成为了一个问题,所以需要 ngx_cache_purge 这个模块来在过期时间未到之前,手动清理缓存。
nginx 的 web 缓存功能的主要是由 proxy_cache、fastcgi_cache 指令集和关指令收集完成。proxy_cache 指令负责反向代理缓存后端服务器的静态内容,fastcgi_cache 主要用来处理FastCGI 动态进程缓存
此时,完整的配置文件如下:
user nginx; group nginx; worker_processes 4; worker_cpu_affinity 0001 0010 0100 1000; error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info; worker_rlimit_nofile 10240; pid logs/nginx.pid; events { use epoll; worker_connections 4096; } http { include mime.types; default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"' '"$upstream_cache_status"'; access_log logs/access.log main; server_tokens off; sendfile on; #tcp_nopush on; #keepalive_timeout 0; keepalive_timeout 65; #Compression Settings gzip on; gzip_comp_level 6; gzip_http_version 1.1; gzip_proxied any; gzip_min_length 1k; gzip_buffers 16 8k; gzip_types text/plain text/css text/javascript application/json application/javascript application/x-javascript application/xml; gzip_vary on; #end gzip # http_proxy Settings client_max_body_size 10m; client_body_buffer_size 128k; proxy_connect_timeout 75; proxy_send_timeout 75; proxy_read_timeout 75; proxy_buffer_size 4k; proxy_buffers 4 32k; proxy_busy_buffers_size 64k; proxy_temp_file_write_size 64k; proxy_buffering on; proxy_temp_path /usr/local/nginx1.10/proxy_temp; proxy_cache_path /usr/local/nginx1.10/proxy_cache levels=1:2 keys_zone=my-cache:100m max_size=1000m inactive=600m max_size=2g; #load balance Settings 负载均衡设置 upstream backend { sticky; server 192.168.31.141:80 weight=1 max_fails=2 fail_timeout=10s; server 192.168.31.250:80 weight=1 max_fails=2 fail_timeout=10s; } #virtual host Settings server{ listen 80; server_name localhost; charset utf-8; location ~/purge(/.*) { allow 127.0.0.1; allow 192.168.10.0/24; deny all; proxy_cache_purge my-cache $host$1$is_args$args; } location / { index index.php index.html index.htm; proxy_pass http://backend; proxy_redirect off; 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_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504; } location ~ .*\.(gif|jpg|png|html|htm|css|js|ico|swf|pdf)(.*) { proxy_pass http://backend; proxy_redirect off; 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_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504; proxy_cache my-cache; add_header Nginx-Cache $upstream_cache_status; proxy_cache_valid 200 304 301 302 8h; proxy_cache_valid 404 1m; proxy_cache_valid any 1d; proxy_cache_key $host$uri$is_args$args; expires 30d; } location /nginx_status { stub_status on; access_log off; allow 192.168.31.0/24; deny all; } } }

配置完要记得重启nginx服务
[root@localhost ~]# service nginx restart Nginx service stop success. Nginx service start success.

【Nginx|一篇就学会Nginx做代理缓存服务器】web服务器建立测试页:
[root@localhost ~]# echo 'web1:192.168.10.5' >> /var/www/html/index.html [root@localhost ~]# [root@localhost ~]# echo 'web2:192.168.10.1' > /var/www/html/index.html

验证:nginx 反向代理的缓存功能、负载均衡 如果在缓存时间之内需要更新被缓存的静态文件怎么办呢,这时候就需要手动来清除缓存了。访问:http://192.168.10.2,如下图:用一台测试机访问192.168.10.2时,调度到web服务器上。刷新再看,连接状态信息是304缓存连接成功。这时候也可以去查看代理服务器的缓存目录,/usr/local/nginx/proxy_temp
Nginx|一篇就学会Nginx做代理缓存服务器
文章图片

清除缓存 上 述 配 置 的proxy_cache_purge指令用于方便的清除缓存,但必须按 照 第 三 方 的ngx_cache_purge 模块才能使用
使用 ngx_cache_purge 模块清除缓存(直接删除缓存目录下的文件也算一种办法):
即使用配置文件中的 location ~ /purge(/.*)(配置文件里去掉注释即可)
浏览器访问 http://192.168.10.2/purge/your/may/path 来清除缓存
Nginx|一篇就学会Nginx做代理缓存服务器
文章图片

缓存清除成功。
注:
(1)purge 是 ngx_cache_pure 模块指令
(2)your/may/path 是要清除的缓存文件 URL 路径

    推荐阅读