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

打印 上一主题 下一主题

主题 842|帖子 842|积分 2526

一、Nginx 反向代理

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

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

  1. # 1.全局块,配置影响nginx全局的指令。
  2. # 一般有运行nginx服务器的用户组,nginx进程pid存放路径,日志存放路径,配置文件引入,允许生成worker process数等。
  3. ...              #全局块
  4. # 2.配置影响nginx服务器或与用户的网络连接。
  5. # 有每个进程的最大连接数,选取哪种事件驱动模型处理连接请求,是否允许同时接受多个网路连接,开启多个网络连接序列化等。
  6. events {         #events块
  7.    ...
  8. }
  9. # 3.可以嵌套多个server,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置。
  10. # 如文件引入,mime-type定义,日志自定义,是否使用sendfile传输文件,连接超时时间,单连接请求数等。
  11. http      #http块
  12. {
  13.     ...   #http全局块
  14.         
  15.     # 4.配置虚拟主机的相关参数,一个http中可以有多个server。
  16.     server        #server块
  17.     {
  18.         ...       #server全局块
  19.             
  20.         # 5.配置请求的路由,以及各种页面的处理情况。
  21.         location [PATTERN]   #location块
  22.         {
  23.             ...
  24.         }
  25.         location [PATTERN]
  26.         {
  27.             ...
  28.         }
  29.     }
  30.     server
  31.     {
  32.       ...
  33.     }
  34.     ...     #http全局块
  35. }
复制代码
1.2 默认的nginx配置文件

  1. #user  nobody;
  2. worker_processes  1;
  3. #error_log  logs/error.log;
  4. #error_log  logs/error.log  notice;
  5. #error_log  logs/error.log  info;
  6. #pid        logs/nginx.pid;
  7. events {
  8.     worker_connections  1024;
  9. }
  10. http {
  11.     include       mime.types;
  12.     default_type  application/octet-stream;
  13.     #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
  14.     #                  '$status $body_bytes_sent "$http_referer" '
  15.     #                  '"$http_user_agent" "$http_x_forwarded_for"';
  16.     #access_log  logs/access.log  main;
  17.     sendfile        on;
  18.     #tcp_nopush     on;
  19.     #keepalive_timeout  0;
  20.     keepalive_timeout  65;
  21.     #gzip  on;
  22.     server {
  23.         listen       80;
  24.         server_name  localhost;
  25.         #charset koi8-r;
  26.         #access_log  logs/host.access.log  main;
  27.         location / {
  28.             root   html;
  29.             index  index.html index.htm;
  30.         }
  31.         #error_page  404              /404.html;
  32.         # redirect server error pages to the static page /50x.html
  33.         #
  34.         error_page   500 502 503 504  /50x.html;
  35.         location = /50x.html {
  36.             root   html;
  37.         }
  38.         # proxy the PHP scripts to Apache listening on 127.0.0.1:80
  39.         #
  40.         #location ~ \.php$ {
  41.         #    proxy_pass   http://127.0.0.1;
  42.         #}
  43.         # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
  44.         #
  45.         #location ~ \.php$ {
  46.         #    root           html;
  47.         #    fastcgi_pass   127.0.0.1:9000;
  48.         #    fastcgi_index  index.php;
  49.         #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
  50.         #    include        fastcgi_params;
  51.         #}
  52.         # deny access to .htaccess files, if Apache's document root
  53.         # concurs with nginx's one
  54.         #
  55.         #location ~ /\.ht {
  56.         #    deny  all;
  57.         #}
  58.     }
  59.     # another virtual host using mix of IP-, name-, and port-based configuration
  60.     #
  61.     #server {
  62.     #    listen       8000;
  63.     #    listen       somename:8080;
  64.     #    server_name  somename  alias  another.alias;
  65.     #    location / {
  66.     #        root   html;
  67.     #        index  index.html index.htm;
  68.     #    }
  69.     #}
  70.     # HTTPS server
  71.     #
  72.     #server {
  73.     #    listen       443 ssl;
  74.     #    server_name  localhost;
  75.     #    ssl_certificate      cert.pem;
  76.     #    ssl_certificate_key  cert.key;
  77.     #    ssl_session_cache    shared:SSL:1m;
  78.     #    ssl_session_timeout  5m;
  79.     #    ssl_ciphers  HIGH:!aNULL:!MD5;
  80.     #    ssl_prefer_server_ciphers  on;
  81.     #    location / {
  82.     #        root   html;
  83.     #        index  index.html index.htm;
  84.     #    }
  85.     #}
  86. }
