nginx 代理01(持续更新)

news2024/11/15 17:57:51

1、如果请求是post,而且请求原是188.188.3.171,处理方式403

   if ($request_method ~* "POST")  # $request_method 等同于request的method,通常是“GET”或“POST” 
                                   # 如果访问request的method值为POST则返回“o”             
   {
       set $test o;
   }
   
   if ($remote_addr = '188.188.3.171') //如果访问地址等于188.188.3.171则返回“k”
   同理 #if  ($remote_addr != '188.188.3.171')  //如果访问地址非188.188.3.171则返回“k”
   {
       Set    $test    "${test}k";      # ${test}=o,所以${test}k=ok
   }
   
   //如果满足上述条件则返回“ok”处理方式为返回403
   if    (  $test    =    ok  )
   {
        Return    403;
    #rewrite    ^(.*)   http://www.fengyuba.com  permanent;
    #如果满足条件则重定向到www.fengyuba.com
   }

参数注释如下:

正则表达式匹配,其中:

* ~ 为区分大小写匹配
* ~* 为不区分大小写匹配
* !~和!~*分别为区分大小写不匹配及不区分大小写不匹配

文件及目录匹配,其中:

* -f和!-f用来判断是否存在文件
* -d和!-d用来判断是否存在目录
* -e和!-e用来判断是否存在文件或目录
* -x和!-x用来判断文件是否可执行

flag标记有:

* last 相当于apache里的[L]标记,表示完成rewrite
* break 终止匹配, 不再匹配后面的规则
* redirect 返回302临时重定向 地址栏会显示跳转后的地址
* permanent 返回301永久重定向 地址栏会显示跳转后的地址

nginx常用变量:

$args 此变量与请求行中的参数相等
$content_length 等于请求行的“Content_Length”的值。
$content_type 等同与请求头部的”Content_Type”的值
$document_root 等同于当前请求的root指令指定的值
$document_uri 与$uri一样
$host 与请求头部中“Host”行指定的值或是request到达的server的名字(没有Host行)一样
$limit_rate 允许限制的连接速率
$uri 等同于当前request中的URI,可不同于初始值,例如内部重定向时或使用index
$server_protocol 等同于request的协议,使用“HTTP/1.0”或“HTTP/1.1”
$server_port 请求到达的服务器的端口号
$server_name 请求到达的服务器名
$server_addr request到达的server的ip,一般获得此变量的值的目的是进行系统调用。为了避免系统调用,有必要在listen指令中指明ip,并使用bind参数。
$request_uri 含有参数的完整的初始URI
$request_method 等同于request的method,通常是“GET”或“POST”
$request_filename 当前请求的文件的路径名,由root或alias和URIrequest组合而成
$request_body_file
$remote_user 等同于用户名,由ngx_http_auth_basic_module认证
$remote_port 客户端port
$remote_addr 客户端ip
$query_string 与$args一样

2、如果是.php或者是.php5结尾的

server {
  listen              80;
  server_name    www.wokao.com;
  index      index.html    index.htm   index.php;
  root    /data/www/wokao;

  location  ~ .*.(php|php5)?$
  {
      Include    test.conf;
      fastcgi_pass    unix:/tmp/php-cgi.sock;
      #fastcgi_pass    127.0.0.1:9000;
      fastcgi_index  index.php;
      include  fcgi.conf;
   }
}

3、NGINX配置中的 events 模块详解

nginx events 模块主要是nginx 和用户交互网络连接优化的配置内容
nginx events模块主要包含了accept_mutex, multi_accept,worker_connections 和 use这几个指令

accept_mutex
这个配置主要可以用来解决常说的"惊群"问题。大致意思是在某一个时刻,客户端发来一个请求连接,Nginx后台是以多进程的工作模式,也就是说有多个worker进程会被同时唤醒,但是最终只会有一个进程可以获取到连接,如果每次唤醒的进程数目太多,就会影响Nginx的整体性能。如果将上述值设置为on(开启状态),将会对多个Nginx进程接收连接进行序列号,一个个来唤醒接收,就防止了多个进程对连接的争抢。

multi_accept
设置一个进程是否同时接受多个网络连接,默认为off

worker_connections
用来配置单个worker进程最大的连接数,nginx 默认连接数是1024,可以设置20480

use
用来设置Nginx服务器选择哪种事件驱动来处理网络消息,事件驱动模型,select|poll|kqueue|epoll|resig|/dev/poll|eventport

