【Nginx】—— Nginx配置文件解读

Nginx配置文件解读

​ Nginx安装完毕后,会产生相应的安装目录,根据前面的安装路径,Nginx的配置文件路径为/usr/local/nginx/conf,其中nginx.conf为Nginx的主配置文件。这里重点介绍下nginx.conf这个配置文件。

​ Nginx配置文件默认有五个部分组成:分别是main、events、http、server和location,其中,main部分设置的指令将影响其他所有设置;events部分用来配置影响Nginx服务器或与用户的网络连接;http部分可以嵌套多个server,主要用来配置代理,缓存,自定义日志格式等绝大多数功能和第三方模块的配置,server部分用于配置虚拟主机的相关参数;location部分用于配置请求的处理规则,以及各种页面的处理情况。这五者之间的关系是:main与events平级,一个http中可以有多个server,server继承main,location继承server。

  • 属性参考图
    image-20250214181826839

1、Nginx的全局配置项

常用的全局配置项含义如下:

  • user:指定Nginx Worker进程运行用户以及用户组,默认由nobody账号运行,这里指定用www用户和组运行。

  • worker_processes:设置nginx工作的进程数,一般来说,设置成CPU核的数量即可,这样可以充分利用CPU资源,可通过如下命令查看CPU核数:

    [root@centos nginx]#grep ^processor /proc/cpuinfo | wc –l

    在nginx1.10版本后,worker_processes指令新增了一个配置值auto,它表示nginx会自动检测CPU核数并打开相同数量的worker进程。

  • worker_cpu_affinity:此指令可将Nginx工作进程与指定CPU核绑定,降低由于多核CPU切换造成的性能损耗。

    ​ worker_cpu_affinity使用方法是通过1、0来表示的,CPU有多少个核?就有几位数,1代表内核开启,0代表内核关闭,例如:有一个4核的服务器,那么nginx配置中worker_processes、worker_cpu_affinity的写法如下:

    worker_processes 4;
    worker_cpu_affinity 0001 0010 0100 1000;
    

    ​ 上面的配置表示:4核CPU,开启4个进程,每个进程都与CPU的每个核进行绑定。其中,0001表示开启第一个cpu内核,0010表示开启第二个cpu内核,其它含义依次类推。如果是8核CPU,绑定第一个CPU核,可以写成00000001,绑定第二个CPU核,可以写成00000010,依次类推。

    ​ worker_cpu_affinity指令一般与worker_processes配合使用,以充分发挥nginx的性能优势。

  • error_log:用来定义全局错误日志文件。日志输出级别有debug、info、notice、warn、error、crit可供选择,其中,debug输出日志最为最详细,而crit输出日志最少。

  • pid:用来指定进程id的存储文件位置。

  • worker_rlimit_nofile:用于指定一个Nginx进程可以打开的最多文件描述符数目,这里是65535,需要使用命令“ulimit -n 65535”来设置。

  • events:设定Nginx的工作模式及连接数上限。其中参数“use”用来指定Nginx的工作模式,Nginx支持的工作模式有select、poll、kqueue、epoll、rtsig和/dev/poll。其中select和poll都是标准的工作模式,kqueue和epoll是高效的工作模式,对于Linux系统,epoll工作模式是首选。而参数“worker_connections”用于定义Nginx每个进程的最大连接数,默认是1024。在一个纯Nginx(无反向代理应用)应用中,最大客户端连接数由worker_processes和worker_connections决定,即为:max_client=worker_processes*worker_connections。

    ​ 进程的最大连接数受Linux系统进程的最大打开文件数限制,在执行操作系统命令“ulimit -n 65536”后worker_connections的设置才能生效。

配置示例
user nginx nginx;                                # 格式:user [user] [group]
error_log /var/log/nginx/error.log notice;       # 格式:error_log [路径] [日志级别]
pid /var/run/nginx.pid;                          # 存储 master 进程 ID 的文件路径
worker_rlimit_nofile 65535;                      # 设置 worker 进程能打开的最大文件数
worker_processes auto;                           # 自动匹配 CPU 核心数
worker_cpu_affinity auto;                        # 自动绑定(Nginx 1.9.10+ 支持)

# 手动指定、手动绑定(以 4 核 CPU 为例):
# worker_processes 4;
# worker_cpu_affinity 0001 0010 0100 1000;

events {
    worker_connections 4096;   # 每个 worker 进程的最大并发连接数
    use epoll;                 # Linux 下高效事件模型(默认自动选择)
    multi_accept on;           # 是否一次接受所有新连接
    accept_mutex off;          # 是否启用互斥锁(高并发时建议 off)
}

