跳到内容

第二部分 2.2 网络服务器 Nginx

Nginx 网页服务器

在本章中,您将学习关于 Nginx 网页服务器的知识。


**目标**:您将学习如何

✔ 安装和配置 Nginx

🏁 **nginx**,**http**

**知识**:⭐ ⭐
**复杂度**:⭐ ⭐

**阅读时间**:15 分钟


概况

**Nginx** 是一款 **基于 BSD 许可的免费 HTTP 网页服务器**。它最初由 Igor Sysoev 于 2002 年在俄罗斯开发。除了网页服务器的标准功能外,Nginx 还为 **HTTP** 协议提供 **反向代理**,以及为 **POP** 和 **IMAP** 消息传递协议提供代理。

Nginx 服务器的开发是为了应对 **C10K** 问题,该问题支持一万个并发连接(现代网络上的标准)。这对网页服务器来说是一个真正的挑战。

Nginx Inc. 提供商业支持。

服务器的内部架构使 **性能非常高**,与 Apache 网页服务器相比 **内存消耗低**。

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

一个主进程控制服务器进程,使 **无需停止服务即可修改配置或更新软件** 成为可能。

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

功能

Nginx 提供以下基本功能

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

其他功能

  • 通过名称或 IP 地址托管
  • 保持客户端连接的活动
  • 日志管理: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_nopushtcp_nopush 与 sendfile 选项密不可分。它用于优化同时发送的信息量。数据包仅在达到其最大大小时才发送。
tcp_nodelay激活 tcp_nodelay 会强制套接字中的数据立即发送,而不管数据包大小如何,这与 tcp_nopush 的作用相反。
sendfile优化静态文件的发送(此选项对于反向代理配置不是必需的)。如果启用了 sendfile,Nginx 会确保所有数据包在发送到客户端之前都已完成(这要归功于 tcp_nopush)。当最后一个数据包到达时,Nginx 会禁用 tcp_nopush 并使用 tcp_nodelay 强制发送数据。
keepalive_timeout关闭非活动连接之前最长时间。
types_hash_max_sizeNginx 维护包含静态信息的哈希表。设置哈希表的最大大小。
include包含另一个文件或多个与配置中提供的模板匹配的文件。
default_type请求的默认 MIME 类型。
ssl_protocols接受的 TLS 协议版本。
ssl_prefer_server_ciphers优先使用服务器密码套件而不是客户端密码套件。
access_log配置访问日志(请参阅“日志管理”段落)。
error_log配置错误日志(请参阅“日志管理”段落)。
gzipngx_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 服务,您必须添加一个服务器块或修改现有服务器块。一个服务器块可以同时监听端口 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