Total Pageviews

Wednesday 13 June 2018

Nginx的Location配置

今天有一位同学问到 Nginx 的站点多路径匹配的问题?
1.www.domain.com/a 需要返回 /var/www/domain.com/a/index.html
2.www.domain.com/b 需要返回 /var/www/domain.com/b/index.html
如何配置 Nginx 使之生效?
解决这个问题,第一的反映是直接使用 Nginx 的 location 指令来解决,不过在给出答案之前,我们先来了解一下 Nginx location 指令的基础。
Nginx 区块配置概念
在 Nginx 的配置文件中,通常会用两个常用的区块(Block)来进行设置:
1.Server 区块
2.Localtion 区块
这里的区块是指 Block,你甚至可以理解为后面的那一对{}之间的配置内容。
Sever 区块主要是真的主机的配置,比如配置主机的域名,IP,端口等内容。当然,在一个 Nginx 的配置文件里面,我们是可以指定多个 Sever 区块的配置的。
而 Location 区块则是在 Sever 区块里面,细分到针对不同的路径和请求而进行的配置。因为一个站点中的 URI 通常会非常多,所以在 Location 区块设置这部分,你也是可以写多个 Location 的配置的。
下面来看看 Location 配置的基本语法先:
location optional_modifier location_match {
 # 这个 {} 里面的配置内容就是一个区块 Block
}
上面的 optional_modifier 配置项是可以使用正则表达式的。常用的几种如下:
留空。对,留空也是一种设置方式。在留空的情况下,配置表示请求路径由 location_match 开始。
= ,等于号还是非常容易理解的:就是请求路径正好等于后面的 location_match 的值;跟第一项留空还是有区别的。
~*表示大小写不敏感的正则匹配。
^~ 表示这里不希望有正则匹配发生。
Nginx 处理 Location 区块的顺序
上面了解了 location 指令基本的概念和常用配置。我们再来看看 Location 生效的顺序!这个也很重要:
每一个请求进来 Nginx 之后,Nginx 就会选择一个 Location 的最佳匹配项进行响应,处理的具体流程是逐一跟 location 的配置进行比对,这个步骤可以分为以下几步:
先进行前缀式的匹配(也就是 location 的 optional_modifier 为空的配置)。
Nginx 其次会根据 URI 寻找完全匹配的 location 配置(也就是 location 的 optional_modifier 为 =的配置).
如果还是没有匹配到,那就先匹配 ^~ 配置,如果找到一个配置的话,则会停止寻找过程,直接返回响应内容。
如果还是没有找到匹配项的话,则会先进行大小写敏感的正则匹配,然后再是大小不写敏感的正则匹配。
Nginx Location 配置的一些例子:
多说无益,看了那么多理论,没有具体的例子支撑也是白搭,所以我们来看一下具体的配置例子:
location  = / {
  # = 等号配置符,只匹配 / 这个路由
}
location /data {
   # 留空配置,会匹配有 /data 开始的路由,后续有匹配会往下匹配。
}
location ^~ /img/ {
  # 注意 ^~ 配置,这里匹配到 /img/ 开始的话,直接就返回了。
}
location ~* .(png|gif|ico|jpg|jpeg)$ {
  # 匹配以 png, gif, ico, jpg or jpeg 结尾的请求;这个通常用来设置图片的请求响应。
}
非常实用的两个例子:
1.简单的图片防盗链
location ~ .(png|gif|jpe?g)$ {
  valid_referers none blocked yourwebsite.com *.yourwebsite.com;
  # 注意上面写上你的域名就好
  if ($invalid_referer) {
      return   403;
  }
}
2.针对一些可写入的路径,禁止 php 或者 js 的脚步执行
location ~* /(media|images|cache|tmp|logs)/.*.(php|jsp|pl|py|asp|cgi|sh)$ {
  return 403;
}
问题的答案
最后,我们再看问题的答案,可以是类似这个样子的:
location /a {
   root /var/www/domain.com/a;
}