复制代码
1.3 实践中的 nginx.conf

  1. ########### 每个指令必须有分号结束。#################
  2. #user administrator administrators;  #配置用户或者组,默认为nobody nobody。
  3. #worker_processes 2;  #允许生成的进程数,默认为1
  4. #pid /nginx/pid/nginx.pid;   #指定nginx进程运行文件存放地址
  5. error_log log/error.log debug;  #制定日志路径,级别。这个设置可以放入全局块,http块,server块,级别以此为:debug|info|notice|warn|error|crit|alert|emerg
  6. events {
  7.     accept_mutex on;   #设置网路连接序列化,防止惊群现象发生,默认为on
  8.     multi_accept on;  #设置一个进程是否同时接受多个网络连接,默认为off
  9.     #use epoll;      #事件驱动模型,select|poll|kqueue|epoll|resig|/dev/poll|eventport
  10.     worker_connections  1024;    #最大连接数,默认为512
  11. }
  12. http {
  13.     include       mime.types;   #文件扩展名与文件类型映射表
  14.     default_type  application/octet-stream; #默认文件类型,默认为text/plain
  15.     #access_log off; #取消服务日志   
  16.     log_format myFormat '$remote_addr–$remote_user [$time_local] $request $status $body_bytes_sent $http_referer $http_user_agent $http_x_forwarded_for'; #自定义格式
  17.     access_log log/access.log myFormat;  #combined为日志格式的默认值
  18.     sendfile on;   #允许sendfile方式传输文件,默认为off,可以在http块,server块,location块。
  19.     sendfile_max_chunk 100k;  #每个进程每次调用传输数量不能大于设定的值,默认为0,即不设上限。
  20.     keepalive_timeout 65;  #连接超时时间,默认为75s,可以在http,server,location块。
  21.     upstream mysvr {   
  22.       server 127.0.0.1:7878;
  23.       server 192.168.10.121:3333 backup;  #热备
  24.     }
  25.     error_page 404 https://www.baidu.com; #错误页
  26.     server {
  27.         keepalive_requests 120; #单连接请求上限次数。
  28.         listen       4545;   #监听端口
  29.         server_name  127.0.0.1;   #监听地址      
  30.         location  ~*^.+$ {       #请求的url过滤,正则匹配,~为区分大小写,~*为不区分大小写。
  31.            #root path;  #根目录
  32.            #index vv.txt;  #设置默认页
  33.            proxy_pass  http://mysvr;  #请求转向mysvr 定义的服务器列表
  34.            deny 127.0.0.1;  #拒绝的ip
  35.            allow 172.18.5.54; #允许的ip           
  36.         }
  37.     }
  38. }
复制代码
惊群现象:一个网路连接到来,多个就寝的进程被同时叫醒,但只有一个进程能获得链接,这样会影响系统性能。
几个常见配置项:


  • 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…
  1. upstream mysvr {
  2.     server 127.0.0.1:7878;
  3.     server 192.168.10.121:3333 backup;  #热备     
  4. }
  5. server {   
  6.     listen       8081;   #监听端口
  7.     server_name  127.0.0.1;   #监听地址      
  8.     location  /{
  9.         proxy_pass  http://mysvr;  #请求转向mysvr 定义的服务器列表   
  10.     }
  11. }
复制代码
2.2 轮询负责均衡

轮询:nginx默认就是轮询其权重都默以为1,服务器处理请求的次序:ABABABABAB…
  1. upstream mysvr {
  2.     server 127.0.0.1:7878;
  3.     server 192.168.10.121:3333;      
  4. }
  5. server {   
  6.     listen       8081;   #监听端口
  7.     server_name  127.0.0.1;   #监听地址      
  8.     location  /{
  9.         proxy_pass  http://mysvr;  #请求转向mysvr 定义的服务器列表   
  10.     }
  11. }
复制代码
2.3 加权轮询负载规则

加权轮询:跟据配置的权重的巨细而分发给不同服务器不同数目的请求。如果不设置,则默以为1。下面服务器的请求次序为:ABBABBABBABBABB…
  1. upstream mysvr {
  2.     server 127.0.0.1:7878 weight=1;
  3.     server 192.168.10.121:3333 weight=2;
  4. }
  5. server {   
  6.     listen       8081;   #监听端口
  7.     server_name  127.0.0.1;   #监听地址      
  8.     location  /{
  9.         proxy_pass  http://mysvr;  #请求转向mysvr 定义的服务器列表   
  10.     }
  11. }
复制代码
2.4 ip_hash 负载均衡

ip_hash:nginx会让类似的客户端ip请求类似的服务器。
  1. upstream mysvr {
  2.     server 127.0.0.1:7878;
  3.     server 192.168.10.121:3333;
  4.     ip_hash;
  5. }
  6. server {   
  7.     listen       8081;   #监听端口
  8.     server_name  127.0.0.1;   #监听地址      
  9.     location  /{
  10.         proxy_pass  http://mysvr;  #请求转向mysvr 定义的服务器列表   
  11.     }
  12. }
