在 Nginx 配置文件中,http
块是用于配置 HTTP 服务的主要块。它包含了与 HTTP 相关的所有配置项,如服务器、位置、代理、缓存等。http
块可以包含多个 server
块,每个 server
块代表一个虚拟主机。
Nginx 配置文件的基本语法结构如下:
全局指令:位于配置文件的最上面,影响整个 Nginx 实例的行为。
user nginx;
worker_processes auto;
events
块:用于配置 Nginx 的工作进程如何处理事件。
events {
worker_connections 1024;
}
http
块:用于配置 HTTP 相关的设置,包括虚拟主机(server
块)、代理设置、缓存配置等。
http {
include mime.types;
default_type application/octet-stream;
# 其他 HTTP 配置
server {
listen 80;
server_name example.com;
location / {
root /var/www/html;
index index.html;
}
}
}
http
块的作用配置全局 HTTP 设置:http
块内的配置适用于所有的 server
块。可以在这里定义全局的 HTTP 设置,比如日志格式、默认 MIME 类型、连接超时等。
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;
client_max_body_size 10M;
}
定义 server
块:在 http
块内可以包含多个 server
块,每个 server
块代表一个虚拟主机,可以配置不同的主机名、端口和位置规则。
http {
server {
listen 80;
server_name example.com;
location / {
root /var/www/example;
index index.html;
}
}
server {
listen 80;
server_name test.com;
location / {
root /var/www/test;
index index.html;
}
}
}
定义 location
块:http
块内可以包含 location
块,用于匹配请求的 URI,并定义如何处理这些请求。
http {
server {
listen 80;
server_name example.com;
location /images/ {
root /var/www/example;
}
location /api/ {
proxy_pass http://backend_api;
}
}
}
配置 HTTP 代理和负载均衡:http
块可以设置代理和负载均衡规则,用于将请求转发到后端服务器或集群中。
http {
upstream backend {
server backend1.example.com;
server backend2.example.com;
}
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://backend;
}
}
}
总结来说,http
块在 Nginx 配置文件中是用来定义 HTTP 服务的全局设置、虚拟主机和位置匹配规则的关键部分。
在 Nginx 配置文件中,server_name _;
中的 _
是一个特殊的用法,通常用于匹配所有没有显式指定 server_name
的请求。下面详细说明 _
的含义,并列举其他通配符写法及其用法。
server_name _;
的意义在 server_name
指令中,使用 _
是一种特殊的写法,用于作为默认的 catch-all 服务器。即,它用于匹配没有明确匹配到其他 server_name
的请求。通常这个写法被用来配置一个默认的虚拟主机,当没有其他 server_name
匹配时,_
会被触发。
server {
listen 80;
server_name _; # 匹配所有未指定的请求
location / {
root /var/www/default;
}
}
在 Nginx 配置文件中,通配符主要用于 server_name
和 location
指令中,以支持灵活的匹配模式。以下是几种通配符写法及其含义:
通配符 *
(星号)
在 server_name
中的用法:
*.example.com
:匹配 example.com
下的所有子域名,如 www.example.com
、api.example.com
等。*example.com
:匹配所有以 example.com
结尾的域名,如 test.example.com
或 subdomain.example.com
。server {
listen 80;
server_name *.example.com; # 匹配 example.com 下的所有子域名
location / {
root /var/www/subdomain;
}
}
在 location
中的用法:
location /images/*
:匹配以 /images/
开头的所有请求,如 /images/photo.jpg
或 /images/gallery/
.server {
listen 80;
server_name example.com;
location /images/ {
root /var/www/images;
}
location /images/* {
# 匹配 /images/ 下面的所有请求
}
}
通配符 ~
(波浪号)
正则匹配:
location ~ ^/images/\d+
:使用正则表达式匹配以 /images/
开头并跟随数字的请求。server {
listen 80;
server_name example.com;
location ~ ^/images/\d+ {
root /var/www/images;
}
}
通配符 ~*
(波浪号加星号)
不区分大小写的正则匹配:
location ~* \.(jpg|png)$
:使用不区分大小写的正则表达式匹配所有以 .jpg
或 .png
结尾的请求。server {
listen 80;
server_name example.com;
location ~* \.(jpg|png)$ {
root /var/www/images;
}
}
通配符 =
(等号)
精确匹配:
location = /specific-path
:仅匹配 /specific-path
,不会匹配其他类似的路径。server {
listen 80;
server_name example.com;
location = /specific-path {
root /var/www/specific;
}
}
_
:在 server_name
中,通常作为默认的 catch-all 服务器。*
:用于匹配域名或路径中的任意字符,可以是前缀或后缀匹配。~
:用于正则表达式匹配,区分大小写。~*
:用于不区分大小写的正则表达式匹配。=
:用于精确匹配特定路径。这些通配符和匹配规则可以帮助你在 Nginx 中实现灵活且高效的请求处理。
在 Nginx 配置中,块
(blocks)和 指令
(directives)是两个核心概念。以下是对 Nginx 的主要块和指令的详细说明:
Nginx 配置文件使用块来组织配置内容。每个块包含一个或多个指令,并可以嵌套其他块。主要的配置块包括:
http
块
功能:用于配置 HTTP 服务的全局设置。
位置:通常在 Nginx 配置文件的最外层,或者嵌套在 events
块中。
示例:
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;
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}
server
块
功能:用于定义虚拟主机的设置。
位置:通常在 http
块内。
示例:
server {
listen 80;
server_name example.com www.example.com;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
error_page 404 /404.html;
location = /40x.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}
location
块
功能:用于配置请求路径的匹配和处理。
位置:通常在 server
块内。
示例:
location /images/ {
alias /data/images/;
}
location / {
proxy_pass http://backend;
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;
}
events
块
功能:用于配置 Nginx 的事件处理模型和工作进程。
位置:通常在配置文件的最外层。
示例:
events {
worker_connections 1024;
}
mail
块
功能:用于配置邮件服务(IMAP、POP3、SMTP)。
位置:通常在配置文件的最外层。
示例:
mail {
server {
listen 25;
protocol smtp;
proxy on;
}
}
Nginx 配置文件中的指令用于定义具体的行为和设置。以下是一些常见的指令及其用法:
listen
功能:定义监听的端口和地址。
示例:
listen 80;
listen 443 ssl;
server_name
功能:定义虚拟主机的域名。
示例:
server_name example.com www.example.com;
root
功能:定义请求的根目录。
示例:
root /usr/share/nginx/html;
index
功能:定义默认的索引文件。
示例:
index index.html index.htm;
proxy_pass
功能:设置代理请求的目标地址。
示例:
proxy_pass http://backend;
include
功能:包含其他配置文件。
示例:
include /etc/nginx/conf.d/*.conf;
location
功能:定义请求路径的匹配规则。
示例:
location /images/ {
alias /data/images/;
}
error_page
功能:定义错误页面。
示例:
error_page 404 /404.html;
access_log
功能:定义访问日志的路径和格式。
示例:
access_log /var/log/nginx/access.log main;
sendfile
功能:启用或禁用高效文件传输。
示例:
sendfile on;
Nginx 的配置文件通过块和指令来组织和定义服务器的行为。块用来组织配置层级,而指令则定义具体的配置项。理解这些块和指令的作用可以帮助你有效地配置和优化 Nginx 服务器。
Nginx 提供了一系列内置变量,用于在配置中动态获取和使用请求和服务器相关的信息。以下是一些常用的 Nginx 变量及其解释:
$host
Host
头部。proxy_set_header Host $host;
$remote_addr
access_log /var/log/nginx/access.log combined;
(日志中记录客户端 IP)$remote_port
log_format main '$remote_addr:$remote_port';
$server_addr
proxy_set_header X-Server-Addr $server_addr;
$server_name
server
块中定义的 server_name
)。if ($server_name = 'example.com') { ... }
$server_port
log_format main '$server_port';
$request_uri
access_log /var/log/nginx/access.log main;
(日志中记录请求 URI)$request_method
log_format main '$request_method';
$query_string
?
后的部分)。if ($query_string) { ... }
$request_body
proxy_set_body $request_body;
(设置代理请求体)$http_user_agent
User-Agent
头部。log_format main '$http_user_agent';
$http_referer
Referer
头部。log_format main '$http_referer';
$http_cookie
Cookie
头部。log_format main '$http_cookie';
$document_root
root $document_root;
$request_filename
try_files $request_filename =404;
$content_length
log_format main '$content_length';
$content_type
log_format main '$content_type';
$scheme
proxy_set_header X-Forwarded-Proto $scheme;
$document_uri
log_format main '$document_uri';
$uri
try_files $uri $uri/ =404;
$port
log_format main '$port';
$status
log_format main '$status';
$response_time
log_format main '$response_time';
$upstream_addr
log_format main '$upstream_addr';
$upstream_status
log_format main '$upstream_status';
$upstream_response_time
log_format main '$upstream_response_time';
Nginx 提供的这些变量允许你在配置文件中灵活地处理和记录请求信息。你可以通过这些变量来调整日志格式、设置请求头部、配置反向代理等,以满足具体的需求。对于特定的应用场景,你可能会使用不同的变量组合来实现目标