• nginx 基础


     一 、操作命令

    sudo nginx #打开 nginx
    nginx -s reload|reopen|stop|quit #重新加载配置|重启|停止|退出 nginx
    nginx -t #测试配置是否有语法错误

    建议 使用 nginx -s quit 待nginx进程处理任务完毕进行停止

    nginx -t -c /etc/nginx/nginx.conf

    nginx -s reload -c /etc/nginx/nginx.conf

    nginx [-?hvVtq] [-s signal] [-c filename] [-p prefix] [-g directives]

    -?,-h : 打开帮助信息
    -v : 显示版本信息并退出
    -V : 显示版本和配置选项信息,然后退出
    -t : 检测配置文件是否有语法错误,然后退出
    -q : 在检测配置文件期间屏蔽非错误信息
    -s signal : 给一个 nginx 主进程发送信号:stop(停止), quit(退出), reopen(重启), reload(重新加载配置文件
    -p prefix : 设置前缀路径(默认是:/usr/local/Cellar/nginx/1.2.6/)
    -c filename : 设置配置文件(默认是:/usr/local/etc/nginx/nginx.conf)
    -g directives : 设置配置文件外的全局指令

     二、配置详解

    # user字段表明了Nginx服务是由哪个用户哪个群组来负责维护进程的,默认是nobody
    # 我这里用了cainengtian用户,staff组来启动并维护进程
    # 查看当前用户命令: whoami
    # 查看当前用户所属组命令: groups ,当前用户可能有多个所属组,选第一个即可
    user cainengtian staff;
    
    # worker_processes字段表示Nginx服务占用的内核数量
    # 为了充分利用服务器性能你可以直接写你本机最高内核
    # 查看本机最高内核数量命令: sysctl -n hw.ncpu
    worker_processes 4;
    
    # error_log字段表示Nginx错误日志记录的位置
    # 模式选择:debug/info/notice/warn/error/crit
    # 上面模式从左到右记录的信息从最详细到最少
    error_log  /usr/local/var/logs/nginx/error.log debug;
    
    # Nginx执行的进程id,默认配置文件是注释了
    # 如果上面worker_processes的数量大于1那Nginx就会启动多个进程
    # 而发信号的时候需要知道要向哪个进程发信息,不同进程有不同的pid,所以写进文件发信号比较简单
    # 你只需要手动创建,比如我下面的位置: touch /usr/local/var/run/nginx.pid
    pid  /usr/local/var/run/nginx.pid;
    
    events {
        # 每一个worker进程能并发处理的最大连接数
        # 当作为反向代理服务器,计算公式为: `worker_processes * worker_connections / 4`
        # 当作为HTTP服务器时,公式是除以2
        worker_connections  2048;
    }
    
    http {
        # 关闭错误页面的nginx版本数字,提高安全性
        server_tokens off;
        include       mime.types;
        default_type  application/octet-stream;
    
        # 日志记录格式,如果关闭了access_log可以注释掉这段
        #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可以让读取磁盘IO操作更快
        # 当然如果你在学习的过程中可以打开方便查看Nginx的访问日志
        access_log off;
    
        sendfile        on;
    
        # 在一个数据包里发送所有头文件,而不是一个接一个的发送
        tcp_nopush     on;
    
        # 不要缓存
        tcp_nodelay on;
    
        keepalive_timeout  65;
    
        gzip  on;
        client_max_body_size 10m;
        client_body_buffer_size 128k;
    
        # 关于下面这段在后面紧接着来谈!
        include /usr/local/etc/nginx/sites-enabled/*;
    }
    View Code
    server {
        # Nginx监听端口号
        listen       80;
        # 服务器的名字,默认为localhost,你也可以写成aotu.jd.com,这样子就可以通过aotu.jd.com来访问
        server_name  localhost;
        # 代码放置的根目录
        root /var/www/;
        # 编码
        charset utf-8;    
    
        location / {
            # index字段声明了解析的后缀名的先后顺序
            # 下面匹配到/的时候默认找后缀名为php的文件,找不到再找html,再找不到就找htm
            index index.php index.html index.htm;
            # 自动索引
            autoindex on;
            # 这里引入了解析PHP的东西
            include /usr/local/etc/nginx/conf.d/php-fpm;
        }    
    
        # 404页面跳转到404.html,相对于上面的root目录
        error_page  404              /404.html;
        # 403页面跳转到403.html,相对于上面的root目录
        error_page  403              /403.html;
        # 50x页面跳转到50x.html
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
    View Code
    # 当用root配置的时候,root后面指定的目录是上级目录
    # 并且该上级目录必须含有和location后指定的名称的同名目录,否则404
    # root末尾的"/"加不加无所谓
    # 下面的配置如果访问站点http://localhost/test1访问的就是/var/www/test1目录下的站点信息
    location /test1/ {
        root /var/www/;
    }
    
    # 如果用alias配置,其后面跟的指定目录是准确的,并且末尾必须加"/",否则404
    # 下面的配置如果访问站点http://localhost/test2访问的就是/var/www/目录下的站点信息
    location /test2/ {
        alias /var/www/;
    }

     三、临时重定向

    location /o2blog_wx/ {
        # 当匹配到http://aotu.jd.com/o2blog_wx/的时候会跳转到http://aotu.jd.com/wxblog
        return 302 http://aotu.jd.com/wxblog
    }

    四、配置限制访问

    在一台服务器上的资源不全部都是对外开放的,这个时候就需要通过Nginx配置一个限制访问,比如查看本服务器的PHP信息,我们就可以通过下面配置来实现限制访问:

    # 当匹配到/info的时候只允许10.7.101.224访问,其它的全部限制
    # 同时改写为/info.php
    location = /info {
        allow 10.7.101.224;
        deny all;
        rewrite (.*) /info.php
    }

    这个时候只有IP10.7.101.224的机器才可以访问:aotu.jd.com/info,其它机器都会…

    当然最佳的实践是将IP抽取出来变成白名单,这样子就可以实现部分IP可以访问,其它的不能访问。

    五、优先级

    1、多个server_name

    如果多个文件配置有相同的 server_name ,根据文件名先读取到哪个文件就加载哪个文件的配置

    2、location

    • = 表示精确匹配
    • ^~ 表示uri以某个常规字符串开头,大多情况下用来匹配url路径,nginx不对url做编码,因此请求为/static/20%/aa,可以被规则^~ /static/ /aa匹配到(注意是空格)。
    • ~ 正则匹配(区分大小写)
    • ~* 正则匹配(不区分大小写)
    • !~和!~*分别为区分大小写不匹配及不区分大小写不匹配 的正则
    • / 任何请求都会匹配

    首先匹配 =,其次匹配^~, 其次是按文件中顺序的正则匹配,最后是交给 / 通用匹配。当有匹配成功时候,停止匹配,按当前匹配规则处理请求。

    HTTP

    可以嵌套多个server,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置。

    配置参数属性解释说明参数列表
    include 主模块指令,实现对配置文件所包含的文件的设定,可以减少主配置文件的复杂度,DNS主配置文件中的zonerfc1912,acl基本上都是用include语句  
    default_type 核心模块指令 默认设置为二进制流,也就是当文件类型未定义时使用这种方式
    log_format 日志格式的设定 日志格式的名称,可自行设置,后面引用
    access_log 引用日志 引用log_format设置的名称
    keepalive_timeout 设置客户端连接保存活动的超时时间 0是无限制
    sendfile 开启高效文件传输模式 on / off
    tcp_nopush 开启防止网络阻塞 on / off
    tcp_nodelay 开启防止网络阻塞 on / off
    upstream 负载均衡  
    server Nginx的server虚拟主机配置  

    Upstream

    它的作用是实现在轮询和客户端IP之间的后端服务器负荷平衡。

    配置参数属性解释说明
    轮询(默认) 当weight不指定时,各服务器weight相同,每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。
    weight 指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况
    ip_hash 每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。
    fair(第三方) 按后端服务器的响应时间来分配请求,响应时间短的优先分配。
    url_hash(第三方) 按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。

    weight 默认为1.weight越大,负载的权重就越大。

    Nginx Upstream状态

    例如:

    upstream news {
        server 127.0.0.1:9527 backup;
        server 127.0.0.1:9527 weight=1 max_fails=2 fail_timeout=3;
        ...
    }
    复制代码
    配置参数属性解释说明
    backup 预留的备份服务器
    down 当前的server暂时不参与负载均衡
    fail_timeout 经过max_fails 失败后,服务暂停的时间
    max_conns 限制最大的接收的连接数
    max_fails 允许请求失败的次数

    use location:在server中添加

    proxy_pass http://127.0.0.1:9527;
    // 因为我的API接口是这个,such as /api/profile
    // location 具体匹配规则详见后面
    location ~ /api/ {
        proxy_pass http://127.0.0.1:9527;
    }
    复制代码

    Server

    配置虚拟主机的相关参数,一个http中可以有多个server

    配置参数属性解释说明参数列表
    listen 监听端口 http -> 80 / https -> 443
    server_name 设置主机域名 localhost
    charset 设置访问的语言编码  
    access_log 设置虚拟主机访问日志的存放路径及日志的格式  
    location 设置虚拟主机的基本信息  
    Location

    配置请求的路由,以及各种页面的处理情况。

    配置参数属性解释说明参数列表
    root 设置虚拟主机的网站根目录 Vue项目的根目录/Users/rainy/Desktop/MyWork/Work/cloudwiz-website/dist
    index 设置虚拟主机默认访问的网页 index.html index.htm
    proxy 通过不同协议将请求从NGINX传递到代理服务器  
    • =: 开头表示精确匹配,如 api 中只匹配根目录结尾的请求,后面不能带任何字符串.
    • ^~ :开头表示uri以某个常规字符串开头,不是正则匹配.
    • ~: 开头表示区分大小写的正则匹配.
    • ~*: 开头表示不区分大小写的正则匹配.
    • / : 通用匹配, 如果没有其它匹配,任何请求都会匹配到.

    匹配优先级(高到低)

    1. location =
    2. location 完整路径
    3. location ^~ 路径
    4. location ~,~* 正则顺序
    5. location 部分起始路径
    6. /

    详见Location配置

    Reverse Proxy

    NGINX代理请求时,它会将请求发送到指定的代理服务器,获取响应并将其发送回客户端。可以使用指定的协议将请求代理到HTTP服务器(另一个NGINX服务器或任何其他服务器)或非HTTP服务器(可以运行使用特定框架(如PHPPython)开发的应用程序)。

    location  / some / path /  {
        proxy_pass  http://www.example.com:8080;
        
        proxy_set_header  Host  $ host ; 
        proxy_set_header  X-Real-IP  $ remote_addr ;
        
        // 禁用特定位置的缓冲
        proxy_buffering  off ;
        proxy_buffers  16  4k ; 
        proxy_buffer_size  2k ;
        
        proxy_bind  127.0.0.2 ; // IP地址也可以用变量指定
    }
    复制代码

    将请求传递给非HTTP代理服务器,**_pass应使用相应的指令:

    配置参数属性解释说明参数列
    proxy_pass 将请求传递给HTTP代理服务器  
    proxy_set_header 传递请求标头 默认情况下,NGINX在代理请求中重新定义两个头字段“Host”和“Connection”,并删除其值为空字符串的头字段。“Host”设置为$proxy_host变量,“Connection”设置为close
    proxy_buffering 负责启用和禁用缓冲 on / off
    proxy_buffers 请求分配的缓冲区的大小和数量  
    proxy_buffer_size 代理服务器的响应的第一部分存储在单独的缓冲区大小 通常包含一个相对较小的响应头,并且可以比其余响应的缓冲区小。
    proxy_bind 接受来自特定IP网络或IP地址范围的连接 指定proxy_bind必要网络接口的指令和IP地址

    详见Proxy

    全局变量Global Variable

    变量名变量含义
    $args 请求中的参数
    $content_length HTTP请求信息里的Content-Length
    $content_type 请求信息里的Content-Type
    $host 请求信息中的Host,如果请求中没有Host行,则等于设置的服务器名
    $http_cookie cookie 信息
    $http_referer 引用地址
    $http_user_agent 客户端代理信息
    $remote_addr 客户端地址
    $remote_port 客户端端口号
    $remote_user 客户端用户名,认证用
    $request_method 请求的方法,比如GETPOST
    $request_uri 完整的原始请求URI(带参数)
    $scheme 请求方案,httphttps
    $server_addr 接受请求的服务器的地址,如果没有用listen指明服务器地址,使用这个变量将发起一次系统调用以取得地址(造成资源浪费);
    $server_protocol 请求的协议版本,HTTP/1.0HTTP/1.1
    $uri 请求中的当前URI, $uri在请求处理期间 ,值可能会发生变化,例如在执行内部重定向或使用索引文件时

    1. index

      语法:index file ...; 默认为index index.html;

      index指令指定了被作为index的文件,比如上面的index.html

      但是在下面这种情况下,对/index.html的请求将会被第二个location block处理,因为第一个与/index.html并不是完全匹配。

      location = / {
          index index.html;
      }
      location / {
          ...
      }
    2. try_files

      root /var/www/main;location / {    try_files $uri $uri.html $uri/ /fallback/index.html;
      }
      location /fallback {
          root /var/www/another;
      }

      /page的请求将会首先进入第一个location, 然后尝试在/var/www/main 下依次查找pagepage.htmlpage/,如果都没有找到的话将会被重定向到/fallback/index.html,并由第二个location提供/var/www/another/fallback/index.html

    3. rewrite

      通过Perl兼容的正则表达式改变请求的URI,语法:rewrite regex replacement [flag];

      flag的值可以是:

      • last

        结束当前的rewrite指令,并用修改过的URI去匹配其他的location block

      • break

        结束当前的rewrite指令。

      • redirect

        当替换的URI(replacement)不以 “http://”,“https://”“$scheme”开头时进行状态码为302的暂时性的重定向。

      • permanent

        返回一个状态码为301的永久重定向。

    4. error_page

      root /var/www/main;
      location / {    error_page 404 /another/whoops.html;
      }
       
      location /another {
          root /var/www;
      }

      除了/another之外的请求都会在/var/www/main查找请求的资源,如果没有找到相关资源将会重定向到/another/whoops.html,由第二个location block处理,查找/var/www/another/whoops.html

  • 相关阅读:
    python class属性
    获取安卓系统日志输出
    深入理解C#中的IDisposable接口(转)
    Mac开启自带的Apache服务器
    【转】《Unity Shader入门精要》冯乐乐著 书中彩图
    AssetDatabase的方法总结
    C# 读写XML文件的方法
    tkinter模块常用参数(python3)
    Unity在Project视图里面显示文件的拓展名
    Git忽略提交规则
  • 原文地址:https://www.cnblogs.com/shangyueyue/p/10991795.html
Copyright © 2020-2023  润新知