跳至内容

第二部分.2 Web 服务器 Nginx

Nginx Web 服务器

在本章中,您将了解 Web 服务器 Nginx。


目标:您将学会如何

✔ 安装和配置 Nginx

🏁 nginx, http

知识⭐ ⭐
复杂度⭐ ⭐

阅读时间: 15 分钟


概述

Nginx 是一个基于 BSD 许可证的免费 HTTP Web 服务器。它最初于 2002 年在俄罗斯由 Igor Sysoev 开发。除了 Web 服务器的标准功能外,Nginx 还为HTTP 协议提供了反向代理,并为POPIMAP 消息协议提供了代理。

Nginx 服务器的开发是为了应对 C10K 问题,该问题支持一万个并发连接(在现代 Web 中很常见)。这对 Web 服务器来说是一个真正的挑战。

Nginx Inc. 提供商业支持。

与 Apache Web 服务器相比,该服务器的内部架构能够实现非常高的性能,同时内存消耗低

补充 Nginx 内核基本功能的模块是在编译时绑定的。这意味着激活或停用不能动态进行。

主进程控制服务器进程,这使得无需停止服务即可修改配置或更新软件

Nginx 在最繁忙的网站中占有 28% 的重要市场份额,仅次于 Apache (41%)。

功能

Nginx 提供以下基本功能

  • 托管静态网页
  • 自动生成索引页
  • 带缓存的加速反向代理
  • 负载均衡
  • 容错
  • 加速支持 FastCGI、uWSGI、SCGI 和 Memcached 缓存服务器
  • 各种过滤器,用于 gzip、xslt、ssi、图像转换等
  • 支持 SSL/TLS 和 SNI
  • HTTP/2 支持

其他功能

  • 按名称或 IP 地址托管
  • 客户端连接的 Keepalive 管理
  • 日志管理:syslog、轮换、缓冲区
  • URI 重写
  • 访问控制:按 IP、密码等
  • FLV 和 MP4 流媒体

安装

Nginx 可直接从应用程序流存储库获取,并且较新版本可作为 dnf 模块提供。

sudo dnf install nginx
sudo systemctl enable nginx --now

配置

Nginx 的配置位置在 /etc/nginx/nginx.conf

此配置文件是全局服务器配置文件。设置会影响整个服务器。

注意

Apache 管理员熟悉的 .htaccess 文件功能在 Nginx 中不存在!

此处提供了 nginx.conf 文件,已移除所有注释

