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报错

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,064评论 5 466
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,606评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,011评论 0 328
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,550评论 1 269
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,465评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 47,919评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,428评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,075评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,208评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,185评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,191评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,914评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,482评论 3 302
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,585评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,825评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,194评论 2 344
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,703评论 2 339

推荐阅读更多精彩内容

  • 1. Nginx的模块与工作原理 Nginx由内核和模块组成,其中,内核的设计非常微小和简洁,完成的工作也非常简单...
    rosekissyou阅读 10,173评论 5 124
  • 这篇是Nginx安装配置PHP(FastCGI)环境的教程。Nginx不支持对外部程序的直接调用或者解析,所有的外...
    SkTj阅读 3,080评论 2 20
  • 第一章 Nginx简介 Nginx是什么 没有听过Nginx?那么一定听过它的“同行”Apache吧!Ngi...
    JokerW阅读 32,623评论 24 1,002
  • Nginx简介 解决基于进程模型产生的C10K问题,请求时即使无状态连接如web服务都无法达到并发响应量级一万的现...
    魏镇坪阅读 1,981评论 0 9
  • 在实际的开发和应用中偶发的502,504让人头痛,下面转发一个写的比较全面的。 PHP-fpm PHP-FPM是一...
    daos阅读 2,323评论 2 18