Nginx

总述

Nginx 的配置文件是采用模块化的设计的,包括多个上下文 ,主要的上下文有:main、events、http、server、location

mian:    全局配置,如设置错误日志路径和日志级别:error_log  /var/log/nginx/error.log    warn;

event: 事件上下文,影响nginx的并发处理能力

              指定每个工作进程的最大并发连接数:worker_connections 1024;

http:      include: 包含其它配置文件

              sendfile on;   : 启用sendfile系统调用,提高静态文件传输效率

              keepalive_timeout 65;  指定长连接的超长时间

              gzip on;  启用gzip压缩,减少传输数据量

server:  定义虚拟主机(可多个),每个虚拟主机可以独立配置不同的域名、端口、目录

              listen: 指定监听的端口和地址

              server_name: 指定虚拟主机的主机名  server_name  a;

              root: 指定虚拟主机的根目录

              index: 指定默认的索引文件  index  index.html  index.htm;

              error_page: 指定错误页面的路径    error_page  404 / 404.html;

location:   匹配URL路径 支持多种匹配方式,前缀匹配,正则匹配等

                  proxy_pass 将请求转发到后端服务器

                  rewrite: 重写url路径  

NGINX转发(http)

location

请求送到nginx 后,先根据location 后的url 与请求进行匹配,只有匹配上的才会执行这个location中的语句

匹配规则(匹配模式)
精确匹配

全路径精确匹配

location = /index  只有/index才会被匹配到,别的任何路径都不会被匹配。

前缀匹配

前缀模糊匹配(也是前缀匹配)

location ^~ /user/ ,只要是以/user/开头的都会被匹配到。如: /user/t,而使用^~ 是为了保证其匹配优先级要高于其它前缀匹配。

普通前缀匹配

location  /api/ {}    匹配所有以/api/开头的路径,如/api/user,但是其不会匹配        /api,

location /api {}  则会匹配以/api开头的所有路径,如/api/user,不会匹配/apihi

lcoation /api/abc 则会匹配到 /api/abcd,也会匹配到 /api/abc/

正则匹配

正则匹配是使用~ 或~* 来定义正则匹配的location ,其优先级是低于精确匹配和前缀匹配的。

匹配优先级

前缀匹配优先级:

  1. 优先级  全路径精确匹配>前缀模糊匹配>普通前缀匹配>正则匹配
  2. 普通前缀匹配(非正则):Nginx 会首先尝试根据前缀来匹配请求的路径,优先匹配“最精确”的前缀路径越长,越具体的前缀,优先级越高。
  3. 精确匹配优先:对于前缀匹配,Nginx会选择匹配路径最精确的。

如,如果有两个location   location  /api/    location /api    请求/api/user 会优先匹配第一个。第一个更长更精确。

proxy_pass

将请求转发向后端服务器

使用方法:proxy_pass url;

这个url的尾部带不带/ 以及location 中带不带/ 对最终转发的路径有很大的影响。

举例

location 匹配路径末尾有/

proxy_pass 后面的路径只有域名,没有/

访问路径: /app/user/index.html

location /app/{

proxy_pass http://localhost:8080;

}

最终请求会被代理到:http://localhost:8080/app/user/index.html

proxy_pass 后面的路径只有域名,有/

location /app/{

proxy_pass http://localhost:8080/;

}

最终请求会被代理到:http://localhost:8080/user/index.html

proxy_pass 后面的路径有域名,还有其它路径,且没有/

location /app/{

proxy_pass http://localhost:8080/abc;

}

最终请求被代理到:http://localhost:8080/abcuser/index.html

proxy_pass 后面的路径有域名,还有其它路径,有/

location /app/{

proxy_pass http://localhost:8080/abc/;

}

最终请求被代理到:http://localhost:8080/abc/user/index.html

只要我端口号后有/都会将匹配的路径进行消除,只要端口号后无/则会将匹配的路径带上。

如果proxy_pass的端口号后带有/,则匹配的部分会被去掉

