当前位置:首页 > 教程 > 正文内容

nginx格式(nginxs)

2023-05-15 06:50:05教程1

nginx格式

以Nginx对OpenSSL的使用为入口,来分析OpenSSL的API的模型。OpenSSL是两个库,如果以握手为目的只会使用libssl.so这个库,但是如果有加密的需求,会使用libcrypto.so这个库。Nginx中对于OpenSSL的使用大部分是直接使用的libssl.so的接口API的,但是仍然会有少部分使用libcrypto.so。除了Nginx,本章还会分析一个s_server程序,通过这个程序的设计,能够对OpenSSL的内部架构有一个初探。

Nginx的Stream中SSL的实现

Nginx的Stream Proxy中有对于SSL的Terminator的支持。这个终端的意思是可以在Nginx层面把SSL解掉,然后把明文传输给后端。也就是说支持SSL的Nginx的Stream模块实际上是一个TLS的握手代理,将TLS信道在本地解了再发送到后端,所以整个过程是一个纯粹的握手过程,至于ALPN这种功能就需要后端与TLS的配合才可以,所以这种行为在stream 的SSL中是不能支持的。

这是一个Nginx的Stream SSL模块相关的函数列表,主要的Stream模块特有的功能也都就在这个列表里了。可以看到除去配置和模块的整体初始化函数,只剩下一个连接初始化,ssl的入口handler和握手的handler。显然握手的handler是入口handler的深入部分。鉴于Nginx的异步模型,可以很容易的想到是Nginx在收到一个连接的时候首先使用ssl_handler作为通用入口,在确定是SSL连接之后就会切换到handshaker_handler作为后续的握手handler函数。

但是Nginx在支持SSL的时候并不是这样的轻松,因为大量的SSL相关函数在ngx_event_openssl.c文件里,这个文件里的函数被HTTP模块和Stream模块或者其他需要SSL支持的模块共同使用。包括Session Cache等Nginx重新实现的OpenSSL功能。通过这个例子可以看到如果要自己实现一个SSL支持,我们需要两个东西,一个是SSL的用户端的接口封装库(ngx_event_openssl.c),一个是如何把封装库的逻辑嵌入到我们的代码流程的逻辑。Nginx作为一个强大的负载均衡设备,这一部分的接口嵌入应该是要追求的最小化实现的。也就是说Stream模块相关的代码越少越好(ngx_stream_ssl_module.c)。所以我们可以看到几乎就几个钩子函数的定义。

无论是Stream还是HTTP模式,整个TLS握手的核心函数都是ngx_ssl_handshake函数。我们看这个函数就能看到一个企业级的握手接口的使用案例。以下是一个简化版的函数流程:

以上是一个同步版本的大体逻辑,异步版本的就没有显示。可以看到主要的SSL握手的入口函数是SSL_do_handshake。如果握手正常,函数返回1之后,使用SSL_get_current_cipher或得到服务器根据客户端发来的密码学参数的列表选择得到的密码学套件。这里会返回服务器选择的那个,如果返回为空,那么就代表了服务器没有找到匹配的套件,连接就不能继续。SSL_CIPHER_description函数输入活的指针,返回一个字符串格式的套件的描述信息,Nginx这里使用了这个信息,最后一步就是查找当前的Session Cache中是否有可以复用的逻辑。这里只是一个查询,并不是就是复用的决定。因为是否复用是在连接建立之前由配置决定的,如果Nginx配置了不使用OpenSSL的Session Cache,这个查询就会一直返回0,表示没有被复用。而且这里查询的OpenSSL中是否有复用,并不代表Nginx内部是否有复用,Nginx内部还有一套自己的Session Cache实现,但是使用SSL_开头的API函数都是OpenSSL的接口。