location /b {
   root /var/www/domain.com/b;
}
----------------------------

用Nginx反代+缓存实现分流及加速


当然,Nginx的功能很强大,利用ProxyCache缓存静态资源,便可以实现自建CDN了(当然算不上真正的CDN啦,只是类似)。
在准备搭建反向代理的服务器上进行操作(Debian下)

1.安装Nginx

我这里是Debian,直接apt安装即可
apt-get update
apt-get install nginx

2.配置nginx

为了方便,我们将配置单独写在一个文件里,只需要在nginx.confinclude一下就好了
*1添加引用
编辑/etc/nginx/nginx.conf文件,
http块结尾添加
include /home/vhost/*.conf;
代表读取/home/vhosts下的配置文件(目录随意,配置文件名随意,只要引用对了即可)。
*2新建反代的配置文件
在/home/vhosts目录下新建配置文件proxy.conf。
下面贴一下我的配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
proxy_cache_path /home/cache levels=1:2 keys_zone=rainngcache:192m max_size=2048m inactive=2h;
proxy_temp_path /home/cache/temp;
upstream rainng  {
    server 198.252.107.135:443;
}
 
server {
    listen 80;
    server_name www.rainng.com;
 return 301 https://$server_name$request_uri;
}
 
server {
    listen 443;
    server_name www.rainng.com;
 
 ssl on;
 ssl_certificate /home/ssl/rainng.crt;
 ssl_certificate_key /home/ssl/rainng.key;
 
 location ~.*\.(gif|jpg|png|htm|html|css|js|flv|ico|swf)(.*) {
 proxy_pass https://rainng;
 
 proxy_redirect off;
        proxy_set_header Host $host;
        proxy_cache rainngcache;
        proxy_cache_valid 200 302 2h;
        proxy_cache_valid 301 1d;
        proxy_cache_valid any 1m;
        expires 30d;
    }
 
    location / {
        proxy_pass  https://rainng;
 
        proxy_redirect     off;
        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_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
        proxy_max_temp_file_size 0;
        proxy_connect_timeout      90;
        proxy_send_timeout         90;
        proxy_read_timeout         90;
        proxy_buffer_size          4k;
        proxy_buffers              4 32k;
        proxy_busy_buffers_size    64k;
        proxy_temp_file_write_size 64k;
   }
}

1.第一行的proxy_cache_path
代表缓存的存放目录,levels为缓存文件目录层次,1:2 表示两级目录,keys_zone 设置缓存名字和共享内存大小,inactive 在指定时间内没人访问则被删除,max_size最大缓存空间,如果缓存空间满,默认覆盖掉缓存时间最长的资源。
2.第二行的proxy_temp_path为临时目录
3.upstream,则是设置源服务器
这是负载均衡的一部分,nginx会根据策略从中选取一台主机,由于网站只有一台主机,这里就只是源主机ip,如果你有多台主机,就可以自定义负载均衡策略了,这里不再多说。
4.server
我先设置了监听80端口,然后将http自动跳转置https
下一个server块,监听443(https)端口,
server_name代表你的域名
我这里启用了ssl,所以还要上传证书。
第21行,location ~.*\.(gif|jpg|png|htm|html|css|js|flv|ico|swf)(.*) {
这里就体现出Nginx的强大了,它是支持正则的,所以这些匹配的是静态资源,
proxy_cache后面跟的是之前keys_zone定义的缓存名字,其他的看字面意思就很好理解:定义了一些缓存策略(失效时间)。
下一个location则是,我们要设置好请求头,并定义一些超时时间、缓存大小之类的参数,当然,你不设置也可以。

3.重启Nginx

保存配置文件后,重启一下Nginx
service nginx restart
如果没有提示错误的话,将你的域名重定向到反向代理服务器的ip便可以正常访问了。
对于静态资源,在缓存后直接由反代服务器发送,对于其他请求,反代服务器则充当中转的角色.

No comments:

Post a Comment