请求:/app/user/index.html,匹配的部分是/app/ 剩下的是user/index.html,然后将这个拼接到proxy_pass后面。

如果proxy_pass的端口号后未带有/,则匹配的部分会被保留

请求:/app/user/index.html,匹配的部分是/app/ 因为不带斜杠,剩下的是/app/user/index.html,直接加到url后,最终的转发地址是:http://localhost:8080/app/user/index.html

location 匹配路径末尾没有/

也是根据端口后有没有/来处理,如果有,则消除,如果无,则原来的带过来。

location /app{

proxy_pass http://localhost:8080/abc/;

}

请求/app/user/index.html,最后有/ 则消除,成为:/user/index.html,;拼接后是:        http://localhost:8080/abc//user/index.html  Nginx会自动消除路径中多的/,所以最终会转发到:http://localhost:8080/abc/user/index.html。http:后面的//不是路径的部分,所以不会被Nginx消掉。

NGINX转发(http/stream)

stream块用来转发非http请求

stream{

        upstream{} 块

        server{

                listen

                proxy_pass

        }

}

里面的upstream块 和server块,这个里面是没有location的,通过server里的proxy_pass来定义转发到哪个url。upstream 也是用来负载均衡的。listen 是监听的端口

upstream 实现负载均衡

如:

http {

    upstream backend_servers {

        server backend1.example.com;

        server backend2.example.com;

        server backend3.example.com;

    }

    server {

        listen 80;

        server_name example.com;

        location / {

            proxy_pass http://backend_servers;

            proxy_set_header Host $host;

            proxy_set_header X-Real-IP $remote_addr;

            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

            proxy_set_header X-Forwarded-Proto $scheme;

        }

    }

}

此时 请求需要是http://example.com这种,即请求中是带有server_name的。会被转发到upstream中定义的那几个sever中。

server_name 也可以是ip ;也可以直接不使用server_name 这一个字段。

upstream 中的 server 只能是域名或者(IP+端口),其后不能够加斜杠,也不能够跟路径。而斜杠以及路径这些依旧是在proxy_pass进行的处理。

upstream backend_servers {

    server 192.168.1.10:8080;

    server 192.168.1.11:8080;

}

server {

    listen 80;

    server_name example.com;

    location /api/ {

        proxy_pass http://backend_servers/api/;  # 可以在这里定义路径

    }

}

如:请求是Http://example.com/api/user/123

则会送到: http://192.168.1.10:8080/api/user/123

或者           http://192.168.1.11:8080/api/user/123

白名单配置

可以在nginx的配置文件外定义一个白名单或者黑名单配置文件:whitelist.conf 或者blacklist.conf

白名单示例:

allow 192.168.1.100;

allow 192.168.1.101;

allow 192.168.1.0/24;

deny all;  //只通过允许的,拒绝所有其它的IP。这个必须要有

黑名单示例:

deny 192.168.1.100;

deny 192.168.1.101;

allow all;  //允许所有其它IP,拒绝列出的几个IP,这个必须有

然后在location块中  或者server块中引入这个名单即可。在location块中,只会限制匹配到的路径,而加在server块中的话,这个server虚拟服务器都将限制这些IP。

http {

    upstream backend_servers {

        server backend1.example.com;

        server backend2.example.com;

        server backend3.example.com;

    }

    server {

        listen 80;

        server_name example.com;

        include /etc/nginx/blacklist.conf  //include+文件所在路径+文件名

        location / {

           include /etc/nginx/blacklist.conf   /这也是可以的,匹配到的路径会限制这些ip

            proxy_pass http://backend_servers;

            proxy_set_header Host $host;

            proxy_set_header X-Real-IP $remote_addr;

            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

            proxy_set_header X-Forwarded-Proto $scheme;

        }

    }

}

还可以有更多的限制,限制server一共能有多少个连接,限制一个IP能够创建几个连接,限制一个IP能够最大多大的下载速度,限制连接时间,这都是可以的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值