Nginx配置详解: 从基础入门到高级实战的全面指南

#新星杯·14天创作挑战营·第11期#

前言

在 Web 服务架构中,Nginx 以其卓越的高性能、高并发处理能力和灵活的配置特性,成为众多开发者和企业的首选 Web 服务器与反向代理工具。无论是静态资源服务、反向代理转发,还是负载均衡、安全防护,Nginx 都能通过合理的配置轻松实现。然而,Nginx 的配置语法相对复杂,不同模块与指令的组合使用方式多样,这也让不少初学者望而却步。本文我将从 Nginx 配置的基本结构出发,逐步深入到高级配置实践,并结合实际案例,帮你全面掌握 Nginx 配置的核心要点与技巧。

一、Nginx 配置基本结构

1.1 Nginx 配置文件结构

Nginx 的配置主要集中在配置文件中,默认情况下,主配置文件路径为/etc/nginx/nginx.conf。整个配置文件采用模块化、层级化的结构,主要包含以下几个核心部分:

  • 全局块:位于配置文件最外层,主要设置 Nginx 运行的全局参数,如工作进程数、PID 文件路径、错误日志路径等。这些参数对 Nginx 的整体运行环境进行基础配置。

  • events 块:用于配置 Nginx 的网络连接相关参数,例如最大连接数、事件驱动模型等,影响 Nginx 处理客户端请求的性能。

  • http 块:Nginx 的核心配置区域,几乎所有与 HTTP 协议相关的配置都在这里完成。它包含了大量的子配置块和指令,用于定义服务器、虚拟主机、请求处理规则等。http 块中还可以嵌套server块,每个server块对应一个虚拟主机的配置。

  • server 块:用于配置虚拟主机,每个server块定义了一个独立的虚拟主机服务,包括监听端口、域名、请求处理规则、资源路径等。一个 http 块中可以包含多个server块,实现多个虚拟主机的部署。

  • location 块:嵌套在server块内,用于定义针对不同 URL 路径的请求处理规则。可以根据请求的 URL 路径,设置不同的响应方式,如返回静态文件、代理到后端服务器等 。

1.2 配置指令语法规则

Nginx 的配置指令遵循特定的语法规则:

  • 指令格式:大多数指令由指令名称和参数组成,以分号;结尾。例如,worker_processes 4;,其中worker_processes是指令名称,4是参数,表示设置 Nginx 的工作进程数为 4 个。

  • 层级关系:指令可以在不同的配置块中使用,且部分指令只能在特定的块中生效。例如,listen指令通常用于server块中,用于设置虚拟主机监听的端口;而worker_processes指令只能在全局块中使用。

  • 注释:使用#符号进行单行注释,被注释的内容在 Nginx 解析配置文件时会被忽略 。

二、Nginx 基础配置详解

2.1 全局块配置

2.1.1 工作进程数配置

worker_processes指令用于设置 Nginx 工作进程的数量。通常建议将其设置为服务器 CPU 核心数,以充分利用服务器资源,提高并发处理能力。

worker\_processes auto;

上述配置中,auto关键字会让 Nginx 自动检测服务器的 CPU 核心数并进行设置。

2.1.2 错误日志与 PID 文件配置

error_log指令用于指定错误日志的路径和日志级别,方便排查 Nginx 运行过程中的错误;pid指令用于指定 Nginx 进程 ID 文件的路径,便于管理 Nginx 进程。

error_log /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;

这里将错误日志路径设置为/var/log/nginx/error.log,日志级别设置为warn,表示记录警告及以上级别的错误信息;PID 文件路径设置为/var/run/nginx.pid

2.2 events 块配置

2.2.1 最大连接数配置

worker_connections指令用于设置每个工作进程的最大连接数。它决定了 Nginx 能够同时处理的客户端连接数量。

events {
    worker_connections 1024;
}

上述配置表示每个工作进程最多可以同时处理 1024 个客户端连接。

2.2.2 事件驱动模型选择

Nginx 支持多种事件驱动模型,如selectpollepoll(Linux 系统)等。在 Linux 系统下,通常推荐使用epoll模型,它具有更高的性能和效率。可以通过use指令进行设置:

events {
    use epoll;
    worker_connections 1024;
}

2.3 http 块基础配置

2.3.1 日志格式定义

通过log_format指令可以自定义 Nginx 的访问日志格式,方便对请求进行分析和统计。

http {
    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;
}

