Nginx的常规使用方式

96 阅读4分钟

正向代理VS反向代理

1、正向代理

正向代理是一个位于客户端和原始服务器之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。客户端才能使用正向代理。正向代理的典型用途是为在防火墙内的局域网客户端提供访问Internet的途径。正向代理还可以使用缓冲特性减少网络使用率。

image.png

2、反向代理

反向代理方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个服务器。通过在网络各处放置反向代理节点服务器所构成的在现有的互联网基础之上的一层智能虚拟网络,CDN系统能够实时地根据网络流量和各节点的连接、负载状况以及到用户的距离和响应时间等综合信息将用户的请求重新导向离用户最近的服务节点上。

image.png

servername匹配规则

1、多域名匹配相同项目

前端代码是同一套,但是可以通过不同的域名来请求

server {
    listen       80;
    server_name  www.gaoyang.asia edu.gaoyang.asia ;

    #charset koi8-r;

    #access_log  logs/host.access.log  main;

    location / {
        root   /usr/local/web;
        index  index.html index.htm;
    }

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

2、泛解析

在公有云上配置域名泛解析,这样任何二级域名都能匹配到目标服务器

server {
    listen       80;
    server_name  *.gaoyang.asia;

    #charset koi8-r;

    #access_log  logs/host.access.log  main;

    location / {
        root   /usr/local/any;
        index  index.html index.htm;
    }


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

3、请求转发

当你在Nginx的配置中添加了proxy_pass,则会将所有访问该nginx站点根目录的请求都转发到 www.baidu.com

server {
    listen       80;
    server_name  localhost;

    #charset koi8-r;

    #access_log  logs/host.access.log  main;

    location / {
        proxy_pass http://www.baidu.com
        # root   /usr/local/any;
        # index  index.html index.htm;
    }


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

负载均衡

通过如下配置可以均衡的将请求分配到不同IP服务器的不同端口号上

worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    
    upstream loadbalance {
        server 192.168.1.11:80;
        server 192.168.1.12:81;
        server 192.168.1.16:84;
    }
    
    server {
        listen       80;
        server_name  localhost;
        location / {
            proxy_pass http://loadbalance;
            # root   html;
            # index  index.html index.htm;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

有时候我们也可以根据不同服务器的配置和性能来按权重来分配,weigth范围可以按1~9来设置,比重越高被访问的概率越大;如果想某个节点不参与调度可以在后面加上关键字down,这样请求就不会被分配到这个服务器;如果实际项目需要一个服务器作为备用服务器防止主服务器全部挂掉出现无服务可用的状态,则可以在该服务器后面加上backup关键字,这样即使主服务器挂了备用服务器也能立马顶上去。

upstream loadbalance {
    server 192.168.1.11 weight=8;
    server 192.168.1.12 weight=2;
    server 192.168.1.13 weight=1 backup;
    server 192.168.1.14 weight=4 down;
}

动静分离

用nginx代理前端项目访问的同学都知道,有的前端项目中需要加载很多js和css、img资源,如果所有的资源都去对应的服务器上查找后再传输到用户端加载出来的话,会占用部分网络资源从而降低了页面的访问速率。

location / {
    proxy_pass http://192.168.44.104:8080;
}
location /css {
    root html;
    index index.html index.htm;
}
location /js {
    root html;
    index index.html index.htm;
}
location /img {
    root html;
    index index.html index.htm;
}

当目录过多时,可以采用多规则匹配(正则表达式)

location ~*/(js|css|img|xx) {
    root html;
    index index.html index.htm;
}

UrlRewrite

有时候我们可能并不想暴露真实的接口地址到公网,这个时候我们不妨试试UrlRewrite,它可以按照我们配置的规则来识别指定规则的url然后将其替换成真实的后端地址。$1表示取第一个正则中的值,break代表匹配上就结束不走后续其他的匹配。

rewrite ^/([正则表达式]+).html$  /index.jsp?pageNum=$1  break;

例如,下面这个正则的含义就是匹配 /2.html 到后端 /index.jsp?pageNum=2 的接口

location / {
    rewrite ^/2.html$  /index.jsp?pageNum=2  break;
    proxy_pass http://192.168.44.104:8080;
}

防盗链

有时候我们只希望前端项目中的某些资源只能被指定IP的主机所加载,其他IP地址的主机则无法访问该资源的时候,我们就可以用valid_referers来配置

location ~*/(js|css|img|xx) {
    valid_referers 192.168.1.11;
    if ($valid_referers) {
        return 403;
    }
}