全局配置:进程数 日志 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端口
}
- 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
- 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 >
基于主机的访问控制
代理对象不同:
正向代理 是为客户端做代理
反向代理 是为服务器做代理
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 记录从哪个页面链接访问过来的,可以根据该参数进行防盗链设
置,防盗链从一定程度上缓解了服务器的压力。
日志格式:
日志条目:
查看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报错