上述配置定义了名为main的日志格式,包含了客户端 IP 地址、请求时间、请求方法、响应状态码等信息,并将访问日志记录到/var/log/nginx/access.log文件中。

2.3.2 MIME 类型配置

include指令用于引入外部配置文件,在 http 块中,常通过引入mime.types文件来配置 Nginx 支持的 MIME 类型,以便正确处理不同类型的文件。

http {
    include       mime.types;
    default_type  application/octet-stream;
}

default_type指令设置默认的 MIME 类型为application/octet-stream,当 Nginx 无法识别文件的 MIME 类型时,将使用该默认值。

三、Nginx 虚拟主机与 location 配置

3.1 server 块配置(虚拟主机)

3.1.1 监听端口与域名配置

listen指令用于设置虚拟主机监听的端口,server_name指令用于指定虚拟主机对应的域名。

server {
    listen       80;
    server_name  example.com www.example.com;

    # 其他配置...
}

上述配置表示该虚拟主机监听 80 端口,同时响应example.comwww.example.com两个域名的请求。

3.1.2 根目录与索引文件配置

root指令用于指定虚拟主机的根目录,index指令用于设置默认的索引文件。

server {
    listen       80;
    server_name  example.com;

    root   /var/www/html;
    index  index.html index.htm;

    # 其他配置...
}

当客户端访问该虚拟主机时,Nginx 会优先在/var/www/html目录下查找index.htmlindex.htm文件作为默认响应内容。

3.2 location 块配置

3.2.1 基于 URL 路径的请求处理

location 块可以根据请求的 URL 路径进行匹配,并设置不同的处理规则。例如,将所有以/static开头的请求映射到指定的静态资源目录:

server {
    listen       80;
    server_name  example.com;

    root   /var/www/html;
    index  index.html index.htm;

    location /static/ {
        alias /var/www/static/;
    }
}

上述配置中,alias指令将以/static开头的 URL 请求映射到/var/www/static/目录,Nginx 会从该目录中读取静态资源并返回给客户端。

3.2.2 正则表达式匹配

location 块还支持使用正则表达式进行 URL 匹配,通过在location后添加~符号表示使用正则匹配。例如,将所有以.jpg.png结尾的图片请求映射到图片资源目录:

server {
    listen       80;
    server_name  example.com;

    root   /var/www/html;
    index  index.html index.htm;

    location ~* \.(jpg|png)$ {
        root /var/www/images;
    }
}

~*表示不区分大小写的正则匹配,当客户端请求的 URL 以.jpg.png结尾时,Nginx 会从/var/www/images目录中查找对应的图片文件。

四、Nginx 反向代理与负载均衡配置

4.1 反向代理配置

反向代理是 Nginx 的核心功能之一,通过将客户端请求转发到后端服务器,实现隐藏后端服务器、提高安全性和负载均衡等目的。

