时间:2023-06-29 18:24:01 | 来源:网站运营
时间:2023-06-29 18:24:01 来源:网站运营
为了彻底理解 Nginx,一怒之下我把它的核心知识点扒了个底朝天:server { # 第一个Server区块开始,表示一个独立的虚拟主机站点 listen 80; # 提供服务的端口,默认80 server_name localhost; # 提供服务的域名主机名 location / { # 第一个location区块开始 root html; # 站点的根目录,相当于Nginx的安装目录 index index.html index.html; # 默认的首页文件,多个用空格分开 } # 第一个location区块结果
[root@localhost ~]# tree /usr/local/nginx/usr/local/nginx├── client_body_temp├── conf # Nginx所有配置文件的目录│ ├── fastcgi.conf # fastcgi相关参数的配置文件│ ├── fastcgi.conf.default # fastcgi.conf的原始备份文件│ ├── fastcgi_params # fastcgi的参数文件│ ├── fastcgi_params.default │ ├── koi-utf│ ├── koi-win│ ├── mime.types # 媒体类型│ ├── mime.types.default│ ├── nginx.conf # Nginx主配置文件│ ├── nginx.conf.default│ ├── scgi_params # scgi相关参数文件│ ├── scgi_params.default │ ├── uwsgi_params # uwsgi相关参数文件│ ├── uwsgi_params.default│ └── win-utf├── fastcgi_temp # fastcgi临时数据目录├── html # Nginx默认站点目录│ ├── 50x.html # 错误页面优雅替代显示文件,例如当出现502错误时会调用此页面│ └── index.html # 默认的首页文件├── logs # Nginx日志目录│ ├── access.log # 访问日志文件│ ├── error.log # 错误日志文件│ └── nginx.pid # pid文件,Nginx进程启动后,会把所有进程的ID号写到此文件├── proxy_temp # 临时目录├── sbin # Nginx命令目录│ └── nginx # Nginx的启动命令├── scgi_temp # 临时目录└── uwsgi_temp # 临时目录
worker_processes 1; # worker进程的数量events { # 事件区块开始 worker_connections 1024; # 每个worker进程支持的最杭州接数} # 事件区块结束http { # HTTP区块开始 include mime.types; # Nginx支持的媒体类型库文件 default_type application/octet-stream; # 默认的媒体类型 sendfile on; # 开启高效传输模式 keepalive_timeout 65; # 连接超时 server { # 第一个Server区块开始,表示一个独立的虚拟主机站点 listen 80; # 提供服务的端口,默认80 server_name localhost; # 提供服务的域名主机名 location / { # 第一个location区块开始 root html; # 站点的根目录,相当于Nginx的安装目录 index index.html index.htm; # 默认的首页文件,多个用空格分开 } # 第一个location区块结果 error_page 500502503504 /50x.html; # 出现对应的http状态码时,使用50x.html回应客户 location = /50x.html { # location区块开始,访问50x.html root html; # 指定对应的站点目录为html } } ......
location /image/ { root /usr/local/static/; autoindex on;}
步骤:# 创建目录mkdir /usr/local/static/image # 进入目录cd /usr/local/static/image # 上传照片photo.jpg # 重启nginxsudo nginx -s reload
打开浏览器 输入 server_name/image/1.jpg 就可以访问该静态图片了upstream backserver { server 192.168.0.12; server 192.168.0.13; }
# 权重越高,在被访问的概率越大,如上例,分别是20%,80%。upstream backserver { server 192.168.0.12 weight=2; server 192.168.0.13 weight=8; }
upstream backserver { ip_hash; server 192.168.0.12:88; server 192.168.0.13:80; }
# 哪个服务器的响应速度快,就将请求分配到那个服务器上。upstream backserver { server server1; server server2; fair; }
upstream backserver { server squid1:3128; server squid2:3128; hash $request_uri; hash_method crc32; }
# 当客户端访问www.lijie.com,监听端口号为80,直接跳转到data/www目录下文件server { listen 80; server_name www.lijie.com; location / { root data/www; index index.html index.htm; }} # 当客户端访问www.lijie.com,监听端口号为80,直接跳转到data/bbs目录下文件 server { listen 80; server_name bbs.lijie.com; location / { root data/bbs; index index.html index.htm; }}
# 当客户端访问www.lijie.com,监听端口号为8080,直接跳转到data/www目录下文件 server { listen 8080; server_name 8080.lijie.com; location / { root data/www; index index.html index.htm; }}# 当客户端访问www.lijie.com,监听端口号为80直接跳转到真实ip服务器地址 127.0.0.1:8080server { listen 80; server_name www.lijie.com; location / { proxy_pass http://127.0.0.1:8080; index index.html index.htm; }}
# 优先级1,精确匹配,根路径location =/ { return 400;} # 优先级2,以某个字符串开头,以av开头的,优先匹配这里,区分大小写location ^~ /av { root /data/av/;} # 优先级3,区分大小写的正则匹配,匹配/media*****路径location ~ /media { alias /data/static/;} # 优先级4 ,不区分大小写的正则匹配,所有的****.jpg|gif|png 都走这里location ~* .*/.(jpg|gif|png|js|css)$ { root /data/av/;} # 优先7,通用匹配location / { return 403;}
# 定义限流维度,一个用户一分钟一个请求进来,多余的全部漏掉limit_req_zone $binary_remote_addr zone=one:10m rate=1r/m; # 绑定限流维度server{ location/seckill.html{ limit_req zone=zone; proxy_pass http://lj_seckill; } }
1r/s代表1秒一个请求,1r/m一分钟接收一个请求, 如果Nginx这时还有别人的请求没有处理完,Nginx就会拒绝处理该用户请求。# 定义限流维度,一个用户一分钟一个请求进来,多余的全部漏掉limit_req_zone $binary_remote_addr zone=one:10m rate=1r/m; # 绑定限流维度server{ location/seckill.html{ limit_req zone=zone burst=5 nodelay; proxy_pass http://lj_seckill; } }
为什么就多了一个 burst=5 nodelay; 呢,多了这个可以代表Nginx对于一个用户的请求会立即处理前五个,多余的就慢慢来落,没有其他用户的请求我就处理你的,有其他的请求的话我Nginx就漏掉不接受你的请求http { limit_conn_zone $binary_remote_addr zone=myip:10m; limit_conn_zone $server_name zone=myServerName:10m;} server { location / { limit_conn myip 10; limit_conn myServerName 100; rewrite / http://www.lijie.net permanent; }}
上面配置了单个IP同时并发连接数最多只能10个连接,并且设置了整个虚拟服务器同时最大并发数最多只能100个链接。当然,只有当请求的header被服务器处理后,虚拟服务器的连接数才会计数。刚才有提到过Nginx是基于漏桶算法原理实现的,实际上限流一般都是基于漏桶算法和令牌桶算法实现的。server { listen 80; server_name www.lijie.com; location / { ### 指定上游服务器负载均衡服务器 proxy_pass http://backServer; ###nginx与上游服务器(真实访问的服务器)超时时间 后端服务器连接的超时时间_发起握手等候响应超时时间 proxy_connect_timeout 1s; ###nginx发送给上游服务器(真实访问的服务器)超时时间 proxy_send_timeout 1s; ### nginx接受上游服务器(真实访问的服务器)超时时间 proxy_read_timeout 1s; index index.html index.htm; } }
# 如果访问的ip地址为192.168.9.115,则返回403if ($remote_addr = 192.168.9.115) { return 403; }
## 不允许谷歌浏览器访问 如果是谷歌浏览器返回500 if ($http_user_agent ~ Chrome) { return 500; }
$remote_addr //获取客户端ip$binary_remote_addr //客户端ip(二进制)$remote_port //客户端port,如:50472$remote_user //已经经过Auth Basic Module验证的用户名$host //请求主机头字段,否则为服务器名称,如:blog.sakmon.com$request //用户请求信息,如:GET ?a=1&b=2 HTTP/1.1$request_filename //当前请求的文件的路径名,由root或alias和URI request组合而成,如:/2013/81.html$status //请求的响应状态码,如:200$body_bytes_sent // 响应时送出的body字节数数量。即使连接中断,这个数据也是精确的,如:40$content_length // 等于请求行的“Content_Length”的值$content_type // 等于请求行的“Content_Type”的值$http_referer // 引用地址$http_user_agent // 客户端agent信息,如:Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.76 Safari/537.36$args //与$query_string相同 等于当中URL的参数(GET),如a=1&b=2$document_uri //与$uri相同 这个变量指当前的请求URI,不包括任何参数(见$args) 如:/2013/81.html$document_root //针对当前请求的根路径设置值$hostname //如:centos53.localdomain$http_cookie //客户端cookie信息$cookie_COOKIE //cookie COOKIE变量的值$is_args //如果有$args参数,这个变量等于”?”,否则等于”",空值,如?$limit_rate //这个变量可以限制连接速率,0表示不限速$query_string // 与$args相同 等于当中URL的参数(GET),如a=1&b=2$request_body // 记录POST过来的数据信息$request_body_file //客户端请求主体信息的临时文件名$request_method //客户端请求的动作,通常为GET或POST,如:GET$request_uri //包含请求参数的原始URI,不包含主机名,如:/2013/81.html?a=1&b=2$scheme //HTTP方法(如http,https),如:http$uri //这个变量指当前的请求URI,不包括任何参数(见$args) 如:/2013/81.html$request_completion //如果请求结束,设置为OK. 当请求未结束或如果该请求不是请求链串的最后一个时,为空(Empty),如:OK$server_protocol //请求使用的协议,通常是HTTP/1.0或HTTP/1.1,如:HTTP/1.1$server_addr //服务器IP地址,在完成一次系统调用后可以确定这个值$server_name //服务器名称,如:blog.sakmon.com$server_port //请求到达服务器的端口号,如:80
ngx_http_proxy_module
和 ngx_http_upstream_module
对后端节点做健康检查。nginx_upstream_check_module
模块对后端节点做健康检查。http { # 开启gzip gzip on; # 启用gzip压缩的最小文件;小于设置值的文件将不会被压缩 gzip_min_length 1k; # gzip 压缩级别 1-10 gzip_comp_level 2; # 进行压缩的文件类型。 gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png; # 是否在http header中添加Vary: Accept-Encoding,建议开启 gzip_vary on;}
保存并重启nginx,刷新页面(为了避免缓存,请强制刷新)就能看到效果了。以谷歌浏览器为例,通过F12看请求的响应头部:$date_gmt
和$date_local
的变量。Proxy_set_header THE-TIME $date_gmt;
fastcgi_connect_timeout 300;fastcgi_send_timeout 300;fastcgi_read_timeout 300;
fastcgi_buffer_size 32k;fastcgi_buffers 8 32k;
proxy_buffer_size 16k;proxy_buffers 4 16k;
作者:夏目 链接:http://blog.csdn.net/wuzhiwei549/article/details/122758937如果本文对你有帮助的话,欢迎点赞
关键词:核心,知识,理解