搭建nginx缓存服务器

本文详细介绍Nginx服务器的高级配置技巧,包括服务器规划、安装扩展模块、配置反向代理、健康检查与负载均衡,以及如何利用ngx_cache_purge模块进行缓存管理。文章深入解析sticky模块和缓存清除策略,适合希望提升Nginx服务稳定性和效率的系统管理员阅读。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 服务器规划

ip角色系统版本
192.168.1.19clientcentos7
192.168.1.22nginx缓存服务器centos7
192.168.1.10webserver1
192.168.1.18webserver2

2. nginx安装

  • 使用 nginx-sticky-module 扩展模块实现 Cookie 会话黏贴
  • 使用 ngx_cache_purge 实现更强大的缓存清除

nginx-goodies-nginx-sticky-module-ng-08a395c66e42.zip 点此下载 提取码:mubw

ngx_cache_purge-2.3.tar.gz 点此下载 提取码:hqy6

   13  groupadd nginx
   14  useradd nginx -g nginx -s /sbin/nologin 
   15  tar -zxf ngx_cache_purge-2.3.tar.gz 
   16  unzip nginx-goodies-nginx-sticky-module-ng-08a395c66e42.zip 
   22  tar -zxf nginx-1.15.4.tar.gz 
   24  cd nginx-1.15.4/

./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 --add-module=../nginx-goodies-nginx-sticky-module-ng-08a395c66e42

make && make install
ln -s /usr/local/nginx/sbin/nginx /usr/sbin/

注:如果你想在已安装好的 nginx 上添加第三方模块,依然需要重新编译,但为了不覆盖你
原有的配置,请不要 make install,而是直接拷贝可执行文件

cp objs/nginx /usr/local/nginx/sbin/nginx

3. 配置nginx反向代理:反向代理+健康检查+负载均衡

查看已加载的模块

[root@localhost nginx-1.15.4]# nginx -V
nginx version: nginx/1.15.4
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-16) (GCC) 
built with OpenSSL 1.0.2k-fips  26 Jan 2017
TLS SNI support enabled
configure arguments: --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

3.1 nginx-sticky-module 模块

这个模块的作用是通过 cookie 黏贴的方式将来自同一个客户端(浏览器)的请求发送到同
一个后端服务器上处理,这样一定程度上可以解决多个 backend servers 的 session 同步的问
题 —— 因为不再需要同步,而 RR 轮询模式必须要运维人员自己考虑 session 同步的实现。
另外内置的 ip_hash 也可以实现根据客户端 IP 来分发请求,但它很容易造成负载不均衡的
情况,而如果 nginx 前面有 CDN 网络或者来自同一局域网的访问,它接收的客户端 IP 是一
样的,容易造成负载不均衡现象。nginx-sticky-module 的 cookie 过期时间,默认浏览器关闭
就过期。
这个模块并不合适不支持 Cookie 或手动禁用了 cookie 的浏览器,此时默认 sticky 就会切换
成 RR。它不能与 ip_hash 同时使用。

upstream backend {
 server 192.168.1.10:80 weight=1;
 server 192.168.1.18:80 weight=1;
 sticky;
}

配置起来超级简单,一般来说一个 sticky 指令就够了。

3.2 负载均衡与健康检查

严格来说,nginx 自带是没有针对负载均衡后端节点的健康检查的,但是可以通过默认自带
的 ngx_http_proxy_module 模块和 ngx_http_upstream_module 模块中的相关指令来完成
当后端节点出现故障时,自动切换到下一个节点来提供访问。

upstream backend {
 sticky;
 server 192.168.1.10:80 weight=1 max_fails=2 fail_timeout=10s;
 server 192.168.1.18:80 weight=1 max_fails=2 fail_timeout=10s;
}
server {
 ……
location / {
 proxy_pass http://backend;
}
……
}

参数说明:

  • weight : 轮询权值也是可以用在 ip_hash 的,默认值为 1
  • max_fails :允许请求失败的次数,默认为 1。当超过最大次数时,返回 proxy_next_upstream
    模块定义的错误。
  • fail_timeout : 有两层含义,一是在 10s 时间内最多容许 2 次失败;二是在经历了 2 次
    失败以后,10s 时间内不分配请求到这台服务器

3.3 nginx配置实例

下面的 nginx.conf 实现 nginx 在前端做反向代理服务器的完整配置文件的例子,处理 js、png
等静态文件,jsp/php 等动态请求转发到其它服务器 tomcat/apache