server {
    listen       80;
    server_name  proxy.example.com;

    location / {
        proxy_pass http://backend_servers;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

upstream backend_servers {
    server 192.168.1.100:8080;
    server 192.168.1.101:8080;
}

上述配置中,upstream块定义了一个名为backend_servers的服务器组,包含了两个后端服务器的地址和端口。server块中的location配置将所有请求通过proxy_pass指令转发到backend_servers服务器组,并通过proxy_set_header指令设置请求头信息,以便后端服务器获取客户端的真实 IP 地址等信息。

4.2 负载均衡配置

Nginx 支持多种负载均衡策略,常见的有轮询(默认)、加权轮询、IP 哈希等。

4.2.1 轮询策略

轮询是 Nginx 默认的负载均衡策略,它将请求依次分配到后端服务器组中的每台服务器。

upstream backend_servers {
    server 192.168.1.100:8080;
    server 192.168.1.101:8080;
}

4.2.2 加权轮询策略

加权轮询可以根据服务器的性能等因素,为每台服务器设置不同的权重,权重越高的服务器接收的请求越多。

upstream backend_servers {
    server 192.168.1.100:8080 weight=2;
    server 192.168.1.101:8080 weight=1;
}

上述配置中,192.168.1.100:8080服务器的权重为 2,192.168.1.101:8080服务器的权重为 1,前者将接收约两倍于后者的请求数量。

4.2.3 IP 哈希策略

IP 哈希策略根据客户端的 IP 地址进行哈希计算,将同一个 IP 地址的请求始终分配到同一台后端服务器,保证了会话的一致性。

upstream backend_servers {
    ip_hash;
    server 192.168.1.100:8080;
    server 192.168.1.101:8080;
}

五、Nginx 安全与优化配置

5.1 防止恶意请求配置

5.1.1 限制 IP 访问频率

通过limit_req模块可以限制客户端 IP 的请求频率,防止恶意攻击和流量滥用。

http {
    limit_req_zone $binary_remote_addr zone=mylimit:10m rate=10r/s;

    server {
        listen       80;
        server_name  example.com;

        location / {
            limit_req zone=mylimit;
            # 其他配置...
        }
    }
}

上述配置中,limit_req_zone指令定义了一个名为mylimit的请求限制区域,使用客户端 IP 地址作为键值,限制每个 IP 地址的请求速率为每秒 10 次。limit_req指令在location块中启用该限制。

5.1.2 防止 SQL 注入与 XSS 攻击

通过ngx_http_xss_filter_modulengx_http_sql_injection_filter_module模块,可以对请求数据进行过滤,防止 SQL 注入和跨站脚本攻击(XSS)。需要在编译 Nginx 时添加相应模块支持,并进行配置:

http {
    xss_filter on;
    xss_filter_level HIGH;

    sql_injection_filter on;
    sql_injection_sensitive_word_file conf/sql_injection_sensitive_words.conf;

    # 其他配置...
}

5.2 性能优化配置

5.2.1 Gzip 压缩配置

启用 Gzip 压缩可以减小响应数据的大小,加快页面加载速度。

http {
    gzip on;
    gzip_disable "msie6";
    gzip_vary on;
    gzip_proxied any;
    gzip_comp_level 6;
    gzip_buffers 16 8k;
    gzip_http_version 1.1;
    gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
}

上述配置启用了 Gzip 压缩,设置了压缩级别、缓冲区大小、支持压缩的文件类型等参数。

5.2.2 连接优化配置

调整 Nginx 的连接相关参数,如keepalive_timeout(保持连接超时时间)、sendfile(启用零拷贝机制)等,可以提高 Nginx 的性能。

http {
    sendfile        on;
    tcp_nopush      on;
    tcp_nodelay     on;
    keepalive_timeout  65;
    types_hash_max_size 2048;

    # 其他配置...
}

六、Nginx 配置实践案例

6.1 静态资源服务器配置

假设需要搭建一个静态资源服务器,用于提供 HTML、CSS、JavaScript、图片等静态文件。配置如下:

server {
    listen       80;
    server_name  static.example.com;

    root   /var/www/static;
    index  index.html index.htm;

    location / {
        autoindex on;
        autoindex_exact_size off;
        autoindex_localtime on;
    }

    location ~* \.(jpg|png|gif|css|js)$ {
        expires 30d;
    }
}

上述配置中,root指令指定静态资源的根目录为/var/www/staticlocation /块启用目录索引功能,方便查看目录下的文件;location ~* \.(jpg|png|gif|css|js)$块为图片、CSS、JS 等文件设置缓存过期时间为 30 天,减少客户端重复请求。

6.2 动态网站反向代理与负载均衡配置

以一个 Java Web 应用为例,后端有两台 Tomcat 服务器提供服务,通过 Nginx 实现反向代理和负载均衡。

upstream tomcat_servers {
    server 192.168.1.100:8080 weight=2;
    server 192.168.1.101:8080 weight=1;
}

server {
    listen       80;
    server_name  dynamic.example.com;

    location / {
        proxy_pass http://tomcat_servers;
        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_connect_timeout 600;
        proxy_read_timeout 600;
        proxy_send_timeout 600;
    }
}

上述配置中,upstream块定义了后端 Tomcat 服务器组,并设置了加权轮询策略;server块将所有请求反向代理到后端服务器组,并设置了代理连接和读写超时时间,保证请求处理的稳定性。

总结

Nginx 的配置是一项复杂而又灵活的工作,从基础的文件结构、指令语法,到虚拟主机、反向代理、负载均衡,再到安全优化和实践案例,每个环节都需要深入理解和熟练掌握。通过合理配置 Nginx,可以搭建出高性能、高可靠、安全稳定的 Web 服务架构,满足不同业务场景的需求。在实际应用中,我们需要根据具体的业务需求和服务器环境,不断调整和优化 Nginx 配置,以达到最佳的运行效果。

若这篇内容帮到你,动动手指支持下!关注不迷路,干货持续输出!
ヾ(´∀ ˋ)ノヾ(´∀ ˋ)ノヾ(´∀ ˋ)ノヾ(´∀ ˋ)ノヾ(´∀ ˋ)ノ

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值