Nginx高级配置
在NGINX中,变量是一种用于存储和检索HTTP请求和响应中的数据的机制。
变量可以包含请求头、请求方法、请求参数、时间戳等信息。
http://nginx.org/en/docs/varindex.html 官方文档
当NGINX作为反向代理服务器时,它将接收到的客户端请求转发给后端服务器。为了保持请求的来源信息,NGINX可以在转发请求时设置X-Forwarded-For头部,以便后端服务器知道真实的客户端IP地址。
功能 | |
---|---|
$remote_addr | 客户端的地址,注意是客户端的公网IP |
$proxy_add_x_forwarded_for | 在反向代理服务器中设置X-Forwarded-For请求头 |
$args | 请求的查询参数 |
$arg_ | 输出名为的查询参数的值 |
$document_root | 当前请求的根目录路径 |
$document_uri | 当前请求的URI,不包括查询字符串部分 |
$host | 存放了请求的主机名 |
limit_rate | 如果nginx服务器使用limit_rate配置了显示网络速率,则会显示,如果没有设置, 则显示0 |
$remote_port | 客户端请求Nginx服务器时随机打开的端口,这是每个客户端自己的端口 |
$remote_user | 已经经过Auth Basic Module验证的用户名 |
$request_body_file | 做反向代理时发给后端服务器的本地资源的名称 |
$request_method | 请求资源的方式,GET/PUT/DELETE等 |
$request_filename | 当前请求的文件路径 |
$request_uri | 包含请求参数的原始URI,不包含主机名 |
$scheme | 请求使用的协议(http或https) |
$server_protocol | 保存了客户端请求资源使用的协议的版本 |
$server_addr | 保存了服务器的IP地址 |
$server_name | 请求的服务器的主机名 |
$server_port | 请求的服务器的端口号 |
$http_ | 记录请求报文的首部字段 |
$http_user_agent | 客户端使用的用户代理 |
$http_cookie | 请求中的Cookie |
$cookie_ | name为任意请求报文首部字部cookie的key名 |
$sent_http_ |
假如需要自定义变量名称和值,使用指令set $variable value;
语法格式:
Syntax: set $variable value; Default: — Context: server, location, if
范例:
set $name kgc; echo $name; set $my_port $server_port; echo $my_port; echo "$server_name:$server_port"; #输出信息如下 [root@centos6 ~]#curl www.kgc.org/main kgc 80 www.kgc.org:80 ###################################################### 实际例子: location /test { set $name kgc; echo $name; set $my_port $server_port; echo $my_port; }
自定义访问日志可以提供更灵活和定制化的日志记录方式。
1.满足特定需求:通过自定义访问日志,你可以选择记录特定的访问信息,如客户端IP地址、访问时间、请求内容、状态码、传输字节数、引用页面、用户代理等。这些信息可以根据你的需求进行自定义,以满足特定的分析、监控或统计需求。
2.减少日志量:默认情况下,Nginx 记录的访问日志较为详细,包含了大量的信息。而自定义访问日志可以让你只记录感兴趣的信息,避免产生过多的日志数据,减少磁盘空间和读写开销。
3.提高性能:自定义访问日志可以减少磁盘的写入操作,从而减小对系统性能的影响。尤其在高访问量的情况下,减少日志量可以提高系统的处理能力和响应速度。
4.日志分析与监控:自定义访问日志可以使日志数据更易于分析和监控。你可以根据自定义的格式,使用各种日志分析工具或脚本,提取有用的信息,进行访问分析、安全审计、性能优化等工作。
要自定义 Nginx 的访问日志,你需要编辑 Nginx 的配置文件,并修改 http
部分的日志格式。
以下是一个简单的例子,展示了如何在 Nginx 配置文件中定义一个自定义的访问日志格式:
http { # 定义自定义访问日志格式 log_format my_custom_log '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent"'; # 配置使用自定义访问日志格式的访问日志文件 access_log /path/to/custom_access.log my_custom_log; # 其他配置项... } 在上述例子中,我们使用 `log_format` 指令定义了一个名为 `my_custom_log` 的自定义日志格式,该格式包含了 IP 地址、用户名、访问时间、请求内容、状态码、传输字节数、引用页面和用户代理等信息。 然后,在 `access_log` 指令中指定了一个自定义访问日志文件的路径 `/path/to/custom_access.log`,并且将之前定义的 `my_custom_log` 格式应用于该日志文件。 请注意,修改完配置文件之后,记得重新加载 Nginx 配置使改动生效,使用命令 `nginx -s reload` 可以实现配置文件的热重载。
log_format access_json '{"@timestamp":"$time_iso8601",' '"host":"$server_addr",' '"clientip":"$remote_addr",' '"size":$body_bytes_sent,' '"responsetime":$request_time,' '"upstreamtime":"$upstream_response_time",' '"upstreamhost":"$upstream_addr",' '"http_host":"$host",' '"uri":"$uri",' '"xff":"$http_x_forwarded_for",' '"referer":"$http_referer",' '"tcp_xff":"$proxy_protocol_addr",' '"http_user_agent":"$http_user_agent",' '"status":"$status"}'; location / { root /data/nginx/pc/; access_log logs/access.log access_json; } '"http_user_agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTMLe/101.0.4951.54 Safari/537.36",' '"status":"304"}'
Nginx通过在服务器上启用gzip模块来提供压缩功能。
启用gzip后,Nginx会自动检测客户端的浏览器支持情况,然后在服务器和客户端之间压缩和解压缩文件。
太小的文件没必要压缩,压缩说不定变大了。
官方文档: https://nginx.org/en/docs/http/ngx_http_gzip_module.html
释义 | 参数值 | |
---|---|---|
gzip | 开启或关闭压缩机制 | on/off; |
gzip_types | 根据文件类型选择性开启压缩机制 | image/png、text/css… |
gzip_comp_level | 用于设置压缩级别,级别越高越耗时 | 1~9(越高压缩效果越好) |
gzip_vary | 设置是否携带Vary:Accept-Encoding头域的响应头部 | on/off |
gzip_buffers | 设置处理压缩请求的缓冲区数量和大小 数量 大小 | 如16 8k |
gzip_disable | 针对不同客户端的请求来设置是否开启压缩 | 如 .Chrome. |
gzip_http_version | 指定压缩响应所需要的最低HTTP请求版本 | 如1.1 |
gzip_min_length | 设置触发压缩的文件最低大小 | 如512k |
gzip_proxied | 对于后端服务器的响应结果是否开启压缩 |
http{ # 开启压缩机制 gzip on; # 指定会被压缩的文件类型(也可自己配置其他类型) gzip_types text/plain application/javascript text/css application/xml text/javascript image/jpeg image/gif image/png; # 设置压缩级别,越高资源消耗越大,但压缩效果越好 gzip_comp_level 5; # 在头部中添加Vary: Accept-Encoding(建议开启) gzip_vary on; # 处理压缩请求的缓冲区数量和大小 gzip_buffers 16 8k; # 对于不支持压缩功能的客户端请求不开启压缩机制 gzip_disable "MSIE [1-6]\."; # 低版本的IE浏览器不支持压缩 # 设置压缩响应所支持的HTTP最低版本 gzip_http_version 1.1; # 设置触发压缩的最小阈值 gzip_min_length 2k; # 关闭对后端服务器的响应结果进行压缩 gzip_proxied off; }
1)客户端发送HTTPS请求:客户端(例如Web浏览器)通过HTTPS协议向Nginx服务器发送加密的HTTP请求。默认情况下,HTTPS使用443端口进行通信。
2)服务器证书握手:Nginx服务器接收到HTTPS请求后,会向客户端发送已经配置好的SSL证书。该证书包含了服务器的公钥以及其他相关信息,例如服务器的域名。
3)客户端验证证书:客户端接收到服务器发送的证书后,会使用预置的受信任证书颁发机构(CA)根证书列表来验证详细的服务器证书链。客户端会检查证书是否由受信任的CA签发,并验证证书的有效性和真实性。如果证书通过验证,客户端可以确认服务器的身份。
4)密钥交换:如果服务器的证书被成功验证,客户端会生成一个随机的对称密钥,称为“会话密钥”。然后,客户端使用服务器的公钥来加密该会话密钥,并将其发送给服务器。
5)数据加密:Nginx服务器接收到客户端发送的加密的会话密钥后,使用服务器的私钥解密该会话密钥。此后,Nginx服务器和客户端使用会话密钥来进行对称加密和解密,以加密和解密数据的传输。
6)安全数据传输:一旦会话密钥被交换并使用,Nginx服务器和客户端之间的通信将通过使用会话密钥进行加密和解密来保证安全性。所有通过HTTPS协议传输的数据,包括HTTP请求和响应内容,都将被加密。
客户端和服务器之间的加密通道建立后,数据在传输过程中将经过加密,从而提供了更高的安全性。
Nginx的HTTPS功能通过ngx_http_ssl_module模块来实现的。
ngx_http_ssl_module模块为Nginx添加了对SSL/TLS协议的支持,使其能够提供HTTPS服务。
ngx_http_ssl_module模块提供了一组配置项,用于指定SSL证书、私钥、加密算法、协议版本以及其他与SSL/TLS相关的设置。
配置步骤:
1)获取SSL证书和私钥:从证书颁发机构(CA)或自签名证书颁发机构获取有效的SSL证书和对应的私钥文件。证书用于验证服务器的身份,私钥用于解密SSL连接。
2)配置Nginx:编辑主配置文件nginx.conf
ssl_certificate:指定SSL证书文件的路径。 ssl_certificate_key:指定SSL私钥文件的路径。 ssl_protocols:指定支持的TLS协议版本,例如TLSv1.2、TLSv1.3。 ssl_ciphers:指定加密算法套件,例如AES128-GCM-SHA256、ECDHE-RSA-AES256-GCM-SHA384。 其他可选的SSL配置项:ssl_prefer_server_ciphers、ssl_session_timeout等。
#举例子 server { listen 443 ssl; server_name example.com; ssl_certificate /path/to/certificate.crt; ssl_certificate_key /path/to/private/key.key; # SSL配置项 ssl_protocols TLSv1.2 TLSv1.3; ssl_prefer_server_ciphers on; ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH"; }
3)重启Nginx:保存配置文件,并重新加载或重启Nginx服务。
nginx -s reload
favicon.ico
文件是浏览器收藏网址时显示的图标。
当客户端使用浏览器问页面时,浏览器会自己主动发起请求获取页面的favicon.ico文件。 当浏览器请求的favicon.ico
文件不存在时,服务器会记录404日志
,而浏览器会显示404
报错。
#方法一:服务器不记录访问日志: location = /favicon.ico { log_not_found off; access_log off; } #方法二:将图标保存到指定目录访问: #location ~ ^/favicon\.ico$ { location = /favicon.ico { root /data/nginx/html/pc/images; expires 365d; #设置文件过期时间 }