第二部分 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 | 定义进程所有者 user 和 group 。如果未指定组,则使用与用户同名的组。 |
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 服务,您必须添加一个服务器块或修改现有服务器块。一个服务器块可以同时监听端口 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_pass
或fastcgi_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