第二部分.2 Web 服务器 Nginx
Nginx Web 服务器¶
在本章中,您将了解 Web 服务器 Nginx。
目标:您将学会如何
安装和配置 Nginx
nginx, http
知识:
复杂度:
阅读时间: 15 分钟
概述¶
Nginx 是一个基于 BSD 许可证的免费 HTTP Web 服务器。它最初于 2002 年在俄罗斯由 Igor Sysoev 开发。除了 Web 服务器的标准功能外,Nginx 还为HTTP 协议提供了反向代理,并为POP 和 IMAP 消息协议提供了代理。
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 |
定义进程所有者 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 服务,您必须添加一个 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_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