注意:此处所选择事件处理模型是Nginx优化部分的一个重要内容,method的可选值有select/poll/epoll/kqueue等,使用linux内核在2.6以上,就是为了能使用epoll函数来优化Nginx

另外这些值的选择,我们也可以在编译的时候使用:–with-select_module、–without-select_module、 --with-poll_module、–without-poll_module来设置是否需要将对应的事件驱动模块编译到Nginx的内核。

events {
    accept_mutex on; #设置网路连接序列化,防止惊群现象发生,默认为on
    multi_accept on; #设置一个进程是否同时接受多个网络连接,默认为off
    use epoll; #事件驱动模型,select|poll|kqueue|epoll|resig|/dev/poll|eventport
    worker_connections 1024; # 最大连接数
}

4、NGINX配置中的 http 模块详解

client_header_buffer_size

假设client_header_buffer_size的配置为1k,如果(请求行+请求头)的大小如果没超过1k,放行请求。如果(请求行+请求头)的大小如果超过client_header_buffer_size配置的1k,如果配置large_client_header_buffers 以配置为准,如果没配置large_client_header_buffers,请求失败

large_client_header_buffers

large_client_header_buffers 4 8k,则对请求有如下要求

1、请求行(request line)的大小不能超过8k,否则返回414错误
2、请求头(request header)中的每一个头部字段的大小不能超过8k,否则返回400错误(实际是494错误,但nginx统一返回400了)
curl -H "header1=aaa" -H "header2=bbb" -v http://127.0.0.1/,这里的header1=xxx和header2=xxx就是请求头中的头部字段
(请求行+请求头)的大小不能超过32k(4 * 8k)

实验client_header_buffer_size、large_client_header_buffers

1、修改nginx配置
      vi nginx.conf

http {
	# 声明日志格式,request_length用来输出每一个请求的大小(请求行+请求头+请求体)
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" $request_length '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
    # 指定访问日志的格式和存放路径
    access_log  /usr/local/var/log/nginx/access.log  main;

	# 请求行+请求头的标准大小为1k
    client_header_buffer_size 1k;
    # 请求行+请求头的最大大小为2k
	large_client_header_buffers 2 1k;
}

2、使用curl模拟http请求

返回 414错误

foo=''; for i in {1..1008}; do foo=${foo}"a"; done
curl -v http://127.0.0.1:80\?$foo   # 先找一个能curl无问题的页面,比如curl 127.0.0.1:8081无问题

​​​​​    curl请求明细

> GET /?1008个a HTTP/1.1
> Host: 127.0.0.1:80
> User-Agent: curl/7.64.1
> Accept: */*
>
< HTTP/1.1 414 Request-URI Too Large
< Server: nginx/1.17.2
< Date: Sat, 02 May 2020 01:45:57 GMT
< Content-Type: text/html
< Content-Length: 177
< Connection: close
<
<html>
<head><title>414 Request-URI Too Large</title></head>
<body>
<center><h1>414 Request-URI Too Large</h1></center>
<hr><center>nginx/1.17.2</center>
</body>
</html>

    nginx日志
    这里显示的是0,但请求行的大小已超过1k了

127.0.0.1 - - [02/May/2020:09:45:57 +0800] "GET /?1008个a HTTP/1.1\x0D" 0 414 177 "-" "-" "-"

返回 494错误

foo='';bar=''; for i in {1..1012}; do foo=${foo}"a"; bar=${bar}"a"; done
curl -H "header1: $foo" -H "header2: $bar" -v http://127.0.0.1:80

     curl请求明细

> GET / HTTP/1.1
> Host: 127.0.0.1:80
> User-Agent: curl/7.64.1
> Accept: */*
> header1: 1012个a
> header2: 1012个a
>
< HTTP/1.1 400 Bad Request
< Server: nginx/1.17.2
< Date: Sat, 02 May 2020 01:48:45 GMT
< Content-Type: text/html
< Content-Length: 233
< Connection: close
<
<html>
<head><title>400 Request Header Or Cookie Too Large</title></head>
<body>
<center><h1>400 Bad Request</h1></center>
<center>Request Header Or Cookie Too Large</center>
<hr><center>nginx/1.17.2</center>
</body>
</html>

     nginx日志

127.0.0.1 - - [02/May/2020:09:48:45 +0800] "GET / HTTP/1.1" 2123 400 233 "-" "curl/7.64.1" "-"

源码及流程图 

include   mime.types

