不断的学习,我们才能不断的前进
一个好的程序员是那种过单行线马路都要往两边看的人

Nginx

Nginx是一个web服务器和反向代理服务器,可以用来做反向代理、负载均衡、虚拟主机(两个域名映射到同一台主机上面)

Docker 安装Nginx

docker pull nginx:latest
docker run --name myNginx -p 8080:80 -d nginx

查看配置文件

ps -ef | grep nginx # 程序在运行中
which nginx # 查看运行文件所在路径
whereis nginx # 查看软件安装路径

# 获得结果 /usr/sbin/nginx

/usr/sbin/nginx -t # 查看配置文件所在路径

代理

正向代理

正向代理,架设在客户机与目标主机之间,只用于代理内部网络对Internet的连接请求,客户机必须指定代理服务器,并将本来要直接发送到Web服务器上的http请求发送到代理服务器。 比如访问google学术,客户端是无法直接访问的,但是可以通过学校图书馆做代理服务器,客户端把请求发送到学校图书馆,然后图书馆作为代理服务器访问google学术,然后返回结果给客户端

反向代理

反向代理服务器架设在服务器端,通过缓存经常被请求的页面来缓解服务器的工作量,将客户机请求转发给内部网络上的目标服务器;并将从服务器上得到的结果返回给Internet上请求连接的客户端,此时代理服务器与目标主机一起对外表现为一个服务器。
反向代理的作用?
主要用于转发客户机请求,假设后台有多个http服务器提供服务,nginx的功能就是把请求转发给后面的服务器,决定哪台目标主机来处理当前请求。

Nginx 实现反向代理

server {
        listen       80 default_server;
        listen       [::]:80 default_server;
        server_name  _;
        
        location / {
           root /root/workspace/ruoyi-ui/dist/; # 设置前端页面的根目录
           try_files $uri $uri/ /index.html;
           index  index.html index.htm; # 首页
        }
        # 设置转发路径,反向代理,
        location /prod-api/{ # 如果路径里面包含/prod-api/,则请求到下面的转发路径,/prod-api/ 会被替换为proxy_pass ip:port后面的内容,这里没写,所以会被删除掉
                        proxy_set_header Host $http_host;
                        proxy_set_header X-Real-IP $remote_addr;
                        proxy_set_header REMOTE-HOST $remote_addr;
                        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                        proxy_pass http://172.16.0.13:8080/;# 转发到的路径
                }

        error_page 404 /404.html;
        location = /404.html {
        }

        error_page 500 502 503 504 /50x.html;
        location = /50x.html {
        }
    }

Nginx 实现负载均衡

负载均衡,: 轮询(按顺序执行)、公平(根据处理能力分发)、权重(权重越高的被分配的越多)、hash(根据ip的hash进行分配)
轮询

upstream backend{
        server 172.16.0.129:8080 ;
        server 172.16.0.130:8080 ;
    }

公平
根据服务器的处理能力来进行分发

upstream backend{
        server 172.16.0.129:8080 ;
        server 172.16.0.130:8080 ;
        fair;
    }

权重
权重越高分发的概率越高

upstream backend{
        server 172.16.0.129:8080 weight=5;
        server 172.16.0.130:8080 weight=3;
    }

hash
根据IP的哈希结果来分发。

upstream backend{
        ip_hash;
        server 172.16.0.129:8080 ;
        server 172.16.0.130:8080 ;
    }

完整DEMO

# 实现的负载均衡,: 轮询(按顺序执行)、公平(根据处理能力分发)、权重(权重越高的被分配的越多)、hash(根据ip的hash进行分配)
upstream backend{
        server 172.16.0.129:8080 weight=5;
        server 172.16.0.130:8080 weight=3;
    }
    server {
        listen       80 default_server;
        listen       [::]:80 default_server;
        server_name  _;
     
        include /etc/nginx/default.d/*.conf;

        location / {
           root /root/workspace/ruoyi-ui/dist/; # 设置前端页面的根目录
           try_files $uri $uri/ /index.html;
           index  index.html index.htm;
        }
        # 设置转发路径,反向代理,
        location /prod-api/{ # 如果路径里面包含/prod-api/  则请求到下面的转发路径
                        proxy_set_header Host $http_host;
                        proxy_set_header X-Real-IP $remote_addr;
                        proxy_set_header REMOTE-HOST $remote_addr;
                        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                        proxy_pass http://backend/;# 转发到的路径
                }

        error_page 404 /404.html;
        location = /404.html {
        }

        error_page 500 502 503 504 /50x.html;
        location = /50x.html {
        }
    }

Nginx 实现动静分离

动静分离的目的是提高资源的访问效率,对于静态请求(css、html、image)请求静态资源服务器,对于动态请求请求后端服务器。
两种方案:

  1. 静态资源和动态资源属于不同的服务器
  2. 静态资源和动态资源放置在相同的服务器里面,通过nginx来分开,通过location 来指定不同的后缀名实现不同的请求转发,通过expires 参数设置浏览器缓存的过期时间,只适合不经常变动的资源

Nginx 实现缓存

缓存可以减少大量重复数据的读取,从而节省资源,提升网站的性能。缓存数据分为两部分(索引,数据):

  1. 存储数据的索引,存放在内存中;
  2. 存储缓存数据,存放在磁盘空间中;
http {
    #设置Web缓存区名称为nginx,内存缓存空间大小为20MB,1天没有被访问的内容自动清除,硬盘缓存空间大小为2GB。
    proxy_cache_path /data/cache levels=1:2 keys_zone=nginx:20M max_size=2G  inactive=1d;
    #为缓存数据添加头部信息
    add_header muzigan-Cache "$upstream_cache_status form $server_addr";
        
    upstream backend{
        server 172.16.0.129:8080 weight=5;
        server 172.16.0.130:8080 weight=3;
    }
    
    server {
        listen       80 default_server;
        listen       [::]:80 default_server;
        server_name  _;
        
        location / {
           root /root/workspace/ruoyi-ui/dist/; # 设置前端页面的根目录
           try_files $uri $uri/ /index.html;
           index  index.html index.htm;
        }
        
        location /prod-api/{ 
                        proxy_set_header Host $http_host;
                        proxy_set_header X-Real-IP $remote_addr;
                        proxy_set_header REMOTE-HOST $remote_addr;
                        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                        proxy_pass http://backend/;# 转发到的路径
                        
                        #开启缓存,nginx为上面配置的缓存分区名称
                        proxy_cache nginx;
                        #缓存设置 对不同的HTTP状态码设置不同的缓存时间
                        proxy_cache_valid 200 301 302 2m;
                }
        
        error_page 404 /404.html;
        location = /404.html {
        }

        error_page 500 502 503 504 /50x.html;
        location = /50x.html {
        }
    }
}

Nginx 配置目录展示

location / {   
        root /data/www/file                     //指定实际目录绝对路径;   
        autoindex on;                            //开启目录浏览功能;   
        autoindex_exact_size off;            //关闭详细文件大小统计,让文件大小显示MB,GB单位,默认为b;   
        autoindex_localtime on;              //开启以服务器本地时区显示文件修改日期!   
}

403 Forbidden的问题

  1. 查看配置文件里面 user 用户的权限
  2. 查看nginx根目录里面是否有index.html文件

Nginx 高可用性

配置Nginx 集群,主从架构


目录