文章目录
一、Nginx相关问题
1.1 Nginx是如何处理一个请求的呢?
(1)nginx在启动时,会解析配置文件,得到需要监听的端口与ip地址;然后在nginx的master进程里面,先初始化好这个监控的socket,再进行listen;然后再fork出多个子进程出来, 子进程会竞争accept新的连接。
(2)此时,客户端就可以向nginx发起连接了。当客户端与nginx进行三次握手,与nginx建立好一个连接后;
(3)此时,某一个子进程会accept成功,然后Nginx创建对连接的封装,即ngx_connection_t结构体。接着,根据事件调用相应的事件处理模块,如http模块与客户端进行数据的交换。
(4)最后,nginx或客户端来主动关掉连接,到此,一个连接就完成了。
1.2 Nginx为什么不使用多线程?为什么性能这么高?nginx是如何实现高并发的?
(1)例如Apache服务器的工作原理,创建多个进程或线程,而每个进程或线程都会为其分配cpu和内存,但是并发过大会榨干服务器资源。由于web server的工作性质决定了每个request的大部份生命都是在网络传输中,实际上花费在server机器上的时间片不多。这是几个进程就解决高并发的秘密所在。即webserver刚好属于网络io密集型应用,不算是计算密集型。
(2)所以Nginx,采用单线程异步非阻塞处理请求,运用epoll模型,提供了一个队列,排队解决,不会为每个请求分配cpu和内存资源,节省了大量资源,同时也减少了大量的CPU的上下文切换。所以才使得Nginx支持更高的并发。
(3)Nginx会有一个master主进程,一个master对应多个worker工作进程,每个worker工作进程可以处理多个请求,每进来一个request,会有一个worker进程去处理。但不是全程的处理,处理到可能发生阻塞的地方,比如向后端服务器转发request,并等待请求返回。那么,这个处理的worker继续处理其他请求,而一旦后端服务器返回了,就会触发这个事件,worker才会来接手,这个request才会接着往下走。
二、Nginx的编译安装及调优
1 编译安装
1、 解压
1)解压tar包: tar zxf nginx-1.15.7.tar.gz
2)隐藏nginx版本,防止被攻击:vim nginx-1.15.7/src/core/nginx.h
nginx-1.15.9目录里的内容
1)auto目录:里面有4个子目录,cc是编译使用的,os是判断操作系统类型的,其他都是辅助configure编译的,也就是操作系统有什么特性供nginx使用
2)CHANGES:各版本的改变,bug修复等信息;CHANGES.ru:nginx作者是俄罗斯人,这是俄罗斯版本
3)conf: 为了方便运维配置,conf目录里有示例文件,安装好后会拷贝到安装目录
4)configure
5)contrib:提供nginx语法检测字体
cp -r contrib/vim/* ~/.vim ##家目录下如果没有.vim目录,手动新建
6)html:默认发布目录,50x.html是报500错误时的页面
7) src:源码目录
修改文件 /nginx-1.15.9/src/core/nginx.h
#define NGINX_VER "nginx/" NGINX_VERSION
改为:
#define NGINX_VER "nginx/"
3) 在Nginx源码 /auto/cc/gcc文件中: vim auto/cc/gcc
- 在此Debug模式模式会插入许多追踪和ASSERT之类的信息,在正常编译过程中结束,会产生几兆大小的包,我们可以在编译之前关闭debug模式,这样在编译结束,只会产生几百K左右的包大小。
# debug
#CFLAGS="$CFLAGS -g" ##本行注释掉,关闭debug日志模式,
2、编译安装nginx
1)解决依赖性,安装gcc编译器和openssl-devel: yum install gcc openssl-devel pcre-devel -y
2)在 /root/nginx/nginx-1.16.1目录下编译:
yum install gcc openssl-devel pcre-devel -y
yum install gd-devel-2.0.35-26.el7.x86_64.rpm -y #这个安装包不是yum源中有的,需要在网上自行下载
3)编译安装nginx
cd nginx-1.16.1
./configure --prefix=/usr/local/nginx --with-http_realip_module --with-http_image_filter_module=dynamic --with-http_ssl_module
make && make install
注意: