Nginx 配置详解


Nginx 配置的上下文(Context)

默认情况下,nginx 配置文件可以位于:

/etc/nginx/nginx.conf
/usr/local/etc/nginx/nginx.conf 
/usr/local/nginx/conf/nginx.conf  

配置文件的位置会根据 Nginx 的安装过程而有所不同。


在 Nginx 的配置文件中,上下文 (Context) 是一种逻辑组织方式,用来将相关的配置指令集合在一起。上下文是通过大括号 {} 定界的,并且可以嵌套。每个上下文中可以包含特定的指令集,而这些指令决定了 Nginx 如何操作。

# 全局上下文 (Global Context)
worker_processes ...;
error_log ...;

events {  # events 上下文
    ...
}

http {  # http 上下文
    upstream backend {  # upstream 上下文
        ...
    }

    map ... {  # map 上下文
        ...
    }

    geo ... {  # geo 上下文
        ...
    }

    server {  # server 上下文
        if (...) {  # if 上下文
            ...
        }

        location / {  # location 上下文
            limit_except ... {  # limit_except 上下文
                ...
            }

            if (...) {  # if 上下文
                ...
            }
        }

        location ~* ... {  # 另一个 location 上下文
            ...
        }
    }

    server {  # 另一个 server 上下文
        ...
    }
}

mail {  # mail 上下文
    ...
}


1️⃣ 全局上下文 (Global Context)

在 Nginx 的配置宇宙中,全局上下文犹如星系的核心,位于最顶部,不受任何其他上下文的约束。全局指令决定了整个 Nginx 星系如何运动和表现。

在全局上下文中,各种星体(指令)共同工作,直接影响 Nginx 星系的稳定性和表现。因此,为了星系的平衡,根据星系的特性和预期的任务来配置是非常关键的。


2️⃣ events 上下文

events 星云中,星体指令控制 Nginx 如何与各种客户端星球互动,包括与星球的连接方式、连接时的行为和连接持续时间等。

events 星云中,你可以调整与各种星球的连接参数,使 Nginx 星系更高效地处理大量的并发任务。


3️⃣ http 上下文

进入 http 星域,这里是 Nginx 星系中的交通枢纽,定义了如何处理星系中的所有请求。这个星域由多个 server 星团组成,每个 server 星团又可以包含多个 location 星点,它们共同决定了如何响应特定的请求。


4️⃣ server 上下文

server 星团中,你可以为一个或多个星球配置详细的响应行为。这包括重定向、错误响应、数据类型、加密通讯、数据压缩等。只有正确配置,Nginx 星系才能为特定的星球提供最佳服务。


5️⃣ location 上下文

进入 location 星点,这里为特定的请求路径或模式定义行为。这包括数据路径、重定向、缓存、数据类型、访问控制等。你可以使用模式匹配工具来匹配特定的路径或使用精确匹配。

✨ 使用 location 星点,你可以为特定的路径或模式创建详细和特定的响应行为,使 Nginx 星系更加灵活和强大。


6️⃣ 其他上下文

除了上述常见的上下文,Nginx 配置中还有其他的上下文,用于处理特定的任务和模块。以下是一些其他重要的上下文:


mail 上下文:

用于邮件代理服务器配置。与 IMAP、POP3 和 SMTP 交互。

mail {
    server_name mail.example.com;
    auth_http  localhost:9000/cgi-bin/auth;
    ...
}

upstream 上下文:

定义了一个服务器组,通常用于负载均衡。此上下文常与 proxy_pass, fastcgi_pass, uwsgi_pass, scgi_pass, memcached_passgrpc_pass 指令一起使用。

upstream backend {
    server backend1.example.com;
    server backend2.example.com;
    ...
}

geo 上下文:

定义了一个变量,该变量的值取决于客户端 IP 地址。

geo $geo {
    default        0;
    192.168.1.0/24 1;
    192.168.2.0/24 1;
    ...
}

map 上下文:

根据另一个变量的值创建一个变量。

map $http_upgrade $connection_upgrade {
    default upgrade;
    ''      close;
}

limit_except 上下文:

定义了对特定 HTTP 方法的访问权限。

location /secret/ {
    limit_except GET {
        deny  all;
    }
}

if 上下文:

serverlocation 上下文中进行条件判断。但需谨慎使用,因为它在某些情况下可能不按预期工作。

if ($http_user_agent ~ MSIE) {
    # 为 IE 浏览器提供特定处理
    ...
}

这些上下文为 Nginx 提供了丰富的功能,使其能够处理各种不同的网络任务。正确理解和使用这些上下文是创建高效、安全和可维护的 Nginx 配置的关键。


Nginx 配置的指令(Directive)


1️⃣ 全局上下文 (Global Context)常用指令

全局上下文(Global Context)是 Nginx 配置文件的顶级上下文。在这个上下文中,我们可以设置影响整个 Nginx 实例的指令。以下是在全局上下文中经常使用的一些指令:

# 定义 Nginx 工作进程运行的用户和组
user nginx nginx;

# 指定 Nginx 应该启动的工作进程数
worker_processes 4;

# 定义存储 master 进程 ID 的文件的路径
pid /var/run/nginx.pid;

# 指定错误日志文件的位置和日志级别
error_log /var/log/nginx/error.log warn;

# 设置 Nginx 工作进程可以打开的最大文件描述符数量
worker_rlimit_nofile 65535;

# 设置工作进程的优先级
worker_priority -5;

# 允许绑定工作进程到特定的 CPU 核心
worker_cpu_affinity 0101 1010;

# 定义了网络事件的配置
events {
    ...
}

# 定义 HTTP 服务器的主配置
http {
    ...
}

