文章目录
nginx
nginx是什么?
- Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。
- Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行。其特点是占有内存少,并发能力强,事实上nginx的并发能力在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。
为什么用Nginx?
(1)跨平台、配置简单;
(2)非阻塞、高并发连接:处理2-3万并发连接数,官方监测能支持5万并发;
(3)内存消耗小:开启10个nginx才占150M内存,Nginx采取了分阶段资源分配技术;
(4)nginx处理静态文件好,耗费内存少;
(5)内置的健康检查功能:如果有一个服务器宕机,会做一个健康检查,再发送的请求就不会发送到宕机的服务器了。重新将请求提交到其他的节点上。
(6)节省宽带:支持GZIP压缩,可以添加浏览器本地缓存;
(7)稳定性高:宕机的概率非常小
(8)master/worker结构:一个master进程,生成一个或者多个worker进程。
(9)接收用户请求是异步的:浏览器将请求发送到nginx服务器,它先将用户请求全部接收下来,再一次性发送给后端web服务器,极大减轻了web服务器的压力;
(10)一边接收web服务器的返回数据,一边发送给浏览器客户端;
(11)网络依赖性比较低,只要ping通就可以负载均衡;
(12)事件驱动:通信机制采用epoll模型。
nginx和Apache的区别?
两者最核心的区别在于apache是同步多进程模型,一个request对应一个进程,而nginx是异步的,多个连接(万级别)可以对应一个进程。
一般来说,需要性能的web服务,用nginx,如果不需要性能只求稳定,更考虑Apache,后者的各种模块实现的比前者好很多,epoll网络IO模型是nginx处理性能高的根本,但并不是所有情况下epoll大获全胜的,如果本身提供静态服务的只有几个文件,apache的select模型或许比epoll更高性能。当然,这只是一个假设,真正还需要实测了再说。
更通用的方案是,前端nginx抗并发,后端apache集群,配合起来会更好。
工作模式
nginx有两种工作模式:master-worker模式和单进程模式。在master-worker模式下,有一个master进程和至少一个的worker进程,单进程模式顾名思义只有一个进程。这两种模式有各自的特点和适用场景。
master-worker
该模式下,nginx启动成功后,会有一个master进程和至少一个的worker进程。master进程负责处理系统信号,加载配置,管理worker进程(启动,杀死,监控,发送消息/信号等)。worker进程负责处理具体的业务逻辑,也就是说,对外部来说,真正提供服务的是worker进程。生产环境下一般使用这种模式,因为这种模式有以下优点:
- 稳定性高,只要还有worker进程存活,就能够提供服务,并且一个worker进程挂掉master进程会立即启动一个新的worker进程,保证worker进程数量不变,降低服务中断的概率。
- 配合linux的cpu亲和性配置,可以充分利用多核cpu的优势,提升性能
- 处理信号/配置重新加载/升级时可以做到尽可能少或者不中断服务
单进程模式
单进程模式下,nginx启动后只有一个进程,nginx的所有工作都由这个进程负责。由于只有一个进程,因此可以很方便地利用gdb等工具进行调试。该模式不支持nginx的平滑升级功能,任何的信号处理都可能造成服务中断,并且由于是单进程,进程挂掉后,在没有外部监控的情况下,无法重启服务。因此,该模式一般只在开发阶段和调试时使用,生产环境下不会使用。
搭建并部署
安装
nginx大部分常用模块,编译时./configure --help
以–without开头的都默认安装。
–prefix=PATH : 指定nginx的安装目录。默认 /usr/local/nginx
–conf-path=PATH : 设置nginx.conf配置文件的路径。nginx允许使用不同的配置文件启动,通过命令行 中的-c选项。默认为prefix/conf/nginx.conf
–user=name: 设置nginx工作进程的用户。安装完成后,可以随时在nginx.conf配置文件更改user指令。 默认的用户名是nobody。–group=name类似
–with-pcre : 设置PCRE库的源码路径,如果已通过yum方式安装,使用–with-pcre自动找到库文件。使 用–with-pcre=PATH时,需要从PCRE网站下载pcre库的源码(版本4.4 - 8.30)并解压,剩下的就交给Nginx 的./configure和make来完成。perl正则表达式使用在location指令和 ngx_http_rewrite_module模块中。
–with-zlib=PATH : 指定 zlib(版本1.1.3 - 1.2.5)的源码解压目录。在默认就启用的网络传输压缩 模块ngx_http_gzip_module时需要使用zlib 。
–with-http_ssl_module : 使用https协议模块。默认情况下,该模块没有被构建。前提是openssl与 openssl-devel已安装
–with-http_stub_status_module : 用来监控 Nginx 的当前状态
–with-http_realip_module : 通过这个模块允许我们改变客户端请求头中客户端IP地址值(例如XReal-IP 或 X-Forwarded-For),意义在于能够使得后台服务器记录原始客户端的IP地址
–add-module=PATH : 添加第三方外部模块,如nginx-sticky-module-ng或缓存模块。每次添加新的模 块都要重新编译(Tengine可以在新加入module时无需重新编译)
#1.下载nginx
#2.tar zxf nginx-1.14.0.tar.gz
#3.cd nginx-1.14.0 ##讲解里面各目录的意义
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:源码目录
8) 编译完成后会生成一个中间目录objs,里面有个ngx_modules.c,表示编译进nginx的模块,可以打开看一下
9) make完成后再看objs目录,又有新文件
#4.编译
./configure --prefix=/usr/local/nginx --with-file-aio
前面lnmp部分已经讲过
升级回退
##1:nginx平滑升级、回退
#升级
1)首先将之前的1.14版本的启动脚本备份
cd /usr/local/nginx/sbin
cp nginx nginx.old
2)再编译新版本1.15
'configure make结束不要make install,这会覆盖原来的nginx'
cd /root/nginx-1.15.8/objs
cp -f nginx /usr/local/nginx/sbin/nginx
3)向原来的nginx的master进程发送信号,不再接收新的请求,
新的nginx程序开启worker进程,并且开始接收请求
kill -USR2 3607
##这个时候ps -ef看到两个master进程和其对应的worker进程
kill -WINCH 3607
##这个时候ps -ef看到老的worker进程结束,但master进程还在,不影响,是为了升级不成功时版本回退
4)执行/usr/local/nginx/sbin/nginx -v ##看到版本已经更新
/usr/local/nginx/sbin/nginx -V ##还可以看到编译的模块
#回退
1)先还原nginx脚本
cd /usr/local/nginx/sbin
cp -f nginx.old nginx
2)重新唤起旧版本的master进程,让其接收请求
kill -HUP 3607 #-HUP相当于reload
3)让新版本的master进程不接收请求,关闭worker进程
kill -USR2 6146
kill -WINCH 6146
4)再查看nginx版本,回退到旧版本
/usr/local/nginx/sbin/nginx -v ##查看nginx版本
/usr/local/nginx/sbin/nginx -V ##查看nginx版本及编译参数等
一次全部编译 ./configure --prefix=/usr/local/nginx --with-http_realip_module --withhttp_image_filter_module=dynamic --with-http_ssl_module
ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
日志切割
##2.nginx日志切割
#因为nginx的access.log日志会保存所有客户端连接信息,普通网站每天请求量很大,所以要每天切割(可以用 nginx自带的reopen)
1)先查看nginx的access.log日志大小
[root@server1 logs]# du -sh access.log
20K access.log
2)多次请求页面,再查看日志大小
[kiosk@foundation0 ~]$ ab -c 1 -n 100000