Nginx配置文件详解(万字图文总结)

Nginx配置文件详解(万字图文总结)-mikechen

Nginx是非常重要的负载均衡,也是大型架构必备技能,下面我就全面来详解Nginx配置文件@mikechen

Nginx

Nginx 是一款高性能的 HTTP 服务器和反向代理服务器,Nginx 以其轻量级、可扩展性、和高并发处理能力而闻名。

Nginx广泛应用于各种 Web 服务环境中,比如:作为一个静态和动态内容的 Web 服务器。

Nginx配置文件详解(万字图文总结)-mikechen

Nginx 可以直接处理 HTTP 请求,提供静态文件(如: HTML、CSS、JS、图片…等)。

Nginx 支持对传输内容进行压缩,如 Gzip 压缩,这不仅可以节省带宽,还能加快内容传输速度。

Nginx 作为反向代理服务器,接收客户端请求并将其转发给后端服务器,同时返回来自后端服务器的响应。

Nginx广泛用于负载均衡、请求缓存和加速、SSL 终端…….等。

Nginx配置文件

Nginx 的配置文件主要由以下几部分组成:全局块、events 块、http 块,以及 server 块。。。等。

如下图所示:

Nginx配置文件详解(万字图文总结)-mikechen

全局块:配置影响整个 “Nginx” 服务的指令;

events 块:配置 Nginx 如何处理连接相关的指令;

http 块:主要配置: HTTP 服务器相关的指令,包括:处理 HTTP 请求。。。等行为。

下面,我分别重点详解Nginx核心的配置文件@mikechen

 

Nginx全局配置

全局配置部分通常位于文件的最开头,这些指令适用于 Nginx 的整个生命周期。

Nginx配置文件详解(万字图文总结)-mikechen

# 全局配置
user  www-data; # 定义Nginx的运行用户
worker_processes  4; # 设置工作进程数,通常设置为CPU核心数
error_log  /var/log/nginx/error.log warn; # 定义错误日志路径和日志级别
pid        /var/run/nginx.pid; # 存放Nginx进程ID的文件位置
  • user:指定 Nginx 进程的用户/和组;
  • worker_processes:指定工作进程的数量,auto 表示自动检测 CPU 核数并设置合适的进程数。
  • error_log:定义错误日志的路径及日志级别,比如:日志级别包括 debuginfonoticewarnerrorcritalertemerg。
  • pid:指定存放 Nginx 主进程 ID 的文件路径。

events 块

events 块主要用于:配置、与网络连接和工作线程相关的参数。

events 块配置,影响 Nginx 与操作系统之间的网络通信方式。

配置如下:

events {
    worker_connections  1024; # 每个工作进程允许的最大连接数
}
  • worker_connections:每个工作进程允许的最大连接数;
  • worker_connections 1024:每个工作进程可以同时打开的最大连接数,该数值影响Nginx的并发能力;

http 块

http 块是 Nginx 的核心,用于处理 HTTP 请求。

Nginx配置文件详解(万字图文总结)-mikechen

配置如下:

http {
    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;
    tcp_nopush      on;
    keepalive_timeout  65;
    gzip            on;
    
    include /etc/nginx/conf.d/*.conf;
}
  • include:包含其他配置文件或片段,通常用来导入 MIME 类型等。
  • default_type:设置默认的 MIME 类型,例如 application/octet-stream 用于未识别文件类型。
  • log_format:定义日志的格式,这里定义了一个名为 main 的日志格式。
  • access_log:指定访问日志的路径和格式。
  • sendfile:开启 sendfile,用于高效地传输文件。
  • tcp_nopush:在使用 sendfile 时,可以提高性能。
  • keepalive_timeout:定义客户端保持连接的超时时间。
  • gzip:开启 gzip 压缩,以减少传输数据量。

 

server 块

server 块定义了一个虚拟主机的配置,用于处理不同域名或 IP 地址的请求。

Nginx配置文件详解(万字图文总结)-mikechen

每个 server 块可以有多个 location 块,配置如下:

server {
    listen       80; # 监听端口
    server_name  example.com www.example.com; # 定义服务器域名
    
    location / {
        root   /usr/share/nginx/html; # 站点根目录
        index  index.html index.htm; # 默认首页文件
    }

    location /images/ {
        root   /usr/share/nginx/html; # 静态文件目录
        autoindex on; # 自动列出目录内容
    }

    error_page  404              /404.html; # 自定义404错误页面
    location = /404.html {
        root   /usr/share/nginx/html;
    }

    # 反向代理配置
    location /api/ {
        proxy_pass http://backend_server; # 转发到后端服务器
        proxy_set_header Host $host; # 保留原始请求的Host头
        proxy_set_header X-Real-IP $remote_addr; # 保留客户端IP
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 保留代理链
        proxy_set_header X-Forwarded-Proto $scheme; # 保留请求协议(HTTP/HTTPS)
    }
}

listen:指定 Nginx 监听的端口号,如 80(HTTP)、或 443(HTTPS);

server_name:定义虚拟主机的域名,可以是一个或多个域名,支持通配符;

location:匹配 URI 路径并定义如何处理请求,例如 / 代表根路径,而 /images/ 代表所有以 /images/ 开头的请求路径;

root:指定资源的根目录;

index:指定默认的索引文件,当请求指向一个目录时,Nginx 会查找该目录下的索引文件。

autoindex:打开目录列表,如果目录中没有 index 文件,Nginx 会列出该目录中的文件。

error_page:指定错误页面,例如 404 错误的页面。

 

 location 块

location 块用于根据 URI 匹配规则处理请求,可以嵌套在 server 块中。

location:匹配的 URI,可以是精确匹配 =、前缀匹配 ^~、正则匹配 ~~*(不区分大小写)。

Nginx配置文件详解(万字图文总结)-mikechen

配置如下:

location /api/ {
        proxy_pass http://backend_server; # 转发到后端服务器
        proxy_set_header Host $host; # 保留原始请求的Host头
        proxy_set_header X-Real-IP $remote_addr; # 保留客户端IP
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 保留代理链
        proxy_set_header X-Forwarded-Proto $scheme; # 保留请求协议(HTTP/HTTPS)
    }

proxy_pass http://backend_server;
反向代理,将请求转发到指定的后端服务器。

proxy_set_header Host $host;
传递请求的Host头到后端服务器。

proxy_set_header X-Real-IP $remote_addr;
传递客户端的真实IP地址。

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
用于保留客户端的代理链。

proxy_set_header X-Forwarded-Proto $scheme;
用于传递请求协议,通常用于判断是否通过HTTPS访问。

 

Nginx反向配置

Nginx配置文件详解(万字图文总结)-mikechen

Nginx 常用于反向代理,将请求转发给后端服务器,如下所示:

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

    server {
        listen 80;
        server_name example.com;

        location / {
            proxy_pass http://backend;
            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_set_header X-Forwarded-Proto $scheme;
        }
    }
}

 

Nginx负载均衡配置

Nginx 可以通过 upstream 指令实现负载均衡,如下所示:

upstream backend {
    server backend1.example.com weight=3;
    server backend2.example.com;
    server backend3.example.com backup;
}

server {
    location / {
        proxy_pass http://backend;
    }
}
  • upstream:定义后端服务器池。
  • weight:指定权重。
  • backup:指定备用服务器。

 

Nginx SSL配置

Nginx 也可以用来处理 HTTPS 请求,如下所示:

server {
    listen 443 ssl;
    server_name example.com;

    ssl_certificate /etc/ssl/certs/nginx.crt;
    ssl_certificate_key /etc/ssl/private/nginx.key;
    
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers HIGH:!aNULL:!MD5;
}
  • ssl_certificate:指定 SSL 证书文件路径。
  • ssl_certificate_key:指定 SSL 证书密钥文件路径。
  • ssl_protocols:定义支持的 SSL/TLS 协议版本。
  • ssl_ciphers:定义加密套件。

 

Nginx动静分离配置

可以将静态资源,比如:图片、CSS、JS 文件…直接由 Nginx 提供,动态请求则转发到后端服务器处理。

从而实现动静分离,配置如下:

server {
    listen 80;
    server_name example.com;

    # 静态资源直接由 Nginx 提供
    location /static/ {
        root /var/www/html;
    }

    # 动态请求转发到后端服务器
    location / {
        proxy_pass http://backend_server;
        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_set_header X-Forwarded-Proto $scheme;
    }
}

总之,Nginx 是一款功能强大的服务器软件,适用于各种 Web 服务场景。

Nginx 核心功能包括高效的 HTTP 服务器、强大的反向代理、灵活的负载均衡……..等机制与功能。

陈睿mikechen

10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。

关注「mikechen」公众号,获取更多技术干货!

后台回复面试即可获取《史上最全阿里Java面试题总结》,后台回复架构,即可获取《阿里架构师进阶专题全部合集

评论交流
    说说你的看法