mime.types 是一个文件,此文件记录了nginx能识别哪些类型的文件

[root@master01 nginx]# cd /etc/nginx/

[root@master01 nginx]# ls nginx.conf
nginx.conf

[root@master01 nginx]# cat mime.types

types {
    text/html                                        html htm shtml;
    text/css                                         css;
    text/xml                                         xml;
    image/gif                                        gif;
    image/jpeg                                       jpeg jpg;
    application/javascript                           js;
    application/atom+xml                             atom;
    application/rss+xml                              rss;

    text/mathml                                      mml;
    text/plain                                       txt;
    text/vnd.sun.j2me.app-descriptor                 jad;
    text/vnd.wap.wml                                 wml;
    text/x-component                                 htc;

    image/png                                        png;
    image/svg+xml                                    svg svgz;
    image/tiff                                       tif tiff;
    image/vnd.wap.wbmp                               wbmp;
    image/webp                                       webp;
    image/x-icon                                     ico;
    image/x-jng                                      jng;
    image/x-ms-bmp                                   bmp;

    font/woff                                        woff;
    font/woff2                                       woff2;

    application/java-archive                         jar war ear;
    application/json                                 json;
    application/mac-binhex40                         hqx;
    application/msword                               doc;
    application/pdf                                  pdf;
    application/postscript                           ps eps ai;
    application/rtf                                  rtf;
    application/vnd.apple.mpegurl                    m3u8;
    application/vnd.google-earth.kml+xml             kml;
    application/vnd.google-earth.kmz                 kmz;
    application/vnd.ms-excel                         xls;
    application/vnd.ms-fontobject                    eot;
    application/vnd.ms-powerpoint                    ppt;
    application/vnd.oasis.opendocument.graphics      odg;
    application/vnd.oasis.opendocument.presentation  odp;
    application/vnd.oasis.opendocument.spreadsheet   ods;
    application/vnd.oasis.opendocument.text          odt;
    application/vnd.openxmlformats-officedocument.presentationml.presentation
                                                     pptx;
    application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
                                                     xlsx;
    application/vnd.openxmlformats-officedocument.wordprocessingml.document
                                                     docx;
    application/vnd.wap.wmlc                         wmlc;
    application/x-7z-compressed                      7z;
    application/x-cocoa                              cco;
    application/x-java-archive-diff                  jardiff;
    application/x-java-jnlp-file                     jnlp;
    application/x-makeself                           run;
    application/x-perl                               pl pm;
    application/x-pilot                              prc pdb;
    application/x-rar-compressed                     rar;
    application/x-redhat-package-manager             rpm;
    application/x-sea                                sea;
    application/x-shockwave-flash                    swf;
    application/x-stuffit                            sit;
    application/x-tcl                                tcl tk;
    application/x-x509-ca-cert                       der pem crt;
    application/x-xpinstall                          xpi;
    application/xhtml+xml                            xhtml;
    application/xspf+xml                             xspf;
    application/zip                                  zip;

    application/octet-stream                         bin exe dll;
    application/octet-stream                         deb;
    application/octet-stream                         dmg;
    application/octet-stream                         iso img;
    application/octet-stream                         msi msp msm;

    audio/midi                                       mid midi kar;
    audio/mpeg                                       mp3;
    audio/ogg                                        ogg;
    audio/x-m4a                                      m4a;
    audio/x-realaudio                                ra;

    video/3gpp                                       3gpp 3gp;
    video/mp2t                                       ts;
    video/mp4                                        mp4;
    video/mpeg                                       mpeg mpg;
    video/quicktime                                  mov;
    video/webm                                       webm;
    video/x-flv                                      flv;
    video/x-m4v                                      m4v;
    video/x-mng                                      mng;
    video/x-ms-asf                                   asx asf;
    video/x-ms-wmv                                   wmv;
    video/x-msvideo                                  avi;
}
[root@master01 nginx]#

++++++++++'MIME-type和Content-Type的关系'++++++++++
 
1)HTTP服务器在'响应'一份'报文主体'时,在HTTP'报文头部'插入'解释自身数据类型'的MIME头部信息-->'Content-Type'
 
2)当web'服务器收到'静态的资源文件请求时,依据'请求文件的后缀名'在服务器的'MIME配置文件中找'到对应的'MIME Type',再根据MIME Type'设置HTTP Response的Content-Type',然后'客户端如浏览器'根据Content-Type的值'处理文件'

Content-Type详解

①  服务端如何处理静态资源文件