复制代码
2.5 对特定资源实现负载均衡

通过多个upstream分成多个服务器组,将不同的请求分流到不同的
  1. upstream videomysvr {
  2.     server 127.0.0.1:7878 weight=1;
  3.     server 192.168.10.121:3333 weight=2;
  4. }
  5. upstream filemysvr {
  6.     server 192.3.2.1:7878 weight=1;
  7.     server 192.3.2.2:3333 weight=2;
  8. }
  9. server {   
  10.     listen       8081;   #监听端口
  11.     server_name  127.0.0.1;   #监听地址      
  12.     location  /video/ {
  13.         proxy_pass  http://videomysvr;  #请求转向mysvr 定义的服务器列表   
  14.     }
  15.     location  /file/ {
  16.         proxy_pass  http://filemysvr;  #请求转向mysvr 定义的服务器列表   
  17.     }
  18. }
复制代码
2.6 对不同域名实现负载均衡

  1. upstream videomysvr {
  2.     server 127.0.0.1:7878 weight=1;
  3.     server 192.168.10.121:3333 weight=2;
  4. }
  5. upstream filemysvr {
  6.     server 192.3.2.1:7878 weight=1;
  7.     server 192.3.2.2:3333 weight=2;
  8. }
  9. server {   
  10.     listen       8081;   #监听端口
  11.     server_name  www.ustc.edu.cn;   #监听地址      
  12.     location  /video/ {
  13.         proxy_pass  http://videomysvr;  #请求转向mysvr 定义的服务器列表   
  14.     }
  15. }
  16. server {   
  17.     listen       8082;   #监听端口
  18.     server_name  www.ustc.sse.edu.cn;   #监听地址      
  19.     location  /file/ {
  20.         proxy_pass  http://filemysvr;  #请求转向mysvr 定义的服务器列表   
  21.     }
  22. }
复制代码
2.7 实现带有URL重写的负载均衡

  1. upstream backend{
  2.         server 192.168.200.146:9001;
  3.         server 192.168.200.146:9002;
  4.         server 192.168.200.146:9003;
  5. }
  6. server {
  7.         listen        80;
  8.         server_name localhost;
  9.         location /file/ {
  10.                 rewrite ^(/file/.*) /server/$1 last;
  11.         }
  12.         location / {
  13.                 proxy_pass http://backend;
  14.         }
  15. }
复制代码
2.8 四层负载均衡


首先安装好redis和tomcat
  1. stream {        # 一级括号
  2.         upstream redisbackend {
  3.                 server 192.168.200.146:6379;
  4.                 server 192.168.200.146:6378;
  5.         }
  6.         upstream tomcatbackend {
  7.                         server 192.168.200.146:8080;
  8.         }
  9.         server {
  10.                 listen  81;
  11.                 proxy_pass redisbackend;
  12.         }
  13.         server {
  14.                         listen        82;
  15.                         proxy_pass tomcatbackend;
  16.         }
  17. }
复制代码
三、Nginx 缓存


nginx 缓存的好处

  • 减轻服务器负载
  • 提供网页相应效率
  • 降低网络阻塞,增强网络可扩展性
3.1 nginx 的缓存机制

配置块名称名称httpproxy_cache_path指定缓冲区的路径levels缓存目录级最高三层,每层1-2个字符表示,好比:1:1:2 三层keys_zone缓存块名称及内存块巨细,好比:cache_item:500m表示声明一个名为cache_item巨细为500m,超出巨细后最早的被清除max_size缓存区硬盘的最大值,超出闲置数据将被清除inactive最长闲置时间,好比:10d ,表示一个数据被闲置10天则将被清除locationproxy_cache指定缓冲区,对应keys_zone中的设定的值proxy_cache_key通过参数拼装参数key如:h o s t hosthosturii s a r g s is_argsisargsargs 则会已全部md5值作为keyproxy_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
  1. http{
  2.     # proxy_cache_path path [levels=number]
  3. # keys_zone=zone_name:zone_size [inactive=time]\[max_size=size];
  4. proxy_cache_path /usr/local/proxy_cache levels=1:2:1 keys_zone=ffideal:200m inactive=1d max_size=20g
  5. }
复制代码
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 如:
  1. proxy_cache_valid 200 302 10m;
  2. proxy_cache_valid 404 1m;
  3. 为200和302的响应URL设置10分钟缓存,为404的响应URL设置1分钟缓存
  4. proxy_cache_valid any 1m;
  5. 对所有响应状态码的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反向代理配置
  1. http{
  2.         upstream backend{
  3.                 server 192.168.200.146:8080;
  4.         }
  5.         server {
  6.                 listen       8080;
  7.         server_name  localhost;
  8.         location / {
  9.                 proxy_pass http://backend/js/;
  10.         }
  11.         }
  12. }
