Nginx笔记

Nginx笔记

Posted by AnAn on November 10, 2021

介绍

以下学习笔记来自于尚硅谷的Nginx课程

目录

前言

  • 说明 Nginx(发音同“engine X”)是异步框架的网页服务器,也可以用作反向代理负载平衡器HTTP缓存。 该软件由伊戈尔·赛索耶夫(Игорь Сысоев)创建并于2004年首次公开发布。2011年成立同名公司以提供支持。 2019年3月11日,Nginx公司被F5 Networks以6.7亿美元收购。

  • 原理 多进程:一个 Master 进程、多个 Worker 进程 Master 进程:管理 Worker 进程 对外接口:接收外部的操作(信号) 对内转发:根据外部的操作的不同,通过信号管理 Worker 监控:监控 worker 进程的运行状态,worker 进程异常终止后,自动重启 worker 进程 Worker 进程:所有 Worker 进程都是平等的 实际处理:网络请求,由 Worker 进程处理; Worker 进程数量:在 nginx.conf 中配置,一般设置为核心数,充分利用 CPU 资源,同时,避免进程数量过多,避免进程竞争 CPU 资源,增加上下文切换的损耗。

  • 常用命令
    nginx -v #查看版本号
    nginx    #启动
    nginx -s stop #关闭
    nginx -s reload #重新加载
    
  • 默认配置文件
    • nginx.conf

      user  nginx;                                                                                                                                                                                       
      worker_processes  auto;#工作进程数                                                                                                                                                                            
                                                                                                                                                                                                             
      error_log  /var/log/nginx/error.log notice;                                                                                                                                                        
      pid        /var/run/nginx.pid;                                                                                                                                                                     
                                                                                                                                                                                                             
                                                                                                                                                                                                             
      events {                                                                                                                                                                                           
          worker_connections  1024;#最大连接数                                                                                                                                                                      
      }                                                                                                                                                                                                  
                                                                                                                                                                                                             
                                                                                                                                                                                                             
      http {                                                                                                                                                                                             
          include       /etc/nginx/mime.types;                                                                                                                                                           
          default_type  application/octet-stream;                                                                                                                                                        
                                                                                                                                                                                                             
          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  /var/log/nginx/access.log  main;                                                                                                                                                   
                                                                                                                                                                                                             
          sendfile        on;                                                                                                                                                                            
          #tcp_nopush     on;                                                                                                                                                                            
                                                                                                                                                                                                             
          keepalive_timeout  65;                                                                                                                                                                         
                                                                                                                                                                                                             
          #gzip  on;                                                                                                                                                                                     
                                                                                                                                                                                                             
          include /etc/nginx/conf.d/*.conf;                                                                                                                                                              
      }               
          
      
    • conf.d/default.conf

        server {                                                                                                                                                                                           
         listen       80;                                                                                                                                                                               
         listen  [::]:80;                                                                                                                                                                               
         server_name  localhost;                                                                                                                                                                        
                                                                                                                                                                                                             
         #access_log  /var/log/nginx/host.access.log  main;                                                                                                                                             
                                                                                                                                                                                                             
         location / {                                                                                                                                                                                   
             root   /usr/share/nginx/html;                                                                                                                                                              
             index  index.html index.htm;                                                                                                                                                               
         }                                                                                                                                                                                              
                                                                                                                                                                                                             
         #error_page  404              /404.html;                                                                                                                                                       
                                                                                                                                                                                                             
         # redirect server error pages to the static page /50x.html                                                                                                                                     
         #                                                                                                                                                                                              
         error_page   500 502 503 504  /50x.html;                                                                                                                                                       
         location = /50x.html {                                                                                                                                                                         
             root   /usr/share/nginx/html;                                                                                                                                                              
         }                                                                                                                                                                                              
                                                                                                                                                                                                             
         # proxy the PHP scripts to Apache listening on 127.0.0.1:80                                                                                                                                    
         #                                                                                                                                                                                              
         #location ~ \.php$ {                                                                                                                                                                           
         #    proxy_pass   http://127.0.0.1;                                                                                                                                                            
         #}                                                                                                                                                                                             
                                                                                                                                                                                                             
         # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000                                                                                                                           
         #                                                                                                                                                                                              
         #location ~ \.php$ {                                                                                                                                                                           
         #    root           html;                                                                                                                                                                      
         #    fastcgi_pass   127.0.0.1:9000;                                                                                                                                                            
         #    fastcgi_index  index.php;                                                                                                                                                                 
         #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;                                                                                                                             
         #    include        fastcgi_params;                                                                                                                                                            
         #}                                                                                                                                                                                             
                                                                                                                                                                                                             
         # deny access to .htaccess files, if Apache's document root                                                                                                                                    
         # concurs with nginx's one                                                                                                                                                                     
         #                                                                                                                                                                                              
         #location ~ /\.ht {                                                                                                                                                                            
         #    deny  all;                                                                                                                                                                                
         #}                                                                                                                                                                                             
        }     
      

      location值令

      精确匹配: = , 后面的表达式中写的是纯字符串 字符串匹配: ^~ 和 无符号匹配 , 后面的表达式中写的是纯字符串 正则匹配: ~ 和 ~* 和 !~ 和 !~* , 后面的表达式中写的是正则表达式 匹配顺序: = > ^~ > ~ > ~* > /

      1. =
        # 精确匹配,必须是 servername/
        location = / {
          ...
        }
        # 精确匹配,必须是127.0.0.1/login
        location = /login {
          ...
        }
        
        2. ^~ ```properties ## 对uri 起始字符 做 字符串匹配,不是 正则匹配。 区分大小写 ## servername/static/js. location ^~ /static/ {  ... } ```
        
        1. ~
          ##对 uri (可以不是起始字符)做 正则匹配,区分大小写
          ## 区分大小写,以gif,jpg,js结尾
          location ~ \.(gif|jpg|png|js|css)$ {
           ...
          }
          
        2. ~*
          ##对 uri (可以不是起始字符)做 正则匹配,不区分大小写
          ## 不区分大小写,匹配.png结尾的
          location ~* \.png$ {
           ...
          }
          
        3. !~ 和!~*
          ##分别为区分大小写不匹配及不区分大小写不匹配 的正则匹配,可以用于错误页
          ## 区分大小写,匹配不以.xhtml结尾的
          location !~ \.xhtml$ {
           ...
          }
          location !~* \.xhtml$ {
           ...
          }
          
        4. /
          ## 什么都可以
          location / {
           ...
          }
          
        5. @
          ##此种方式的location配置,无法通过外网访问,只能通过内网跳转,实现容错的功能
          location @name { ... }
          

Rewrite重定向&&Return重定向

last  表示完成rewrite 
break  中止Rewirte,不在继续匹配 
redirect  返回临时重定向的HTTP状态302 
permanent  返回永久重定向的HTTP状态301 
1、下面是可以用来判断的表达式: 
-f和!-f用来判断是否存在文件 
-d和!-d用来判断是否存在目录 
-e和!-e用来判断是否存在文件或目录 
-x和!-x用来判断文件是否可执行 
2、下面是可以用作判断的全局变量 
例:http://localhost:88/test1/test2/test.php 
$host:localhost 
$server_port:88 
$request_uri:/test1/test2/test.php 
$document_uri:/test1/test2/test.php 
$document_root:D:\nginx/html 
$request_filename:D:\nginx/html/test1/test2/test.php 
  • Rewrite
    server { 
    listen 80; 
    server_name start.igrow.cn; 
    root html; 
    index index.html index.php; 
    rewrite ^(.*) https://star.igrow.cn$1 permanent; 
    } 
    
  • Return
server { 
  listen 80; 
  server_name start.igrow.cn; 
  return 301 https://$host$request_uri;
}
  • 区别

    rewrite 重定向:需要先做正则匹配,然后再给客户端返回新地址进行重定向(做了两步操作) return 重定向:不需要做正则匹配,直接给客户端返回新地址进行重定向(做了一步操作)

if

// 如果用户设备为IE浏览器的时候,重定向 。如果UA包含"MSIE",rewrite请求到/msid/目录下
if ($http_user_agent ~ MSIE) {
    rewrite ^(.*)$ /msie/$1 break;
}
 
 //如果cookie匹配正则,设置变量$id等于正则引用部分
if ($http_cookie ~* "id=([^;]+)(?:;|$)") {
    set $id $1;
}
 
 //如果提交方法为POST,则返回状态405(Method not allowed)。return不能返回301,302
if ($request_method = POST) {
    return 405;
}

 //限速,$slow可以通过 set 指令设置 
if ($slow) {
    limit_rate 10k;
}
 
//如果请求的文件名不存在,则反向代理到localhost 。这里的break也是停止rewrite检查
if (!-f $request_filename){
    break;
    proxy_pass http://127.0.0.1;
} 
 
 //如果query string中包含"post=140",永久重定向到example.com
if ($args ~ post=140){
    rewrite ^ http://example.com/ permanent;
}
 
 //防盗链
 //如果 valid_referers 条件判断未通过,nginx 则会赋值 invalid_referer 为true
 //语法: valid_referers none | blocked | server_names | string ...;
 //参数说明:
 //none: 不允许 “Referer” 来源头部为空的情况
 //blocked: 不允许“Referer”值为空情况,有可能Referer的值被代理或者防火墙删除
 //server_names: “Referer”来源头部包必须含当前的server_names (当前域名)可以多个

location ~* \.(gif|jpg|png|swf|flv)$ {
    valid_referers none blocked www.jefflei.com www.lfa.com;
    if ($invalid_referer) {
        return 404;
    }
}

//根据文件类型设置过期时间
location ~* \.(js|css|jpg|jpeg|gif|png|swf)$ { 
  if (-f $request_filename) { 
    expires 1h; 
    break; 
  } 
} 

// 禁止访问某个目录
location ~* \.(txt|doc)${ 
  root /data/www/wwwroot/linuxtone/test; 
  deny all; 
}

###常用隐式全局变量

$host  请求主机头字段,否则为服务器名称。
$http_user_agent  客户端agent信息
$http_cookie  客户端cookie信息
$request_method  客户端请求的动作,通常为GET或POST。
$content_length  请求头中的Content-length字段。
$content_type  请求头中的Content-Type字段。
$request_uri  包含请求参数的原始URI,不包含主机名,如:”/foo/bar.php?arg=baz”。
$uri  不包含请求参数的当前URI,$uri不包含主机名,如”/foo/bar.html”。
$document_uri  与$uri相同。
$query_string 
$args  这个变量等于请求行中的参数,同$query_string
$document_root  当前请求在root指令中指定的值。
$limit_rate  这个变量可以限制连接速率。
$request_body_file 
$request_filename  当前请求的文件路径,由root或alias指令与URI请求生成。
$remote_addr  客户端的IP地址。
$remote_port  客户端的端口。
$remote_user  已经经过Auth Basic Module验证的用户名。
$scheme  HTTP方法(如http,https)。
$server_protocol  请求使用的协议,通常是HTTP/1.0或HTTP/1.1。
$server_addr  服务器地址,在完成一次系统调用后可以确定这个值。
$server_name  服务器名称。
$server_port  请求到达服务器的端口号。
//例:
http://localhost:88/test1/test2/test.php
$host:localhost
$server_port:88
$request_uri:http://localhost:88/test1/test2/test.php
$document_uri:/test1/test2/test.php
$document_root:/var/www/html
$request_filename:/var/www/html/test1/test2/test.php

反向代理

  • 正向代理:代理服务的配置内容在客户端,比如http代理 socks5 vemss,代理端后置于客户端
  • 反向代理:代理的配置在服务端,对用户透明,代理端前置于真实服务器

负载平衡器

upstream myserer{
server FuzaiUri:xx
server FuzaiUri:yy
}

location / {
proxy_pass http://myserver
}
  • 策略
    1. 轮询(默认) 如果服务器down掉能自动切换
    2. weight 代表权重,默认为1
        upstream myserer{
        server FuzaiUri:xx  weight 5
        server FuzaiUri:yy  weight 10
        }
      
    3. ip_hash ip分配到hash slot
        upstream myserer{
        ip_hash
        server FuzaiUri:xx
        server FuzaiUri:yy
        }
      
    4. fair(第三方) 根据请求的响应时间分配 响应时间短优先分配
        upstream myserer{
        fair
        server FuzaiUri:xx
        server FuzaiUri:yy
        }
      

动静分离

location ^~ /static/ {
  root /webroot/static/;
}

location ~* \.(gif|jpg|jpeg|png|css|js|ico)$ {
  root /webroot/res/;
}