nginx web服务器工作原理:由内核和模块组成,其中,内核的设计非常微小和简洁,完成的工作也非常简单,通过查找配置文件将客户端请求映射到一个location block (location是nginx 配置中的一个指令,用于URL匹配),而在这个location中所配置的每个指令将会启动不同的模块去完成相应的工作。ps -ef|grep nginx  后,master 进程作用,负责接受管理者的指令,假设nginx需要重启,需要生成新的进程,就是master 生成的。在nginx.conf 中修改worker_processes  2; 在查看进程后,就有两个 worker processes,worker processes 

nginx 的模块从结构上分为核心模块、基础模块、第三方模块

核心模块:http 模块、EVENT 模块 MAIL模块

基础模块:HTTP Access模块  HTTP Fastcgi模块、HTTP proxy 模块,和HTTP Rewirte 模块

第三方模块:HTTP UpstreamRequest Hash模块,Notice模块和 HTTP Access Key模块

nginx 比apache的优点

1、高并发,官方nginx 处理静态文件并发 5w/s,高效且稳定原因,异步非阻塞模式,一个进程可以处理多个连接,采用了epoll模型,与传统的服务器程序架构不一样,epoll是linux内核2.6 以后才出现的,nginx 采用epoll模型,异步非阻塞,

而apache,采用select 模型

select 模型特点:select 选择句柄的时候,是遍历所有句柄,也就是说句柄有时间响应时,select 需要遍历所有句柄才能获取到哪些句柄有事件通知,因此效率非常低。

epoll模型特点:epoll对于句柄事件的选择不是遍历的,是事件响应的,就是句柄上事件来就马上选择出来,不需要遍历整个句柄链表,因此非常高效。

nginx是用c语言写的,而且比较高效,每个work内存占用十几M,而且还是在高并发的情况下,

2、反向代理性能非常好,可用于负载均衡,反向代理之从外网访问内网,正向代理是内网访问外网。

3、内存和cpu占用率低,为 apahce的1/5-1/10

4、功能比apache  少 ,常用的功能都有

5、对php 可使用 cgi 方式和fastcgi方式

 

Apache Httpd的工作模式

4.1 apache三种工作模式

 

我们都知道Apache有三种工作模块,分别为prefork、worker、event。

  • prefork:多进程,每个请求用一个进程响应,这个过程会用到select机制来通知。
  • worker:多线程,一个进程可以生成多个线程,每个线程响应一个请求,但通知机制还是select不过可以接受更多的请求。
  • event:基于异步I/O模型,一个进程或线程,每个进程或线程响应多个用户请求,它是基于事件驱动(也就是epoll机制)实现的。

4.2 prefork的工作原理

如果不用“--with-mpm”显式指定某种MPM,prefork就是Unix平台上缺省的MPM.它所采用的预派生子进程方式也是 Apache1.3中采用的模式。prefork本身并没有使用到线程,2.0版使用它是为了与1.3版保持兼容性;另一方面,prefork用单独的子进程来处理不同的请求,进程之间是彼此独立的,这也使其成为最稳定的MPM之一。

4.3 worker的工作原理

相对于prefork,worker是2.0版中全新的支持多线程和多进程混合模型的MPM。由于使用线程来处理,所以可以处理相对海量的请求,而系统资源的开销要小于基于进程的服务器。但是,worker也使用了多进程,每个进程又生成多个线程,以获得基于进程服务器的稳定性,这种MPM的工作方 式将是Apache2.0的发展趋势。

4.4 event 基于事件机制的特性

一个进程响应多个用户请求,利用callback机制,让套接字复用,请求过来后进程并不处理请求,而是直接交由其他机制来处理,通过epoll机制来通知请求是否完成;在这个过程中,进程本身一直处于空闲状态,可以一直接收用户请求。可以实现一个进程程响应多个用户请求。支持持海量并发连接数,消耗更少的资源。

 

确保进行了安装了linux常用必备支持库。检查是否安装了g++、gcc。rpm -qa | grep gcc 之后需要出现3个包如下图所示。如果没有出现。需要安装g++、gcc。

 

centos安装 源码包nginx步骤 ,nginx工作原理  nginx优点_HTTP

yum install gcc-c++

Nginx官网:http://nginx.org/