媒体类型通常是通过 'HTTP' 协议,由 Web 服务器过'Content-Type值'来告知'浏览器'的

媒体类型通常是通过 'HTTP' 协议,由 Web 服务器过'Content-Type值'来告知'浏览器'的
例如:'响应头' -->Content-Type: text/html 

 ②  客户端如何处理Content-Type值请求

浏览器是'如何区分'它们,进而决定'什么内容'用'什么形式'来显示呢?

nginx中关于媒体类型

nginx访问静态文件不下载

①  nginx中的 mime.types文件

'include'表示'纳入mime.types文件'的配置

举例: 形如text'/html格式'的字符串就是用来说明'数据类型'的
1)'/'前的是'主'类型
2)'/之后'的是该主类型下的'子类型'
备注:详细的类型定义在'RFC2046'中

nginx压缩ttf文件踩坑 mine.types的作用 

gzip_types

解决nginx下加载eot|otf|ttf|woff|svg等404 错误问题

②  default_type

 作用:在'mime.type'文件中找不到'文件'映射的'type'时'采用'默认的'default_type'
 如果web程序'没设置,'Nginx也'没找到'对应文件的'扩展名'的'type'话,就使用'默认的Type'

 ③  types

四    案例讲解

比如:当我们打开'chrome浏览器'看一个'PNG格式的图片'的时候,Nginx是这样'发送格式信息'的: 
1)服务器上'有wzj.png'这个文件,后缀名是png;
2)根据'include mime.types'查找到这个文件的'数据类型'应该是'image/png';
3)将'Content-Type'的值设置为'image/png',然后发送给'客户端(浏览器)'

1)如果处理'本地的'文件,在'没有人告诉'浏览器某个文件的 MIME Type 的情况下,浏览器也会做一些'默认的处理'
2)'默认的处理'和你'在操作系统中'给文件配置的 'MIME Type 有关' 
Windows 下: 打开注册表的"HKEY_LOCAL_MACHINESOFTWAREClassesMIMEDatabaseContent Type"主键,可以看到'所有 MIME Type' 的配置信息
 
Linux下:通过一个'文本文件静态'关联数据库,负责将'application'(应用程序描述文件)与'MIME type'(Shared MIME Database)对应起来
 
Centos7该'数据库'为:/usr/share/applications/mimeinfo.cache

Linux MIME Type

+++++++++ 'Content-Type更通用的格式' +++++++++
 
Content-Type: [type]/[subtype]; parameter
 
用于定义网络文件的'类型'和网页的'编码',决定浏览器将以'什么形式'、'什么编码读取'这个文件

Content-Type 标头是'服务器'告诉客户端'实际返回的内容'的'内容类型'
 
++++++++++'语法格式'++++++++++
 
Content-Type: text/html; charset=utf-8

①   查看文件的MIME Type

格式: mimetype filename 
 
备注: mimetype命令'需要安装'
 
yum install perl-File-MimeInfo.noarch -y


②根据文件的MIME type找到打开方式

gio mime mime_type

五   思考

(1)浏览器对于一个文件类型是如何判断渲染显示还是下载

浏览器的'原则'是能'打开'就打开-->'在自己的媒体类型中',不能打开'就下载'
 
1)每个'浏览器内置支持'的 Content-Type 类型表各不相同,这导致了'某些类型字符串'在'某些浏览器下'不被识别
 
2)另外如果'出现错误'的 Content-Type 类型,各个浏览器又会'以不同的方式'处理


 

思考: 如果客户端请求-->'request'的'Content-Type'和服务器响应-->'response'的'Content-Type'不一致呢?

(2)对于特定的文件类型,强制让其显示内容,而不是不能识别导致下载

常见: 'application/octet-stream'
 
   是'HTTP规范中'Content-Type的一种.意思是:'未知'的'应用程序'文件,浏览器一般'不会自动执行'或'询问执行',表示这是个'二进制流',需要'下载到本地'后由'用户端环境决定'如何使用
 
   备注: '如果'提交文件的话,只能'提交一个文件',后台'接收参数'只能有'一个',而且只能是流(或者字节数组)

nginx配置让任何文件在浏览器中显示文本text/plain或者xml,而不是下载

已知: 对于'text/plain'格式的文件,可以在'任何浏览器'中'直接打开'而不会下载

需求: 在nginx中配置'perl'这种特殊结尾的文件为'直接打开',而不是下载
 