复制代码
(2)完成Nginx缓存配置
4.添加缓存配置
  1. http{
  2.         proxy_cache_path /usr/local/proxy_cache levels=2:1 keys_zone=itcast:200m inactive=1d max_size=20g;
  3.         upstream backend{
  4.                 server 192.168.200.146:8080;
  5.         }
  6.         server {
  7.                 listen       8080;
  8.         server_name  localhost;
  9.         location / {
  10.                 proxy_cache itcast;
  11.             proxy_cache_key itheima;
  12.             proxy_cache_min_uses 5;
  13.             proxy_cache_valid 200 5d;
  14.             proxy_cache_valid 404 30s;
  15.             proxy_cache_valid any 1m;
  16.             add_header nginx-cache "$upstream_cache_status";
  17.                 proxy_pass http://backend/js/;
  18.         }
  19.         }
  20. }
复制代码
3.3 Nginx缓存的清除

方式一:删除对应的缓存目录
  1. rm -rf /usr/local/proxy_cache/......
复制代码
方式二:使用第三方扩展模块
ngx_cache_purge
(1)下载ngx_cache_purge模块对应的资源包,并上传到服务器上。
  1. ngx_cache_purge-2.3.tar.gz
复制代码
(2)对资源文件进行解压缩
  1. tar -zxf ngx_cache_purge-2.3.tar.gz
复制代码
(3)修改文件夹名称,方便后期配置
  1. mv ngx_cache_purge-2.3 purge
复制代码
(4)查询Nginx的配置参数
  1. nginx -V
复制代码
(5)进入Nginx的安装目录,使用./configure进行参数配置
  1. ./configure --add-module=/root/nginx/module/purge
复制代码
(6)使用make
进行编译
  1. make
复制代码
(7)将nginx安装目录的nginx二级制可实行文件备份
  1. mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginxold
复制代码
(8)将编译后的objs中的nginx拷贝到nginx的sbin目录下
  1. cp objs/nginx /usr/local/nginx/sbin
复制代码
(9)使用make
进行升级
  1. make
  2. upgrade
复制代码
(10)在nginx配置文件中进行如下配置
  1. server{
  2.         location ~/purge(/.*) {
  3.                 proxy_cache_purge itcast itheima;
  4.         }
  5. }
复制代码
3.4 Nginx设置资源不缓存

前面咱们已经完成了Nginx作为web缓存服务器的使用。但是我们得思考一个问题就是不是所有的数据都适合进行缓存。好比说对于一些常常发生变化的数据。如果进行缓存的话,就很轻易出现用户访问到的数据不是服务器真实的数据。所以对于这些资源我们在缓存的过程中就必要进行过滤,不进行缓存。
Nginx也提供了这块的功能设置,必要使用到如下两个指令
proxy_no_cache
该指令是用来界说不将数据进行缓存的条件。
语法proxy_no_cache string …;默认值—位置http、server、location 配置实例
  1. proxy_no_cache $cookie_nocache $arg_nocache $arg_comment;
复制代码
proxy_cache_bypass
该指令是用来设置不从缓存中获取数据的条件。
语法proxy_cache_bypass string …;默认值—位置http、server、location 配置实例
  1. proxy_cache_bypass $cookie_nocache $arg_nocache $arg_comment;
复制代码
上述两个指令都有一个指定的条件,这个条件可以是多个,而且多个条件中至少有一个不为空且不等于"0",则条件满足建立。上面给的配置实例是从官方网站获取的,里面使用到了三个变量,分别是$cookie_nocache、$arg_nocache、$arg_comment
$cookie_nocache、$arg_nocache、$arg_comment
这三个参数分别代表的含义是:
  1. $cookie_nocache
  2. 指的是当前请求的cookie中键的名称为nocache对应的值
  3. $arg_nocache和$arg_comment
  4. 指的是当前请求的参数中属性名为nocache和comment对应的属性值
复制代码
案例演示下:
  1. log_format params $cookie_nocache | $arg_nocache | $arg_comment;
  2. server{
  3.         listen        8081;
  4.         server_name localhost;
  5.         location /{
  6.                 access_log logs/access_params.log params;
  7.                 add_header Set-Cookie 'nocache=999';
  8.                 root html;
  9.                 index index.html;
  10.         }
  11. }
复制代码
案例实现
设置不缓存资源的配置方案
  1. server{
  2.         listen        8080;
  3.         server_name localhost;
  4.         location / {
  5.                 if ($request_uri ~ /.*\.js$){
  6.            set $nocache 1;
  7.         }
  8.                 proxy_no_cache $nocache $cookie_nocache $arg_nocache $arg_comment;
  9.         proxy_cache_bypass $nocache $cookie_nocache $arg_nocache $arg_comment;
  10.         }
  11. }
复制代码
四、参考资料

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

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

悠扬随风

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表