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。
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开机启动
六、设置开机启动项
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个数据