NGINX

Nginx(发音同“engine X”)是异步框架的网页服务器,也可以用作反向代理、负载平衡器和HTTP缓存。

概念

正向代理

客户端主动使用代理服务器连接目标服务器

反向代理

客户端无感知,目标服务器使用代理,将请求分发,提高服务的并发性能

三板斧

  1. 反向代理
  2. 负载均衡
  3. 动静分离

配置

配置结构

  1. 全局配置块:配置影响nginx全局的指令。一般有运行nginx服务器的用户组,nginx进程pid存放路径,日志存放路径,配置文件引入,允许生成worker process数等

  2. event配置块:配置影响nginx服务器或与用户的网络连接。有每个进程的最大连接数,选取哪种事件驱动模型处理连接请求,是否允许同时接受多个网路连接,开启多个网络连接序列化等

  3. http配置块:可以嵌套多个server,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置

  4. server配置块:配置虚拟主机的相关参数,一个http中可以有多个server

  5. location配置块:配置请求的路由,以及各种页面的处理情况

     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
    
    ...              #全局块
    
    events {         #events块
    ...
    }
    
    http      #http块
    {
    ...   #http全局块
    server        #server块
    {
        ...       #server全局块
        location [PATTERN]   #location块
        {
            ...
        }
        location [PATTERN]
        {
            ...
        }
    }
    server
    {
      ...
    }
    ...     #http全局块
    }
    

location

配置语法

  1. location [ = | ~ | ~* | ^~ ] uri { ... }
  2. location @name { ... }

配置注意

  1. location 是在 server 块中配置。
  2. 可以根据不同的 URI 使用不同的配置(location 中配置),来处理不同的请求。
  3. location 是有顺序的,会被第一个匹配的location 处理。

配置demo

  1. =:精确匹配

    1
    2
    3
    4
    
        location = / {
            #规则
        }
        # 则匹配到 `http://www.example.com/` 这种请求。
    
  2. ~:大小写敏感

    1
    2
    3
    4
    5
    6
    
        location ~ /Example/ {
               #规则
        }
        #请求示例
        #http://www.example.com/Example/  [成功]
        #http://www.example.com/example/  [失败]
    
  3. ~*:大小写忽略

    1
    2
    3
    4
    5
    6
    
        location ~* /Example/ {
                    #规则
        }
        # 则会忽略 uri 部分的大小写
        #http://www.example.com/Example/  [成功]
        #http://www.example.com/example/  [成功]
    
  4. ^~:只匹配以 uri 开头

    1
    2
    3
    4
    5
    6
    
        location ^~ /img/ {
                #规则
        }
        #以 /img/ 开头的请求,都会匹配上
        #http://www.example.com/img/a.jpg   [成功]
        #http://www.example.com/img/b.mp4 [成功]
    
  5. @:nginx内部跳转

    1
    2
    3
    4
    5
    6
    7
    8
    
        location /img/ {
            error_page 404 @img_err;
        }
    
        location @img_err {
            # 规则
        }
        #以 /img/ 开头的请求,如果链接的状态为 404。则会匹配到 @img_err 这条规则上。
    

使用示例

  1. 反向代理

     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
    
    ## Start www.redis.com.cn ##
    server {
    listen 80;
    server_name  www.redis.com.cn;
    access_log  logs/redis.access.log  main;
    error_log  logs/redis.error.log;
    root   html;
    index  index.html index.htm index.php;
    
    ## send request back to apache ##
    location / {
        proxy_pass  http://apachephp;
    
        #Proxy Settings
        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;
    }
    }
    ## End www.redis.com.cn ##
    
  2. 负载均衡

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    
    # 把www.domain.com均衡到本机不同的端口,也可以改为均衡到不同的地址上。
    http {
        upstream myproject {
            server 127.0.0.1:8000 weight=3;
            server 127.0.0.1:8001;
            server 127.0.0.1:8002;
            server 127.0.0.1:8003;
        }
    
        server {
            listen 80;
            server_name www.domain.com;
            location / {
                proxy_pass http://myproject;
            }
        }
    }
    
  3. 动静分离

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    
    server {
        listen 80;
        server_name 192.168.25.35; 
        # 当接收到http请求时,首先host和这里的server_name进行匹配,如果匹配上,则走这个虚拟主机的location路由
    
        # 静态资源则路由到这里
        location /static/~(.*)(\.jpg|\.png|\.gif|\.jepg|\.css|\.js|\.css){
            alias html;
        }
        # 其他的url则转发到 http://192.168.25.35:8080
        location / {
            proxy_pass http://192.168.25.35:8080;
        }
    }
    

参考

  1. Nginx
  2. Nginx配置详解