user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
include /usr/share/nginx/modules/*.conf;
events {
    worker_connections 1024;
}
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;
    sendfile            on;
    tcp_nopush          on;
    tcp_nodelay         on;
    keepalive_timeout   65;
    types_hash_max_size 4096;
    include             /etc/nginx/mime.types;
    default_type        application/octet-stream;
    include /etc/nginx/conf.d/*.conf;
    server {
        listen       80;
        listen       [::]:80;
        server_name  _;
        root         /usr/share/nginx/html;
        include /etc/nginx/default.d/*.conf;
        error_page 404 /404.html;
        location = /404.html {
        }
        error_page 500 502 503 504 /50x.html;
        location = /50x.html {
        }
    }
}

默认配置指南

指令 描述
user 定义进程所有者 usergroup。如果未指定组,则使用与用户同名的组。
worker_processes 定义进程数。最佳值取决于许多因素,例如 CPU 核心数和硬盘规格。如有疑问,Nginx 文档建议的起始值为可用 CPU 核心数(auto 值将尝试确定此值)。
pid 定义一个文件以存储 PID 值。
worker_connections 设置工作进程可以打开的并发连接的最大数量(连接到客户端和强制的服务器)。
tcp_nopush tcp_nopush 与 sendfile 选项不可分割。它用于优化同时发送的信息量。数据包仅在达到最大大小时发送。
tcp_nodelay 激活 tcp_nodelay 会强制立即发送套接字中的数据,而不管数据包大小,这与 tcp_nopush 所做的相反。
sendfile 优化静态文件的发送(此选项对于反向代理配置不是必需的)。如果启用了 sendfile,Nginx 会确保在将所有数据包发送给客户端之前完成(这要归功于 tcp_nopush)。当最后一个数据包到达时,Nginx 会禁用 tcp_nopush 并使用 tcp_nodelay 强制发送数据。
keepalive_timeout 在关闭不活动的连接之前的最长时间。
types_hash_max_size Nginx 维护包含静态信息的哈希表。设置哈希表的最大大小。
include 包含另一个文件或与配置中提供的模板匹配的文件。
default_type 请求的默认 MIME 类型。
ssl_protocols 接受的 TLS 协议版本。
ssl_prefer_server_ciphers 优先服务器密码套件而不是客户端密码套件。
access_log 配置访问日志(请参阅“日志管理”段)。
error_log 配置错误日志(请参阅“日志管理”段)。
gzip ngx_http_gzip_module 是一个压缩 gzip 格式传输数据的过滤器。
gzip_disable 根据正则表达式禁用 gzip。

Nginx 配置的结构是

# global directives

events {
    # worker configuration
}

http {
    # http service configuration

    # Configure the first server listening on port 80
    server {
        listen 80 default_server;
        listen [::]:80 default_server;
        root /var/www/html;
        index index.html index.htm;
        server_name _;
        location / {
            try_files $uri $uri/ =404;
        }
    }
}

mail {
    # mail service configuration

# global mail service directives
   server {
        # A first server listening on the pop protocol
        listen     localhost:110;
        protocol   pop3;
        proxy      on;
   }


   server {
        # A second server listening on the imap protocol
       listen     localhost:143;
       protocol   imap;
       proxy      on;
   }
}

HTTPS 配置

要配置 HTTPS 服务,您必须添加一个 server 块或修改现有块。一个 server 块可以同时监听端口 443 和端口 80。

您可以例如将此块添加到新的 /etc/nginx/conf.d/default_https.conf 文件中

server {
    listen              443 ssl default_server;
    ssl_protocols       TLSv1.3 TLSv1.2 TLSv1.1
    ssl_certificate     /path/to/cert.pem;
    ssl_certificate_key /path/to/key.key;
    root                /var/www/html;
    index               index.html index.htm;
    server_name         _;
    location / {
        try_files       $uri $uri/ =404;
    }
}

或者您可以修改默认服务器以支持 HTTPS

server {
    listen              80;
    listen              443 ssl;
    server_name         _;
    ssl_protocols       TLSv1.3 TLSv1.2 TLSv1.1
    ssl_certificate     /path/to/cert.pem;
    ssl_certificate_key /path/to/key.key;
    ...
}

日志管理

您可以为错误日志配置 error_log 指令。

error_log 指令的语法

error_log file [level];

第一个参数定义一个用于接收错误日志的文件。

第二个参数确定日志级别:debug、info、notice、warn、error、crit、alert 或 emerg(请参阅我们的管理员指南中的 syslog 章)。

将日志发送到 syslog 的功能是通过“syslog:”前缀实现的。

access_log syslog:server=192.168.1.100:5514,tag=nginx debug;

Nginx 作为反向代理

反向代理功能通过 ngx_http_upstream_module 实现。它允许您定义服务器组,然后通过 proxy_passfastcgi_pass 指令、memcached_pass 等进行调用。

一个基本配置的示例,它将负载 2/3 分配给第一个服务器,1/3 分配给第二个应用程序服务器

    upstream frontservers {
        server front1.rockylinux.lan:8080       weight=2;
        server front2.rockylinux.lan:8080       weight=1;
    }

    server {
        location / {
            proxy_pass http://docs.rockylinux.lan;
        }
    }

您可以将服务器声明为备份

    upstream frontservers {
        ...
        server front3.rockylinux.lan:8080   backup;
        server front4.rockylinux.lan:8080   backup;
    }

server 指令接受许多参数

  • max_fails=numberofattempts:在 fail_timeout 参数定义的时期内,设置必须失败的连接尝试次数,服务器才被视为不可用。默认值为 1;0 禁用此功能。
  • fail_timeout=time:设置定义的连接次数将导致服务器不可用的时间,并设置服务器将被视为不可用的时间段。默认值为 10 秒。

作者:Antoine Le Morvan

贡献者:Steven Spencer, Ganna Zhyrnova