Nginx

全局配置:进程数 日志 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)