(配置篇)nginx.conf配置项详解

生命周期控制

通过命令行命令控制nginx服务器的整个生命周期,也就是从开启到关闭为止

查看nginx进程

ps -ef | grep nginx

这是一个连续命令,这条命令将会依次执行两个操作:

ps -ef:这个命令用于列出当前系统上所有正在运行的进程。其中:

-e 选项用于显示所有进程,而不仅仅是当前终端的进程。

-f 选项用于显示完整的进程信息。

grep nginx:grep 命令用于在文本中搜索指定的字符串。在这个命令中,它将从 ps -ef 命令的输出中过滤出包含关键词 “nginx” 的行。这样可以筛选出与 Nginx 相关的进程信息。

因此,整条命令的作用是查找并显示所有包含 “nginx” 关键词的进程信息。

nginx进程

nginx采用多进程来处理任务

多进程:一个 Master 进程、多个 Worker 进程。

Master 进程:

管理 Worker 进程。对外接收管理员的命令,对内管理,监控各worker进程

Worker 进程:

实际处理网络请求

信号控制

通过发命令给master进程,完成对nginx的控制

以下是一个表格,展示了 Nginx 中与 kill 相关的信号及其功能:

信号说明
TERM立刻关闭
INT同 TERM
QUIT优雅地关闭并退出 Nginx,不再接受请求并且在完成当前请求后退出
HUP请求 Nginx 重新加载配置文件
USR1请求 Nginx 重新打开日志文件
USR2平滑升级可执行文件
WINCH优雅地关闭旧的工作进程

你可以使用 kill 命令向 Nginx master进程发送这些信号,例如:

-s 选项用于指定要发送的信号。

kill -s 信号 

不停机升级服务器

  1. 备份旧版本./nginx
mv nginx nginxold

2.将新版本的nginx拷贝到/usr/sbin

cp nginx /usr/sbin

3.通过user2信号命令master进程升级

命令行控制

直接通过命令行命令控制nginx服务器,是一种简单的方式,在生产中用的最多

./nginx命令

./nginx 命令的选项及其功能:

选项说明
-h, --help显示帮助信息,列出所有可用选项及其说明
-v, --version显示 Nginx 的版本信息
-t, --test检测配置文件的语法是否正确,但不启动 Nginx
-q, --quiet安静模式,输出更少的信息
-g, --global在全局配置中设置参数
-c 指定要使用的配置文件
-p 指定 Nginx 的安装路径
-s 向 Nginx 进程发送信号,可以是 stop(快速关闭nginx进程), quit(优雅关闭), reload(重新加载配置文件),reopen(重新打开日志文件) 等
-g 在启动 Nginx 时设置全局参数

你可以根据需要,在启动 ./nginx 命令时使用这些选项来控制 Nginx 的行为。

常用的有:

  1. ./nginx:启动nginx进程
  2. ./nginx -t:查看nginx.conf配置文件的位置以及检查配置文件是否正确
  3. ./nginx -s reload:重新加载配置文件,非常常用,只要是改了配置文件,都需要reload,因为配置文件时保存在磁盘中,只有写入内存后,才能被cpu使用

nginx.conf

nginx.conf是nginx的核心配置文件,也是开发人员打交道最多的文件

确定nginx.conf位置

我发现有很多人在安装nginx后连配置文件都找不到

解决方法是通过命令来查看

./nginx -t

nginx.conf 中的各配置项、参数及其作用,包括各层子配置项:

全局配置项:

  1. user: 指定 Nginx 运行的用户和用户组。

    • 语法:user user_name [group_name];
    • 默认值:user nobody nobody;
    • worker_processes: 指定 Nginx 启动的工作进程数量。

      • 语法:worker_processes number;
      • 默认值:自动根据 CPU 核心数确定。
      • error_log: 指定错误日志文件的路径和级别。

        • 语法:error_log file [level];
        • 默认值:error_log logs/error.log error;
        • pid: 指定 Nginx 主进程的 PID 文件路径。

          • 语法:pid file;
          • 默认值:pid logs/nginx.pid;
          • events: 定义 Nginx 如何处理连接和事件的模块。

            • 语法:events { ... }
            • 子配置项:
              • worker_connections: 每个工作进程的最大连接数。
                • 语法:worker_connections number;
                • 默认值:worker_connections 1024;

HTTP 配置项:

  1. http: 定义 HTTP 服务器的配置块。

    • 语法:http { ... }
    • 子配置项:
      • include: 包含其他配置文件。
        • 语法:include file | mask;
        • log_format: 定义日志格式。
          • 语法:log_format name [escape=default] string;
          • access_log: 指定访问日志文件的路径和格式。
            • 语法:access_log path [format [buffer=size] [gzip[=level]] [flush=time] [if=condition]];
            • error_log: 指定错误日志文件的路径和级别。
              • 语法:error_log file [level];
              • types: 定义 MIME 类型和扩展名的映射。
                • 语法:types { ... }
                • server: 定义一个 HTTP 服务器块。

                  • 语法:server { ... }
                  • 子配置项:
                    • listen: 指定服务器监听的 IP 地址和端口。
                      • 语法:listen address[:port] [default_server] [ssl] [http2] [reuseport] [so_keepalive=on|off|keepidle:time|keepintvl:time|keepcnt:num] [backlog=num] [deferred] [accept_filter=filter];
                      • server_name: 指定服务器名称。
                        • 语法:server_name name [name];
                        • root: 指定服务器根目录。
                          • 语法:root path;
                          • index: 指定默认的首页文件。
                            • 语法:index file [file];
                            • location: 定义对特定请求路径的处理方式。
                              • 语法:location [modifier] uri { ... }
                              • include: 包含其他配置文件。

                                • 语法:include file | mask;

简化版:

- user:指定 Nginx 运行的用户和用户组。
- worker_processes:指定 Nginx 启动的工作进程数量。
- error_log:指定错误日志文件的路径和级别。
- pid:指定 Nginx 主进程的 PID 文件路径。
- events:定义 Nginx 如何处理连接和事件的模块。
  - worker_connections:指定每个工作进程的最大连接数。
- http:定义 HTTP 服务器的配置块。
  - include:包含其他配置文件。
  - log_format:定义日志格式。
  - access_log:指定访问日志文件的路径和格式。
  - types:定义 MIME 类型和扩展名的映射。
- server:定义一个 HTTP 服务器块。
  - listen:指定服务器监听的 IP 地址和端口。
  - server_name:指定服务器名称。
  - root:指定服务器根目录。
  - index:指定默认的首页文件。
  - location:定义对特定请求路径的处理方式。

全局块

nginx.conf中既不属于events块,也不属于http块的配置项称为全局块

全局块包含了影响 Nginx 全局行为的配置项。

  1. user:

    • 参数:指定 Nginx 运行的用户和用户组。
    • 功能:定义 Nginx 运行的权限。
    • worker_processes:

      • 参数:指定 Nginx 启动的工作进程数量。
      • 功能:控制 Nginx 的并发处理能力。
      • error_log:

        • 参数:指定错误日志文件的路径和级别。
        • 功能:记录 Nginx 的错误日志。
        • pid:

          • 参数:指定 Nginx master进程的 PID 文件路径。
          • 功能:记录 Nginx master进程的 PID。
          • include:

            • 参数:其他配置文件的路径。
            • 功能:将其他配置文件引入到当前配置文件中。
            • log_format:

              • 参数:自定义的日志格式。
              • 功能:定义日志的格式,用于 access_log。
              • access_log:

                • 参数:指定访问日志文件的路径和格式。
                • 功能:记录访问日志。
                • types:

                  • 参数:MIME 类型和扩展名的映射。
                  • 功能:定义文件扩展名与 MIME 类型之间的关系。

这些全局块的配置项定义了 Nginx 的基本行为和服务器范围内的全局设置。

user配置,用于指定worker进程的用户和用户组,以配置文件中的配置优先

直接在nginx.conf中配置

user <用户名>

注意,如果当前操作系统中没有这个用户,则需要用命令添加用户到操作系统

useradd <用户名>

master_process配置,用于配置是否开启工作进程,所谓工作进程,是真正用于处理网络请求的进程

work_processes配置,用于配置开启的工作进程数量,理论上来讲,工作进程数量越大,nginx能处理的并发请求量就越大

