本节内容:
Nginx 自动调试脚本
编译时,configure 加上--with-debug,
nginx.conf 中
然后:
make install
sbin/nginx
ps -A |grep nginx
然后,找到:
gdb -p
分享下自动化脚本:
sleep 3
sbin/nginx
sleep 3
procnum=`ps -A | grep nginx |tail -n 1 |awk '{print $1}' `
gdb -p $procnum
本节内容:
nginx 负载均衡
将一台Nginx主机当作前端负载均衡服务器,后面通过交换机链接多台web服务器,提供html和php的web界面服务。
通过配置前端负载均衡服务器,可以实现将html界面和php界面的分开访问,即html页面一个服务器,php页面使用另一台服务器达到负载均衡的效果。
或配置多台服务器提供同一个页面的web服务,当访问量很大时,可以均衡web服务器的流量,对同一个页面实现负载均衡。
具体配置:
#vi nginx.conf
#在http中添加如下配置
upstream html.{
server 10.0.8.29:80 weight=1 max_fails=2 fail_timeout=30s;
}
upstream www.{
server 10.0.8.32:80 weight=1 max_fails=2 fail_timeout=30s;
server 10.0.8.31:80 weight=1 max_fails=2 fail_timeout=30s;
} #权重,值相同就平分访问量#最大请求失败次数和失败时间,超出就跳到另一个服务器进行访问。
#以下参数可以根据需求进行设置
#压缩变量设置
gzip on;
# gzip_min_length 2k;
# gzip_buffers 4 64k;
# gzip_http_version 1.1;
# gzip_comp_level 5;
# gzip_types text/plain application/x-javascript text/css application/xml;
# gzip_vary off;
##客户端设置
# client_max_body_size 100m;
# client_body_buffer_size 512k;
# client_header_timeout 5m;
# client_body_timeout 5m;
##代理设置
# proxy_connect_timeout 60;
# proxy_read_timeout 60;
# proxy_send_timeout 60;
# proxy_buffer_size 128k;
# proxy_buffers 4 128k;
# proxy_busy_buffers_size 128k;
# proxy_next_upstream error timeout invalid_header http_500 http_503 http_404;
# proxy_temp_file_write_size 128k;
# proxy_max_temp_file_size 128k;
# proxy_cache_path /tmp/nginx levels=1:2
# keys_zone=one:10m
# inactive=7d max_size=10g;
在server中添加如下配置(可以理解为一个server配置就是一个web服务)
location ~ \.php$ {
proxy_pass http://www.; #此路径由upstream指定。
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
proxy_set_header X-Forward-For $proxy_add_x_forwarded_for;
}
#当访问以.php结尾的页面时,就由proxy_pass跳转到www.进行访问,此页面由前面upstream设置。
location ~ \.html$ {
proxy_pass http://html.;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
proxy_set_header X-Forward-For $proxy_add_x_forwarded_for;
}
#当访问以.html结尾的页面时,跳转到html.进行访问。
本节内容:
nginx高效学习方法
Nginx做为一个高性能的web服务器,相对于apache等服务器来说它的代码量并不是非常庞大,反而非常精简。看过nginx源码的人都知道,nginx将“一切皆为模块”和“所有问题都可以通过加层的方式来解决”这两句话体现得淋漓尽致。
nginx所有功能都由一个一个模块叠加而成,这对快速定位问题非常有用。在计算机行业中有这么一句话,计算机中的所有问题都可以通过增加中间层的方式来解决;比如linux物理内存太少不够用,就通过增加虚拟内存这一层来解决;再比如内存访问磁盘的速度太低,就通过增加调整缓存这一层来解决等等。
nginx也是一样通过增加中间层来解决问题,nginx的大体上分为三层,第一层由核心模块、事件模块,日志模块组成,主要处理配置解析、TCP网络事件等;第二层由http框架模块、mail框架模块等组成,在第一层的基础上处理用户的请求,解析用户请求行、请求头(http协议);第三层由业务模块组成,通过获取第二层解析的用户请求信息进行业务处理。用来做nginx 正向代理、nginx 反向代理用来代理后端文件或作nginx缓存,都相当不错的。
nginx是一个非常优秀的开源软件,学习它可以提高我们编码的能力。相信每个人都能学会nginx,只是时间问题而已,但如何发最少的时间高效的学会nginx呢?本人学习nginx已有大半个月,虽没有完全看完nginx源代码,但也看懂近十个模块的源代码。
分享下学习nginx的一些方法,供大家参考。
第一步、下载nginx源代码,在linux上编译安装
能看懂configure文件的尽量学习一下,看不懂的就算了,编译完后是知道在objs目录下有一个ngx_modules.c文件,这文件里存有nginx模块加载运行的顺序。
第二步、用sourceInsight建立一个nginx源码工程
第三、四步中会用到
第三步、找一本nginx方面的电子书,按照书的流程看一遍
入门级书中一般都会介绍一些nginx常用的配置项、nginx常用的数据结构、以及如何编写nginx模块等等,这些都得学会。看书是有技巧的,在看书时遇到书中对某结构体或者某函数的描述时就将描述信息写在源代码中对相应的结构体或函数边,后续看代码时就不需要再这里找那里找了。
推荐《实战Nginx:取代Apache的高性能Web服务器》,有兴趣的朋友可以参阅下。
第四步、阅读源代码
书看完了,并不代表就学会了,有些细节还得通过看源代码才能知道。
阅读源代码不能无目的的去看,得按照ngx_modules.c文件中模块的编译 顺序一个模块一个模块的去看,模块之间总会有些依赖关系的,前一个模块所做的工作往往后面的模块要用到,不按模块顺序看是要付出很大代价的。
由于在第三步中对一些重要的结构成员已经有描述了,此时看起代码来就不那么困难了。
源代码至少得看两遍,第一遍将每个模块的源码看一遍,知道该模块处理了那些配置项,完成了什么功能;
第二遍得从连接的角度去看,如当nginx收到用户请求时经过那些模块,这些模块对它做了那些处理等。
参考资料:
http://nginx.org/en/docs/ //官方文档,有每个模块处理的配置项
http://www.pagefault.info/?p=188 //nginx的启动过程分析