nginx | nginx反向代理/负载均衡/缓存

文章目录

  • [一、Nginx 反向代理](#一、Nginx 反向代理)
    • [1.1 nginx 文件结构](#1.1 nginx 文件结构)
    • [1.2 默认的nginx配置文件](#1.2 默认的nginx配置文件)
    • [1.3 实践中的 nginx.conf](#1.3 实践中的 nginx.conf)
  • [二、Nginx 负载均衡](#二、Nginx 负载均衡)
    • [2.1 热备负载均衡](#2.1 热备负载均衡)
    • [2.2 轮询负责均衡](#2.2 轮询负责均衡)
    • [2.3 加权轮询负载规则](#2.3 加权轮询负载规则)
    • [2.4 ip_hash 负载均衡](#2.4 ip_hash 负载均衡)
    • [2.5 对特定资源实现负载均衡](#2.5 对特定资源实现负载均衡)
    • [2.6 对不同域名实现负载均衡](#2.6 对不同域名实现负载均衡)
    • [2.7 实现带有URL重写的负载均衡](#2.7 实现带有URL重写的负载均衡)
    • [2.8 四层负载均衡](#2.8 四层负载均衡)
  • [三、Nginx 缓存](#三、Nginx 缓存)
    • [3.1 nginx 的缓存机制](#3.1 nginx 的缓存机制)
    • [3.2 缓存实例](#3.2 缓存实例)
    • [3.3 Nginx缓存的清除](#3.3 Nginx缓存的清除)
    • [3.4 Nginx设置资源不缓存](#3.4 Nginx设置资源不缓存)
  • 四、参考资料

一、Nginx 反向代理

正向代理代理的对象是客户端,反向代理代理的是服务端

在nginx安装包下,有 conf/nginx.conf 文件,这是nginx服务器的基础配置,默认的配置也存放在此。

1.1 nginx 文件结构

nginx 复制代码
# 1.全局块,配置影响nginx全局的指令。
# 一般有运行nginx服务器的用户组,nginx进程pid存放路径,日志存放路径,配置文件引入,允许生成worker process数等。
...              #全局块

# 2.配置影响nginx服务器或与用户的网络连接。
# 有每个进程的最大连接数,选取哪种事件驱动模型处理连接请求,是否允许同时接受多个网路连接,开启多个网络连接序列化等。

events {         #events块
   ...
}


# 3.可以嵌套多个server,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置。
# 如文件引入,mime-type定义,日志自定义,是否使用sendfile传输文件,连接超时时间,单连接请求数等。
http      #http块
{
    ...   #http全局块
        
    # 4.配置虚拟主机的相关参数,一个http中可以有多个server。
    server        #server块
    { 
        ...       #server全局块
            
        # 5.配置请求的路由,以及各种页面的处理情况。
        location [PATTERN]   #location块
        {
            ...
        }
        location [PATTERN] 
        {
            ...
        }
    }
    server
    {
      ...
    }
    ...     #http全局块
}

1.2 默认的nginx配置文件

nginx 复制代码
#user  nobody;
worker_processes  1;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;


events {
    worker_connections  1024;
}


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"';

    #access_log  logs/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;

    server {
        listen       80;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            root   html;
            index  index.html index.htm;
        }

        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

        # proxy the PHP scripts to Apache listening on 127.0.0.1:80
        #
        #location ~ \.php$ {
        #    proxy_pass   http://127.0.0.1;
        #}

        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        #location ~ \.php$ {
        #    root           html;
        #    fastcgi_pass   127.0.0.1:9000;
        #    fastcgi_index  index.php;
        #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
        #    include        fastcgi_params;
        #}

        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        #location ~ /\.ht {
        #    deny  all;
        #}
    }


    # another virtual host using mix of IP-, name-, and port-based configuration
    #
    #server {
    #    listen       8000;
    #    listen       somename:8080;
    #    server_name  somename  alias  another.alias;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}


    # HTTPS server
    #
    #server {
    #    listen       443 ssl;
    #    server_name  localhost;

    #    ssl_certificate      cert.pem;
    #    ssl_certificate_key  cert.key;

    #    ssl_session_cache    shared:SSL:1m;
    #    ssl_session_timeout  5m;

    #    ssl_ciphers  HIGH:!aNULL:!MD5;
    #    ssl_prefer_server_ciphers  on;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}

}

1.3 实践中的 nginx.conf

nginx 复制代码
########### 每个指令必须有分号结束。#################
#user administrator administrators;  #配置用户或者组,默认为nobody nobody。
#worker_processes 2;  #允许生成的进程数,默认为1
#pid /nginx/pid/nginx.pid;   #指定nginx进程运行文件存放地址
error_log log/error.log debug;  #制定日志路径,级别。这个设置可以放入全局块,http块,server块,级别以此为:debug|info|notice|warn|error|crit|alert|emerg
events {
    accept_mutex on;   #设置网路连接序列化,防止惊群现象发生,默认为on
    multi_accept on;  #设置一个进程是否同时接受多个网络连接,默认为off
    #use epoll;      #事件驱动模型,select|poll|kqueue|epoll|resig|/dev/poll|eventport
    worker_connections  1024;    #最大连接数,默认为512
}
http {
    include       mime.types;   #文件扩展名与文件类型映射表
    default_type  application/octet-stream; #默认文件类型,默认为text/plain
    #access_log off; #取消服务日志    
    log_format myFormat '$remote_addr--$remote_user [$time_local] $request $status $body_bytes_sent $http_referer $http_user_agent $http_x_forwarded_for'; #自定义格式
    access_log log/access.log myFormat;  #combined为日志格式的默认值
    sendfile on;   #允许sendfile方式传输文件,默认为off,可以在http块,server块,location块。
    sendfile_max_chunk 100k;  #每个进程每次调用传输数量不能大于设定的值,默认为0,即不设上限。
    keepalive_timeout 65;  #连接超时时间,默认为75s,可以在http,server,location块。

    upstream mysvr {   
      server 127.0.0.1:7878;
      server 192.168.10.121:3333 backup;  #热备
    }
    error_page 404 https://www.baidu.com; #错误页
    server {
        keepalive_requests 120; #单连接请求上限次数。
        listen       4545;   #监听端口
        server_name  127.0.0.1;   #监听地址       
        location  ~*^.+$ {       #请求的url过滤,正则匹配,~为区分大小写,~*为不区分大小写。
           #root path;  #根目录
           #index vv.txt;  #设置默认页
           proxy_pass  http://mysvr;  #请求转向mysvr 定义的服务器列表
           deny 127.0.0.1;  #拒绝的ip
           allow 172.18.5.54; #允许的ip           
        } 
    }
}

惊群现象:一个网路连接到来,多个睡眠的进程被同时叫醒,但只有一个进程能获得链接,这样会影响系统性能。

几个常见配置项:

  • 1.remote_addr 与 http_x_forwarded_for 用以记录客户端的ip地址;
  • 2.$remote_user :用来记录客户端用户名称;
  • 3.$time_local : 用来记录访问时间与时区;
  • 4.$request : 用来记录请求的url与http协议;
  • 5.$status : 用来记录请求状态;成功是200;
  • 6.$body_bytes_s ent :记录发送给客户端文件主体内容大小;
  • 7.$http_referer :用来记录从那个页面链接访问过来的;
  • 8.$http_user_agent :记录客户端浏览器的相关信息;

二、Nginx 负载均衡

2.1 热备负载均衡

热备:如果你有2台服务器,当一台服务器发生事故时,才启用第二台服务器给提供服务。服务器处理请求的顺序:AAAAAA突然A挂啦,BBBBBBBBBBBBBB...

nginx 复制代码
upstream mysvr { 
    server 127.0.0.1:7878; 
    server 192.168.10.121:3333 backup;  #热备     
}

server {   
    listen       8081;   #监听端口
    server_name  127.0.0.1;   #监听地址       
    location  /{
        proxy_pass  http://mysvr;  #请求转向mysvr 定义的服务器列表    
    } 
}

2.2 轮询负责均衡

轮询:nginx默认就是轮询其权重都默认为1,服务器处理请求的顺序:ABABABABAB...

nginx 复制代码
upstream mysvr { 
    server 127.0.0.1:7878;
    server 192.168.10.121:3333;       
}

server {   
    listen       8081;   #监听端口
    server_name  127.0.0.1;   #监听地址       
    location  /{
        proxy_pass  http://mysvr;  #请求转向mysvr 定义的服务器列表    
    } 
}

2.3 加权轮询负载规则

加权轮询:跟据配置的权重的大小而分发给不同服务器不同数量的请求。如果不设置,则默认为1。下面服务器的请求顺序为:ABBABBABBABBABB...

nginx 复制代码
upstream mysvr { 
    server 127.0.0.1:7878 weight=1;
    server 192.168.10.121:3333 weight=2;
}
server {   
    listen       8081;   #监听端口
    server_name  127.0.0.1;   #监听地址       
    location  /{
        proxy_pass  http://mysvr;  #请求转向mysvr 定义的服务器列表    
    } 
}

2.4 ip_hash 负载均衡

ip_hash:nginx会让相同的客户端ip请求相同的服务器。

nginx 复制代码
upstream mysvr { 
    server 127.0.0.1:7878; 
    server 192.168.10.121:3333;
    ip_hash;
}
server {   
    listen       8081;   #监听端口
    server_name  127.0.0.1;   #监听地址       
    location  /{
        proxy_pass  http://mysvr;  #请求转向mysvr 定义的服务器列表    
    } 
}

2.5 对特定资源实现负载均衡

通过多个upstream分成多个服务器组,将不同的请求分流到不同的

nginx 复制代码
upstream videomysvr { 
    server 127.0.0.1:7878 weight=1;
    server 192.168.10.121:3333 weight=2;
}

upstream filemysvr {
    server 192.3.2.1:7878 weight=1;
    server 192.3.2.2:3333 weight=2;
}
server {   
    listen       8081;   #监听端口
    server_name  127.0.0.1;   #监听地址       
    location  /video/ {
        proxy_pass  http://videomysvr;  #请求转向mysvr 定义的服务器列表    
    } 
    location  /file/ {
        proxy_pass  http://filemysvr;  #请求转向mysvr 定义的服务器列表    
    } 
}

2.6 对不同域名实现负载均衡

nginx 复制代码
upstream videomysvr { 
    server 127.0.0.1:7878 weight=1;
    server 192.168.10.121:3333 weight=2;
}

upstream filemysvr {
    server 192.3.2.1:7878 weight=1;
    server 192.3.2.2:3333 weight=2;
}
server {   
    listen       8081;   #监听端口
    server_name  www.ustc.edu.cn;   #监听地址       
    location  /video/ {
        proxy_pass  http://videomysvr;  #请求转向mysvr 定义的服务器列表    
    } 
}
server {   
    listen       8082;   #监听端口
    server_name  www.ustc.sse.edu.cn;   #监听地址       
    location  /file/ {
        proxy_pass  http://filemysvr;  #请求转向mysvr 定义的服务器列表    
    } 
}

2.7 实现带有URL重写的负载均衡

nginx 复制代码
upstream backend{
	server 192.168.200.146:9001;
	server 192.168.200.146:9002;
	server 192.168.200.146:9003;
}
server {
	listen	80;
	server_name localhost;
	location /file/ {
		rewrite ^(/file/.*) /server/$1 last;
	}
	location / {
		proxy_pass http://backend;
	}
}

2.8 四层负载均衡

首先安装好redis和tomcat

nginx 复制代码
stream {	# 一级括号
        upstream redisbackend {
                server 192.168.200.146:6379;
                server 192.168.200.146:6378;
        }
        upstream tomcatbackend {
        		server 192.168.200.146:8080;
        }
        server {
                listen  81;
                proxy_pass redisbackend;
        }
        server {
        		listen	82;
        		proxy_pass tomcatbackend;
        }
}

三、Nginx 缓存

nginx 缓存的好处

  1. 减轻服务器负载
  2. 提供网页响应效率
  3. 降低网络阻塞,增强网络可扩展性

3.1 nginx 的缓存机制

配置块 名称 名称
http proxy_cache_path 指定缓冲区的路径
levels 缓存目录级最高三层,每层1-2个字符表示,比如:1:1:2 三层
keys_zone 缓存块名称及内存块大小,比如:cache_item:500m表示声明一个名为cache_item大小为500m,超出大小后最早的被清除
max_size 缓存区硬盘的最大值,超出闲置数据将被清除
inactive 最长闲置时间,比如:10d ,表示一个数据被闲置10天则将被清除
location proxy_cache 指定缓冲区,对应keys_zone中的设定的值
proxy_cache_key 通过参数拼装参数key如:h o s t hosthosturii s a r g s is_argsisargsargs 则会已全部md5值作为key
proxy_cache_valid 对不同的状态码设置缓存有效期

http模块:

  • proxy_cache_path:该指定用于设置缓存文件的存放路径
  • levels: 指定该缓存空间对应的目录,最多可以设置3层 ,每层取值为1|2如 : levels=1:2 缓存空间有两层目录,第一次是1个字母,第二次是2个字母;levels=2:2:2 最终的存储路径为 /usr/local/proxy_cache/7d/10/e2
  • keys_zone:用来为这个缓存区设置名称和指定大小,如:keys_zone=ffideal:200m 缓存区的名称是ffideal,大小为200M,1M大概能存储8000个keys
  • inactive:指定缓存的数据多次时间未被访问就将被删除,如:inactive=1d ,缓存数据在1天内没有被访问就会被删除
  • max_size:设置最大缓存空间,如果缓存空间存满,默认会覆盖缓存时间最长的资源,如:max_size=20g
nginx 复制代码
http{
    # proxy_cache_path path [levels=number]
# keys_zone=zone_name:zone_size [inactive=time]\[max_size=size];
proxy_cache_path /usr/local/proxy_cache levels=1:2:1 keys_zone=ffideal:200m inactive=1d max_size=20g
}

location:

  • proxy_cache

该指令用来开启或关闭代理缓存,如果是开启则自定使用哪个缓存区来进行缓存。

语法 proxy_cache zone_name|off;
默认值 proxy_cache off;
位置 http、server、location

zone_name:指定使用缓存区的名称

  • proxy_cache_key

该指令用来设置web缓存的key值,Nginx会根据key值MD5哈希存缓存。

语法 proxy_cache_key key;
默认值 proxy_cache_key schemeproxy_host$request_uri;
位置 http、server、location
  • proxy_cache_valid

该指令用来对不同返回状态码的URL设置不同的缓存时间

语法 proxy_cache_valid code ... time;
默认值 ---
位置 http、server、location

如:

复制代码
proxy_cache_valid 200 302 10m;
proxy_cache_valid 404 1m;
为200和302的响应URL设置10分钟缓存,为404的响应URL设置1分钟缓存
proxy_cache_valid any 1m;
对所有响应状态码的URL都设置1分钟缓存
  • proxy_cache_min_uses

该指令用来设置资源被访问多少次后被缓存

语法 proxy_cache_min_uses number;
默认值 proxy_cache_min_uses 1;
位置 http、server、location
  • proxy_cache_methods

该指令用户设置缓存哪些HTTP方法

语法 proxy_cache_methods GET|HEAD|POST;
默认值 proxy_cache_methods GET HEAD;
位置 http、server、location

默认缓存HTTP的GET和HEAD方法,不缓存POST方法。

3.2 缓存实例

Nginx的环境准备

(1)完成Nginx反向代理配置

复制代码
http{
	upstream backend{
		server 192.168.200.146:8080;
	}
	server {
		listen       8080;
        server_name  localhost;
        location / {
        	proxy_pass http://backend/js/;
        }
	}
}

(2)完成Nginx缓存配置

4.添加缓存配置

复制代码
http{
	proxy_cache_path /usr/local/proxy_cache levels=2:1 keys_zone=itcast:200m inactive=1d max_size=20g;
	upstream backend{
		server 192.168.200.146:8080;
	}
	server {
		listen       8080;
        server_name  localhost;
        location / {
        	proxy_cache itcast;
            proxy_cache_key itheima;
            proxy_cache_min_uses 5;
            proxy_cache_valid 200 5d;
            proxy_cache_valid 404 30s;
            proxy_cache_valid any 1m;
            add_header nginx-cache "$upstream_cache_status";
        	proxy_pass http://backend/js/;
        }
	}
}

3.3 Nginx缓存的清除

方式一:删除对应的缓存目录

复制代码
rm -rf /usr/local/proxy_cache/......

方式二:使用第三方扩展模块

ngx_cache_purge

(1)下载ngx_cache_purge模块对应的资源包,并上传到服务器上。

复制代码
ngx_cache_purge-2.3.tar.gz

(2)对资源文件进行解压缩

复制代码
tar -zxf ngx_cache_purge-2.3.tar.gz

(3)修改文件夹名称,方便后期配置

复制代码
mv ngx_cache_purge-2.3 purge

(4)查询Nginx的配置参数

复制代码
nginx -V

(5)进入Nginx的安装目录,使用./configure进行参数配置

复制代码
./configure --add-module=/root/nginx/module/purge

(6)使用make进行编译

复制代码
make

(7)将nginx安装目录的nginx二级制可执行文件备份

复制代码
mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginxold

(8)将编译后的objs中的nginx拷贝到nginx的sbin目录下

复制代码
cp objs/nginx /usr/local/nginx/sbin

(9)使用make进行升级

复制代码
make upgrade

(10)在nginx配置文件中进行如下配置

复制代码
server{
	location ~/purge(/.*) {
		proxy_cache_purge itcast itheima;
	}
}

3.4 Nginx设置资源不缓存

前面咱们已经完成了Nginx作为web缓存服务器的使用。但是我们得思考一个问题就是不是所有的数据都适合进行缓存。比如说对于一些经常发生变化的数据。如果进行缓存的话,就很容易出现用户访问到的数据不是服务器真实的数据。所以对于这些资源我们在缓存的过程中就需要进行过滤,不进行缓存。

Nginx也提供了这块的功能设置,需要使用到如下两个指令

proxy_no_cache

该指令是用来定义不将数据进行缓存的条件。

语法 proxy_no_cache string ...;
默认值 ---
位置 http、server、location

配置实例

复制代码
proxy_no_cache $cookie_nocache $arg_nocache $arg_comment;

proxy_cache_bypass

该指令是用来设置不从缓存中获取数据的条件。

语法 proxy_cache_bypass string ...;
默认值 ---
位置 http、server、location

配置实例

复制代码
proxy_cache_bypass $cookie_nocache $arg_nocache $arg_comment;

上述两个指令都有一个指定的条件,这个条件可以是多个,并且多个条件中至少有一个不为空且不等于"0",则条件满足成立。上面给的配置实例是从官方网站获取的,里面使用到了三个变量,分别是cookie_nocache、arg_nocache、$arg_comment

cookie_nocache、arg_nocache、$arg_comment

这三个参数分别代表的含义是:

复制代码
$cookie_nocache
指的是当前请求的cookie中键的名称为nocache对应的值
$arg_nocache和$arg_comment
指的是当前请求的参数中属性名为nocache和comment对应的属性值

案例演示下:

复制代码
log_format params $cookie_nocache | $arg_nocache | $arg_comment;
server{
	listen	8081;
	server_name localhost;
	location /{
		access_log logs/access_params.log params;
		add_header Set-Cookie 'nocache=999';
		root html;
		index index.html;
	}
}

案例实现

设置不缓存资源的配置方案

复制代码
server{
	listen	8080;
	server_name localhost;
	location / {
		if ($request_uri ~ /.*\.js$){
           set $nocache 1;
        }
		proxy_no_cache $nocache $cookie_nocache $arg_nocache $arg_comment;
        proxy_cache_bypass $nocache $cookie_nocache $arg_nocache $arg_comment;
	}
}

四、参考资料

https://www.runoob.com/w3cnote/nginx-setup-intro.html

https://www.runoob.com/w3cnote/nginx-proxy-balancing.html

相关推荐
似的8358 小时前
一步一步学习使用FireMonkey动画() 使用TAnimator类创建动画
linux·学习·nginx
看昭奚恤哭11 小时前
平滑加权轮询负载均衡的底层逻辑
运维·负载均衡
梅孔立13 小时前
两种免费的翻译API调用方式详解 - Edge官方API与个人缓存服务
前端·缓存·edge
gwf21613 小时前
SSD读写速度深度解析:顺序读写vs随机读写、IOPS、延迟,你的硬盘性能到底怎么看?
git·嵌入式硬件·缓存·github·智能硬件
番茄炒鸡蛋加糖16 小时前
缓存三大问题
缓存
江晓鱼未暖20 小时前
十七、Redis 核心原理与架构详解
大数据·数据库·数据仓库·redis·缓存·架构
小罗水21 小时前
第13章 Redis 缓存、幂等锁与任务状态
数据库·redis·缓存
小张同学a.21 小时前
LAMP架构2
linux·运维·网络·架构·负载均衡
热心市民lcj21 小时前
Spring Boot 整合 Caffeine 本地缓存实战
spring boot·后端·缓存
zx1154501 天前
【热点 Key 探测与加长缓存 TTL 实战】
缓存