文章

Nginx初识及配置

Nginx初识,配置重点.

引言

我一直在工作中使用Nginx,部署了许多平台及应用,支撑服务了很多业务。有时用做静态服务器,有时是后端API网关,有时是混合性,也可以是负载均衡。现整理总结一下,既做梳理梳理,也分享给初学者。

前文

nginx是一个 HTTP 和反向代理服务器、邮件代理服务器和通用 TCP/UDP 代理服务器,最初由Igor Sysoev编写。我向他致敬。

HTTP及反向代理服务器配置

基本组成(server,location)

Nginx HTTP和反向代理服务器的配置可以很复杂,也可以很简单。但无论怎样,其基本是由server及location来完成。先给个基本格式

1
2
3
4
5
6
7
8
9
10
11
   http {
      server {
        listen 80;
        server_name 127.0.0.1 localhost;

        location / {
          index index.html index.htm;
          try_files $uri $uri/ /index.html;
       }
      }
   }

server 是Http处理的基本单元,做为一个虚拟服务,完成Http 请求拦截处理

location 根据其后的path来识别请求,把请求转发到不同服务上去。

请求处理

nginx 首先决定那个虚拟的server来处理请求。server可以分为大类,每类的filter及处理过程均不同

Name-based

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
1. 配置
   
```nginx
  server {
    listen      80 default_server;
    server_name test.org www.test.org;
  }

  server {
    listen      80;
    server_name test.net www.test.net;
  }

  server {
    listen      80;
    server_name test.com www.test.com;
  }
```
2. 请求实例

 请求头中的"Host" 为以下内容的均可被捕获,若没有则使default_server。
 http://test.org
 http://test.net
 http://test.com

Name-based 和Ip-based

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
1. 配置

```nginx
  server {
   listen      192.168.0.1:80;
   server_name test.org www.test.org;
  }

  server {
   listen      192.168.0.1:80;
   server_name test.net www.test.net;
  }

  server {
   listen      192.168.1.2:80;
   server_name test.com www.test.com;
  }
```
2. 请求实例
  请求头中的"Host" 为以下内容的均可被捕获,若没有则使用default_server。
  http://test.org
  http://test.net
  http://test.com
  http://192.168.1.1:80

server name 匹配

匹配有三类

  • 通配符
  • 正则表达式
  • 其它

配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
   server {
    listen       80;
    server_name  test.org  www.test.org;
    ...
   }

   server {
    listen       80;
    server_name  *.test.org;
    ...
   }

   server {
    listen       80;
    server_name  mail.*;
    ...
   }

   server {
    listen       80;
    server_name  ~^(?<user>.+)\.test\.net$;
    ...
   }

nginx 请求处理步骤

  1. 截取请求名称
  2. 通配符名称最长匹配原则进行匹配 例如 “*.test.org”
  3. 通配符名称最长匹配原则进行匹配 例如 “mail.*”
  4. 按先后顺序进行正则表达式匹配

负载均衡方式

  • 负载均衡方式
    1. distributed in a round-robin fashion,
    2. least-connected — next request is assigned to the server with the least number of active connections,
    3. ip-hash — a hash-function is used to determine what server should be selected for the next request (based on the client’s IP address).
  • 相应的配置
    • 默认方式round-robin

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      
       http {
           upstream myapp1 {
             server srv1.test.com;
             server srv2.test.com;
             server srv3.test.com;
         }    
         server {
           listen 80;
             location / {
               proxy_pass http://myapp1;
             }
          }
       }
      
    • Least connected 方式
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      
       http {
              upstream myapp1 {
           least_conn;
                server srv1.test.com;
                server srv2.test.com;
                server srv3.test.com;
            }
              server {
                listen 80;
                  location / {
                    proxy_pass http://myapp1;
                  }
               }
            }
      
    • 权重方式

      1
      2
      3
      4
      5
      6
      
          upstream myapp1 {
                 ip_hash;
                 server srv1.test.com;
                 server srv2.test.com;
                 server srv3.test.com;
          }
      

负载

  • 基本配置即可
    1
    2
    3
    4
    5
    6
    7
    8
    
       server {
         listen              443 ssl;
         server_name         www.test.com;
         ssl_certificate     www.test.com.crt;
         ssl_certificate_key www.test.com.key;
         ssl_protocols       TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
         ssl_ciphers         HIGH:!aNULL:!MD5
       }
    
本文由作者按照 CC BY 4.0 进行授权