http {
    # 其他 http 配置...
}

2、HTTP服务器配置

常用的HTTP配置项含义如下:

  • include:是个主模块指令,实现对配置文件所包含的文件的设定,可以减少主配置文件的复杂度。类似于Apache中的include方法。
  • default_type:属于HTTP核心模块指令,这里设定默认类型为二进制流,也就是当文件类型未定义时使用这种方式,例如在没有配置PHP环境时,Nginx是不予解析的,此时,用浏览器访问PHP文件就会出现下载窗口。
  • log_format:用于指定Nginx日志的输出格式。main为此日志输出格式的名称,可以在下面的access_log指令中引用。
  • Sendfile on:用于开启高效文件传输模式。将tcp_nopush和tcp_nodelay两个指令设置为on用于防止网络阻塞。
  • keepalive_timeout:设置客户端连接保持活动的超时时间。在超过这个时间之后,服务器会关闭该连接。
  • server_names_hash_bucket_size 128:为了提高快速寻找到相应server name的能力,Nginx使用散列表来存储server name,而server_names_hash_bucket_size就是设置每个散列桶占用的内存大小。
  • client_max_body_size 30m:用来设置允许客户端请求的最大的单个文件字节数。
  • client_header_buffer_size 32k:用于指定来自客户端请求头的header buffer大小。对于大多数请求,1K的缓冲区大小已经足够,如果自定义了消息头或有更大的Cookie,可以增加缓冲区大小。这里设置为32K。
  • large_client_header_buffers 4 128k:用来指定客户端请求中较大的消息头的缓存最大数量和大小, “4”为个数,“128K”为大小,最大缓存量为4个128K。
