Nginx配置概览

注意
本文最后更新于 2023-03-17,文中内容可能已过时。

在构建高效、可扩展的Web服务器时,Nginx无疑是一个不可或缺的工具。其强大的配置灵活性和性能优化能力,使得它成为众多开发者和运维人员的首选。

Nginx配置文件结构概览

Nginx的配置文件通常位于/etc/nginx/目录下,主要文件为nginx.conf。虽然Nginx的配置结构相对复杂,但我们可以将其大致分为以下几个部分:

  1. 全局块:配置影响Nginx全局的指令。如user指令设置Nginx进程运行的用户和组。
  2. events块:配置影响Nginx服务器或与用户的网络连接。如worker_connections设置每个worker进程的最大连接数。
  3. http块:可以嵌套多个server块,用于配置HTTP服务器。

HTTP配置

HTTP块是Nginx配置的核心,它包含了处理HTTP请求相关的所有配置。在HTTP块中,我们可以定义多个Server块,每个Server块对应一个虚拟主机。

示例配置

 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
http {
    include       mime.types;
    default_type  application/octet-stream;

    # 日志配置
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    # 虚拟主机配置
    server {
        listen       80;
        server_name  example.com;

        # ...其他配置...
    }

    # 其他Server块...
}

Server配置

Server块定义了如何响应特定域名的HTTP请求。在Server块中,我们可以设置监听端口、域名、请求路由等。

示例配置

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
server {
    listen       80;
    server_name  example.com;

    # 访问日志配置
    access_log  /var/log/nginx/example.com.access.log  main;

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }

    # 其他location块...

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

Upstream配置

Upstream模块允许您将请求代理到一组后端服务器,从而实现负载均衡、容错处理等功能。Upstream块定义了一组后端服务器及其相关配置。

示例配置

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
http {
    # ...其他配置...

    upstream backend_servers {
        server backend1.example.com;
        server backend2.example.com weight=2;
        server 192.168.1.1 backup;
    }

    server {
        # ...其他配置...

        location /api/ {
            proxy_pass http://backend_servers;
        }
    }
}

在上面的示例中,我们定义了一个名为backend_servers的Upstream块,其中包含了三个后端服务器。在Server块中,我们将/api/路径的请求代理到这些后端服务器。Nginx会根据Upstream块中的配置,如权重(weight)和备份(backup)选项,来选择合适的后端服务器处理请求。

Location 配置

在Nginx中,location指令用于匹配请求的URI,并根据匹配到的规则进行请求处理。

1. 基本语法

location指令的基本语法如下:

1
location [=|~|~*|^~|@] /uri/ { ... }
  • [=|~|~*|^~|@]:修饰符,用于定义URI匹配的方式。
  • /uri/:要匹配的URI模式。

2. 修饰符详解

  • =:精确匹配。只有当请求的URI与指定的模式完全匹配时,才会应用该location块中的配置。
  • ^~:如果URI以某个常规字符串开头,则停止搜索正则表达式。也就是说,当^~匹配到之后,就不再进行正则表达式的匹配了。
  • ~:区分大小写的正则匹配。如果URI与指定的正则表达式匹配(区分大小写),则应用该location块中的配置。
  • ~*:不区分大小写的正则匹配。与~类似,但匹配时不区分大小写。
  • @:定义一个命名的location,该location块通常与error_page指令一起使用,用于处理错误页面。

3. 匹配顺序

当有多个location块时,Nginx按照以下顺序进行匹配:

  1. 首先匹配带有=location,如果找到,则停止搜索。
  2. 然后匹配带有^~location,如果找到最长的匹配项,则停止搜索正则表达式。
  3. 接着按照配置文件中的顺序匹配带有~~*location
  4. 如果以上都没有匹配到,则匹配不带任何修饰符的location(如果存在)。
  5. 如果所有location块都没有匹配到,则匹配通用匹配(即/)。

4. 示例

以下是一些location配置的示例:

  1. 精确匹配根目录的请求:
1
2
3
location = / {
    # 配置指令...
}
  1. 匹配以/images/开头的所有请求(不进行正则匹配):
1
2
3
location ^~ /images/ {
    # 配置指令...
}
  1. 区分大小写的正则匹配,匹配所有以.jpg结尾的请求:
1
2
3
location ~ \.jpg$ {
    # 配置指令...
}
  1. 不区分大小写的正则匹配,匹配所有以.png.jpg结尾的请求:
1
2
3
location ~* \.(png|jpg)$ {
    # 配置指令...
}
  1. 代理转发示例,将所有/api/开头的请求转发到后端服务器:
1
2
3
location /api/ {
    proxy_pass http://backend_servers/;
}

5. 注意点

  • 在使用proxy_pass进行代理转发时,如果目标URL的末尾有/,则表示将请求的URI附加到代理URL之后;如果没有/,则只代理到目标URL,而不附加请求的URI。
  • location块中的配置指令可以包括rootindexproxy_pass等,用于定义请求的资源位置、默认索引文件、代理转发等。
示例

示例1

  • location /somepath/ { proxy_pass http://backend_server/; }
  • 当用户请求/somepath/resource时,Nginx会将其转发到http://backend_server/resource

示例2

  • location /somepath/ { proxy_pass http://backend_server; }
  • 当用户请求/somepath/resource时,Nginx会将其转发到http://backend_server(注意,这里并没有附加/resource)。转发时的完整路径是http://backend_server/somepath/resource