Nginx配置文件
Nginx配置文件主要有以下几个部分构成,并且嵌套结构如下:
全局配置
http { # http 块server{ # server 块location { #location块}}
}
全局配置
全局配置位于配置文件的最上方,用于设置 Nginx 的一些基本行为。平时使用基本也用不着修改。
user www-data; # 设置工作进程的用户
worker_processes auto; # 设置工作进程数量,通常为 CPU 核数
error_log /var/log/nginx/error.log; # 设置错误日志
pid /var/run/nginx.pid; # 设置 pid 文件路径
events { worker_connections 1024; #指定每个工作进程的最大并发连接数。
}
http 块
http
块是 Nginx 配置的核心,定义了 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 2048; # 设置类型哈希表最大大小include /etc/nginx/mime.types; # 加载MIME类型
default_type application/octet-stream;
其中log_format是access log的日志格式,可以根据自己的需要添加或者减少字段,每一个字段都会打出来,如果为空日志中会以-形式占位。
nginx配置文件是自上而下的顺序执行,如果log_format配置在http块的最前面,那么日志会在nginx收到请求就打出来,如果配置在server块,或者location块里面,那么只有满足对应的配置条件,才会输出日志。
具体参数说明如下:
参数 说明
$remote_addr 客户端地址
$remote_user 客户端用户名称
$time_local 访问时间和时区
$request 请求的URI和HTTP协议
$http_host 请求地址,即浏览器中你输入的地址(IP或域名)
$status HTTP请求状态
$upstream_status upstream状态
$body_bytes_sent 发送给客户端文件内容大小
$http_referer url跳转来源
$http_user_agent 用户终端浏览器等信息
$ssl_protocol SSL协议版本
$ssl_cipher 交换数据中的算法
$upstream_addr 后台upstream的地址,即真正提供服务的主机地址
$request_time 整个请求的总时间
$upstream_response_time 请求过程中,upstream响应时间
server 块
server 块用于定义一个虚拟主机配置。每个http可以包含多个serer,每个 server 块可以包含多个 location 块,每个 location块用来处理特定的 URL 请求。
listen 80; # 监听 80 端口(HTTP)
server_name example.com; # 配置服务器域名
location 块
location 块用于定义如何处理特定 URL 路径的请求。Nginx 会根据请求的 URI 匹配 location块。这里也是我用到最多的地方。
location [modifier] /uri/ {# 配置项
}
-
modifier(可选):
location
指令可以使用不同的匹配修饰符(例如:=
、~
、~*
)。 -
/uri/:指定需要匹配的 URI 路径,可以是精确路径、前缀路径或正则表达式。
location
块的匹配规则有几种常见方式:
- 精确匹配
location = /path
:完全匹配该路径。 - 前缀匹配
location /path/
:匹配以/path/
开头的路径。 - 正则匹配
location ~ /pattern
:匹配正则表达式模式。 - 不区分大小写的正则匹配
location ~* /pattern
:匹配不区分大小写的正则表达式模式。
而这四种匹配的优先级并不是按照配置文件的自上而下一个个匹配的,而是先按照优先级,然后再自上而下匹配。
-
精确匹配 (
=
):最优先匹配。如果请求的 URI 完全与location = /uri
相同,则直接匹配。 -
最长前缀匹配:匹配以
/uri/
开头的最长路径。 -
正则匹配 (
~
或~\*
):在没有精确匹配和前缀匹配的情况下,使用正则表达式进行匹配。正则表达式的匹配顺序是自上而下,直到找到第一个匹配项为止。
匹配成功之后,有以下几种处理方式
-
proxy_pass
:用于反向代理,将请求转发到后端服务器。 -
root
或alias
:用于指定文件系统中的根目录或别名。 -
rewrite
:用于重写 URL。 -
fastcgi_pass
、uwsgi_pass
、scgi_pass
:用于与 FastCGI、uWSGI 或 SCGI 后端通信。 -
return
:用于返回特定的状态码和内容。
proxy_pass
使用proxy_pass可以将请求,转发到后端服务器,并且可以决定转发的时候携带哪些信息,具体携带那些信息可以参考前面access log的配置。
location /api/ {proxy_pass http://backend_server;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_pass具体请求要不要携带匹配到的路径,是一个容易混淆的点。
这里主要看proxy_pass代理的URL后面是否有 /
-
有,不会携带匹配到的路径
比如 proxy_pass http://backend_server,代理后的路径就是proxy_pass http://backend_server/api
-
没有,会携带匹配后的路径
比如 proxy_pass http://backend_server,代理后的路径就是proxy_pass http://backend_server/
静态资源
location /static/ {root /var/www/html; # 指定静态文件所在的根目录
}
try_files
try_files
用于按顺序尝试访问多个文件或路径,通常用于文件或页面不存在时的备用处理。
location / {try_files $uri $uri/ /index.html; # 尝试查找文件,如果找不到则返回 index.html
}
重定向
可以使用 return
或 rewrite
进行 URL 重定向:
示例:使用 return
进行重定向
location /old-page {return 301 /new-page; # 重定向到新的 URL
}
示例:使用 rewrite
重写 URL
location /old-page {rewrite ^/old-page$ /new-page permanent; # 使用正则表达式重写 URL
}
当使用rewrite的时候,其实质是对原有访问url的修改,并且把修改后的地址返回给浏览器,浏览器收到之后重新新请求新地址。
location
中的变量
在 location
配置中,可以使用 Nginx 提供的变量来动态处理请求。常见的变量包括:
$uri
:请求的 URI。$remote_addr
:客户端 IP 地址。$query_string
:请求的查询字符串。$request_uri
:完整的请求 URI(包括查询字符串)。
location /images/ {root /var/www/images/$remote_addr; # 根据客户端 IP 动态选择文件夹
}
几种常见配置
-
设置文件上传的大小限制。
http{client_max_body_size 10M; # 设置最大上传文件大小为 10MB }
-
SSL 配置 (SSL Configuration)
server {listen 443 ssl;server_name example.com;ssl_certificate /etc/nginx/ssl/example.com.crt;ssl_certificate_key /etc/nginx/ssl/example.com.key;location / {root /var/www/html;} }
-
自定义错误页面
server {listen 80;server_name example.com;error_page 404 /404.html; # 配置 404 错误页面location = /404.html {root /usr/share/nginx/html;} }