这个简单的接口可以看出对OpenSSL的API的使用的一些端倪。OpenSSL提供的API非常多,我们写一个简单的示例程序仅仅会用到几个最简单的接口,例如SSL_new等。但是一个正式的项目,会用到很多细节的API接口。由于OpenSSL只会暴露他认为应该暴露的API函数出来给调用者使用,其他的函数调用者是用不到的,并且OpenSSL内部的结构体外部也是不能使用的,所以使用者所有的行为都是要基于API进行设计。

OpenSSL分为libcrypto.so和libssl.so两个库。在使用TLS握手的时候,主要的调用API都位于ssl.h文件中定义,都是SSL_开头的API。但是这并不意味着只能调用libssl.so的接口,高级的用户并不是想要使用OpenSSL的TLS握手功能,完全可以直接调用libcrypto.so里面的各种各样的密码学库。总的来说libssl.so是一个TLS握手库,而libcrypto.so是一个通用的密码学的库。只是libssl.so的握手使用的密码学是完全依赖libcryto.so中提供的。也就是因此,在使用TLS握手的时候,是基本上不会直接用到libcrypto.so中的API的。

s_server

openssl s_server是一个简单的SSL服务器,虽然说是简单,但是其中包含了大部分用户SSL编程需要考虑的东西。证书,密码,过期校验,密码学参数定制,随机数定制等等。这是一个功能性的程序,用于验证openssl内部的各项SSL握手服务器的功能是否能够正常使用,并不能用于直接服务于线上业务。

s_server程序启动的第一步是解析各种参数,在正常运作的时候,第一步是加载key。

我们看到OpenSSL内部调用的函数和在使用OpenSSL库接口的时候是不一样的,OpenSSL的子程序会调用一些内部的接口。比如这里使用了ENGINE_init,直接初始化了底层的引擎系统。ENGINE系统是OpenSSL为了适配下层不同的数据引擎设计的封装层。有对应的一系列API,所有的ENGINE子系统的API都是ENGINE_开头的。一个引擎代表了一种数据计算方式,比如内核的密码学套件可以有一个专门的OpenSSL引擎调用到内核的密码学代码,QAT硬件加速卡也会有一个专门的引擎,OpenSSL自己的例如RSA等加密算法的实现本身也是一个引擎。这里在加载key的时候直接初始化一个引擎,这个引擎在init之前还要先调用一个setup_engine函数,这个函数能够设置这个将要被初始化的引擎的样子。s_server之所以要自己用引擎的API接口是因为它支持从命令行输入引擎的参数,指定使用的引擎。

可以看到,如果指定了auto,就会加载所有默认的引擎。如果指定了特定ID的引擎,就只会加载特定的引擎。一个引擎下面是所有相关的密码学的实现,加载key就是一个密码学层面的操作,所以也要使用ENGINE提供的接口。事实上,最后都是分别调用了对应的ENGINE的具体实现,这中间都是通过方法表的指针的方式完成的。ENGINE定义的通用的接口还有很多,这里只是用到了加载密钥。

表内都是对不同的EVP_CIPHER和EVP_MD的接口的定义。

我们回到加载key的函数,继续阅读发现一个 key = bio_open_default(file, 'r', format); 这个key是一个BIO类型的指针,这个BIO类型的指针就是另外一个OpenSSL的子系统,所有的IO操作都会被封装到这个子系统之下。例如这里使用的文件IO,用于从文件中读取key的结果。BIO被设计为一个管道式的系统,类似于Shell脚本中见到的管道的效果。有两种类型的BIO,一种是source/sink类型的,就是我们最常见的读取文件或者Socket的方式。另外一种是管道BIO,就是两个BIO可以通过一个管道BIO连接起来,形成一个数据流。所以BIO的方式是一个很重量级的IO系统的实现,只是目前只是被OpenSSL内部使用的比较多。

继续向下阅读加载密钥的函数,会发现PEM_read_bio_PrivateKey函数,这一步就是实际的从一个文件中读取密钥了。我们现在已经有了代表文件读写的BIO,代表密码学在程序中的封装EVP,中间缺的桥梁就是文件中密钥存储的格式。这里的以PEM_开头的函数就代表了PEM格式的API。PEM是密码学的存储格式,PEM_开头的API就是解析或者生成这种格式的API,当然它需要从文件中读取,所以参数中也会有BIO的结构体,PEM模块使用BIO模块提供的文件服务按照定义的格式将密钥加载到内存。

OpenSSL的所有apps都会共享一些函数,这些函数的实现都在一个apps.c文件中,以上的加载密钥的函数也是其中的一个。s_server程序在调用完load_key之后会继续调用load_cert来加载证书。load_cert使用的子系统与load_key非常类似,类似的还有后面的load_crl函数,CRL(Certificate revocation lists)是CA吊销的证书列表,这项技术已经基本被OCSP淘汰。OpenSSL还提供一个随机数文件的功能,可以从文件中加载随机数。

s_server在加载完相关的密码学相关参数后,就会开始创建上下文,SSL_CTX_new函数的调用就代表了上下文的创建。这个上下文是后面所有SSL连接的母板,对SSL的配置设置都会体现在这个上下文的设置中。随后,s_server会开始设置OpenSSL服务器支持的TLS握手版本范围,分别调用SSL_CTX_set_min_proto_version和SSL_CTX_set_max_proto_version两个函数完成所有操作。

OpenSSL在共享TLS握手的Session时,需要生成一个Session ID,默认的情况,OpenSSL会在内部决定Session ID怎么生成。但是也提供了用户设置这个生成算法的API。s_server程序调用SSL_CTX_set_generate_session_id函数设置一个自己的回调函数,在这个回调函数中就可以完成Session ID的设置,从而取代掉OpenSSL自带的内部Session ID的生成器。OpenSSL在证书协商的时候还会允许外部的库使用者动态的修改采用的证书,这个机制是通过SSL_CTX_set_cert_cb来设置证书回调函数实现的。s_server也有这个函数的设置。程序走到这里,基本能看到OpenSSL的一个很大的特性,就是大部分的内部流程都会提供一个回调函数给使用者来注册,使用者可以按照自己的需求取代掉或者修改OpenSSL内部的功能。显然这个s_server程序是一个功能展示的程序,会用上大量的函数回调点。比如紧接着调用的SSL_CTX_set_info_callback函数就是在生成SSL的时候调用的,可以用于使用者获得状态。不但OpenSSL外部的机制可以在用户端设置,用户甚至可以设置加密算法的参数。例如s_server就会接下来根据用户是否提供DH参数来设置内部的参数。如果调用了SSL_CTX_set_dh_auto就意味着参数是使用内部的机制生成,这也是默认的行为。但是仍然可以提前提供,主要是为了性能的考虑,比如提前提供DH的大素数,DH算法在运算的过程中需要一个取模操作,这个取模是对一个大素数进行取模的,而这个大素数默认是在运行的时候动态生成的,但是我们可以提供这个素数,从而以牺牲一定的安全性为代价换来性能的提高。

s_server在设置完整个上下文之后,就会进入Socket监听和处理的模式。由于BIO框架包含了Socket的能力,所以这一步本质上就是调用BIO的接口。

这是一个典型的OpenSSL的Socket逻辑。BIO_sock_init这个函数在Linux下就是空函数,没有意义。BIO_lookup是一个通用的获取地址的方法,对于Socket就是IP:PORT的字符串,对于文件是文件的目录。BIO_socket意思就相当于在使用Socket变成的socket函数。BIO_listen也就自然对应listen函数,BIO_accept_ex和BIO_closesocket也是类似的意思。整个流程其实就与一个普通的Socket流程没有太大区别,只是BIO多了一层封装。因为OpenSSL是个跨平台的库,这层封装更多的意义在于用在跨平台的应用上的。

通过一个简单的s_server程序的分析可以看到整个OpenSSL的主要设计思路。它对外封装了不同的模块,例如ENGINE,EVP,BIO之类的封装。在大部分的流程上都提供了回调函数API,使用者可以用回调函数来修改OpenSSL原来的逻辑或者获得其他的信息。在使用OpenSSL的时候一般需要遵循类似的流程,就是创建上下文,然后配置上下文,然后运行服务。

nginxs

k8s是一个开源的容器集群管理系统,可以实现容器集群的自动化部署、自动扩缩容、维护等功能,就是k8s可以用来管理docker,

Nginx是一个高性能的 HTTP 和反向代理服务器, k8s可以用来管理nignx服务器

nginx的gzip

Nginx是一个高性能的Web服务器和反向代理服务器,支持gzip压缩。gzip是一种在Web服务器和客户端之间传输数据时进行压缩的技术,可以显著减少传输数据的大小,从而提高Web页面的加载速度。

下面是Nginx开启gzip的优缺点:

优点:

提高网站速度:gzip压缩可以将数据压缩成更小的体积,这样可以减少Web页面加载时间,从而提高网站速度。

减少带宽使用:由于gzip压缩可以将数据压缩成更小的体积,因此可以减少带宽使用,降低网站的流量消耗。

改善用户体验:通过减少页面的加载时间,可以提高用户的体验,并提高他们对网站的满意度和忠诚度。

缺点:

压缩需要消耗CPU资源:由于压缩需要消耗CPU资源,因此开启gzip压缩可能会增加服务器的CPU负载,对于性能较低的服务器可能会影响性能。

压缩可能会增加内存使用:在进行gzip压缩时,需要使用一定的内存资源来存储压缩后的数据,如果压缩的数据量较大,可能会增加服务器的内存使用。

综上所述,开启gzip压缩可以提高网站的速度和用户体验,但需要注意压缩可能会增加服务器的CPU和内存使用。如果服务器性能较低或者带宽资源充足,可以考虑不开启gzip压缩。

nginx -g

在Windows下,Nginx的启动日志可以在Nginx的安装目录下查看。具体步骤如下:

1. 打开Nginx的安装目录,一般在C:\nginx或者D:\nginx等位置。

2. 进入logs目录,可以看到access.log和error.log两个文件。

- access.log是Nginx的访问日志,记录了每个请求的详细信息,包括请求的时间、IP地址、请求的URL、响应状态码等。

- error.log是Nginx的错误日志,记录了Nginx在运行过程中出现的错误信息,包括语法错误、配置错误、启动错误等。

3. 双击打开access.log或error.log文件,可以使用记事本或其他文本编辑器查看日志内容。

4. 如果想要在启动Nginx时将启动日志输出到控制台,可以在命令行中使用以下命令启动Nginx:

```

nginx.exe -c nginx.conf -p C:\nginx -g "daemon off;"

```

其中,-c参数指定Nginx的配置文件路径,-p参数指定Nginx的安装目录,-g参数指定Nginx的全局配置,其中的"daemon off;"表示不以守护进程方式运行Nginx,将启动日志输出到控制台。

通过以上步骤,您可以在Windows下查看Nginx启动日志。

nginx格式证书

Log文件是记录系统或应用程序运行时状态的文件,通常以文本格式保存。log文件的格式有很多种,其中一种常见的格式为log4j日志格式,它是Apache log4j项目提供的一种Java日志框架,也是Java中最流行的日志框架之一。log4j日志格式主要由以下几个部分组成:

1. 时间戳:记录日志时的日期和时间。

2. 日志级别:日志级别包括DEBUG、INFO、WARN、ERROR等,用于描述日志信息的重要性。

3. 线程名:记录当前线程的名称。

4. 日志来源类:记录日志信息的代码所在的类名。

5. 日志消息:记录实际的日志信息,其中包括一些可变参数,如异常信息、方法调用参数等。

例如,一个典型的log4j日志格式可能如下所示:

2021-10-05 14:22:33,411 [main] INFO com.example.MyClass - This is a log message.

其中,"2021-10-05 14:22:33,411"表示时间戳;"[main]"表示线程名;"INFO"表示日志级别;"com.example.MyClass"表示日志来源类;"This is a log message."表示日志消息。这样的日志格式可以帮助开发人员快速定位问题并解决。除了log4j,还有其他众多的日志框架和日志格式,如logback、slf4j、nginx日志格式等。

nginx格式证书需多少钱

结论:阿里云SSL证书的部署需要按照一定的步骤进行,需要一些专业知识和技能。解释原因:部署阿里云SSL证书需要进行一定的配置和设置。首先需要购买证书,并在阿里云后台进行审核和颁发。然后需要在服务器上进行安装证书和配置HTTPS访问。这个过程需要具备一定的技能和经验,否则可能会出现一些问题和错误。内容延伸:为了部署阿里云SSL证书,可以按照以下步骤进行操作:1.购买证书并上传到阿里云后台;2.下载并安装证书到服务器;3.配置HTTPS访问;4.测试是否成功。此外,可以参考阿里云提供的相关文档和教程,以及在遇到问题时向阿里云技术支持寻求帮助。

nginx格式的ssl证书

让网站永久拥有HTTPS - 申请免费SSL证书并自动续期 Let’s Encrypt

为什么要用HTTPS  网站没有使用HTTPS的时候,浏览器一般会报不安全,而且在别人访问这个网站的时候,很有可能会被运营商劫持,然后在网站里显示一些莫名其妙的广告。

  有HTTPS的时候,通俗地讲所有的数据传输都会被加密,你和网站之间的数据交流也就更加安全。

相关简介Let’s Encrypt  如果要启用HTTPS,我们就需要从证书授权机构处获取一个证书,Let’s Encrypt 就是一个证书授权机构。我们可以从 Let’s Encrypt 获得网站域名的免费的证书。

Certbot  Certbot是Let’s Encrypt推出的获取证书的客户端,可以让我们免费快速地获取Let’s Encrypt证书。

便宜SSL  便宜SSL是一家国内的SSL证书提供商,同样也拥有免费证书。而且提供丰富的工具: https://www.pianyissl.com/tools。

获取HTTPS证书  获取SSL证书的过程大体上都一样。既可以图形化,也可以命令行,最后实现的效果都完全一样,大家各取所需。

命令行安装Certbot  进入Certbot的官网,选择你所使用的软件和系统环境,然后就会跳转到对应版本的安装方法,以Ubuntu + Nginx为例。

sudo apt-get updatesudo apt-get install software-properties-commonsudo add-apt-repository ppa:certbot/certbotsudo apt-get updatesudo apt-get install certbot申请证书  安装完成后执行:

certbot certonly --webroot -w /var/www/example -d example.com -d www.example.com  这条命令的意思是为以/var/www/example为根目录的两个域名example.com和www.example.com申请证书。

  如果你的网站没有根目录或者是你不知道你的网站根目录在哪里,可以通过下面的语句来实现:

certbot certonly --standalone -d example.com -d www.example.com  使用这个语句时Certbot会自动启用网站的443端口来进行验证,如果你有某些服务占用了443端口,就必须先停止这些服务,然后再用这种方式申请证书。

  证书申请完之后,Certbot会告诉你证书所在的目录,一般来说会在/etc/letsencrypt/live/这个目录下。

图形化  进入便宜SSL的官网https://www.pianyissl.com,注册了账号之后,选择那个体验版的免费测试,然后点确认购买。

  输入域名并点击生成CSR并提交申请按钮。

  点击确定按钮。

  接下来会选择验证方式。

  这里我选择邮箱验证方式,其它另外两种依照你的个人情况而定,反正就是为了验证域名是不是你的而已。

  大约过几分钟,邮箱会收到一封验证邮件,如下图,复制②指向的一串验证码,点击①处的Here链接。

  输入验证码,点击Next>按钮。

  提示已经输入正确的验证码,点击Close Window。

  大约等到10分钟左右,再次登陆 https://www.pianyissl.com,进入个人中心,可以看到已经成功申请SSL证书,点击查看详情。

  此时你可以点击箭头所指的证书打包下载,然后免费的SSL证书就可以下载到本地了,下载后可以看到SSL压缩包内的文件。

部署HTTPS证书  找到网站的Nginx配置文件,找到listen 80;,修改为listen 443;在这一行的下面添加以下内容:

ssl on;ssl_certificate XXX/fullchain.pem; 修改为fullchain.pem所在的路径ssl_certificate_key XXX/privkey.pem; 修改为privkey.pem所在的路径ssl_session_timeout 5m;ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;ssl_protocols TLSv1 TLSv1.1 TLSv1.2;ssl_prefer_server_ciphers on;  保存退出后,通过nginx -t来检查配置文件是否正确,有错误的话改之即可。配置文件检测正确之后,通过nginx -s reload来重载配置文件。

  然后通过访问https://example.com来查看是否配置成功。

  如果发现无法访问或者是加载不出来的话检查一下443端口有没有开启!

设置HTTP强制跳转HTTPS  上一步成功之后大家可能会发现通过原来的http://example.com无法访问网页了,因为HTTP默认走的是80端口,我们刚才将其修改为443端口了。在这里我们可以在配置文件的最后一行加入以下代码:

server {listen 80;server_name example.com; 这里修改为网站域名rewrite ^(.*)$ https://$host$1 permanent;}意思是每一个通过80端口访问的请求都会强制跳转到443端口,这样一来访问http://example.com的时候就会自动跳转到https://example.com了。

命令行下设置证书自动续期  有心的小伙伴可能会留意到我们刚才申请的整数的有效期只有90天,不是很长,可是我们可以通过Linux自带的cron来实现自动续期,这样就相当于永久了。

  随便找一个目录,新建一个文件,名字随便起,在这里以example为例,在里面写入0 */12 * * * certbot renew --quiet --renew-hook "/etc/init.d/nginx reload",保存。

  然后在控制台里执行crontab example一切都OK了。原理是example里存入了一个每天检查更新两次的命令,这个命令会自动续期服务器里存在的来自Certbot的SSL证书。然后把example里存在的命令导入进Certbot的定时程序里。

附:其它环境下的证书部署  https://www.pianyissl.com/support/

Nginx相关命令nginx -t 验证配置是否正确nginx -v 查看Nginx的版本号service nginx start 启动Nginxnginx -s stop 快速停止或关闭Nginxnginx -s quit 正常停止或关闭Nginxnginx -s reload 重新载入配置文件crontab相关命令cat /var/log/cron 查看crontab日志crontab -l 查看crontab列表crontab -e 编辑crontab列表systemctl status crond.service 查看crontab服务状态systemctl restart crond.service 重启crontab参考文档https://lucien.ink/archives/81/https://www.cnblogs.com/zoro-zero/p/6590503.htmlhttp://blog.csdn.net/gsls200808/article/details/53486078https://certbot.eff.org/#ubuntuxenial-otherhttp://nginx.org/en/docs/http/configuring_https_servers.html

https://www.cnblogs.com/zdz8207/p/10729294.html

nginx格式检查

日志对于统计排错来说非常有利的。本文总结了nginx日志相关的配置如access_log、log_format、open_log_file_cache、log_not_found、log_subrequest、rewrite_log、error_log。

nginx有一个非常灵活的日志记录模式。每个级别的配置可以有各自独立的访问日志。日志格式通过log_format命令来定义。ngx_http_log_module是用来定义请求日志格式的。

1. access_log指令

语法: access_log path [format [buffer=size [flush=time]]];

access_log path format gzip[=level] [buffer=size] [flush=time];

access_log syslog:server=address[,parameter=value] [format];

access_log off;

默认值: access_log logs/access.log combined;

配置段: http, server, location, if in location, limit_except

gzip压缩等级。

buffer设置内存缓存区大小。

flush保存在缓存区中的最长时间。

不记录日志:access_log off;

使用默认combined格式记录日志:access_log logs/access.log 或 access_log logs/access.log combined;

2. log_format指令

语法: log_format name string …;

默认值: log_format combined “…”;

配置段: http

name表示格式名称,string表示等义的格式。log_format有一个默认的无需设置的combined日志格式,相当于apache的combined日志格式,如下所示:

log_format combined '$remote_addr - $remote_user [$time_local] '

' "$request" $status $body_bytes_sent '

' "$http_referer" "$http_user_agent" ';

log_formatcombined'$remote_addr - $remote_user [$time_local] '

' "$request" $status $body_bytes_sent '

' "$http_referer" "$http_user_agent" ';

如果nginx位于负载均衡器,squid,nginx反向代理之后,web服务器无法直接获取到客户端真实的IP地址了。 $remote_addr获取反向代理的IP地址。反向代理服务器在转发请求的http头信息中,可以增加X-Forwarded-For信息,用来记录 客户端IP地址和客户端请求的服务器地址。PS: 获取用户真实IP 参见http://www.ttlsa.com/html/2235.html如下所示:

log_format porxy '$http_x_forwarded_for - $remote_user [$time_local] '

' "$request" $status $body_bytes_sent '

' "$http_referer" "$http_user_agent" ';

log_formatporxy'$http_x_forwarded_for - $remote_user [$time_local] '

' "$request" $status $body_bytes_sent '

' "$http_referer" "$http_user_agent" ';

日志格式允许包含的变量注释如下:

$remote_addr, $http_x_forwarded_for 记录客户端IP地址

$remote_user 记录客户端用户名称

$request 记录请求的URL和HTTP协议

$status 记录请求状态

$body_bytes_sent 发送给客户端的字节数,不包括响应头的大小; 该变量与Apache模块mod_log_config里的“%B”参数兼容。

$bytes_sent 发送给客户端的总字节数。

$connection 连接的序列号。

$connection_requests 当前通过一个连接获得的请求数量。

$msec 日志写入时间。单位为秒,精度是毫秒。

$pipe 如果请求是通过HTTP流水线(pipelined)发送,pipe值为“p”,否则为“.”。

$http_referer 记录从哪个页面链接访问过来的

$http_user_agent 记录客户端浏览器相关信息

$request_length 请求的长度(包括请求行,请求头和请求正文)。

$request_time 请求处理时间,单位为秒,精度毫秒; 从读入客户端的第一个字节开始,直到把最后一个字符发送给客户端后进行日志写入为止。

$time_iso8601 ISO8601标准格式下的本地时间。

$time_local 通用日志格式下的本地时间。

$remote_addr,$http_x_forwarded_for记录客户端IP地址

$remote_user记录客户端用户名称

$request记录请求的URL和HTTP协议

$status记录请求状态

$body_bytes_sent发送给客户端的字节数,不包括响应头的大小;该变量与Apache模块mod_log_config里的“%B”参数兼容。

$bytes_sent发送给客户端的总字节数。

$connection连接的序列号。

$connection_requests当前通过一个连接获得的请求数量。

$msec日志写入时间。单位为秒,精度是毫秒。

$pipe如果请求是通过HTTP流水线(pipelined)发送,pipe值为“p”,否则为“.”。

$http_referer记录从哪个页面链接访问过来的

$http_user_agent记录客户端浏览器相关信息

$request_length请求的长度(包括请求行,请求头和请求正文)。

$request_time请求处理时间,单位为秒,精度毫秒;从读入客户端的第一个字节开始,直到把最后一个字符发送给客户端后进行日志写入为止。

$time_iso8601ISO8601标准格式下的本地时间。

$time_local通用日志格式下的本地时间。

[warning]发送给客户端的响应头拥有“sent_http_”前缀。 比如$sent_http_content_range。[/warning]

实例如下:

http {

log_format main '$remote_addr - $remote_user [$time_local] "$request" '

'"$status" $body_bytes_sent "$http_referer" '

'"$http_user_agent" "$http_x_forwarded_for" '

'"$gzip_ratio" $request_time $bytes_sent $request_length';

log_format srcache_log '$remote_addr - $remote_user [$time_local] "$request" '

'"$status" $body_bytes_sent $request_time $bytes_sent $request_length '

'[$upstream_response_time] [$srcache_fetch_status] [$srcache_store_status] [$srcache_expire]';

open_log_file_cache max=1000 inactive=60s;

server {

server_name ~^(www\.)?(.+)$;

access_log logs/$2-access.log main;

error_log logs/$2-error.log;

location /srcache {

access_log logs/access-srcache.log srcache_log;

}

}

}

http{

log_formatmain'$remote_addr - $remote_user [$time_local] "$request" '

'"$status" $body_bytes_sent "$http_referer" '

'"$http_user_agent" "$http_x_forwarded_for" '

'"$gzip_ratio" $request_time $bytes_sent $request_length';

log_formatsrcache_log'$remote_addr - $remote_user [$time_local] "$request" '

'"$status" $body_bytes_sent $request_time $bytes_sent $request_length '

'[$upstream_response_time] [$srcache_fetch_status] [$srcache_store_status] [$srcache_expire]';

open_log_file_cachemax=1000inactive=60s;

server{

server_name~^(www\.)?(.+)$;

access_loglogs/$2-access.logmain;

error_loglogs/$2-error.log;

location/srcache{

access_loglogs/access-srcache.logsrcache_log;

}

}

}

3. open_log_file_cache指令

语法: open_log_file_cache max=N [inactive=time] [min_uses=N] [valid=time];

open_log_file_cache off;

默认值: open_log_file_cache off;

配置段: http, server, location

对于每一条日志记录,都将是先打开文件,再写入日志,然后关闭。可以使用open_log_file_cache来设置日志文件缓存(默认是off),格式如下:

参数注释如下:

max:设置缓存中的最大文件描述符数量,如果缓存被占满,采用LRU算法将描述符关闭。

inactive:设置存活时间,默认是10s

min_uses:设置在inactive时间段内,日志文件最少使用多少次后,该日志文件描述符记入缓存中,默认是1次

valid:设置检查频率,默认60s

off:禁用缓存

实例如下:

open_log_file_cache max=1000 inactive=20s valid=1m min_uses=2;

1

open_log_file_cachemax=1000inactive=20svalid=1mmin_uses=2;

4. log_not_found指令

语法: log_not_found on | off;

默认值: log_not_found on;

配置段: http, server, location

是否在error_log中记录不存在的错误。默认是。

5. log_subrequest指令

语法: log_subrequest on | off;

默认值: log_subrequest off;

配置段: http, server, location

是否在access_log中记录子请求的访问日志。默认不记录。

6. rewrite_log指令

由ngx_http_rewrite_module模块提供的。用来记录重写日志的。对于调试重写规则建议开启。 Nginx重写规则指南

语法: rewrite_log on | off;

默认值: rewrite_log off;

配置段: http, server, location, if

启用时将在error log中记录notice级别的重写日志。

7. error_log指令

语法: error_log file | stderr | syslog:server=address[,parameter=value] [debug | info | notice | warn | error | crit | alert | emerg];

默认值: error_log logs/error.log error;

配置段: main, http, server, location

配置错误日志。

本网站文章仅供交流学习 ,不作为商用, 版权归属原作者,部分文章推送时未能及时与原作者取得联系,若来源标注错误或侵犯到您的权益烦请告知,我们将立即删除.

本文链接:https://www.xibujisuan.cn/98842862.html