- 文章信息 - Author: 李俊才 (jcLee95)
Visit me at CSDN: https://jclee95.blog.csdn.net
My WebSite:http://thispage.tech/
Email: 291148484@163.com.
Shenzhen China
Address of this article:https://blog.csdn.net/qq_28550263/article/details/140242979
HuaWei:https://bbs.huaweicloud.com/blogs/430555
【介绍】:本文介绍了Nginx配置文件中的结构,简要介绍了各个主要部分的功能。
1. 概述 1.1 Nginx配置文件的作用
Nginx是一款高性能的Web服务器和反向代理服务器,其强大的功能和灵活的配置主要依赖于其配置文件。Nginx配置文件的作用包括:
- 定义Nginx服务器的运行参数,如工作进程数、连接超时时间等。
- 配置Nginx服务器的网络设置,如监听端口、服务器名称等。
- 设置Nginx服务器的路由规则,控制请求的转发和处理。
- 配置Nginx服务器的缓存、压缩、安全等功能,优化性能和安全性。
- 实现负载均衡、反向代理等高级功能,提高应用的可扩展性和可用性。
Nginx配置文件是Nginx服务器的核心,通过灵活的配置,可以实现各种强大的功能,满足不同的应用需求。
1.2 Nginx主配置文件nginx.conf的位置Nginx的主配置文件是nginx.conf
,其默认位置因操作系统而异:
-
Linux系统:
/etc/nginx/nginx.conf
/usr/local/nginx/conf/nginx.conf
-
Windows系统:
C:\nginx\conf\nginx.conf
-
macOS系统(通过Homebrew安装):
/usr/local/etc/nginx/nginx.conf
除了主配置文件,Nginx还允许使用include
指令引入其他配置文件,以实现配置的模块化和复用。在实际应用中,可以根据需要将不同的配置划分到不同的文件中,提高配置的可读性和可维护性。
全局配置块位于nginx.conf
文件的最顶层,包含影响Nginx服务器整体运行的配置指令。这些指令在Nginx启动时被解析,并应用于所有的模块。
以下表格列出了全局配置块中的主要指令:
指令 | 语法 | 作用 | 示例 |
---|---|---|---|
user | user user [group]; | 指定Nginx工作进程运行的用户和用户组 | user nginx; |
worker_processes | worker_processes number | auto; | 定义Nginx启动的工作进程数 | worker_processes auto; |
error_log | error_log file [level]; | 指定错误日志文件的位置和日志级别 | error_log /var/log/nginx/error.log warn; |
pid | pid file; | 设置存储主进程ID的文件路径 | pid /var/run/nginx.pid; |
worker_rlimit_nofile | worker_rlimit_nofile number; | 设置工作进程可以打开的最大文件描述符数量 | worker_rlimit_nofile 65535; |
load_module | load_module file; | 动态加载Nginx模块 | load_module modules/ngx_http_geoip_module.so; |
全局配置块的示例:
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
worker_rlimit_nofile 65535;
load_module modules/ngx_http_geoip_module.so;
这些全局配置指令对Nginx的整体性能和行为有重要影响。下表总结了一些常见的配置建议:
指令 | 配置建议 |
---|---|
worker_processes | 通常设置为CPU核心数,或使用"auto"让Nginx自动检测 |
worker_rlimit_nofile | 根据系统资源和预期并发连接数设置,通常设置较高值如65535 |
error_log | 根据需要调整日志级别,生产环境通常使用"warn"或"error" |
在实际配置时,应根据服务器硬件资源和具体应用需求来调整这些参数,以优化Nginx的资源使用,提高服务器的性能和稳定性。
2.2 events配置块
events
配置块用于配置Nginx的事件处理机制,影响Nginx处理连接的方式。它通常位于全局配置块之后,http
配置块之前。
主要指令包括:
指令 | 语法 | 作用 | 示例 |
---|---|---|---|
worker_connections | worker_connections number; | 设置每个工作进程的最大并发连接数 | worker_connections 1024; |
use | use method; | 指定事件驱动模型 | use epoll; |
multi_accept | `multi_accept on | off;` | 是否一次接受多个新连接 |
accept_mutex | `accept_mutex on | off;` | 是否开启负载均衡锁 |
一个events配置块示例如下:
events {
worker_connections 1024;
use epoll;
multi_accept on;
accept_mutex on;
}
配置说明:
worker_connections
:根据服务器硬件资源和预期并发量设置。use
:在Linux系统上,推荐使用epoll。multi_accept
:开启可提高高并发下的性能,但可能增加系统负载。accept_mutex
:通常保持开启,可以减少工作进程之间的竞争。
2.3 http配置块
http
配置块是Nginx配置中最复杂和最重要的部分,包含了与HTTP服务相关的所有配置。
2.3.1 http配置块的基本结构
http {
# 基本设置
include mime.types;
default_type application/octet-stream;
# 日志设置
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 2048;
# Gzip压缩
gzip on;
gzip_disable "msie6";
# 包含其他配置文件
include /etc/nginx/conf.d/*.conf;
# 服务器块
server {
# 服务器配置
}
}
2.3.2 主要指令说明
指令 | 作用 | 示例 |
---|---|---|
include | 包含其他配置文件 | include mime.types; |
default_type | 设置默认的MIME类型 | default_type application/octet-stream; |
log_format | 定义日志格式 | log_format main '...'; |
access_log | 设置访问日志的路径和格式 | access_log /var/log/nginx/access.log main; |
sendfile | 启用sendfile系统调用来发送文件 | sendfile on; |
tcp_nopush | 优化数据包的发送 | tcp_nopush on; |
tcp_nodelay | 禁用Nagle算法 | tcp_nodelay on; |
keepalive_timeout | 设置keep-alive连接的超时时间 | keepalive_timeout 65; |
types_hash_max_size | 设置类型哈希表的最大大小 | types_hash_max_size 2048; |
gzip | 启用gzip压缩 | gzip on; |
2.3.3 性能优化建议
- 启用
sendfile
和tcp_nopush
以提高文件传输效率。 - 根据实际需求调整
keepalive_timeout
。 - 合理配置Gzip压缩,可以显著减少传输数据量。
- 使用
include
指令分割配置文件,提高可维护性。
http配置块是Nginx配置的核心,其中包含了多个server块,每个server块定义了一个虚拟主机。在实际配置中,应根据具体需求调整这些参数,以优化服务器性能和资源利用。
2.4 mail配置块(可选)
mail配置块是Nginx的一个可选功能,用于配置Nginx作为邮件代理服务器。这个功能需要在编译Nginx时包含mail模块。mail配置块通常位于http配置块之后,与http配置块平级。
2.4.1 mail配置块的基本结构
mail {
server_name mail.example.com;
auth_http localhost:8008/auth-smtp;
server {
listen 25;
protocol smtp;
proxy on;
}
server {
listen 110;
protocol pop3;
proxy on;
}
server {
listen 143;
protocol imap;
proxy on;
}
}
2.4.2 主要指令说明
指令 | 作用 | 示例 |
---|---|---|
server_name | 设置邮件服务器的名称 | server_name mail.example.com; |
auth_http | 指定用于身份验证的HTTP服务器 | auth_http localhost:8008/auth-smtp; |
protocol | 指定邮件协议(smtp, pop3, imap) | protocol smtp; |
proxy | 启用邮件代理功能 | proxy on; |
proxy_pass | 指定上游邮件服务器 | proxy_pass 192.168.1.100:25; |
ssl | 启用SSL/TLS加密 | ssl on; |
starttls | 启用STARTTLS命令支持 | starttls on; |
2.4.3 配置说明和最佳实践
-
身份验证:
auth_http
指令指向一个HTTP服务器,用于验证用户身份。这个服务器需要自行实现。
-
协议支持:
- 可以为不同的邮件协议(SMTP, POP3, IMAP)配置不同的server块。
-
SSL/TLS加密:
-
建议为所有邮件服务启用SSL/TLS加密,以保护用户数据:
server { listen 993 ssl; protocol imap; ssl_certificate /path/to/cert.pem; ssl_certificate_key /path/to/cert.key; }
-
-
上游服务器:
-
使用
proxy_pass
指定实际处理邮件的上游服务器:server { listen 25; protocol smtp; proxy_pass 192.168.1.100:25; }
-
-
日志配置:
-
可以为邮件服务配置单独的访问日志:
mail { access_log /var/log/nginx/mail.access.log; }
-
2.4.4 使用场景
-
负载均衡:Nginx可以作为邮件服务的前端代理,将请求分发到多个后端邮件服务器。
-
SSL终止:Nginx可以处理SSL/TLS加密,减轻后端服务器的负担。
-
协议转换:可以在客户端和服务器之间进行协议转换,例如将POP3转换为IMAP。
-
安全过滤:可以集成第三方模块,实现垃圾邮件过滤等功能。
2.4.5 注意事项
- mail模块是可选的,需要在编译Nginx时明确包含。
- 配置邮件服务需要考虑安全性,建议始终使用SSL/TLS加密。
- 需要正确配置DNS记录(MX记录),以便邮件能够正确路由到Nginx服务器。
mail配置块使Nginx能够作为功能强大的邮件代理服务器,但其配置相对复杂,需要谨慎规划和测试。在大多数情况下,除非有特殊需求,否则通常会使用专门的邮件服务器软件(如Postfix,Dovecot等)来处理邮件服务。
3. 配置指令的语法和参数
3.1 指令的基本语法
Nginx配置文件中的指令遵循一定的语法规则,接下来将对这些语法规则展开介绍。
3.1.1 基本语法结构
Nginx配置指令的基本语法结构如下:
指令名 参数1 参数2 ... 参数N;
注意事项:
- 每个指令都以分号(
;
)结尾。 - 指令名和参数之间,以及参数之间使用空格分隔。
- 指令对大小写敏感。
3.1.2 指令上下文
Nginx的指令可以在不同的上下文中使用,主要包括:
- 主上下文(Main Context)
- events上下文
- http上下文
- server上下文
- location上下文
- mail上下文(如果启用)
某些指令只能在特定上下文中使用,而有些指令可以在多个上下文中使用。例如:
# 主上下文
user nginx;
http {
# http上下文
gzip on;
server {
# server上下文
listen 80;
location / {
# location上下文
root /usr/share/nginx/html;
}
}
}
3.1.3 指令继承
子上下文会继承父上下文的配置,除非在子上下文中明确重写。例如:
http {
gzip on;
server {
# 继承http上下文的gzip配置
location /api/ {
# 重写gzip配置
gzip off;
}
}
}
3.2 常用指令参数说明
3.2.1 listen指令
listen
指令用于配置服务器监听的IP地址和端口。
语法:
listen address[:port] [default_server] [ssl] [http2] [proxy_protocol] [setfib=number] [fastopen=number] [backlog=number];
参数说明:
address
: IP地址,可以是具体IP或*
(表示所有地址)port
: 端口号,默认为80default_server
: 将此server块标记为默认服务器ssl
: 启用SSL/TLShttp2
: 启用HTTP/2协议proxy_protocol
: 启用代理协议
示例:
listen 80;
listen 443 ssl http2;
listen 192.168.1.1:8080 default_server;
3.2.2 server_name指令
server_name
指令用于设置虚拟主机的域名。
语法:
server_name name1 [name2 ...];
参数说明:
name
:可以是精确的域名、通配符域名或正则表达式
示例:
server_name example.com www.example.com;
server_name *.example.com;
server_name ~^www\d+\.example\.com$;
3.2.3 location指令
location
指令用于配置如何处理特定的URI。
语法:
location [ = | ~ | ~* | ^~ ] uri { ... }
参数说明:
=
:精确匹配~
:区分大小写的正则匹配~*
:不区分大小写的正则匹配^~
:前缀匹配,优先级高于正则匹配
示例:
location = / {
# 精确匹配"/"
}
location ~* \.(gif|jpg|jpeg)$ {
# 匹配以.gif、.jpg或.jpeg结尾的请求
}
location /documents/ {
# 匹配以/documents/开头的请求
}
3.2.4 proxy_pass指令
proxy_pass
指令用于设置代理服务器的协议和地址。
语法:
proxy_pass URL;
参数说明:
URL
:可以是HTTP(S)协议的URL,也可以是Unix域套接字路径
示例:
proxy_pass http://backend;
proxy_pass http://192.168.0.1:8080/api/;
proxy_pass unix:/tmp/backend.socket:/uri/;
3.2.5 fastcgi_pass指令
fastcgi_pass
指令用于设置FastCGI服务器的地址。
语法:
fastcgi_pass address;
参数说明:
address
:可以是IP地址和端口,也可以是Unix域套接字路径
示例:
fastcgi_pass localhost:9000;
fastcgi_pass unix:/tmp/php-fpm.socket;
3.2.6 root和alias指令
root
和alias
指令用于设置请求映射到服务器文件系统的路径。
语法:
root path;
alias path;
参数说明:
path
:服务器上的文件系统路径
示例:
root /var/www/html;
alias /var/www/static/;
主要区别:
root
会将完整的URI附加到指定路径后alias
只替换匹配的部分
3.2.7 index指令
index
指令用于指定默认索引文件。
语法:
index file1 [file2 ...];
参数说明:
file
:索引文件名
示例:
index index.html index.htm index.php;
这些是Nginx中一些常用指令的基本语法和参数说明。在实际配置中,可能还需要根据具体需求使用更多的指令和参数。理解这些基本语法和参数有助于更好地配置和优化Nginx服务器。
4. ★配置文件中的变量使用
Nginx配置文件中的变量使用是一个强大的特性,它允许我们动态地处理请求和响应。变量可以用于日志格式、重写规则、条件判断等多个方面。
Nginx中的变量分为两大类:内置变量 和 自定义变量。接下来我们将使用讲个小节来对应介绍这两类变量的用法。
4.1 内置变量
Nginx提供了大量的内置变量,这些变量包含了请求、响应、服务器等相关的信息。
4.1.1 常用内置变量
以下是一些常用的内置变量:
变量名 | 描述 |
---|---|
$request_method | 请求方法(GET、POST等) |
$request_uri | 完整的原始请求URI |
$uri | 当前请求的URI(可能经过重写) |
$query_string | 请求的查询字符串 |
$remote_addr | 客户端IP地址 |
$server_name | 匹配上的服务器名 |
$server_port | 服务器端口 |
$server_protocol | 服务器的HTTP版本(HTTP/1.0、HTTP/1.1等) |
$http_user_agent | 客户端User-Agent |
$http_referer | 请求的Referer头 |
$request_time | 请求处理时间,单位为秒,精确到毫秒 |
$status | 响应状态码 |
$body_bytes_sent | 发送给客户端的字节数,不包括响应头 |
$nginx_version | Nginx版本 |
4.1.2 使用内置变量
内置变量可以在多个Nginx指令中使用,例如:
- 在日志格式中:
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
- 在条件判断中:
if ($request_method = POST) {
return 405;
}
- 在重写规则中:
rewrite ^/old-page$ /new-page permanent;
- 在响应头中:
add_header X-Served-By $hostname;
4.2 自定义变量
除了内置变量,Nginx还允许我们定义和使用自定义变量,这为配置提供了更大的灵活性。
4.2.1 定义自定义变量
使用set
指令可以定义自定义变量:
set $variable_name value;
例如:
set $mobile_rewrite do_not_perform;
if ($http_user_agent ~* "(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino") {
set $mobile_rewrite perform;
}
if ($mobile_rewrite = perform) {
rewrite ^ /mobile$uri redirect;
}
4.2.2 使用自定义变量
自定义变量可以在配置文件的多个地方使用,包括:
- 在location块中:
location / {
set $foo "bar";
return 200 $foo;
}
- 在if语句中:
if ($request_uri ~* "^/special") {
set $special_uri "true";
}
if ($special_uri = "true") {
# 执行特殊处理
}
- 在rewrite指令中:
set $weekend "No";
if ($date_local ~ "Saturday|Sunday") {
set $weekend "Yes";
}
rewrite ^/is-it-weekend /weekend.php?answer=$weekend last;
4.2.3 变量的作用域
自定义变量的作用域通常是请求级别的,这意味着:
- 每个请求都有自己的变量集合。
- 变量在请求处理的整个生命周期内有效。
- 不同请求之间的变量是相互独立的。
4.2.4 变量使用的注意事项
- 变量名区分大小写。
- 使用未定义的变量不会导致错误,而是返回空字符串。
- 某些模块(如
ngx_http_rewrite_module
)会在配置加载时评估变量,而不是在运行时。 - 过度使用变量可能会影响性能,特别是在高并发场景下。
4.2.5 实际应用示例
- 根据客户端IP设置变量:
set $country "unknown";
if ($geoip_country_code = "US") {
set $country "USA";
}
if ($geoip_country_code = "GB") {
set $country "United Kingdom";
}
proxy_set_header X-Country $country;
- 根据时间设置缓存策略:
map $time_iso8601 $cache_expiry {
default 1h;
~^2023-12- 5m; # December 2023
~^2023-11- 15m; # November 2023
}
expires $cache_expiry;
- 动态设置上游服务器:
set $backend "default_backend";
if ($request_uri ~* ^/api/) {
set $backend "api_backend";
}
if ($http_user_agent ~* "googlebot") {
set $backend "bot_backend";
}
proxy_pass http://$backend;
通过灵活使用内置变量和自定义变量,我们可以创建更加动态和智能的Nginx配置,以适应各种复杂的场景和需求。
5. ★配置文件的模块化和复用
随着Nginx配置的复杂性增加,将配置文件模块化并实现配置的复用变得越来越重要。这不仅可以提高配置的可读性和可维护性,还能减少重复代码,降低错误率。本节将介绍如何使用include
指令实现配置文件的模块化,以及如何组织和管理配置片段。
5.1 include指令的使用
include
指令是Nginx配置文件模块化的核心。它允许将其他配置文件包含到主配置文件中,从而实现配置的分割和复用。
5.1.1 include指令的语法量
include file | mask;
file
:指定要包含的配置文件的路径。mask
:使用通配符指定要包含的多个配置文件。
5.1.2 include指令的使用场景
-
分割主配置文件:
# 在nginx.conf中 include /etc/nginx/conf.d/*.conf; include /etc/nginx/sites-enabled/*;
-
复用通用配置:
# 在server块中 include /etc/nginx/snippets/ssl-params.conf;
-
按功能组织配置:
# 在http块中 include /etc/nginx/mime.types; include /etc/nginx/proxy.conf; include /etc/nginx/fastcgi.conf;
5.1.3 include指令的注意事项
- 路径可以是绝对路径或相对路径(相对于主配置文件)。
- 可以使用通配符(
*
)包含多个文件。 - 被包含的文件必须有正确的Nginx配置语法。
- 包含的顺序很重要,后面的配置可能会覆盖前面的配置。
5.2 配置片段的组织和管理
合理组织和管理配置片段可以大大提高Nginx配置的可维护性。
5.2.1 配置片段的分类
- 全局配置:影响整个Nginx服务器的设置。
- HTTP配置:与HTTP服务相关的通用设置。
- 服务器配置:特定虚拟主机的配置。
- 位置配置:特定URI位置的处理规则。
- 功能模块:特定功能(如SSL、缓存、压缩等)的配置。
5.2.2 配置文件的目录结构
推荐的目录结构:
/etc/nginx/
├── nginx.conf
├── conf.d/
│ ├── default.conf
│ └── example.com.conf
├── snippets/
│ ├── ssl-params.conf
│ └── proxy-params.conf
├── sites-available/
│ ├── example.com
│ └── subdomain.example.com
└── sites-enabled/
└── example.com -> ../sites-available/example.com
nginx.conf
:主配置文件conf.d/
:存放额外的配置文件snippets/
:存放可复用的配置片段sites-available/
:存放所有的网站配置sites-enabled/
:存放已启用的网站配置(通常是符号链接)
5.2.3 配置片段的命名约定
- 使用描述性的名称,如
ssl-params.conf
,php-fpm.conf
。 - 对于网站配置,使用域名作为文件名,如
example.com.conf
。 - 使用一致的文件扩展名,通常是
.conf
。
5.2.4 配置片段的版本控制
将Nginx配置文件纳入版本控制系统(如Git)是一个好习惯:
- 跟踪配置的变更历史。
- 便于回滚到之前的配置。
- 便于团队协作和配置审查。
5.2.5 配置片段的示例
-
SSL参数配置 (
snippets/ssl-params.conf
):ssl_protocols TLSv1.2 TLSv1.3; ssl_prefer_server_ciphers on; ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384; ssl_session_timeout 1d; ssl_session_cache shared:SSL:10m; ssl_session_tickets off;
-
代理参数配置 (
snippets/proxy-params.conf
):proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_buffering on; proxy_buffer_size 128k; proxy_buffers 4 256k; proxy_busy_buffers_size 256k;
-
PHP-FPM配置 (
snippets/php-fpm.conf
):location ~ \.php$ { fastcgi_pass unix:/var/run/php/php7.4-fpm.sock; fastcgi_index index.php; include fastcgi_params; }
-
网站服务器配置 (
sites-available/example.com
):server { listen 80; server_name example.com www.example.com; root /var/www/example.com; include snippets/ssl-params.conf; include snippets/php-fpm.conf; location / { try_files $uri $uri/ /index.php?$query_string; } }
5.2.6 最佳实践
- 保持主配置文件(
nginx.conf
)简洁,主要用于全局设置和包含其他配置文件。 - 将常用的配置片段(如SSL参数、代理设置)放在
snippets
目录中。 - 为每个网站创建单独的配置文件,放在
sites-available
目录中。 - 使用符号链接将启用的网站配置从
sites-available
链接到sites-enabled
。 - 使用
include
指令时,尽量指定完整的文件路径,避免使用过于宽泛的通配符。 - 定期审查和清理未使用的配置文件。
- 在应用新的配置之前,始终使用
nginx -t
命令检查配置的语法。
通过合理使用include
指令和组织配置片段,可以使Nginx的配置更加模块化、可维护和可复用。这不仅可以提高配置的效率,还能减少错误,使得管理大型和复杂的Nginx部署变得更加容易。
6. 总结
Nginx配置文件的结构和组织对于有效管理和使用Web服务器十分重要。本文是一个总结,详细介绍了Nginx配置文件的各个方面,前面的内容主要包括以下几点:
-
配置文件的整体结构:介绍了全局配置块、events块、http块等主要组成部分,以及它们的作用和常用指令。
-
指令语法和参数:解释了Nginx配置指令的基本语法规则,以及一些常用指令的参数含义和使用方法。
-
变量使用:讨论了Nginx内置变量和自定义变量的使用,这为创建动态和灵活的配置提供了基础。
-
配置的模块化和复用:介绍了如何使用include指令实现配置的模块化,以及如何组织和管理配置片段,提高配置的可维护性。
希望这些总结对你有所帮助。