daemon on| off:用于配置是否以守护进程的方式启动,在计算机中,守护进程是一种特殊的进程,它在后台默默地运行,不会显示在屏幕上,也不需要用户手动启动。守护进程通常用来管理和监控某个服务或程序,确保它们能够一直运行,并且在需要的时候自动重启。

events块

在 Nginx 的配置文件(通常是 nginx.conf)中,events 块用于配置与 Nginx 事件处理相关的参数。这些参数主要用于控制 Nginx 如何处理连接、请求和其他事件。

  1. worker_connections:

    • 配置参数:worker_connections number;
    • 功能:指定每个工作进程能够同时处理的最大连接数。当 Nginx 处理高负载时,这个参数决定了 Nginx 能够同时处理的请求数量。
    • use:

      • 配置参数:use [ kqueue | rtsig | epoll | /path/to/dev/poll | select | poll ];
      • 功能:指定 Nginx 在特定平台上使用的事件模型。不同的操作系统和内核提供了不同的事件模型,Nginx 根据平台自动选择最合适的模型。一般情况下,用户不需要手动设置这个参数。
      • multi_accept:

        • 配置参数:multi_accept on | off;
        • 功能:控制 Nginx 是否一次性接受尽可能多的连接。当启用 multi_accept 时,Nginx 在每个事件循环中尽可能多地接受连接,以提高连接处理的效率。但这也会增加内存消耗。
        • accept_mutex:

          • 配置参数:accept_mutex on | off;
          • 功能:控制是否启用接受互斥锁。当启用时,Nginx 在处理新连接时会使用互斥锁来保证只有一个工作进程在处理连接,这可以防止因竞争条件而导致的性能下降。但在高负载情况下,可能会成为性能瓶颈。
          • accept_mutex_delay:

            • 配置参数:accept_mutex_delay time;
            • 功能:配置接受互斥锁的延迟时间。当多个连接同时到达时,Nginx 可以延迟一段时间再去竞争互斥锁,以减少竞争的激烈程度,提高性能。
            • worker_aio_requests:

              • 配置参数:worker_aio_requests number;
              • 功能:指定每个工作进程能够同时处理的最大异步 I/O 请求数量。异步 I/O 可以提高 Nginx 在高负载情况下的性能。

这些是 events 块中常用的配置项和参数,通过调整这些参数,可以优化 Nginx 的性能以适应不同的应用场景。

http块

在 Nginx 的配置文件中,http 块是用来配置 HTTP 服务器的主要部分,它包含了全局性的配置项,用于控制 HTTP 服务器的行为。下面是 http 块的作用、常见配置项以及功能:

作用:

  • http 块用于配置整个 HTTP 服务器的行为。
  • 定义了全局性的配置项,如日志记录、访问控制、反向代理等。

    常见配置项和功能:

    1. server:定义 HTTP 服务器的虚拟主机,一个 http 块可以包含多个 server 块,每个 server 块用于配置一个虚拟主机。

    2. upstream:定义后端服务器的集群,用于反向代理和负载均衡。配置项包括:

      • server:定义后端服务器的地址和端口。
      • weight:定义服务器的权重,用于负载均衡。
      • backup:定义备用服务器。
      • keepalive:定义与后端服务器的保持连接数。
      • location:用于匹配请求的 URI,并设置相应的处理规则。配置项包括:

        • root:指定网站的根目录。
        • proxy_pass:配置反向代理。
        • try_files:用于配置文件或目录的查找顺序。
        • rewrite:用于重写 URL。
        • log_format:定义日志格式,用于自定义日志记录的格式。

    log_format accesslog '自定义的日志格式';
    

    日志格式:

    以下是常用的 Nginx 日志格式占位符及其含义:

    占位符含义
    $remote_addr客户端的 IP 地址。
    $remote_user客户端提供的 HTTP 基本认证用户名。
    $time_local请求的本地时间,格式为 [day/month/year:hour:minute:second zone]。
    $request客户端请求的第一行,包括请求方法、URL 和 HTTP 版本。
    $statusHTTP 响应状态码。
    $body_bytes_sent发送给客户端的响应正文的字节数(不包括响应头)。
    $http_referer引荐页面的 URL。
    $http_user_agent客户端的 User-Agent 字符串。
    $http_x_forwarded_forX-Forwarded-For 头部,用于代理服务器情况下获取客户端真实 IP。
    $server_name处理请求的服务器名称。
    $uri请求的 URI。
    $scheme请求的协议(http 或 https)。
    $host请求的 Host 头部。
    $bytes_sent发送给客户端的总字节数(包括响应头)。
    1. access_log:配置访问日志记录。
    access_log  /log/nginx/access.log   accesslog;
    
    1. error_log:配置错误日志记录。

    2. include:用于包含其他配置文件。

    3. gzip:配置 Gzip 压缩。

    4. ssl:配置 SSL/TLS 加密。

    5. server_tokens:配置是否显示服务器版本信息。

    6. keepalive_timeout:配置客户端和服务器之间保持连接的超时时间。

      建立长连接,在一个长连接中,客户端可以与服务端进行多次请求响应

    7. resolver:配置 DNS 解析服务器的地址。

    8. client_max_body_size:配置客户端请求体的最大大小。

    9. default_type:配置默认的 MIME 类型。

    10. proxy_set_header:配置转发请求时的 HTTP 头信息。

    11. proxy_read_timeout:配置与后端服务器的读取超时时间。

    12. proxy_connect_timeout:配置与后端服务器的连接超时时间。

    13. proxy_cache:配置反向代理缓存。

    14. proxy_buffering:配置是否开启缓冲代理响应。

    15. server_name:配置虚拟主机的域名。

    这些是 http 块中常见的配置项和功能,通过合理配置这些项,可以实现 Nginx HTTP 服务器的各种功能和性能优化。

    引入mime.types文件,该文件记录了客户端请求资源类型和实际文件类型的映射关系,依此,服务器可以准确理解客户端请求的文件类型

    可以通过default_type来配置响应体类型

    server块

    在 Nginx 的配置文件中,server 块用于定义虚拟主机,每个 server 块通常对应一个域名或者 IP 地址。server 块中包含了一系列的配置参数,用来配置虚拟主机的行为。以下是一些常见的 server 块配置参数及其含义和作用:

    1. listen:指定 Nginx 监听的端口和 IP 地址。

      • 语法:listen [地址:]端口 [参数];
      • 示例:listen 80;、listen 127.0.0.1:8080;
      • server_name:指定虚拟主机的域名。

        • 语法:server_name 域名;
        • 示例:server_name example.com www.example.com;
        • root:指定网站的根目录。

          • 语法:root 路径;
          • 示例:root /var/www/html/;
          • index:指定默认的首页文件。

            • 语法:index 文件名;
            • 示例:index index.html index.htm;
            • error_page:指定错误页面的路径。

              • 语法:error_page 状态码 跳转路径;
              • 示例:error_page 404 /404.html;
              • location:用于匹配请求的 URI,并设置相应的处理规则。

                • 示例:location / { ... }、location /images/ { ... }
                • rewrite:用于重写 URL。

                  • 示例:rewrite ^/(.*)$ https://www.example.com/$1 permanent;
                  • access_log:配置访问日志记录。

                    • 示例:access_log /var/log/nginx/access.log;
                    • error_log:配置错误日志记录。

                      • 示例:error_log /var/log/nginx/error.log;
                      • ssl_certificate 和 ssl_certificate_key:配置 SSL/TLS 加密。

                        • 示例:ssl_certificate /etc/nginx/ssl/server.crt;、ssl_certificate_key /etc/nginx/ssl/server.key;
                        • ssl_protocols 和 ssl_ciphers:配置 SSL/TLS 协议和密码套件。

                          • 示例:ssl_protocols TLSv1.2 TLSv1.3;、ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256;
                          • proxy_pass:配置反向代理。

                            • 示例:proxy_pass http://localhost:8080;
                            • proxy_set_header:配置转发请求时的 HTTP 头信息。

                              • 示例:proxy_set_header Host $host;
                              • proxy_read_timeout 和 proxy_connect_timeout:配置与后端服务器的读取超时时间和连接超时时间。

                                • 示例:proxy_read_timeout 60s;、proxy_connect_timeout 30s;
                                • client_max_body_size:配置客户端请求体的最大大小。

                                  • 示例:client_max_body_size 10M;

    这些是 server 块中常见的配置参数及其含义和作用,通过合理配置这些参数,可以实现对虚拟主机的各种功能和行为进行定制。

    location块

    在 Nginx 的配置文件中,location 块用于匹配请求的 URI,并设置相应的处理规则。location 块可以包含一系列的配置参数,用来定义特定 URI 路径的行为。以下是一些常见的 location 块配置参数及其含义和作用:

    1. location:用于匹配请求的 URI。

      • 示例:location / { ... }、location /images/ { ... }
      • proxy_pass:配置反向代理。

        • 语法:proxy_pass URL;
        • 示例:proxy_pass http://localhost:8080;
        • root:指定该 location 下的文件根目录。

          • 语法:root 路径;
          • 示例:root /var/www/html/;
          • alias:指定一个路径作为文件资源的别名。

            • 语法:alias 路径;
            • 示例:alias /var/www/static/;
            • try_files:按顺序尝试寻找文件,如果找到则返回,否则返回指定的错误码或跳转页面。

              • 语法:try_files 参数1 参数2 ...;
              • 示例:try_files $uri $uri/ /index.php?$query_string;
              • rewrite:用于重写 URL。

                • 语法:rewrite 正则表达式 跳转地址 [标志];
                • 示例:rewrite ^/(.*)$ https://www.example.com/$1 permanent;
                • expires:设置响应头中的过期时间。

                  • 语法:expires 时间;
                  • 示例:expires 1h;
                  • limit_req 和 limit_req_zone:限制请求速率。

                    • 示例:limit_req zone=one burst=5 nodelay;、limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
                    • auth_basic 和 auth_basic_user_file:设置基本认证。

                      • 示例:auth_basic "Restricted";、auth_basic_user_file /etc/nginx/.htpasswd;
                      • fastcgi_pass:配置 FastCGI 服务地址。

                        • 示例:fastcgi_pass unix:/var/run/php-fpm.sock;
                        • proxy_set_header:配置转发请求时的 HTTP 头信息。

                          • 示例:proxy_set_header Host $host;
                          • proxy_read_timeout 和 proxy_connect_timeout:配置与后端服务器的读取超时时间和连接超时时间。

                            • 示例:proxy_read_timeout 60s;、proxy_connect_timeout 30s;
                            • error_page:指定错误页面的路径。

                              • 示例:error_page 404 /404.html;
                              • allow 和 deny:控制访问权限。

                                • 示例:allow 192.168.1.0/24; deny all;

    nginx系统服务

    要将 Nginx 配置为系统服务,执行以下步骤:

    1. 创建 systemd 单元文件:

      首先,你需要创建一个 systemd 单元文件,用于定义 Nginx 服务的启动、停止和管理行为。通常这个文件的路径是 /etc/systemd/system/nginx.service。

    2. 编辑 systemd 单元文件:

      使用你喜欢的文本编辑器(如 nano 或 vi)打开该文件,并填入以下内容:

      [Unit]
      Description=The NGINX HTTP and reverse proxy server
      After=network.target remote-fs.target nss-lookup.target
      [Service]
      Type=forking
      PIDFile=/var/run/nginx.pid
      ExecStartPre=/usr/sbin/nginx -t -c /etc/nginx/nginx.conf
      ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf
      ExecReload=/usr/sbin/nginx -s reload
      ExecStop=/usr/sbin/nginx -s quit
      PrivateTmp=true
      [Install]
      WantedBy=multi-user.target
      

      请确保将 ExecStartPre 和 ExecStart 中的路径替换为你的 Nginx 配置文件的实际路径。

    3. 重新加载 systemd 管理的服务:

      执行以下命令重新加载 systemd 管理的服务列表,以便让 systemd 知道新创建的 Nginx 服务:

      sudo systemctl daemon-reload
      
    4. 启动 Nginx 服务:

      执行以下命令启动 Nginx 服务:

      sudo systemctl start nginx
      
    5. 设置开机自启动(可选):

      如果你希望 Nginx 在系统启动时自动启动,可以执行以下命令将其设置为开机自启动:

      sudo systemctl enable nginx
      
    6. 检查服务状态:

      可以执行以下命令检查 Nginx 服务的运行状态:

      sudo systemctl status nginx