文章目录
- 一、Nginx 反向代理
- 1.1 nginx 文件结构
- 1.2 默认的nginx配置文件
- 1.3 实践中的 nginx.conf
- 二、Nginx 负载均衡
- 2.1 热备负载均衡
- 2.2 轮询负责均衡
- 2.3 加权轮询负载规则
- 2.4 ip_hash 负载均衡
- 2.5 对特定资源实现负载均衡
- 2.6 对不同域名实现负载均衡
- 2.7 实现带有URL重写的负载均衡
- 2.8 四层负载均衡
- 三、Nginx 缓存
- 3.1 nginx 的缓存机制
- 3.2 缓存实例
- 3.3 Nginx缓存的清除
- 3.4 Nginx设置资源不缓存
- 四、参考资料
一、Nginx 反向代理
正向代理代理的对象是客户端,反向代理代理的是服务端
在nginx安装包下,有 conf/nginx.conf 文件,这是nginx服务器的基础配置,默认的配置也存放在此。
1.1 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配置文件
#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
########### 每个指令必须有分号结束。#################
#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; #设置网路连接序列化,防止惊群现象发生,默认为onmulti_accept on; #设置一个进程是否同时接受多个网络连接,默认为off#use epoll; #事件驱动模型,select|poll|kqueue|epoll|resig|/dev/poll|eventportworker_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; #拒绝的ipallow 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…
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…
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…
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请求相同的服务器。
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分成多个服务器组,将不同的请求分流到不同的
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 对不同域名实现负载均衡
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重写的负载均衡
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
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 缓存的好处
- 减轻服务器负载
- 提供网页响应效率
- 降低网络阻塞,增强网络可扩展性
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
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 $scheme$proxy_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