读实战Nginx取代Apache的高性能Web服务器之笔记
原书作者:张宴
原书博客:
书中示例代码:
http://blog.s135.com/book/nginx/code
原书作者邮箱:
Nginx官方:
http://nginx.org/ (英文)
第一章:基础篇
LInux下主要web平台有Apache、Nginx、Lighttpd、Tomcat、IBMWebSphere。以及windows下的IIS
国内使用Nginx平台的有,新浪博客,新浪播客、网易新闻、六间房、56..com、Discuz官方论坛、水木社区、豆瓣、YUPOO相册、海内SNS、迅雷在线等
两图对比
使用理由:
官方测试:Nginx支持5万并连接、实际生产可支撑2~4万并发连接数。Nginx使用Epoll(Linux2.6内核)和Kqueue(Freebsd)网络I/O Apache则使用select模型,其实比较稳定的Prefork模式为多进程模式,所以需派生子进程,所以占用资源比Nginx高。
Nginx与PHp(FastCGI)内存占用算法:
单个Nignx进程消耗内存:15MB
单个Php-cgi进程消耗:20MB
3万并发则会开启10个Nginx进程以及64个php-cgi进程
成本低廉:
同等产品F5、BIG-IP、NetScale等硬件负载均衡交换机需十多万甚至几十万,而Nginx采用2-clause BSD-like协议,可以免费使用,并且可以用于商业用途。
配置文件非常简单(通俗易懂)、支持Rewrite重写规则(根据域名、URL的不同,将HTTP分发到后端服务器群组上)。内置的健康检查功能(某台web挂了,不会影响前段访问)、节省带宽(支持Gzip压缩)、稳定性高、(用于反向代理,基本上不会挂)支持热部署。
第二章Nginx的安装
官方下载地址:http://nginx.org/en/download.html 下载最稳定的版本
依赖包: gcc zlib zlib-devel openssl openssl-devel pcre pcre-devel
CenTos:yum -y install gcc gcc-c++ autoconf automake zlib zlib-devel openssl openssl-devel pcre pcre-devel
Tar zxvf nginx-x.xx.tar.gz //解压包
Cd nginx-x.xx //进入包
./configure //预配置 明确请 ./configure --help配置设置
Make //预编译
Make //编译安装
Nginx的启动
/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
可执行文件路径 参数(指定配置目录) 配置文件路径
Nginx的停止
PS -ef | grep nginx 查找Nginx的主进程号
Master process 为主进程号, worker procexx为从进程号
Kill -信号类型
1从容停止nginx
Kill -QUIT Nginx主进程号
快速停止 Nginx
Kill - TERM Nginx主进程号 kill -INT nginx主进程号
强制停止Nginx进程
Pkill -9 nginx
Nginx的平滑重启
过程:Nginx接收到HUb信叫,它先解析配置文件,成功应用新的配置文件,如果失败还是用卓越的配置文件
Pd Nginx配置文件是否正确
/usr./local/webserver/nginx/sbin/nginx -t -c /usr/local/webserver/nginx/conf/nginx.conf
Kill -HUP 主进程号
------------------------------------------------------------------------------------------------------------------------
[root@nginx1 nginx-1.0.12]# /usr/local/fzserver/sbin/nginx -t -c /usr/local/fzserver/conf/nginx.conf
nginx: the configuration file /usr/local/fzserver/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/fzserver/conf/nginx.conf test is successful
[root@nginx1 nginx-1.0.12]#
[root@nginx1 nginx-1.0.12]#
[root@nginx1 nginx-1.0.12]#
[root@nginx1 nginx-1.0.12]# ps -ef |grep nginx
root 9395 1 0 06:26 ? 00:00:00 nginx: master process /usr/local/fzserver/sbin/nginx -c /usr/local/fzserver/conf/nginx.conf
nobody 9396 9395 0 06:26 ? 00:00:00 nginx: worker process
root 9400 6881 0 06:29 pts/0 00:00:00 grep nginx
[root@nginx1 nginx-1.0.12]#
[root@nginx1 nginx-1.0.12]#
[root@nginx1 nginx-1.0.12]# kill -HUP 9395
------------------------------------------------------------------------------------------------------------------
信号控制:
TERM,INT 快速关闭;
QUIT 从容关闭
HUP 平滑重启
USR 重新打开日志文件,在切割日志时用途较大
USR2 平滑升级可执行程序
WINCH 从容关闭工作进程
NGinx的平滑升级
过程:使用新的可执行程序,或编译包代替到旧的目录当中,然后关闭旧的主进程号(kill -USR2),再然后启动新的主进程和子进程,然后再关闭旧的子进程。就完成一次平滑升级了
--------------------------------------------------------------
先安装或替换
Ps -ef |grep nginx 查看旧版本的主进程号
Kill -USR2 旧版本的主进程号(会重命名可执行文件为 path/logs/nginx.pid.oldbin)
Kill -WINCH 旧版本的主进程号
Kill -HUB 旧版本的主进程号
Kill -QUIT 旧版本的主进程号
-------------------------------------------------------------
第三章Nginx的基本配置与优化
配置文件组成:
.....
Events
{
.....
}
http
{
....}
Server
{
.......
}
Server
{
//多个server组成
}
......
}
虚拟主机:
添加两个虚拟IP
[root@nginx1 nginx-1.0.12]# ifconfig eth0:1 192.168.100.82 broadcast 192.168.100.1 netmask 255.255.255.128 up
[root@nginx1 nginx-1.0.12]# route add -host 192.168.100.82 dev eth0:1
[root@nginx1 nginx-1.0.12]# ifconfig eth0:1 192.168.100.83 broadcast 192.168.100.1 netmask 255.255.255.128 up
[root@nginx1 nginx-1.0.12]# route add -host 192.168.100.83 dev eth0:1
重启后会消失,所以建议写在 etc/rc.local
虚拟主机基于主机
虚拟主机则在nginx.conf中配置就成
...
http{
server{
虚拟主机1
}
server{
虚拟主机2
}
}
....
基于域名:
...
http{
server{
虚拟主机1
Server_name xxxx.xxx.com;
}
server{
虚拟主机2
Server_name xxxx.xxx.com;
}
}
....
日志切割过程:
设定的时间段把文件移动到日志目录,然后由nginx平滑重启,过程中会创建一个默认的日志记录。
脚本如下。
#! /bin/bash
#日志路径
Log_path="/date1/logs"
Mkdir -p $(logs_path)$(date -d "yesterday"+"%Y")/$(date -d "yesterday" + "%m")/mv $(logs_path)access.log $(logs_path)$(date -d "yesterday" + "%Y")/$(date -d "yesterday" + "&m")/access_$(date -d "yesterday" + "%Y%m%d").log
Kill -usr1 'cat /usr/local/fzserver/nginx.pid'
创建00:00执行脚本
Crontab -e
00 00 8 * * * /bin/bash /usr/local/fzserver/sbin/cut_nginx_log.sh
Nginx压缩过程
Web服务器压缩可以变为原来的30%大小,然后交后客户端浏览器去解析。
代码放与http{}中
# 开启gzip压缩
------------------------------------------------------------------------------------------
gzip on;
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_http_version 1.1;
gzip_comp_level 2;
gzip_types text/plain application/x-javascript text/css application/xml;
gzip_vary on;
------------------------------------------------------------------------------------------
Nginx列目录
Location /{
Autoindex on;
}
Nginx浏览器本地缓存
过程:为了加快速度,浏览器(用户本地)保存了用户刚才访问的页面,下次访问时直接读取,
Expires [time|epoch|max|off]
默认值:expires off
作用域:http server location
--------------------------------
Localtion - .*\.(gif|jpg|jpeg|png|bmp|swf)$
{
Expires 30d;
}
Location ~ .*\.(js|css)?$
{
Expires lh;
}