+++++++++'从三个粒度来解析'+++++++++

​主要作为'对比'实验

①  默认是下载

说明: nginx的无法识别'perl结尾的文件',能识别'pl和pm'结尾的文件,'并且'如果安装了对应的模块,并在nginx种做了相应的配置,则会'解析该脚本'后返回内容给客户端

②  方式1:全局

vim /etc/nginx/mime.types
 
说明: 最好不要'一种后缀文件'对应'多种媒体类型'
 
注意: 修改之后一定要'restart','reload'不生效
 
备注: 可以'写在同一行',以'空格隔开';也可以'另起一行'
 
细节: 这个方法修改后'影响所有nginx网站'的配置

③  方式2:只针对某种文件类型(推荐)

备注: 甚至可以'自定义文件'类型,但是浏览器可能'不能'按照该种格式解析-->因为是'伪造'的
单独打开'某个网站'的配置文件,在server中修改
 
案例: 所有目录下'以perl结尾的文件'显示为'text/plain'格式
 
location ~ .*\.perl$ {
    add_header Content-Type text/plain;
}

④    方式3:只针对某个站点的某个目录下的文件 

location /perl/ {
    'location嵌套'
    location ~* .*\.perl$ {
        add_header Content-Type text/plain;
    }

⑤    效果展示 

(6)强制设置所有文件都是下载的

header中Content-Disposition的作用与使用方法

location / {
    root   html;
    add_header Content-Disposition "attachment; filename=$1";  
    index  index.html
}

(7)nginx支持播放mkv视频

#nginx.conf
#在server > location块内加入
types{
    video/webm  mkv;
}

default_type  application/octet-stream

如果访问的类型,在 mime.types 中没匹配上,默认使用二进制流的方式传输显示内容

log_format  main  

log_format  main  '$remote_addr|$remote_user|[$time_local]|"$request"|'
                      '$status|$body_bytes_sent|$http_host|"$http_referer"|'
                      '"$http_user_agent"|$http_x_forwarded_for|$upstream_cache_status|'
                      '"$upstream_http_content_type"|$request_time|$upstream_response_time|$bytes_sent|$request_length|'
                      '"$upstream_addr"|$uuid|$span_id';

此配置为 nginx 日志中,显示的信息

nginx服务器日志相关指令主要有两条:一条是log_format,用来设置日志格式;另外一条是access_log,用来指定日志文件的存放路径、格式和缓存大小,可以参加ngx_http_log_module。一般在nginx的配置文件中日记配置(/usr/local/nginx/conf/nginx.conf)。

log_format指令用来设置日志的记录格式,它的语法如下:
log_format name format {format ...}
其中name表示定义的格式名称,format表示定义的格式样式。
 
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_format指令设置的名称在配置文件中是不能重复的。
 
假设将Nginx服务器作为Web服务器,位于负载均衡设备、Squid、Nginx反向代理之后,不能获取到客户端的真实IP地址了。
原因是经过反向代理后,由于在客户端和Web服务器之间增加了中间层,因此Web服务器无法直接拿到客户端的IP。
通过$remote_addr变量拿到的将是反向代理服务器的IP地址。
 
但是,反向代理服务器在转发请求的HTTP头信息中,可以增加X-Forwarded-For信息,用以记录原有的客户端IP地址和原来客户端请求的服务器地址。
这时候,要用log_format指令设置日志格式,让日志记录X-Forearded-For信息中的IP地址,即客户的真实IP。
 
例如,创建一个名为mylogformat的日志格式,再$http_x_forwarded_forlog_for变量记录用户的X_Forwarded-For IP 地址:
log_format mylogformat '$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用于记录远程客户端用户名称;
$time_local用于记录访问时间与时区;
$request用于记录请求URL与HTTP协议;
$status用于记录请求状态,例如成功时状态为200,页面找不到时状态为404;
$body_bytes_sent用于记录发送客户端的文件主体内容大小;
$http_referer用于记录是从哪个页面链接访问过来的;
$http_user_agent用于记录客户浏览器的相关信息。

一般来说:nginx的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"';

想要记录更详细的信息需要自定义设置log_format,具体可设置的参数格式及说明如下:

参数                      说明                                         示例
$remote_addr             客户端地址                                    211.28.65.253
$remote_user             客户端用户名称                                --
$time_local              访问时间和时区                                18/Jul/2012:17:00:01 +0800
$request                 请求的URI和HTTP协议                           "GET /article-10000.html HTTP/1.1"
$http_host               请求地址,即浏览器中你输入的地址(IP或域名)     www.wang.com 192.168.100.100
$status                  HTTP请求状态                                  200
$upstream_status         upstream状态                                  200
$body_bytes_sent         发送给客户端文件内容大小                        1547
$http_referer            url跳转来源                                   https://www.baidu.com/
$http_user_agent         用户终端浏览器等信息                           "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; SV1; GTB7.0; .NET4.0C;
$ssl_protocol            SSL协议版本                                   TLSv1
$ssl_cipher              交换数据中的算法                               RC4-SHA
$upstream_addr           后台upstream的地址,即真正提供服务的主机地址     10.10.10.100:80
$request_time            整个请求的总时间                               0.205
$upstream_response_time  请求过程中,upstream响应时间                    0.002

如下是在nginx的LB代理层使用过的一个配置(nginx.conf中配置):

log_format  main  '$remote_addr $remote_user [$time_local] "$request" '
                  '$status $body_bytes_sent "$http_referer" '
                  '$http_user_agent $http_x_forwarded_for $request_time $upstream_response_time $upstream_addr $upstream_status';

然后在nginx.conf文件或vhosts/*.conf文件中的access_log日志中指定级别为main。如下:

access_log  logs/wiki_access.log main;
error_log   logs/wiki_error.log;
........
110.156.114.121 - [11/Aug/2017:09:57:19 +0800] "GET /rest/mywork/latest/status/notification/count?_=1502416641768 HTTP/1.1" 200 67 "http://wiki.wang-inc.com/pages/viewpage.action?pageId=11174759" Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.78 Safari/537.36 - 0.006 0.006 12.129.120.121:8090 200
112.116.25.18 - [11/Aug/2017:09:57:24 +0800] "POST /json/startheartbeatactivity.action HTTP/1.1" 200 234 "http://wiki.wang-inc.com/pages/resumedraft.action?draftId=12058756&draftShareId=014b0741-df00-4fdc-90ca-4bf934f914d1" Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36 - 0.023 0.023 12.129.120.121:8090 200

其中错误日志 error log 级别分为 debug、info、notice、 warn、error、crit,默认为error ,crit记录的日志最少,而 debug 记录的日志最多,如果你的 nginx 遇到问题,比如502频繁出现,但是看默认的error og并没有看到有意义的信息,那么可以调一下错误日志的级别,调成error 级别时,错误日志记录的内容会更加丰富,该级别在日志名后边定义格式如下,而且也可以将不同的错误类型分开存储如,可以定义多条 error_log

error_log logs/error.log;         # 不写则是全部类型错误
error_log logs/error.log notice;  # notice 类型错误
error_log logs/error.log info;

每个日志级别包括更高级别。例如,如果您将日志级别设置为wam,则Nginx还将记录emror,crit,alert 和 emerg 消息。未指定log_level参数时,默认为error。
 

debug-调试消息。
info-信息性消息
notice-公告。
wamn-警告。
error-处理请求时出错。
crit-关键问题。需要立即采取行动。.
alert -警报。必须立即采取行动。
emerg-紧急情况。系统处于无法使用的状态

sendfile

使用linux的 sendfile(socket, file, len) 高效网络传输,也就是数据0拷贝。 未开启sendfile。再发个比方:咱们现在有两台电脑,我们需要从PC1拿点东西去PC2,那我们就得先拿U盘去PC1里面拷贝,然后再用U盘拷贝到PC2中,而如果开启了这个sendfile,那就相当于直接隔空传过去,省去了拷贝的过程。

sendfile off; 

 咱们的Nginx是假设在CentOS操作系统上的,当服务过来的时候是通过CentOS的网络接口然后转发给Nginx。Nginx拿到信息后会根据其内容去硬盘(SSD)中找到那个目标文件,然后Nginx会把这个文件完整的读一遍,读到自己的内存中再交给应用程序,应用程序也把拿到的文件完整的读进自己的内存,再转发到CentOS的网络接口(当然这里面还有DMA [ Direct Memory Access直接访问内存 ] 的调度,网络接口的缓存和内核的缓存)网络接口再把其发送出去。这里的层层缓存就相当于上面所说的层层复制。

sendfile on;

这里通过Nginx会给内核发送一个信号,此时的应用程序不会再去把文件读取进自己的内存了,而是直接发送这个 sendfile() 信号(当然这其实是一个方法,里面会写明需要传出的文件和socket)给CentOS的网络接口,网络接口在收到信号后回去找到这个目标文件,然后发送出去。

keepalive_timeout  65;

连接的超时时间限制。keepalive_timeout:表示设置客户端连接保持活动的超时时间,单位是秒。在超过这个时间之后,服务器会关闭连接,因此如果您上传数据量较大,连接时间较长,也需要修改该参数的值。完成修改后,重启nginx即可。

client_max_body_size

client_max_body_size:2048 表示客户端请求服务器最大允许大小,单位是兆。如果请求的数据量大于client_max_body_size中设置的值,HTTP协议会报错413"Request Entity Too Large",因此当您上传的数据量较大时,需要将参数值改大。

client_max_body_size          413"Request Entity Too Large"

client_header_buffer_size
large_client_header_buffers   414 Request-URI Too Large、400 Request Header Or Cookie Too Large

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/359373.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MinIO文件系统

3.2 MinIO 3.2.1 介绍 本项目采用MinIO构建分布式文件系统&#xff0c;MinIO 是一个非常轻量的服务,可以很简单的和其他应用的结合使用&#xff0c;它兼容亚马逊 S3 云存储服务接口&#xff0c;非常适合于存储大容量非结构化的数据&#xff0c;例如图片、视频、日志文件、备份…

基于 SmartX 分布式存储的 iSCSI 与两种 NVMe-oF 技术与性能对比

作者&#xff1a;深耕行业的 SmartX 金融团队本文重点SmartX 分布式块存储 ZBS 提供 2 种存算分离架构下的数据接入协议&#xff0c;分别是 iSCSI 和 NVMe-oF。其中&#xff0c;iSCSI 虽然具有很多优势&#xff0c;但不适合支持高性能的工作负载&#xff0c;这也是 SmartX 选择…

《爆肝整理》保姆级系列教程python接口自动化(十九)--Json 数据处理---实战(详解)

简介 上一篇说了关于json数据处理&#xff0c;是为了断言方便&#xff0c;这篇就带各位小伙伴实战一下。首先捋一下思路&#xff0c;然后根据思路一步一步的去实现和实战&#xff0c;不要一开始就盲目的动手和无头苍蝇一样到处乱撞&#xff0c;撞得头破血流后而放弃了。不仅什么…

Java——位运算符

Java——位运算符起因位运算符1.Java中^ 运算符的目的2.Java中& 0xff运算符的目的3.Java中<< 8运算符的目的起因 写这篇文章的起因是在某个地方需要将字节数组byte[]转16进制数字int。见上一篇文章: 进制转换的一些内容&#xff0c;我写出来的方法长这样。 byte[] …

2. RNN 情感评论鉴定

目录1. 加载购物评论数据集2. 构建 RNN 神经网络&#xff08;DNN、CNN、RNN、GNN&#xff09;3. 多循环神经网络原理分析4. LSTM 原理剖析5. LSTM 与 Bi LSTM1. 加载购物评论数据集 file --> setting --> plugins --> Installed --> 搜索【csv Plugin】即可。 …

【前端】浏览器的渲染流程(完整)

本文主要包含以下内容&#xff1a;浏览器渲染整体流程解析 HTML样式计算布局分层生成绘制指令分块光栅化绘制常见面试题浏览器渲染整体流程浏览器&#xff0c;作为用户浏览网页最基本的一个入口&#xff0c;我们似乎认为在地址栏输入 URL 后网页自动就出来了。殊不知在用户输入…

RocketMQ之(一)RocketMQ入门

一、RocketMQ入门一、RocketMQ 介绍1.1 RocketMQ 是什么&#xff1f;1.2 RocketMQ 应用场景01、应用解耦02、流量削峰03、数据分发1.3 RocketMQ 核心组成01、NameServer02、Broker03、Producer04、Consumer1.6 运转流程1.5 RocketMQ 架构01、NameServer 集群02、Broker 集群03、…

NetApp Cloud Volumes ONTAP 将数据复制到云或从云中复制

NetApp Cloud Volumes ONTAP 将数据复制到云或从云中复制&#xff0c;为开发运营和基于云的灾难恢复提供支持。 无论应用位于何处&#xff0c;都可以使用企业级存储,让云存储基础架构更经济、更智能、更合规且更安全。 为什么选择 NetApp Cloud Volumes ONTAP NetApp Cloud …

RocketMQ 第二章

RocketMQ 第二章 7、SpringBoot整合RocketMQ SpringBoot 提供了快捷操作 RocketMQ 的 RocketMQTemplate 对象。 7.1、引入依赖 注意依赖的版本需要和 RocketMQ 的版本相同。 <dependency><groupId>org.apache.rocketmq</groupId><artifactId>rock…

本地部署element-plus文档

由于一直使用的前端组件element-plus&#xff0c;所以需要经常看文档&#xff0c;但无奈官网实在不给力&#xff0c;经常报503或者404&#xff0c;大大影响效率和心情&#xff0c;忍无可忍就本地化部署一套解决此问题。 百度了一下大多数都是使用 vscode的live server, 或者放…

JAVA保姆式JDBC数据库免费教程之02-连接池技术

连接池 连接池概念 ​ 概念&#xff1a;其实就是一个容器(集合)&#xff0c;存放数据库连接的容器。 当系统初始化好后&#xff0c;容器被创建&#xff0c;容器中会申请一些连接对象&#xff0c;当用户来访问数据库时&#xff0c;从容器中获取连接对象&#xff0c;用户访问完…

【MySQL】MySQL 架构

一、MySQL 架构 C/S 架构&#xff0c;即客户端/服务器架构。服务器程序直接和我们存储的数据打交道&#xff0c;多个客户端连接这个服务器程序。客户端发送请求&#xff0c;服务器响应请求。 MySQL 数据库实例 &#xff1a;即 MySQL 服务器的进程 &#xff08;我们使用任务管理…

Vue组件间通信的四种方式(函数回调,自定义事件,事件总线,消息订阅与发布)

目录 概述 props配置项-回调函数实现 自定义事件实现 事件总线实现 消息订阅与发布实现 概述 在组件化编程中&#xff0c;组件间的通信是重要的&#xff0c;我们可以有四种方式实现组件间的通信。 分别是&#xff1a;函数回调&#xff0c;自定义事件&#xff0c;事件总…

可调恒流驱动LED电路分析

https://www.icxbk.com/article/detail?aid884 常规使用的pwm调亮度不仅会导致频闪&#xff0c;而且在长时间使用的时候&#xff0c;有损坏led的风险&#xff0c;所以这次设计了一个恒流调亮度电路&#xff0c;其电路图如下所示 电路原理的解读&#xff1a; 左侧的电位计起着…

【JavaScript】js实现深拷贝的方法

前言 在js中我们想要实现深拷贝&#xff0c;首先要了解深浅拷贝的区别。 浅拷贝&#xff1a;只是拷贝数据的内存地址&#xff0c;而不是在内存中重新创建一个一模一样的对象&#xff08;数组&#xff09; 深拷贝&#xff1a;在内存中开辟一个新的存储空间&#xff0c;完完全全…

Java语言常用哪些运算符?

之前有个大家讨论过java的数据类型&#xff0c;总体来说类型和其他几种语言也相差无几&#xff0c;我为什么会这样说&#xff1f;我们应该都要知道Python可还有个复数类型。 这里主要给大家讲解Java运算符的分类和使用。 一、运算符分类 说到运算符&#xff0c;我们可以先了…

硬件系统工程师宝典(9)-----如何正确使用去耦电容

各位同学大家好&#xff0c;欢迎继续做客电子工程学习圈&#xff0c;今天我们继续来讲这本书&#xff0c;硬件系统工程师宝典。上篇我们说到在电源完整性分析时&#xff0c;明确噪声来源可以有效的避免、解决噪声问题。今天我们来看看电源完整性分析中重要的一环&#xff0c;去…

【自动化测试】web自动化测试验证码如何测?如何处理验证码问题?解决方案......

目录&#xff1a;导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09;前言 在对安全性有要求的…

线程池ThreadPoolExecutor源码剖析

一、Java构建线程的方式 继承Thread &#xff08;也实现了Runnable&#xff09; 实现Runnable 实现Callable &#xff08;与Runnable区别…&#xff09; 线程池方式 &#xff08;Java提供了构建线程池的方式&#xff09;[可以实现Runnable 和 Callable 功能] Java提供了Exe…

使用Vue3实现一个可复制的表格

前言 表格是前端非常常用的一个控件&#xff0c;但是每次都使用v-for指令手动绘制tr/th/td这些元素是非常麻烦的。同时&#xff0c;基础的 table 样式通常也是不满足需求的&#xff0c;因此一个好的表格封装就显得比较重要了。 最基础的表格封装 最基础基础的表格封装所要做…