Nginx的安装依赖于以下三个包,意思就是在安装Nginx之前首先必须安装一下的三个包,安装顺序为我写的顺序:

 

    c.1 SSL功能需要openssl库,下载地址:http://www.openssl.org/

    c.2 gzip模块需要zlib库,下载地址:http://www.zlib.net/

    c.3 rewrite模块需要pcre库,下载地址:http://www.pcre.org/

 

 d.Nginx的安装包:下载地址为:http://nginx.org/en/download.html

 

把安装包上传到服务器上,后解压,开始安装。

一、首先我们安装SSL功能需要的openssl库插件,命令如下:
    a.1   tar -zxvf  openssl-fips-2.0.9.tar.gz
    a.2   cd openssl-fips-2.0.9
    a.3   ./config
    a.4   make && make install

二 安装gzip模块需要zlib库的安装方法
    b.1   tar -zxvf  zlib-1.2.8.tar.gz
    b.2   cd zlib-1.2.8
    b.3   ./configure 
    b.4   make && make install

三、安装 rewrite模块需要pcre库的安装方法

        a.1   tar -zxvf pcre-8.40.tar.gz

    a.2   cd pcre-8.40

    a.3   ./configure 

    a.4   make && make install

四、安装nginx 

a.1   tar -zxvf soft/nginx-1.8.1.tar.gz
    a.2   cd nginx-1.8.1
    a.3  ./configure --with-pcre=../pcre-8.40/ --with-zlib=../zlib-1.2.8/ --with-openssl=../openssl-fips-2.0.9/
    a.4   make && make install

安装完成。

监测nginx是否安装成功

           a.1  cd /usr/local/nginx/sbin/
    a.2 ./nginx -t

    结果显示:
    nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
    nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful

五、然后关闭防火墙,在浏览器中输入http:ip ,就可以访问到

systemctl stop firewalld.service #停止firewall
systemctl disable firewalld.service #禁止firewall开机启动

centos安装 源码包nginx步骤 ,nginx工作原理  nginx优点_句柄_02

 

六、设置开机启动项

echo "/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf" >> /etc/rc.local

 

查看端口号  netstat -ntp|grep 80

查看nginx 进程  ps -ef|grep nginx  查看主进程和工作进程,工作进程workprocesses 的数量跟nginx.conf中的配置参数work—processes有关

重启nginx  nginx -s reload  含义是平滑重启,是在不停止nginx的情况下,重启nginx,重新加载配置文件,启动新的工作线程,完美停止旧的工作线程。

停止nginx   /usr/local/nginx/sbin/nginx -s stop

七、查看nginx日志

在access.log中都会写入一条记录,记录中包含了请求ip、请求时间、接口url、HTTP状态码、客户端浏览器等信息。

124.207.231.242 - - [21/Jul/2017:11:29:44 +0800] "GET /favicon.ico HTTP/1.1" 404 570 "http://47.94.201.226/" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36"
124.207.231.242 - - [21/Jul/2017:13:16:25 +0800] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36"
124.207.231.242 - - [21/Jul/2017:13:17:00 +0800] "GET /test.php HTTP/1.1" 200 85836 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36"

要求使用一条linux命令,分析access.log,统计日志中每个HTTP请求的访问次数,并且列出前10个访问次数最多的请求。

cat access.log | awk -F\" '{print $2}'|sort|uniq -c|sort -rn|head -10

查询结果

 288026 GET / HTTP/1.1
    650 POST /phpmyadmin/ HTTP/1.1
    650 GET /phpmyadmin/ HTTP/1.1
    290 POST /zabbix/jsrpc.php?output=json-rpc HTTP/1.1
    152 GET / HTTP/1.0
    150 \x03\x00\x00)$\xE0\x00\x00\x00\x00\x00Cookie: mstshash=NCRACK_USER
    126 POST / HTTP/1.1
     95 GET /zabbix/ HTTP/1.1
     67 GET /favicon.ico HTTP/1.1
     65 POST /struts2-showcase/integration/saveGangster.action HTTP/1.0
 

cat 展示文本文件中的所有数据

awk 对文本行数据进行过滤

uniq 统计连续重复数据出现的次数

sort 排序命令

head 获取前N个数据