user www www;
worker_processes 4;
worker_cpu_affinity 0001 0010 0100 1000;
error_log logs/error.log;
worker_rlimit_nofile 10240;
pid logs/nginx.pid;
events {
 use epoll;
 worker_connections 4096;
}
http {
 include mime.types;
 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;

 #压缩设置
 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; 


 # 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/nginx/proxy_temp; 
 proxy_cache_path /usr/local/nginx/proxy_cache levels=1:2 keys_zone=my-cache:100m  inactive=600m max_size=2g;



 #负载均衡模块
 upstream backend {
 sticky;
 server 192.168.1.10:80 weight=1 max_fails=2 fail_timeout=10s;
 server 192.168.1.18: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.1.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;
 }
 }
}

4. 验证:nginx 反向代理的缓存功能

如果在缓存时间之内需要更新被缓存的静态文件怎么办呢,这时候就需要手动来清除缓存了。
ngx_cache_pure 清除缓存模块使用说明
用谷歌浏览器测试的时候,可以按 F12 调用开发工具,选择 Network 选项,我们可以看到,
Response Headers,在这里我们可以看到,我们请求的是否是缓存

在这里插入图片描述

从图中我们可以看到,我们访问的服务器是 192.168.1.22,缓存命中。
也可以查看缓存目录或 nginx 的访问日志

清除缓存:
上 述 配 置 的 proxy_cache_purge 指令用于方便的清除缓存,但必须按 照 第 三 方 的
ngx_cache_purge 模块才能使用
使用 ngx_cache_purge 模块清除缓存(直接删除缓存目录下的文件也算一种办法):
GET 方式请求 URL
即使用配置文件中的 location ~ /purge(/.*)
浏览器访问 http://192.168.1.22/purge/apache_pb2.gif 来清除缓存

在这里插入图片描述

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

Sticky是nginx的一个模块,它是基于cookie的一种nginx的负载均衡解决方案,通过分发和识别cookie,来使同一个客户端的请求落在同一台服务器上,默认标识名为route (a)客户端首次发起访问请求,nginx接收后,发现请求头没有cookie,则以轮询方式将请求分发给后端服务器。 (b)后端服务器处理完请求,将响应数据返回给nginx。 (c)此时nginx生成带route的cookie,返回给客户端。route的值与后端服务器对应,可能是明文,也可能是md5、sha1等Hash值 (d)客户端接收请求,并保存带route的cookie。 (e)当客户端下一次发送请求时,会带上route,nginx根据接收到的cookie中的route值,转发给对应的后端服务器。 其他需要注意的 (a)同一客户端的请求,有可能落在不同的后端服务器上。如果客户端启动时同时发起多个请求。由于这些请求都没带cookie,所以服务器会随机选择后端服务器,返回不同的cookie。当这些请求中的最后一个请求返回时,客户端的cookie才会稳定下来,值以最后返回的cookie为准。 (b)cookie不一定生效。由于cookie最初由服务器端下发,如果客户端禁用cookie,则cookie不会生效。 (c)客户端可能不带cookie。Android客户端发送请求时,一般不会带上所有的cookie,需要明确指定哪些cookie会带上。如果希望用sticky做负载均衡,请对Android开发说加上cookie。 (d)cookie名称不要和业务使用的cookie重名。Sticky默认的cookie名称是route,可以改成任何值。 (e)客户端发的第一个请求是不带cookie的。服务器下发的cookie,在客户端下一次请求时才能生效。 (f)Nginx sticky模块不能与ip_hash同时使用 sticky [name=route] [domain=.foo.bar] [path=/] [expires=1h] [hash=index|md5|sha1] [no_fallback] [secure] [httponly]; [name=route] 设置用来记录会话的cookie名称 [domain=.foo.bar] 设置cookie作用的域名 [path=/] 设置cookie作用的URL路径,默认根目录 [expires=1h] 设置cookie的生存期,默认不设置,浏览器关闭即失效,需要是大于1秒的值 [hash=index|md5|sha1] 设置cookie中服务器的标识是用明文还是使用md5值,默认使用md5 [no_fallback] 设置该项,当sticky的后端机器挂了以后,nginx返回502 (Bad Gateway or Proxy Error) ,而不转发到其他服务器,不建议设置 [secure] 设置启用安全的cookie,需要HTTPS支持 [httponly] 允许cookie不通过JS泄漏,没用过
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值