分享一张nginx的架构图

回复 收藏
本帖最后由 lyhabc 于 2016-1-28 16:03 编辑

psb.png


nginx是多线程程序,会有一个master主线程,下面生成很多的worker线程处理http/https请求
主线程读取nginx.conf主配置文件生成相应的线程数(launch workers启动子线程),而且还可以不停机升级nginx( make upgrade)
nginx包含3类模块:核心模块,基础模块,第三方模块
ht_core核心模块
ht_upstream 基础模块
ht_proxy 基础模块
ht_fastcgi 基础模块
还可以添加一些第三方模块,例如memcache客户端和后端的memcached通信

worker线程会加载一些模块,例如用于反向代理的upstream模块,fastcgi代理给php-fpm处理的模块
proxy模块

可以看到它是有层次结构的,web server是nginx,发送到后端app sever处理(php,tomcat),还有memcached

nginx使用事件驱动模式来处理请求,异步I/O,非阻塞,事件模式是epoll/select等,非常高效
内存使用mmap、aio,高级io  sendfile
http
{
include mime.types;
default_type application/octet-stream;
sendfile on;

通过ngx_cache_purge模块  清除图中的proxy cache,反代会cache一些静态资源,减少对后端服务器的压力

-------------------------------------------------------------------
php-fpm
这里纠正一下铭哥上课的错误,铭哥上课时说要重新读取php.ini配置要/etc/init.d/php-fpm restart,其实php-fpm跟nginx一样有reload选项
/etc/init.d/php-fpm reload
/usr/local/php-fpm/sbin/php-fpm logrotate  #跟apache一样切割日志




nginx对php的解析,其实nginx就是一个反向代理,代理后端的php
081144121.jpg


通过location指令把所有.php结尾的请求交给ip:端口fastcgi进程来处理
location ~ \.php$ {
include fastcgi_params;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /mydata/www/wordpress$fastcgi_script_name;
}




location ~ \.jsp$ {
include fastcgi_params;
xx
}


-------------------------------------------------------------
sendfile()对Nginx性能的提升
http://www.linuxidc.com/Linux/2014-05/102321.htm

Linux kernel 2.2之前,(如图)读写数据基本都是使用read系统调用和write系调用,以nginx来说如果一个请求建立,从磁盘的文件到网络连接之间会通过硬件(DMA)---内核层---用户层多次读写系统来完成文件数据的复制传输:从内核层用read系统调用读到用户层,再从用户层用write系统调用写到内核层,每一次用户层到内核层的进行一次上下文转换,这种代价是非常昂贵的。甚至在没有数据变化时这种复制尤其显得多余。如果nginx接受大量并发请求,这种系统调用就会非常频繁,服务器的性能就会下降。

sendfile()对Nginx性能的提升

在Linux kernel2.2版本之后出现了一种叫做“零拷贝(zero-copy)”系统调用机制,目前很多应用服务器如apache、samba、nginx都支持sendfile。注意:sendfile系统调用是一种文件传输的系统调用和kernel系统调用关系不大。

sendfile()对Nginx性能的提升

如图所示,nginx在支持了sendfile系统调用后,避免了内核层与用户层的上线文切换(content swith)工作,大大减少了系统性能的开销。
QQ截图20160128153433.jpg


可以使用man 8 sendfile 进一步了解sendfile系统调用。

----------------------------------------------------------------------nginx目录下的那些temp目录的用途
其实跟fastcgi优化有关

fastcgi_buffers指定本地需要用多少和多大的缓冲区来缓冲FastCGI的应答请求。如果一个PHP脚本所产生的页面大小为256KB,那么会为其分配4个64KB的缓冲区来缓存;如果页面大小大于256KB,那么大于256KB的部分会缓存到fastcgi_temp指定的路径中,但是这并不是好方法,因为内存中的数据处理速度要快于硬盘。一般这个值应该为站点中PHP脚本所产生的页面大小的中间值,如果站点大部分脚本所产生的页面大小为256KB,那么可以把这个值设置为“16 16k”、“4 64k”等。

nginx]# ll
total 36
drwx------ 2 nobody root 4096 Jan 21 10:17 client_body_temp
drwxr-xr-x 3 root   root 4096 Jan 16 13:52 conf
drwx------ 2 nobody root 4096 Jan 26 13:11 fastcgi_temp
drwxr-xr-x 2 root   root 4096 Dec 18 13:47 html
drwxr-xr-x 2 root   root 4096 Jan 28 00:05 logs
drwx------ 2 nobody root 4096 Dec 18 13:48 proxy_temp
drwxr-xr-x 2 root   root 4096 Dec 20 15:50 sbin
drwx------ 2 nobody root 4096 Dec 18 13:48 scgi_temp
drwx------ 2 nobody root 4096 Dec 18 13:48 uwsgi_temp


这就是强劲的nginx






psb.png
2016-01-16 10:34 举报
已邀请:
0

lyhabc

赞同来自:

nginx是多线程程序,会有一个master主线程,下面生成很多的worker线程处理http/https请求
主线程读取nginx.conf主配置文件生成相应的线程数(launch workers启动子线程),而且还可以不停机升级nginx
worker线程会加载一些模块,例如用于反向代理的upstream模块,fastcgi代理给php-fpm处理的模块
proxy模块

可以看到它是有层次结构的,web server是nginx,发送到后端app sever处理(php,tomcat),还有memcached

nginx使用事件驱动模式来处理请求,异步I/O,非阻塞,事件模式是epoll/select,,非常高效
内存使用mmap、aio,高级iosendfile

这就是强劲的nginx
0

Rohero

赞同来自:

{:4_91:}
0

sunwang33

赞同来自:

好文。
0

balich

赞同来自:

学习了
0

旅行

赞同来自:

留下脚印
0

K哥叫啥

赞同来自:

mark  学习到了nginx再来研究
0

weifeng1463

赞同来自:

{:4_107:}
0

zhangzihao

赞同来自:

{:7_227:}
0

prospect

赞同来自:

66666

回复帖子,请先登录注册

退出全屏模式 全屏模式 回复
评分
可选评分理由: