变量一览
nginx 提供了一系列预定义变量,可以在配置文件中使用。这些变量提供了关于请求、连接、服务器等信息的访问。
以下是一些常用的预定义变量:
$arg_parameter: get 请求参数中的指定参数值。 $args: 请求中的参数字符串。 $binary_remote_addr: 客户端 ip 地址(二进制格式)。 $body_bytes_sent: 发送给客户端的字节数。 $bytes_sent: 发送给客户端的总字节数。 $connection: 连接序列号。 $connection_requests: 已处理的当前连接的请求数量。 $content_length: 请求头中的 content-length 字段。 $content_type: 请求头中的 content-type 字段。 $cookie_cookie: 请求中的指定 cookie 值。 $document_root: 当前请求的根目录。 $document_uri: 请求的 uri(不包含参数)。 $host: 请求中的主机头字段。 $hostname: 请求的主机名。 $is_args: 如果请求参数存在,则为 "?",否则为空字符串。 $limit_rate: 限制客户端请求的速率。 $msec: 当前时间戳(毫秒级)。 $nginx_version: 当前 nginx 版本号。 $pid: 当前 nginx 进程 id。 $query_string: 请求的查询字符串。 $realpath_root: 请求根目录的真实路径。 $remote_addr: 客户端 ip 地址。 $remote_port: 客户端端口号。 $remote_user: http 认证的用户名。 $request: http 请求行(例如:get /index.html http/1.1)。 $request_body: 请求的主体内容。 $request_completion: 请求的完成状态("ok" 或空)。 $request_filename: 当前请求的文件路径。 $request_length: 请求的长度(包括请求行、头部和主体)。 $request_method: 请求的 http 方法(例如:get、post)。 $request_time: 请求处理时间(秒)。 $request_uri: 请求的 uri(包括参数)。 $scheme: 请求的协议(http 或 https)。 $sent_http_header: 发送给客户端的响应头字段值。 $server_addr: 服务器 ip 地址。 $server_name: 服务器名称。 $server_port: 服务器端口号。 $server_protocol: 服务器协议(例如:http/1.1)。 $status: 服务器响应的 http 状态码。 $tcpinfo_rtt: 客户端到服务器的往返时延(rtt)。 $tcpinfo_rttvar: rtt 方差。 $tcpinfo_snd_cwnd: 发送方拥塞窗口大小。 $time_iso8601: 当前时间(iso 8601 格式)。 $time_local: 当前时间(本地时间格式)。 $uri: 请求的 uri(不包含参数)。 $variable: 自定义的变量值。 $http_header: 请求头中的指定字段值。 $http_accept: 客户端发送的 accept 头部。 $http_accept_encoding: 客户端发送的 accept-encoding 头部。 $http_accept_language: 客户端发送的 accept-language 头部。 $http_cache_control: 客户端发送的 cache-control 头部。 $http_connection: 客户端发送的 connection 头部。 $http_cookie: 客户端发送的 cookie 头部。 $http_host: 请求中的主机头字段。 $http_referer: 引导用户代理到当前页面的来源页面。 $http_user_agent: 客户端的用户代理字符串。 $http_upgrade: 客户端发送的 upgrade 头部。 $http_via: 客户端发送的 via 头部。 $http_x_forwarded_for: 客户端请求中包含的 x-forwarded-for 头部信息,表示请求经过的代理服务器 ip 地址。 $http_x_real_ip: 客户端请求中包含的 x-real-ip 头部信息,表示客户端的真实 ip 地址。
这些预定义变量可以在 nginx 的配置文件中使用,用于记录访问日志、设置重定向、控制访问权限等。使用这些变量可以让 nginx 配置更加灵活和强大。
实例
server_name
在nginx中,server_name指令用于指定服务器块(server block)所匹配的主机名(hostname)。
主机名是浏览器在发送http请求时提供的域名。
server_name指令允许你配置nginx服务器以响应特定的域名请求。
当nginx收到一个请求时,它会检查请求的主机名与配置文件中的server_name指令是否匹配,如果匹配,则会选择相应的服务器块来处理请求。
server { listen 80; server_name example.com; # 其他配置... } server { listen 80; server_name www.example.com; # 其他配置... }
例如,如果你有两个域名example.com和www.example.com指向同一个服务器,但你希望为每个域名提供不同的内容或配置,你可以在nginx配置文件中创建两个服务器块,并分别指定它们的server_name为example.com和www.example.com。
示例配置:
在这个配置中,第一个服务器块将响应example.com域名的请求,而第二个服务器块将响应www.example.com域名的请求。
案例:限制域名访问,但是不限制其对应的公网ip访问
server { listen 9266; server_name 10.57.112.210; # 禁止以 tech.test.xxxxxxx.cn 为前缀的域名访问 if ($host ~* "^tech\.test\.xxxxxxx\.cn") { return 403; } }
传递客户端的请求信息给后端服务器
在server或者location下配置
proxy_set_header host $hos:$server_port; proxy_set_header x-real-ip $remote_addr; proxy_set_header x-forwarded-for $proxy_add_x_forwarded_for;
proxy_set_header host $host:$server_port;:
这一行设置了将要发送到后端服务器的请求头中的 host 字段。$host 表示客户端请求中的主机名,$server_port 表示nginx服务器的端口号。这样设置可以确保后端服务器正确识别请求的目标主机和端口。
proxy_set_header x-real-ip $remote_addr;:
这一行设置了将要发送到后端服务器的请求头中的 x-real-ip 字段。$remote_addr 表示客户端的真实ip地址。这样设置有助于后端服务器获取到客户端的真实ip地址,而不是nginx服务器的ip地址。
proxy_set_header x-forwarded-for $proxy_add_x_forwarded_for;:
这一行设置了将要发送到后端服务器的请求头中的 x-forwarded-for 字段。$proxy_add_x_forwarded_for 表示nginx在转发请求时会将客户端的原始ip地址添加到已有的 x-forwarded-for 字段中。
这个字段通常用于跟踪请求经过的代理服务器链路,以便后端服务器可以了解到请求的原始来源。
总的来说,这些配置是为了确保nginx作为代理服务器时能正确地传递客户端的请求信息给后端服务器,并且保留了客户端的真实ip地址和请求路径。
将nginx的访问日志记录到指定的文件中
在http,server或location下配置access_log,在配置access_log前先在http下配置log_format,
# 定义自定义的日志格式 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 /usr/local/nginx/logs/access_9266.log main;
- access_log: 这是nginx配置指令,用于指定访问日志的位置和格式。
- /usr/local/nginx/logs/access_9266.log: 这是实际的日志文件路径和文件名。nginx 会将访问日志记录到这个文件中。
- main: 这是日志格式的名称。在nginx的配置文件中,可以定义不同的日志格式,main 是其中一个预定义的日志格式。
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
发表评论