配置示例
http {
    include       /etc/nginx/mime.types;          # 加载外部配置文件(定义 MIME 类型,如 text/css、image/png 等)
    default_type  application/octet-stream;       # 设置默认的 MIME 类型(当无法识别文件类型时使用)

    # 定义访问日志的格式(变量说明见注释)
    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" 的日志格式
    
    sendfile        on;          # 启用高效文件传输(零拷贝技术,减少 CPU 占用)
    tcp_nopush      on;          # 仅在发送完整数据包时传输(减少网络包碎片,需配合 sendfile)
    tcp_nodelay     on;          # 禁用 Nagle 算法,立即发送小数据包(降低延迟)
    keepalive_timeout  65;       # 设置客户端长连接的超时时间为 65 秒
    
    server_names_hash_bucket_size 128;        # 设置 server_name 哈希表中每个桶的内存大小为 128 字节(避免长域名冲突)
    large_client_header_buffers 4 128k;       # 设置大请求头的缓冲区:4 个 128KB 的缓冲区
    client_header_buffer_size 32k;            # 设置普通请求头的缓冲区大小为 32KB
    client_max_body_size 30m;                 # 限制客户端上传文件的最大大小为 30MB

    # 定义一个虚拟主机(server 块)
    server {
        listen 80;                    # 监听 80 端口(HTTP 默认端口)
        server_name example.com;      # 设置虚拟主机的域名
        root /var/www/html;           # 设置网站的根目录路径
        index index.html;             # 设置默认索引文件(按顺序查找)
    }
}
关键变量说明(log_format
  • $remote_addr:客户端 IP 地址。
  • $remote_user:HTTP Basic Auth 认证的用户名(若无则为 -)。
  • $time_local:本地时间(格式为 [day/month/year:hour:minute:second zone])。
  • $request:请求方法、路径和协议(如 GET /index.html HTTP/1.1)。
  • $status:HTTP 响应状态码(如 200、404)。
  • $body_bytes_sent:发送给客户端的响应体大小(字节)。
  • $http_referer:请求来源页面的 URL(若无则为 -)。
  • $http_user_agent:客户端浏览器标识(如 Mozilla/5.0)。
  • $http_x_forwarded_for:代理服务器传递的客户端 IP(若无则为 -)。

3、HttpGzip模块配置

常用的HttpGzip配置项含义如下:

  • gzip on:用于设置开启或者关闭gzip模块,“gzip on”表示开启GZIP压缩,实时压缩输出数据流。
  • gzip_min_length 1k:设置允许压缩的页面最小字节数,页面字节数从header头的Content-Length中获取。默认值是0,不管页面多大都进行压缩。建议设置成大于1k的字节数,小于1k可能会越压越大。
  • gzip_buffers 4 16k:表示申请4个单位为16K的内存作为压缩结果流缓存,默认是申请与原始数据大小相同的内存空间来存储gzip压缩结果。
  • gzip_http_version 1.1:用于设置识别HTTP协议版本,默认是1.1,目前大部分浏览器已经支持GZIP解压,使用默认即可。
  • gzip_comp_level 2:用来指定GZIP压缩比,1表示压缩比最小,处理速度最快;9表示压缩比最大,传输速度快,但处理最慢,也比较消耗CPU资源。
  • gzip_types text/plain application/x-javascript text/css application/xml:用来指定压缩的类型,无论是否指定,“text/html”类型总是会被压缩的。
  • gzip_vary on; 是一个用于优化 HTTP 压缩(Gzip)的指令。它的作用是告诉 Nginx 在响应头中添加 Vary: Accept-Encoding,以帮助缓存服务器(如 CDN、代理服务器)正确处理压缩后的内容。在启用 Gzip 压缩时,建议始终开启此选项。
配置示例
http {
    gzip on;                    # 启用 Gzip 压缩(默认 off,建议开启)
    gzip_min_length 1k;         # 设置触发压缩的最小文件大小(小于 1KB 的文件不压缩)
    gzip_buffers 4 16k;         # 设置 Gzip 压缩缓冲区数量和大小(4 个 16KB 的缓冲区)
    gzip_http_version 1.1;      # 设置支持 Gzip 压缩的最低 HTTP 协议版本(1.1 支持持久连接)
    gzip_comp_level 2;          # 设置 Gzip 压缩级别(1-9,2 为低压缩率,平衡 CPU 和带宽)
    # 指定需要压缩的 MIME 类型(文本、JS、CSS、XML)
    gzip_types text/plain application/x-javascript text/css application/xml;
    gzip_vary on;               # 添加 Vary: Accept-Encoding 响应头

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

4、server虚拟主机配置

常用的server配置项含义如下:

  • server:定义虚拟主机开始的关键字。
  • listen:用于指定虚拟主机的服务端口。
  • server_name:用来指定IP地址或域名,多个域名之间用空格分开。
  • index:用于设定访问的默认首页地址。
  • root:用于指定虚拟主机的网页根目录,这个目录可以是相对路径,也可以是绝对路径。
  • access_log:用来指定此虚拟主机的访问日志存放路径,最后的main用于指定访问日志的输出格式。
  • error_page指令可以定制各种错误信息的返回页面。在默认情况下,Nginx会在主目录的html目录中查找指定的返回页面,特别需要注意的是,这些错误信息的返回页面的大小一定要超过512K,否者会被IE浏览器替换为IE默认的错误页面。
多虚拟主机的含义

​ 在 Nginx 中,**多虚拟主机(Multi-Virtual Host)**是指通过配置多个 server 块,让一台服务器(或同一个 IP 地址)能够同时托管多个不同的网站或服务。每个虚拟主机独立处理自己域名的请求,拥有独立的配置(如根目录、日志、错误页面等),互不干扰。

为什么需要多虚拟主机?

  1. 资源隔离
    • 每个虚拟主机可以独立管理文件、日志和配置,避免不同项目之间的冲突。
    • 例如:example.comtest.com 的文件分别存储在 /var/www/example.com/var/www/test.com
  2. 节省成本
    • 一台服务器可以托管多个域名,无需为每个网站单独购买服务器或 IP 地址。
    • 例如:共享 IP 的多个网站通过 server_name 区分请求。
  3. 灵活配置
    • 不同虚拟主机可以配置不同的 PHP 版本、SSL 证书、访问控制等。
    • 例如:example.com 使用 PHP 8.2,而 legacy.com 使用 PHP 7.4。
  4. 测试与生产环境隔离
    • 可以在同一台服务器上运行生产环境和测试环境(如 prod.example.comtest.example.com)。

多虚拟主机的实现原理

Nginx 通过以下机制实现多虚拟主机:

  1. server_name 匹配
    • 当客户端发起请求时,Nginx 根据请求头中的 Host 字段(域名)匹配对应的 server 块。
    • 例如:请求 http://example.com 会匹配 server_name example.com; 的配置。
  2. 默认服务器(Default Server)
    • 如果没有匹配的 server_name,请求会由 default_server 处理。
    • 例如:未列出的域名(如 unknown.com)会被 listen 80 default_server; 捕获。
  3. 端口复用
    • 多个虚拟主机可以共享同一个端口(如 80 或 443),通过域名区分。
配置示例

模拟多虚拟主机:

http {
    # 全局配置(如 Gzip、日志格式等)...

    # 第一个虚拟主机:处理 example.com 的请求
    server {
        listen 80;                                               # 监听 80 端口(HTTP 默认端口)
        server_name example.com www.example.com;                 # 设置虚拟主机的主域名(支持通配符和正则)
        root /var/www/example.com/html;                          # 设置网站的根目录路径
        index index.html index.php;                              # 设置默认索引文件(按顺序查找)
        access_log /var/log/nginx/example.com.access.log;        # 自定义访问日志路径(默认使用 HTTP 块的 access_log)

        # 定义错误页面(如 404、500)
        error_page 404 /404.html;                   # 自定义 404 错误页面,这里的/根目录指的是root /var*/*html目录
        error_page 500 502 503 504 /50x.html;       # 自定义 500、502、503、504 错误页面

        # 处理静态文件请求(匹配所有路径)
        location / {
            try_files $uri $uri/ =404;          # 按顺序尝试查找文件或目录,不存在则返回 404
        }

        # 处理 PHP 请求(匹配以 .php 结尾的路径,需 PHP-FPM 支持)
        location ~ \.php$ {
            fastcgi_pass 127.0.0.1:9000;        # 将 PHP 请求转发到本地的 PHP-FPM 服务(默认端口 9000)
            include fastcgi_params;             # 加载 PHP-FPM 所需的通用参数(如 SCRIPT_FILENAME)
        }
    }

    # 第二个虚拟主机:处理 test.com 的请求
    server {
        listen 80;
        server_name test.com www.test.com;
        root /var/www/test.com/html;
        index index.html;

        access_log /var/log/nginx/test.com.access.log;
        error_page 404 /custom_404.html;

        location / {
            try_files $uri $uri/ =404;
        }
    }

    # 可选:默认服务器块(匹配未列出的域名)
    server {
        listen 80 default_server;
        server_name _;
        return 444;  # 直接关闭连接(或重定向到其他页面)
    }
}

5、Nginx通用配置模板

# 全局配置
user nginx;                      # 运行用户(根据系统调整)
worker_processes auto;           # 自动根据 CPU 核心数分配进程
worker_rlimit_nofile 65535;      # 单进程最大文件描述符数(需配合系统 ulimit)
pid /var/run/nginx.pid;          # PID 文件路径

# 事件模块配置(高并发核心)
events {
    use epoll;                   # Linux 高效事件模型(必选)
    worker_connections 4096;     # 单进程最大连接数(根据内存调整)
    multi_accept on;             # 一次接受所有新连接(减少系统调用)
    accept_mutex off;            # 高并发下关闭互斥锁(提升多核性能)
}

# HTTP 模块配置
http {
    include       /etc/nginx/mime.types;  # 加载 MIME 类型
    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;
    error_log   /var/log/nginx/error.log warn;

    # 发送文件优化
    sendfile        on;          # 启用高效文件传输
    tcp_nopush     on;           # 减少网络包数量(需配合 sendfile)
    tcp_nodelay    on;           # 禁用 Nagle 算法(低延迟场景)

    # 连接超时设置
    keepalive_timeout  65;       # 长连接超时时间(秒)
    keepalive_requests 1000;     # 单长连接最大请求数

    # 缓冲区优化
    client_body_buffer_size 16k;        # 请求体缓冲区大小
    client_header_buffer_size 1k;       # 请求头缓冲区大小
    large_client_header_buffers 4 8k;   # 大请求头缓冲区

    # Gzip 压缩(节省带宽)
    gzip on;
    gzip_disable "MSIE [1-6]\.";  # 禁用旧版 IE 的 gzip
    gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;

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

        # 静态资源缓存
        location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
            expires 30d;        # 缓存 30 天
            add_header Cache-Control "public";
        }

        # 根目录配置
        root /usr/share/nginx/html;
        index index.html index.htm;

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

        # 反向代理示例(如需)
        location /api/ {
            proxy_pass http://backend_server;               # 将匹配 /api/ 的请求转发到http://backend_server
            proxy_set_header Host $host;                    # 设置转发给后端服务器的请求头 Host(保持原始域名),作用:避免后端服务因 Host 头丢失而无法正确处理请求(如多租户系统)。
            proxy_set_header X-Real-IP $remote_addr;        # 设置转发给后端服务器的请求头 X-Real-IP(传递客户端真实 IP),作用:后端服务可以通过 X-Real-IP 记录或验证客户端 IP(如日志记录、限流、风控)。
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值