1 、基础详情概述
Nginx (engine x) 是一个高性能的HTTP和反向代理的web服务器,同时也提供了IMAP/POP3/SMTP服务。Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点(俄文:Рамблер)开发的,第一个公开版本0.1.0发布于2004年10月4日。是一款轻量级的web 服务器、反向代理服务器、电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行。其特点是占有内存少,并发能力强,事实上nginx的并发能力在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。
优缺点:
Nginx的优点就在于其高并发。同时Nginx作为负载均衡服务:Nginx 既可以在内部直接支持 Rails 和 PHP 程序对外进行服务,也可以支持作为 HTTP代理服务器对外进行服务。Nginx采用C进行编写,不论是系统资源开销还是CPU使用效率都比 Perlbal 要好很多。能有效的处理静态文件;同时支持重写(http->https)、健康监测、文件压缩等功能。
缺点就在于,对动态文件的处理能力较高,从而对动态文件的处理不如Aparche。
2、安装与配置
软件包地址:http://nginx.org/ 或者 https://www.nginx.com/
软件包安装:上述网站上基本提供的都是源码包,安装要求可以根据源码包编译的三部曲进行安装
##源码包安装三步曲
##1 检查编译环境 更多参数可使用--help进行查看
./configure --prefix=/usr/local/keepalived --with-http_ssl_module
##指定安装目录、添加HTTP模块
##2 生成编译文件链接
make
##3 安装
make install
安装过程中的问题:因为进行源码编译的时候会出现很多依赖性,比如库函数要求对GCC环境编译器的要求,此时可以根据检测要求进行相应的安装,排除完所有环境问题,即可成功安装。
安装实例:
##1 对源码包进行解压
tar zxf nginx-1.18.0.tar.gz
##2 进入源码包进行编译
./configure --prefix=/usr/local/nginx --with-http_ssl_module
##3 解决依赖性问题(每个人产生的依赖性均有可能不相同)
yum install -y gcc ##c语言的依赖性
yum install -y openssl ##交互式的依赖性、
...
## 编译安装
make && make install
![](https://img-blog.csdnimg.cn/20200516082740317.png)
制作语法检测文件:
![](https://img-blog.csdnimg.cn/20200516084111237.png)
上述文件中:
auto:gcc的编译文件
conf:配置目录文件
configure:环境检测文件
html:默认发布页
src:源码文件
contrib:语法检测文件
Makefile:编译后的文件
REDME:安装手册
【注】在上述两个网站中均可下载Nginx最新安装包,值得注意的是,通常情况下,nginx团队的更新会有一些主线版本,使用起来可能不稳定,建议下载稳定版本。
3、Nginx的启动
3.1 启动
因为是源码编译,所以启动时需要在编译时配置的文件上进行编译。
pwd:/usr/local/nginx/sbin/nginx(对个人上述的编译结果而言)
启动:./nginx
![](https://img-blog.csdnimg.cn/20200516085045906.png)
![](https://img-blog.csdnimg.cn/2020051608553655.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxMDU2MjI0,size_16,color_FFFFFF,t_70)
3.2 设置sysytemctl启动方式
配置内容可以参考Apache的配置文件(/usr/lib/systemd/system/httpd.service)内容进行编写。
##配置文件内容
1 [Unit] ##服务说明
2 Description=The Nginx HTTP Server ##服务说明
3 After=network.target remote-fs.target nss-lookup.target ##描述服务类型
4
5 [Service] ##服务相关配置
6 Type=forking ##后台运行形势
7 PIDFile=/usr/local/nginx/log/nginx.pid ##pid文件
8 ExecStart=/usr/local/nginx/sbin/nginx ##开启服务
9 ExecReload=/usr/local/sbin/nginx -s reload ##重启服务
10 ExecStop=/usr/local/nginx/sbin/nginx -s stop ##停止服务
11 rivateTmp=true ##是否分配临时空间
12
13 [Install] ##服务安装设置
14 WantedBy=multi-user.target ##交互式页面
~
【说明】系统启动更多详细参数和用法:https://blog.csdn.net/yuesichiu/article/details/51485147
![](https://img-blog.csdnimg.cn/2020051615434777.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxMDU2MjI0,size_16,color_FFFFFF,t_70)
4、Nginx下的热部署
所谓的热部署指的是,在当前服务不中断的 情况下,对Nginx版本进行更新。(因为小编一开始使用的1.18版本是个人使用较新的版本,所以这里的更替采用的是1.16版本。)
其次对Nginx工作时的进程调度方式做一个简单的介绍,方便下一步的程序替换。
Ngnix运行时会产生两中进程:master、worker。
master:主要对当前应用用程序下的worker进行管理。由root发起。
worker:master的子进程,是真正处理请求的进程。
当通知ngnix重读配置文件的时候,master进程会进行语法错误的判断。如果存在语法错误的话,返回错误,不进行装载;如果配置文件没有语法错误,那么ngnix也不会将新的配置调整到所有worker中。而是,先不改变已经建立连接的worker,等待worker将所有请求结束之后,将原先在旧的配置下启动的worker杀死,然后使用新的配置创建新的worker。所以nginx 的热部署 ,是在不打断用户请求的情况下更新版本。
下面对热部署的过程做简单的介绍:
当需要上线一个新的版本时,我们拿到源码包,首先对其环境编译和查看,若环境没有问题我们可以进行编译。若环境不适合我们要对其版本的依赖性作出相应的调整。
##对下载的源码包进行解压,进入之后进行预编译
[root@server nginx-1.16.1]# ./configure --prefix=/mnt --with-http_ssl_module
在预编译成功的条件下,我们对源码进行编译
##预编译结束后,解决了依赖性问题,对源码包进行编译
[root@server nginx-1.16.1]# make
预编译结束,这里就不需要进行安装了,因为我们做的工作是版本的更替。不直接安装是为了避免安装过程中服务器宕机的情况,同时当新版本出现问题时,有利于旧版本的回滚,提高用户体验。
故先对旧版本进行备份:
##备份旧版本
cp /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.old
##因为程序的调用和执行主要是依靠nginx进程进行调度,所以在更新时可直接备份相关程序
然后将启动的调度程序复制到原版本目录下
##复制新版本到原版本启动目录下
cp /opt/nginx-1.16/objs/nginx /usr/local/nginx/sbin/nginx
因为原文件程序依然在运行,故需要强制复制:
![](https://img-blog.csdnimg.cn/20200516093623776.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxMDU2MjI0,size_16,color_FFFFFF,t_70)
此时配置完成,我们就考虑结束原旧进程的信息接收,将所有的信息接收到新的master下,由新的master产生新的进程进行工作。
##版本更替
ps -ef | grep nginx ##查看nginx进程信息
kill -USR2 PID ##杀死旧版本PID的master,使停止接受信息
##此时会产生新的进程
kill -WINCH PID ##杀死求版本的worke,时处理完当前进程后结束运行
![](https://img-blog.csdnimg.cn/20200516103042275.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxMDU2MjI0,size_16,color_FFFFFF,t_70)
若新版本更新出现问题,此时需要进行版本回滚:
![](https://img-blog.csdnimg.cn/20200516103933164.png)
![](https://img-blog.csdnimg.cn/20200516104130343.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxMDU2MjI0,size_16,color_FFFFFF,t_70)
最后 kill -9 PID 结束新版本进程信息即可。 查看回滚结果:
![](https://img-blog.csdnimg.cn/20200516104555157.png)
5、 Nginx日志切割与自定义文件
在Nginx中,其日志的存储是单独的体系的。即有其自己的存储位置:
access.log:记录用户成功登陆信息,会随着服务器的开启,逐渐增大。而日志切割就是为了应对日志量过大情况,不方便查看,而产生的。
error.log:服务器错误信息。
![](https://img-blog.csdnimg.cn/20200516134755276.png)
【说明】为了产生大量日志,我们采用ab的方式,增加该日志模块的大小。
##增加访问量
ab -c 1 -n 100000 http://192.168.1.110/index.html
## -c 访问次数 1 次访问
## -n 每次并发的任务数
![](https://img-blog.csdnimg.cn/20200516140025501.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxMDU2MjI0,size_16,color_FFFFFF,t_70)
日志切割:
这里所描述的切隔就是利用命令在记录原日志的情况下设置日志的重新记录,所谓的定时,就是设置定时任务,对日志进行操作。 这里只对日志重切割的命令做以演示。
![](https://img-blog.csdnimg.cn/20200516140644836.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxMDU2MjI0,size_16,color_FFFFFF,t_70)
自定义日志文件:
##在配置文件中设置日志内容和文件
...
18 http {
...
21
22 log_format main '$remote_addr - $remote_user [$time_local] "$request" '
23 '$status $body_bytes_sent "$http_referer" '
24 '"$http_user_agent" "$http_x_forwarded_for"';
##上述内容为nginx配置文件中的变量自定义。分别为:发送的地址、发送的用户、服务器时间、
请求、状态、传输给客户端的字节数、http的请求、操作系统信息、报文头
25
26 access_log logs/access.log main; ##存储的位置(相对路径)
...
**}
【关于】更详细的ab命令可参考文章:https://www.cnblogs.com/yueminghai/p/6412254.html
6、Nginx的gzip压缩
在网络传输过程中,为了提高用户体验效果,有时会将一些大的数据包进行压缩,使用户可以快速的看到结果。当需要时在进行下载(例如:微信中的下载原图)。
而Nginx也提供这样的服务,Nginx的gzip压缩。通过对大型文件进行压缩,提高访问效率。
压缩前:
![](https://img-blog.csdnimg.cn/20200516141728859.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxMDU2MjI0,size_16,color_FFFFFF,t_70)
压缩设置:
##在配置文件中打开压缩选项,进行如下设置
33 gzip on; ##打开压缩选项
34 gzip_min_length 1; ##最小压缩长度
35 gzip_comp_level 2; ##压缩等级
36 gzip_types text/plainpplication/x-javascript text/css application/xml
text/javascript application/x-httpd-php image/gif image/png;
##压缩的类型
![](https://img-blog.csdnimg.cn/20200516144838855.png)
结果检测:
![](https://img-blog.csdnimg.cn/2020051614513043.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxMDU2MjI0,size_16,color_FFFFFF,t_70)
7、指定用户开启服务
设置指定用户开启Nginx服务。
##设置配置文件内容(/usr/local/nginx/conf/nginx.conf)
...
2 user nginx nginx; ##设定指定用户和用户组(系统不存在该用户时需要建立)
3 worker_processes 1; ##工作进程的数量(一般情况下和内核个数相同)
....
![](https://img-blog.csdnimg.cn/20200516155204399.png)
8、其他的一些配置
##配置文件(/usr/local/nginx/conf/nginx.conf)
##指定最大连接数
....
12 events {
13 worker_connections 1024;
14 }
15
....
##设置并发连接数和速率
52 location /mnt {
...
limit_conn_zone $binary_remote_addr zone=addr:10m;
##设定密钥,并指定内存共享区域、大小为10M
...
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
##对当前主机申请名为:one的空间,大小为10M,速率为:1r/s
...
53 limit_conn addr 1; ##限制并发次数为1
54 limit_req zone=one burst=5; ##设置超过指定个数(5)将会报错
55 limit_rate 50K; ##设置传输速率不打于50K
56 }
上述参数说明:
- $server_name是限制同一server最大并发数;
- limit_conn为限制并发连接数;
- limit_rate为限制下载速度;
- "zone=" 给它一个名字,可以随便叫,这个名字要跟下面的 limit_conn 一致(计数空间)
- $binary_remote_addr = 用二进制来储存客户端的地址,1m 可以储存 32000 个并发会话
示例:
![](https://img-blog.csdnimg.cn/20200516163205637.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxMDU2MjI0,size_16,color_FFFFFF,t_70)
【说明】此时的/mnt的绝对路径为:/usr/local/nginx/html/mnt
配置完成,示例查看结果:
当并发数为1时,访问结果:
##一次访问
ab -c 1 -n 100 http://192.168.1.110/mnt/play.jpeg
![](https://img-blog.csdnimg.cn/20200516163334704.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxMDU2MjI0,size_16,color_FFFFFF,t_70)
当并发数为2时,访问结果:
##两次访问
ab -c 2 -n 100 http://192.168.1.110/mnt/play.jpeg
![](https://img-blog.csdnimg.cn/20200517080723974.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxMDU2MjI0,size_16,color_FFFFFF,t_70)
参考资料:百度百科