Nginx

作者: Icarus_ac47 | 来源:发表于2018-09-27 13:58 被阅读0次
    全局配置:进程数 日志 pid文件
    events 事件模块:每个进程的并发链接数
    http:网站的配置,每一个server是一个虚拟主机,有一个默认的server,其他的虚拟主机的配置,php的反向代理等.
    

    nginx3个核心模块:

    CoreModule 核心模块  (进程数等)
                        
                        设置进程数量与CPU数相同
                        指出错误日志 的路径
                        pid 指出其路径
    
    EventsModule 事件驱动模块(工作模式等)
                          
                          指出进程的最大连接数connection   C10K
    
    HttpCoreModule        http内核模块(文档程序类型,配置文件等)
    
                      http   指出访问日志路径
                      长连接 的时间
                      定义子配置文件路径        
    

    centos6 源码安装 Nginx后做开机自启:
    方法一:
    在 rc.local 中加入Nginx的启动路径:

    echo “/usr/local/nginx/sbin/nginx –c /usr/local/nginx/conf/nginx.conf” >> /etc/rc.local
    

    方法二:编写启动脚本并且加入chkconfig

    #vim /etc/init.d/nginx
    #!/bin/bash
    #chkconfig: 99 20
    # description: Oooo this is my nginx startup script
    PROG="/usr/local/nginx/sbin/nginx"
    PIDF="/usr/local/nginx/logs/nginx.pid"
    case $1 in
    start)
    $PROG
    ;; 
    stop)
    kill -s QUIT `cat $PIDF`
    ;;
    restart)
    $0 stop
    $0 start
    ;;
    reload)
    kill -s HUP `cat $PIDF`
    ;;
    *)
     echo "Usage: $0 {start|stop|restart|reload}"
     exit 1
    ;;
    esac
    exit 0
    
    QUIT 从容关闭,关闭主进程顺便关闭工作子进程
    HUP 重载配置用新的配置开始新的工作进程从容关闭旧的工作进程 
    

    Apache和Nginx的区别:

    Nginx
        轻量级,采用 C 进行编写,同样的 web 服务,会占用更少的内存及资源
        抗并发
    nginx 处理静态文件好,静态处理性能比 apache 高三倍以上
        nginx 的设计高度模块化,编写模块相对简单
        nginx 配置简洁,正则配置让很多事情变得简单,而且改完配置能使用 -t 测试配
    置有没有问题,apache 配置复杂 ,重启的时候发现配置出错了,会很崩溃
        nginx 作为负载均衡服务器,支持 7 层负载均衡
        nginx 本身就是一个反向代理服务器,而且可以作为非常优秀的邮件代理服务器
        启动特别容易, 并且几乎可以做到 7*24 不间断运行
    

    Apache

        apache 的 rewrite 比 nginx 强大,在 rewrite 频繁的情况下,用 apache
        apache 发展到现在,模块超多,基本想到的都可以找到
        apache 更为成熟,少 bug ,nginx 的 bug 相对较多
        apache 超稳定
        apache 对 PHP 支持比较简单,nginx 需要配合其他后端用
        apache 在处理动态请求有优势,nginx 在这方面是鸡肋,一般动态请求要 
    apache 去做,nginx 适合静态和反向。
        apache 仍然是目前的主流,拥有丰富的特性,成熟的技术和开发社区
    

    总结:

    1.两者最核心的区别在于 apache 是同步多进程模型,一个连接对应一个进程,而 nginx 是异步的,多个连接(万级别
    )可以对应一个进程。最大的特点:并发量高apache最大2000 nginx官方50000
    2.nginx配置简单,本身就是一个反向代理服务器
    

    虚拟主机:

    基于  域名   IP  端口        但常用基于 域名
    

    基于域名的虚拟主机: 域名不同,端口相同,ip相同

        server {
            listen        80; 只监听这块网卡的端口,前面加上ip的就是基于ip,修改端口就是基于端口的
            server_name www.blackmed.com;  访问这个主机的域名,使用什么域名访问就写那个域名
            charset utf-8;  字符集
    
            location /{     匹配       location后面的/相当于10.1.1.1的/ 也相当于 root 后面的网站发布目录
                root /yahoo/html;  root:发布网站的默认目录
                index index.html index.htm;
                    }
            }
        server {
            listen        80;
            server_name  web.wing.com;
            location /{
                root /wing/html;
                index index.html index.htm;
                    }
            }
    

    1.location 配置

    = 是精确匹配 , 是优先级最高的
    ^~ 匹配一什么开头的 
    ~ 表示区分大小写 的正则匹配
    ~* 表示不区分大小写的正则匹配 
    !~ 表示区分大小写不匹配的正则
    !~*  表示 不区分大小写不匹配的正则
    /   表示通配
    
    注意:优先级依次变小,如果有匹配成功就会立刻停止匹配
    

    2.用户访问控制==连接频率限制,请求频率限制

    连接频率限制是指用同一个ip的连接数,并发数进行限制
    设置一个缓存区保存不同的key,大小为10M,使用远程ip作为key,依次来限制每个源ip的连接数
    http {
                limit_conn_zone $binary_remote_addr zone=addr:10m; 
                       这个是一个变量,获取ip        addr是zone的名字  后面大小是10m
    limit_req_zone  $binary_remote_addr  zone=reqps:10m rate=5r/s;   
    //定义每个IP的每秒请求数量,限制每秒5个连接请求,不延迟
        }
        
        server {
                location / { 
                    ……
                    limit_conn addr 1;  //定义同一个ip的并发最大连接数 这里最大限制到1;高了无效      
          limit_req zone=reqps nodelay;   
     //限制每IP的每秒的PHP页面请求次数为上面定义的rate的值:每秒5个请求,不延迟
                }    
        }
    

    3.用户访问控制:就是通过使用用户和密码才能访问
    4.主机访问控制:就是允许某些主机访问,限制某些主机访问或者限制用户访问某些文件

    location ~* \.(txt|doc)$ {
    root html/test;
    deny all;
    }
    

    rewirte 地址重写 URL 重写

    作用:
    1.可以转换端口,例如80-443的转换
    2.可以隐藏地址,保证地址的安全性
    
    location ~* \.(mp3|mp4)$ {        
        proxy_pass http://localhost:8080        //转发到本机8080端口
    }
    
    1. rewrite /正则/替换后的内容/flags
    rewrit一般在server和location里使用,在location里使用的较多
    
    last: 停止当前这个请求,并根据rewrite匹配的规则重新发起一个请求。新请求又从第一阶段开始执行…
    break:相对last,break并不会重新发起一个请求,只是跳过当前的rewrite阶段,并执行本请求后续的执行阶段
    
        flags标签:
                    last:相当于apache里的[L]标记,表示完成rewrite
                    break:本条规则匹配完成后,终止匹配,不在匹配后面的规则
                    redrite:返回302临时重定向,浏览器会显示调转后面界面
                    permenant:返回301永久重定向,留浏览器会显示调转后的界面
    
    在server块下,会优先执行rewrite部分,然后才会去匹配location块 
    1. rewrite break -        url重写后,直接使用当前资源,不再执行location里余下的语
    句,完成本次请求,地址栏url不变 
    2. rewrite last -        url重写后,马上发起一个新的请求,再次进入server块,重试
    location匹配,超过10次匹配不到报500错误,地址栏url不变 
    3. rewrite redirect –    返回302临时重定向,地址栏显示重定向后的url,爬虫不会更
    新url(因为是临时) 
    4. rewrite permanent –    返回301永久重定向, 地址栏显示重定向后的url,爬虫更新url
    
    
    1. if的语法应用到server或者location中
        if(condition){if条件表达式}
        if可以支持的条件判断匹配符号 
            ~区分大小写  ~*不区分大小写
            !~区分大小写不匹配   !~*不区分大小写不匹配
            -f !-f用来判断是否存在文件
            -d!-d用来判断是否存在目录
            -x!-x用来判断文件是否可执行          
    

    3.return 指令

        用于返回代码给客户端,应用于server或者location环境
        如果访问.sh 结尾的网站返回403操作拒绝
        location ~* .*/.sh$ {
            return 403; 
        }    
    

    4.set 指令

    用于定义一个变量,并且赋值。应用于server,location,if环境。
    语法格式为: set $变量名 变量值
        例:
        当访问任意目录下的whoami.html 都重定向到 /who.html
        location ~* .*/whoami\.html$ {
        set $who 'who.html';
        rewrite .* /$who break;
        }
    

    apache:

     vim /etc/httpd/conf.d/web.conf
        < VirtualHost *:80 > 
            Servername     www.blackmed.cn
            serverAlias           blackmed.cn
            DocumentRoot   /web1
        < /VirtualHost >
        < Directory "/wed1" >
            Require all granted
        < /Directory >
    

    基于主机的访问控制


    111.png

    代理对象不同:

    正向代理 是为客户端做代理
    反向代理 是为服务器做代理
    
    location / {
        proxy_pass  http://192.168.20.10:8000;
        proxy_set_header Host        $host;
        proxy_set_header X-Real-IP $remote_addr;  只记录上一层
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;  记录所有层
    }
    
    一般来说,X-Forwarded-For是用于记录代理信息的,每经过一级代理(匿名代理除外),代理服务器都会把这次请求的
    来源IP追加在X-Forwarded-For中
    
    来自4.4.4.4的一个请求,header包含这样一行
    X-Forwarded-For: 1.1.1.1, 2.2.2.2, 3.3.3.3
    代表 请求由1.1.1.1发出,经过三层代理,第一层是2.2.2.2,第二层是3.3.3.3,
    而本次请求的来源IP4.4.4.4是第三层代理
    
    
    1. 他在正向(如squid)反向(如nginx)代理中都是标准用法,而正向代理中是没有x-real-ip相关的标准的,也就是说,
    如果用户访问你的 nginx反向代理之前,还经过了一层正向代理,你即使在nginx中配置了x-real-ip,取到的也只是
    正向代理的IP而不是客户端真实IP
    2. 大部分nginx反向代理配置文章中都没有推荐加上x-real-ip ,而只有x-forwarded-for,因此更通用的做法自然是
    取x-forwarded-for
    3. 多级代理很少见,只有一级代理的情况下二者是等效的
    4. 如果有多级代理,x-forwarded-for效果是大于x-real-ip的,可以记录完整的代理链路
    

    缓冲区

    Syntax:     proxy_buffering on | off;
    Default:    proxy_buffering on;
    Context:    http, server, location
    proxy_buffering开启的情况下,nignx会把后端返回的内容先放到缓冲区当中,然后再返回给客户端
    (边收边传,不是全部接收完再传给客户端)。
    

    proxy_busy_buffers_size:此指令设置标注“client-ready”缓冲区的最大尺寸。而客户端可以一次读取来自一个缓冲区的数据,缓冲被放置在队列中,批量发送到客户端。此指令控制允许是在这种状态下的缓冲空间的大小。

    注:如果Nginx位于负载均衡器,squid,nginx反向代理之后,web服务器无法直接获取到客户端真实的IP地址。
    $remote_addr获取的是反向代理的IP地址。反向代理服务器在转发请求的http头信息中,可以增加X-Forwarded-For信息,

    日志格式允许包含的变量:

    $remote_addr, $http_x_forwarded_for 记录客户端IP地址
    $remote_user            记录客户端用户名称
    $request                   记录请求的URL和HTTP协议
    $status                     记录请求状态
    $body_bytes_sent      发送给客户端的字节数,不包括响应头的大小
    $bytes_sent               发送给客户端的总字节数
    $connection               连接的序列号
    $connection_requests  当前通过一个连接获得的请求数量。
    $msec                      日志写入时间。单位为秒,精度是毫秒。
    $pipe                       如果请求是通过HTTP流水线(pipelined)发送,pipe值为“p”,否
    则为“.”。
    $http_referer            记录从哪个页面链接访问过来的,可以根据该参数进行防盗链设
    置,防盗链从一定程度上缓解了服务器的压力。
    

    日志格式:


    111.png

    日志条目:


    111.png

    查看Web服务器(nginx apache)的并发请求数及其TCP连接状态:

    #netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
    LAST_ACK 5 (正在等待处理的请求数)
    SYN_RECV 30
    ESTABLISHED 1597 (正常数据传输状态)
    FIN_WAIT1 51
    FIN_WAIT2 504
    TIME_WAIT 1057 (处理完毕,等待超时结束的请求数)
    

    redis

    网站需要有大并发,同一时间超过500人的点击。那么为了快速给客户端相应,你就得建立redis的数据库。通过php调用
    redis来解决大并发。因为redis的数据库基本在内存中,响应快。
    

    优化:

    worker_processes      //定义在events模块上面设置为“auto”与CPU个数一样
    worker_rlimit_nofile     //定义在events模块上面 文件句柄数 默认1024 设高(100000)
    
    sendfile   //用于http模块  sendfile on  开启新的传输方式
    传统:硬盘—>内核buf—>用户buf—>socket相关缓冲区—>协议引擎
    新: 当文件数据被复制到内核缓冲区时,不再将所有数据copy到socket相关的缓冲区,而是仅仅将记录数据位置和长
    度相关的数据保存到 socket相关的缓存,而实际数据将由DMA模块直接发送到协议引擎
    
    tcp_nopush on;  提升网络的传输能力
        防止网络阻塞,此选项允许或禁止使用socket的TCP_CORK的选项,此选项仅在使用sendfile的时候使用
    
    server_tokens   off;  //用于http模块  服务器应答头
        并不会让nginx执行的速度更快,但它可以关闭在错误页面中的nginx版本数字,这样对于安全性是有好处的。
    
    gzip  on;                 //用于http模块   传输过程中压缩数据
        压缩传输,一般对于手机用户,gzip功能要打开,这块比较重要,在本机压缩,传输过去再解压缩
    
    keepalive_timeout
    给客户端分配keep-alive链接超时时间。服务器将在这个超时时间过后关闭链接。
    http {
        keepalive_timeout  120s 120s;
        keepalive_requests 10000;
    }
    超时值(默认75s);值为0会禁用keep-alive
    设置一个keep-alive连接上可以服务的请求的最大数量,当最大请求数量达到时,连接被关闭。默认是100。
    
    client_header_timeout 和client_body_timeout   
            设置请求头和请求体(各自)的超时时间。我们也可以把这个设置低些。
    
    reset_timeout_connection 
        告诉nginx关闭不响应的客户端连接。这将会释放那个客户端所占有的内存空间。
    

    一、解决500错误:
    1、500错误
    指的是服务器内部错误,也就是服务器遇到意外情况,而无法履行请求。
    2、500错误一般有几种情况:
    (1)web脚本错误,如php语法错误,lua语法错误等。
    (2)访问量大的时候,由于系统资源限制,而不能打开过多的文件
    3、一般分析思路:
    (1)查看nginx error log ,查看php error log
    (2)如果是too many open files,修改nginx的worker_rlimit_nofile参数(定义在events模块上),使用ulimit查看系统打开文件限制,修改/etc/security/limits.conf ulimit -n 100000
    (3)如果是脚本的问题,则需要修复脚本错误,并优化代码
    (4)各种优化都做好,还是出现too many open files,那就要考虑做负载均衡,把流量分散到不同服务器上去了

    二、解决502,504错误
    1、使用nginx代理,而后端服务器发生故障;或者php-cgi进程数不够用;php执行时间长,或者是php-cgi进程死掉;已经执行fastCGI等使用情况都会导致502、504。
    2、502 Bad Gateway 是指请求的php-fpm已经执行,但是由于某种原因而没有执行完毕,最终导致php-fpm进程终止。
    一般来说,与php-fpm.conf的设置有关,也与php的执行程序性能有关,网站的访问量大,而php-cgi的进程数偏少。针对这种情况的502错误,只需增加php-cgi的进程数。
    具体就是修改/usr/local/php/etc/php-fpm.conf文件,将其中的max_children值适当增加。
    这个数据要依据你的VPS或独立服务器的配置进行设置。一般一个php-cgi进程占20M内存,你可以自己计算下,适量增多。
    /usr/local/php/sbin/php-fpm restart 然后重启一下.
    3、504 表示超时,也就是客户端所发出的请求没有到达网关,请求没有得到可以执行的php-fpm

    三、解决503错误
    503 Service Temporarily Unavailable错误
    单个ip并发设置过小会导致503报错

    相关文章

      网友评论

          本文标题:Nginx

          本文链接:https://www.haomeiwen.com/subject/pdvsoftx.html