# 允许包含其他配置文件
include /etc/nginx/modules-enabled/*.conf;

# 加载动态模块
load_module modules/ngx_http_geoip_module.so;

2️⃣ events 上下文常用指令

events 上下文是用于优化网络连接处理的。在这里,你可以调整 Nginx 如何处理来自客户端的连接。以下是在 events 上下文中经常使用的一些指令:

events {
    # 设置每个工作进程的最大连接数
    worker_connections 1024;

    # 使用的事件驱动模型。这个值通常是 'epoll'、'kqueue'、'select' 或 'poll'。
    # 'epoll' 是 Linux 2.6+ 的首选方法
    use epoll;

    # 多个连接被接受的一个工作进程在同一时间,使用此选项可以优化
    multi_accept on;

    # 打开或关闭对工作进程的连接进行序列化,这有助于防止网络资源的争夺
    # 但可能会增加工作进程之间的上下文切换
    accept_mutex off;

    # 定义了 accept mutex 的等待时间
    accept_mutex_delay 500ms;
}

以下是关于这些指令的简要说明:

  • worker_connections: 这是每个工作进程可以打开的最大连接数。例如,如果你有4个工作进程,总连接数是 worker_connections * 4。

  • use: 这是要使用的事件模型。最常见的是 epoll(Linux)和 kqueue(FreeBSD/OS X)。

  • multi_accept: 当启用时,每个工作进程都会尝试接受尽可能多的新连接。

  • accept_mutex: 当启用时,工作进程将使用互斥锁来处理新连接,从而防止资源竞争。

  • accept_mutex_delay: 定义了一个工作进程在获得互斥锁之后等待新连接的时间。

这些指令帮助你优化 Nginx 服务器以处理大量并发连接。正确的设置取决于你的具体需求和服务器的硬件配置。


3️⃣ http 上下文常用指令

http 上下文是 Nginx 配置中的核心部分,它定义了所有与 HTTP 服务器相关的配置。以下是在 http 上下文中经常使用的一些指令:

http {
    # MIME 类型文件的路径,定义了响应的 Content-Type
    include /etc/nginx/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;

    # 保持连接的超时时间
    keepalive_timeout 65;

    # TCP_NOPUSH 选项设置
    tcp_nopush on;

    # 压缩设置
    gzip on;
    gzip_disable "msie6";

    # 虚拟主机配置
    include /etc/nginx/conf.d/*.conf;

    # 开始一个 server 块,定义一个虚拟主机
    server {
        listen 80;
        server_name localhost;
        ...
    }

    # 其他服务器块、location块等
    ...
}

以下是这些指令的简要说明:

  • include: 用于包含其他配置文件,有助于模块化和组织你的配置。

  • default_type: 默认的 MIME 类型。

  • log_formataccess_log: 定义日志的格式和位置。

  • sendfile: 是否允许 sendfile 方式的数据传输。

  • keepalive_timeout: 长连接的超时时间。

  • tcp_nopush: 设置 TCP_NOPUSH 选项,有助于减少数据包的数量。

  • gzip: 启用或禁用响应压缩。

  • server: 开始一个新的服务器块,也称为虚拟主机。

http 上下文中的指令通常涉及到 HTTP 服务器的全局配置、连接处理、日志记录、数据压缩等。正确的设置这些指令是优化 Nginx 性能和确保服务器安全的关键。


4️⃣ server 上下文常用指令

在 Nginx 的 server 上下文中,你可以定义和调整虚拟主机的配置。以下是在 server 上下文中常用的指令和一个示例配置:

server {
    # 监听端口和地址
    listen 80;
    listen [::]:80;

    # 服务器名称(域名)
    server_name example.com www.example.com;

    # 定义日志位置
    access_log /var/log/nginx/example.com.access.log;
    error_log /var/log/nginx/example.com.error.log;

    # 默认请求的文件
    index index.html index.htm index.php;

    # 文档根目录,即请求的资源存放的位置
    root /var/www/example.com;

    # 指定一个特定位置的配置
    location / {
        try_files $uri $uri/ =404;
    }

    # 处理 PHP 请求的配置
    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/run/php/php7.4-fpm.sock;
    }

    # 重定向或别名
    location /oldpath/ {
        rewrite ^/oldpath/(.*)$ /newpath/$1 permanent;
    }

    # 防止特定位置的访问
    location ~ /\.ht {
        deny all;
    }

    # SSL 配置
    listen 443 ssl;
    ssl_certificate /etc/nginx/ssl/example.com.crt;
    ssl_certificate_key /etc/nginx/ssl/example.com.key;

    # 其他配置和位置块
    ...
}

以下是这些指令的简要说明:

  • listen: 定义服务器监听的端口和地址。

  • server_name: 定义这个 server 块应该响应的域名。

  • access_logerror_log: 定义这个虚拟主机的日志文件位置。

  • index: 定义默认的索引文件。

  • root: 定义请求资源的存放位置。

  • location: 用于定义如何响应在特定位置的请求。可以有多个 location 块。

  • rewrite: 用于 URL 重写。

  • ssl_certificatessl_certificate_key: 定义 SSL 证书的位置。

server 上下文中,你可以配置多个虚拟主机,每个虚拟主机都有其自己的设置和资源。正确地配置这些指令可以确保每个虚拟主机的正确和高效运行。


5️⃣ location 上下文常用指令

在 Nginx 的 location 上下文中,你可以定义如何响应特定位置的请求。这使得 Nginx 非常灵活,能够对不同的 URL 模式和路径提供不同的响应。以下是在 location 上下文中常用的指令和一个示例配置:

server {
    listen 80;
    server_name example.com;

    root /var/www/example.com;

    # 处理根目录请求
    location / {
        try_files $uri $uri/ =404;
    }

    # 处理图片缓存
    location ~* \.(jpg|jpeg|png|gif|ico)$ {
        expires 30d;
    }

    # 代理设置
    location /api/ {
        proxy_pass http://backend_server;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }

    # 防止 .htaccess 文件的访问
    location ~ /\.ht {
        deny all;
    }

    # 处理 PHP
    location ~ \.php$ {
        include fastcgi_params;
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }

    # 其他位置块
    ...
}

以下是这些指令的简要说明:

  • try_files: 尝试按顺序提供文件或目录,如果都找不到,则返回指定的错误代码。

  • expires: 设置响应的 ExpiresCache-Control 头部,用于浏览器缓存。

  • proxy_pass: 将请求转发到另一个服务器。

  • proxy_set_header: 修改被转发请求的头部信息。

  • denyallow: 控制基于 IP 的访问。

  • fastcgi_pass: 将请求传递给 FastCGI 服务器,通常用于处理 PHP 请求。

  • fastcgi_param: 设置传递给 FastCGI 服务器的参数。

location 上下文允许你为不同的 URL 模式和路径提供特定的处理逻辑。通过组合多个 location 块,你可以为 Web 服务器配置复杂的行为。


6️⃣ 其他上下文常用指令

除了上面提到的主要上下文外,Nginx 还有其他一些特定的上下文,它们用于特定的模块或功能。以下是其中的一些上下文及其常用指令:


mail 上下文常用指令

当配置 Nginx 以代理邮件协议(如 SMTP、IMAP 和 POP3)时,mail 上下文提供了所需的指令。以下是 mail 上下文中的一些常用指令:

mail {
    # 指定服务器的名称
    server_name mail.example.com;
    
    # 指定用于身份验证的 HTTP 服务器的地址
    auth_http localhost:9000/auth.php;
    
    # 定义 POP3 代理服务器的参数
    pop3_capabilities "TOP" "USER";
    
    # 定义 IMAP 代理服务器的参数
    imap_capabilities "IMAP4rev1" "UIDPLUS";
    
    # 定义 SMTP 代理服务器的参数
    smtp_auth login plain;
    smtp_capabilities "PIPELINING" "8BITMIME";
    
    # 用于客户端的 SSL 设置
    ssl on;
    ssl_certificate /etc/nginx/ssl/nginx.crt;
    ssl_certificate_key /etc/nginx/ssl/nginx.key;
    
    # 其他常见指令...
}

注释:

  • server_name:定义邮件代理服务器的名称。
  • auth_http:定义用于验证邮件用户的 HTTP 服务器。
  • pop3_capabilitiesimap_capabilities:定义 POP3 和 IMAP 代理服务器应该公开的功能。
  • smtp_auth:定义 SMTP 代理服务器应使用的身份验证方法。
  • sslssl_certificatessl_certificate_key:用于配置 SSL/TLS。

这些只是 mail 上下文中的一部分指令。需要注意的是,为了使这些功能正常工作,可能还需要安装和配置额外的 Nginx 模块。


upstream 上下文常用指令

upstream 上下文允许你定义一组服务器,然后你可以引用这些服务器来负载均衡传入的请求。这在配置 Nginx 作为反向代理或负载均衡器时特别有用。以下是 upstream 上下文中的一些常用指令:

upstream backend_servers {
    # 使用轮询算法 (默认)
    # 当一个服务器宕机时,请求会自动重定向到下一个服务器
    server backend1.example.com;
    server backend2.example.com;

    # 使用最少连接算法
    # least_conn;

    # 使用 IP 哈希算法,确保特定 IP 的客户端始终连接到同一个后端服务器
    # ip_hash;

    # 使用 keepalive 连接池
    # keepalive 32;

    # 使用权重
    # server backend1.example.com weight=3;
    # server backend2.example.com weight=2;

    # 临时禁用某个服务器
    # server backend1.example.com down;

    # 其他常见指令...
}

注释:

  • server:定义属于该上游组的后端服务器。
  • least_conn:使用最少连接算法,将新连接路由到当前连接数最少的服务器。
  • ip_hash:基于客户端 IP 地址的哈希来选择服务器,确保相同的客户端 IP 始终连接到同一个服务器。
  • keepalive:定义持久连接的数量,提高后端连接的重用。
  • weight:定义服务器的权重,权重越高,分配到的请求越多。
  • down:标记服务器为临时不可用。

通过使用 upstream 上下文,可以为应用程序或网站提供高可用性和容错能力,从而增强其性能和可靠性。


geo 上下文常用指令

geo 上下文允许你根据客户端的 IP 地址设置特定的变量。这在为不同的地理位置或 IP 地址范围提供特定内容或行为时非常有用。以下是 geo 上下文中的一些常用设置和指令:

http {
    # 定义一个 geo 变量,根据 IP 地址设置
    geo $geo_var {
        default         "default_value";
        192.168.1.0/24  "local_network";
        10.0.0.0/16     "another_network";
        # 其他 IP 地址或范围...
    }

    server {
        # ...

        location / {
            # 使用 $geo_var 变量
            if ($geo_var = "local_network") {
                # 为 local_network 提供特定内容或行为
                # ...
            }

            if ($geo_var = "another_network") {
                # 为 another_network 提供特定内容或行为
                # ...
            }
        }
    }
}

注释:

  • default:为不匹配任何其他定义的 IP 地址或范围设置默认值。
  • 192.168.1.0/2410.0.0.0/16 等:定义 IP 地址或 CIDR 范围,并为其分配特定的值。
  • $geo_var:在其他配置部分中使用此变量,例如 serverlocation 上下文,以根据其值提供特定的行为或内容。

geo 上下文提供了一个非常灵活的方式来根据客户端的 IP 地址定制内容或行为,这对于实现地理定位、访问控制或特定的网络行为特别有用。


map 上下文常用指令

在Nginx中,map上下文允许你基于变量的值创建一个新的变量。它提供了一个简单的方式来为不同的请求或响应条件设置不同的值或行为。

map指令通常位于http上下文中,但它定义的变量可以在配置的其他部分使用,包括serverlocation上下文。

常用指令:

  • map: 该指令定义一个基于源变量值的新变量。源变量可以是任何Nginx支持的变量,例如$http_user_agent$request_uri

以下是使用map上下文的示例配置:

http {
    # 基于 User-Agent 定义一个新变量 $mobile
    map $http_user_agent $mobile {
        default         0;
        "~*android"     1;
        "~*iphone"      1;
        "~*ipad"        1;
        "~*windows\s+phone" 1;
    }

    server {
        listen 80;

        location / {
            if ($mobile = 1) {
                # 如果 $mobile 变量为1(表示移动设备),则重定向到 mobile 版本的网站
                rewrite ^ http://m.example.com$request_uri? permanent;
            }
        }
    }
}

在这个示例中,我们根据User-Agent头部定义了一个新变量$mobile。如果User-Agent匹配任何移动设备的模式(如Android、iPhone等),则该变量的值为1,否则为0。然后,我们在location块中使用这个变量来决定是否将用户重定向到移动版本的网站。

map指令提供了一个非常灵活的方法来基于请求或响应参数定义行为。这在你需要为不同的用户、设备或请求条件提供不同的内容或行为时非常有用。


limit_except 上下文常用指令

limit_except 上下文允许你为除了指定的请求方法之外的所有其他方法设置访问限制。这在你想对某些 HTTP 方法(例如 POST 或 PUT)应用特定的安全策略时非常有用。

以下是一个使用 limit_except 上下文的示例配置:

location /path/ {
    # 允许 GET 和 HEAD 请求,为其他请求方法设置访问限制
    limit_except GET HEAD {
        # 只允许特定的 IP 地址访问
        allow 192.168.1.0/24;
        deny  all;
    }
}

在这个示例中,我们为 /path/ 路径设置了访问限制。我们允许 GET 和 HEAD 请求,但是对于其他所有请求方法,我们只允许来自 192.168.1.0/24 网络的请求,并拒绝所有其他请求。

常用指令:

  • allow: 定义哪些 IP 地址或网络可以访问。可以多次使用此指令来定义多个允许的 IP 地址或网络。
  • deny: 定义哪些 IP 地址或网络应该被拒绝访问。这也可以多次使用。

使用 limit_except 上下文,你可以为除了特定方法之外的所有其他方法创建精细的访问控制策略,确保你的 web 服务符合安全和合规性要求。


if 上下文常用指令

在 Nginx 配置中,if 指令允许你基于特定条件执行配置指令。这为请求处理提供了很大的灵活性。然而,if 在 Nginx 中有时被认为是有争议的,因为它的行为有时可能与预期不符,尤其是在 location 上下文中。

if 指令可以在 serverlocation 上下文中使用。

常用指令和形式:

  • if (condition): 检查给定的条件是否为 true。

以下是使用 if 指令的一些示例:

server {
    listen 80;

    # 基于 IP 地址阻止请求
    if ($remote_addr = 123.456.789.0) {
        return 403;
    }

    location / {
        # 如果请求的 URI 以 .php 结尾,尝试发送到 PHP 处理器
        if ($request_uri ~ \.php$) {
            fastcgi_pass 127.0.0.1:9000;
        }

        # 基于 User-Agent 重定向移动用户
        if ($http_user_agent ~* "android|iphone|ipad") {
            rewrite ^ http://m.example.com$request_uri? permanent;
        }
    }
}

在这个示例中,我们使用 if 指令执行了以下操作:

  • 基于 IP 地址阻止某些请求。
  • 如果请求的 URI 以 .php 结尾,尝试将请求发送到 PHP 处理器。
  • 如果用户代理匹配移动设备(如 Android、iPhone 或 iPad),将用户重定向到移动版本的网站。

需要注意的是,虽然 if 指令提供了很大的灵活性,但在某些情况下它可能导致配置变得复杂和难以理解。因此,建议在使用 if 指令时小心,并尽量避免过于复杂的条件逻辑。


️ Nginx 配置的指令类型

在Nginx中,指令的继承模型根据其类型而有所不同。理解这些继承模型对于正确配置和理解Nginx的行为至关重要。以下是指令的三种主要类型及其继承模型:


1️⃣ 普通的 (Standard Directives)

这些指令在给定的上下文中只能有一个值。在同一个上下文中定义同一个指令两次是非法的。子上下文可以覆盖父上下文中的指令。

gzip on;  
gzip off; # 在同一个上下文中有两个普通指令是非法的   
  
server {  
  location /downloads {  
    gzip off;  # 在此上下文中禁用gzip
  }  
  
  location /assets {  
    # 父上下文中的gzip指令在此处仍然有效
  }  
}  

2️⃣ Array Directives

这些指令可以在同一个上下文中多次定义,并将其值添加到数组中。在子上下文中定义这些指令将完全覆盖父上下文中的所有值。

error_log /var/log/nginx/error.log;  
error_log /var/log/nginx/error_notice.log notice;  
error_log /var/log/nginx/error_debug.log debug;  
  
server {  
  location /downloads {  
    # 这将覆盖父级所有指令  
    error_log /var/log/nginx/error_downloads.log;  
  }  
} 

3️⃣ 行动指令 (Action Directives)

这些指令用于执行某些操作。它们的继承行为取决于特定模块。例如,对于 rewrite 指令,每个匹配的指令都会被执行,但是对于 return 指令,只有第一个会被执行。

server {  
  rewrite ^ /foobar;  
  
  location /foobar {  
    rewrite ^ /foo;  
    rewrite ^ /bar;  
    # 当访问/sample时,会先执行第一个重写,然后执行第二个重写
  }  
}

在上述示例中,如果我们尝试访问 /sample,则会按照以下顺序进行重写:

  1. 执行服务器级别的 rewrite,将 /sample 重写为 /foobar
  2. 匹配 /foobar 位置。
  3. 在位置内执行第一个 rewrite,将 /foobar 重写为 /foo
  4. 在位置内执行第二个 rewrite,将 /foo 重写为 /bar

而对于 return 指令:

server {  
  location / {  
    return 200;  # 该行会被执行
    return 404;  # 该行不会被执行,因为上一行已经执行了
  }  
}

在上述示例中,当我们访问任何URL时,会立即返回200状态码,第二个 return 指令不会被执行。


root, location 和 try_files 指令


root 指令

定义
root 指令用于设置请求的根目录,使 Nginx 能够将传入的请求映射到文件系统。

示例

server {  
  listen 80;  
  server_name cainiaojc.com;  
  root /var/www/cainiaojc.com;  
}

解析
这样配置后,以下请求将返回服务器上的对应文件:

  • cainiaojc.com/index.html → 返回 /var/www/cainiaojc.com/index.html
  • cainiaojc.com/foo/index.html → 返回 /var/www/cainiaojc.com/foo/index.html

location 指令

定义
location 指令用于根据请求的 URI 设置配置。

示例

server {  
  listen 80;  
  server_name cainiaojc.com;  
  root /var/www/cainiaojc.com;  
  
  location / {  
    return 200 "root";  
  }  
  
  location /foo {  
    return 200 "foo";  
  }  
}

解析
根据上述配置:

  • cainiaojc.com/ → 返回 "root"
  • cainiaojc.com/foo → 返回 "foo"
  • cainiaojc.com/foo123 → 返回 "foo"
  • cainiaojc.com/bar → 返回 "root"

Nginx 提供了多种与 location 指令配合使用的修饰符,每种修饰符都有其优先级。


try_files 指令

定义
try_files 指令用于尝试多个路径,并返回第一个找到的文件或目录。如果没有找到,则返回指定的错误代码。

示例

try_files $uri index.html =404;

解析
/foo.html 为例,Nginx 将尝试按以下顺序返回文件:

  • $uri (即 /foo.html)
  • index.html
  • 如果两者都找不到:返回 404 错误

注意:在使用 try_files 时,确保它位于正确的上下文中,以确保其正常工作。例如,避免在 server 上下文中使用 try_files,而应在 location 块内使用它。


⚡️ Nginx 变量

在 Nginx 中,变量扮演着值的替代品,这些值可以在请求处理过程中动态地进行更改。这些变量可用于各种任务,从构建响应头和重写 URL 到控制逻辑流程和定义访问规则。


特点

  1. Nginx 变量的值只能是字符串
  2. 变量名前总是带有一个 $ 符号。
  3. 通过各种模块和配置指令,Nginx 提供了大量的预定义变量
  4. ✍️ 用户可以通过 set 指令定义自己的变量

✨ 语法

  1. 定义变量:
    set 指令来定义变量。

    set $variable_name value;
    
  2. 变量插值:
    在定义新变量的值时可以使用其他变量。

    set $a "hello";
    set $b "$a world";
    
  3. 预定义变量:
    Nginx 有许多预定义变量,例如 $uri(当前请求的 URI)、$host(请求的主机头)和 $args(查询字符串参数)等。

  4. 变量的使用:
    变量可以用于许多配置指令,如 if 判断、rewrite 规则和日志格式等。


示例

server {
    listen 80;
    server_name example.com;

    set $greeting "Hello";

    location / {
        if ($http_user_agent ~* "Firefox") {
            set $greeting "Hi Firefox User";
        }

        return 200 "$greeting, welcome to example.com!";
    }
}

在上述示例中,我们为变量 $greeting 定义了一个默认的 “Hello” 值。但如果用户的浏览器是 Firefox,我们会更改 $greeting 的值。这样,当 Firefox 用户访问我们的站点时,他们会收到特定的问候。


Nginx 提供了许多预定义的系统变量

Nginx 提供了许多预定义的系统变量,这些变量用于表示请求、响应和服务器的各种属性。以下是一些常用的 Nginx 系统变量及其描述:

请求变量:

  1. $args: 当前请求的参数,例如在 /page?arg=value 中的 arg=value
  2. $content_length: 请求头中的 Content-Length 字段。
  3. $content_type: 请求头中的 Content-Type 字段。
  4. $document_uri: 与 $uri 相同。
  5. $host: 请求头中的 Host 字段。
  6. $http_user_agent: 客户端的 user agent,通常是浏览器。
  7. $http_cookie: 请求头中的 Cookie 字段。
  8. $http_referer: 请求头中的 Referer 字段。
  9. $is_args: 如果请求有参数,此变量为 ?,否则为空。
  10. $method: HTTP 请求方法,如 GETPOST 等。
  11. $query_string: 与 $args 相同。
  12. $request_body: 请求的主体。
  13. $request_method: 与 $method 相同。
  14. $request_uri: 原始请求的 URI,包括参数。
  15. $uri: 当前请求的 URI,不包括参数。

服务器变量:

  1. $hostname: 当前机器的主机名。
  2. $nginx_version: Nginx 的版本号。
  3. $server_addr: 服务器地址。
  4. $server_name: server_name 指令中定义的服务器名称。
  5. $server_port: 服务器监听的端口。
  6. $server_protocol: 请求使用的协议,通常是 HTTP/1.1HTTP/2.0

响应变量:

  1. $sent_http_content_type: 响应头中的 Content-Type 字段。
  2. $sent_http_location: 响应头中的 Location 字段。
  3. $status: 响应的 HTTP 状态码。

其他常用变量:

  1. $bytes_sent: 发送给客户端的字节数。
  2. $connection: 当前连接的序列号。
  3. $connection_requests: 当前连接上的请求总数。
  4. $limit_rate: 用于限制连接速率的变量。
  5. $remote_addr: 客户端的 IP 地址。
  6. $remote_port: 客户端的端口。
  7. $remote_user: 由 HTTP Basic Authentication 提供的用户名。
  8. $request: 完整的请求行,例如 GET /path?arg=value HTTP/1.1
  9. $request_filename: 试图为当前请求提供文件的路径。

Nginx 最小配置


确实,安全简洁是服务器配置的两大基石。因此,从最小的配置开始,只按需逐步添加,是个明智的做法。 过于复杂的配置不仅可能导致安全隐患,还可能带来性能问题或不必要的复杂性。

以下是 Nginx 的最小配置示例:

#  /etc/nginx/nginx.conf  
  
#  events 上下文 - 必不可少,以确保配置的有效性
events {}         
  
#  http 上下文 - 定义了如何处理客户端的 HTTP 请求
http {  
  #  server 上下文 - 指明如何处理特定 IP 地址和端口的连接
  server {  
    #  指定服务器监听的端口
    listen 80;  
    # ️ 指定服务器名称
    server_name  lzq.com;  
  
    # ✅ 返回 200 状态码和 "Hello" 消息
    return 200 "Hello";  
  }  
}  

这是一个非常基础的 Nginx 配置,它的主要功能就是为访问 lzq.com 的请求返回一个简单的 “Hello” 消息。当然,在此基础上,你可以根据需求添加更多的配置指令,以满足更复杂的服务要求。

你可能感兴趣的:(Nginx 配置详解)