重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
博文大纲:
创新互联公司主要从事网站设计、网站制作、网页设计、企业做网站、公司建网站等业务。立足成都服务黑龙江,10余年网站建设经验,价格优惠、服务专业,欢迎来电咨询建站服务:18982081108
1.Nginx简介
2.Nginx的核心特点
3.Nginx平滑升级
4.修改Nginx版本信息
5.Nginx虚拟主机配置
6.nginx配置文件location选项的作用
7.配置https访问nginx
8.开启Nginx访问认证
Nginx是一款轻量级的网页服务器、反向代理服务器以及电子邮件代理服务器。因它的稳定性、丰富的功能集、实例配置文件和低系统资源消耗而闻名。
Nginx已经在俄罗斯大的门户网站上运行,同时俄罗斯有超过20%的虚拟主机平台采用Nginx作为反向代理服务器;在国内,Nginx已经运行在淘宝、新浪、网易等多家网站使用Nginx作为Web服务器或反向代理服务器。
- (1)跨平台:Nginx可以在大多数OS编译运行,而且也有Windows版本;
- (2)配置异常简单、非常容易上手;
- (3)非阻塞、高并发连接;官方测试能够支撑5万的并发连接,在实际环境中可以达到2~3万并发连接数。(这得益于Nginx使用了最新的epoll模型);
- (4)事件驱动:采用epoll模型,支持更大的并发连接;
非阻塞通过不断检查事件的状态来判断是否进行读写操作,这样带来的开销很大,因此就有了异步非阻塞的事件处理机制。这种机制让你可以同时监控多个事件,调用他们是非阻塞的,但可以设置超时时间,在超时时间之内,如果有事件准备好了,就返回。这种机制解决了上面阻塞调用与非阻塞调用的两个问题。
以 epoll 模型为例:当事件没有准备好时,就放入 epoll(队列)里面。如果有事件准备好了,那么就去处理;当事件没有准备好时,才在 epoll 里面等待。这样,我们就可以并发处理大量的并发请求了,当然,这里的并发请求,是指未处理完的请求。线程只有一个,所以同时能处理的请求当然只有一个了,只是在请求之间进行不断地切换而已,切换也是因为异步事件未准备好,而主动让出的。这里的切换是没有任何代价,你可以理解为循环处理多个准备好的事件。
多线程方式相比,这种事件处理方式是有很大的优势的,不需要创建线程,每个请求占用的内存也很少,没有上下文切换, 事件处理非常的轻量级,并发数再多也不会导致无谓的资源浪费(上下文切换)。对于 apache 服务器,每个请求会独占一个工作线程,当并发数上到几千时,就同时有几千的线程在处理请求了。这对操作系统来说,是个不小的挑战:因为线程带来的内存占用非常大,线程的上下文切换带来的 cpu 开销很大,自然性能就上不去,从而导致在高并发场景下性能下降严重。
总结:通过异步非阻塞的事件处理机制,Nginx 实现由进程循环处理多个准备好的事件,从而实现高并发和轻量级。- (5)Master/Worker 结构:一个 master 进程,生成一个或多个worker 进程,如图:
Master-Worker设计模式主要包含两个主要组件Master和Work,Master维护者Worker队列,将请求下发到多个Worker并行执行,Worker主要进行实际逻辑计算,并将结果返回给Master。
采用独立的进程,可以让互相之间不会影响,一个进程退出后,其他进程还在工作,服务不会中断,Master进程则很快重新启动新的Worker进程。当然,Worker进程的异常退出,肯定是程序中有bug了,异常退出,会导致当前Worker上的所有请求失败,不过不会影响到所有的请求,所以降低了风险;- (6)内存消耗小:处理高并发的请求内存消耗非常小。在3万并发连接下,开启的10个Nginx进程才消耗150M内存;
- (7)内置的健康检查工作:如果Nginx代理的后端某台Web服务器宕机了,不会影响前端的访问;
- (8)节省带宽:支持GZIP压缩,可以添加到浏览器本地缓存的Header头;
- (9)稳定性高:用于反向代理,宕机的概率微乎其微;
本篇博文中所需使用的软件包都已经打包了,可以直接下载Nginx软件包
所谓Nginx平滑升级就是当前服务器正在运行Nginx服务,想将当前运行的Nginx服务的版本进行升级,且在服务不停止的前提进行升级。
实现思路:
- 在不停止老进程的情况下,启动新进程;
- 老进程负责处理仍然没有处理完成的请求,但不再接收处理请求;
- 新进程接收新请求;
- 老进程处理完所有请求,关闭所有连接后,停止;
实现步骤:
[root@localhost ~]# yum -y install pcre-devel openssl-devel //安装nginx所需依赖
[root@localhost ~]# tar zxf nginx-1.14.0.tar.gz -C /usr/src
[root@localhost ~]# cd /usr/src/nginx-1.14.0/
[root@localhost nginx-1.14.0]# ./configure --prefix=/usr/local/nginx --with-http_ssl_module && make && make install
//编译安装nginx1.14版本,由于实验环境,配置项较少
[root@localhost ~]# ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin //创建符号链接
[root@localhost ~]# nginx //启动nginx服务
[root@localhost ~]# nginx -v //查看Nginx服务的版本信息
nginx version: nginx/1.14.0
[root@localhost ~]# tar zxf nginx-1.2.4.tar.gz -C /usr/src
[root@localhost ~]# cd /usr/src/nginx-1.2.4/
[root@localhost nginx-1.2.4]# ./configure --prefix=/usr/local/nginx --with-http_ssl_module && make
//配置、编译nginx1.2.4版本,注意不要进行安装,可以根据需要添加配置项,但是原本的配置必须存在
[root@localhost ~]# mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.old
//备份旧版本的nginx的执行程序
[root@localhost ~]# cp /usr/src/nginx-1.2.4/objs/nginx /usr/local/nginx/sbin/
//替换旧的Nginx的执行程序
[root@localhost ~]# netstat -anpt | grep 80
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 4655/nginx: master
[root@localhost ~]# kill -USR2 4655 //建议针对nginx的进程号进行操作,不建议针对nginx的pid文件进行操作
//生成新的进程去接收客户端请求,执行完成后nginx安装目录下logs目录会出现一个nginx.pid.old文件,用来存放旧版的pid信息
[root@localhost ~]# nginx -s reload //重新加载新版的nginx配置
[root@localhost ~]# kill -HUP 4655 //平滑的重启新版的nginx进程
[root@localhost ~]# nginx -v //查看nginx版本信息
nginx version: nginx/1.2.4
[root@localhost ~]# curl -I 127.0.0.1
HTTP/1.1 200 OK
Server: nginx/1.14.0 //头部信息版本还未更改
Date: Sun, 01 Dec 2019 06:04:10 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Sun, 01 Dec 2019 05:59:29 GMT
Connection: keep-alive
ETag: "5de356c1-264"
Accept-Ranges: bytes
[root@localhost ~]# kill -QUIT 4655 ////平滑的关闭旧版的nginx进程
[root@localhost ~]# nginx -v //查看nginx版本信息
nginx version: nginx/1.2.4
[root@localhost sbin]# curl -I 127.0.0.1
HTTP/1.1 200 OK
Server: nginx/1.2.4 //注意版本信息,已经成功发生改变
Date: Sat, 30 Nov 2019 14:47:53 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Sat, 30 Nov 2019 14:42:09 GMT
Connection: keep-alive
Accept-Ranges: bytes
注意:整个过程中,建议针对进程号进行平滑升级、重启、关闭等操作!
关于nginx使用kill命令常用的参数:
- QUIT 平滑关闭
- HUP 平滑重启,重新加载配置文件
- USR1 重新打开日志文件
- USR2 平滑升级可执行程序
- WINCH 平滑关闭工作进程
[root@localhost ~]# vim /usr/src/nginx-1.2.4/src/core//nginx.h
……………… //省略部分内容
#define nginx_version 1002004
#define NGINX_VERSION "8.8.8.8" //根据实际情况修改为自己想要的信息
#define NGINX_VER "lzj/" NGINX_VERSION //同上,注意修改完的lzj
[root@localhost ~]# vim /usr/src/nginx-1.2.4/src/http/ngx_http_header_filter_module.c
……………… //省略部分内容
static char ngx_http_server_string[] = "Server: lzj" CRLF; //与上一个文件中修改的名称一样(lzj)
static char ngx_http_server_full_string[] = "Server: " NGINX_VER CRLF;
[root@localhost ~]# vim /usr/src/nginx-1.2.4/src/http/ngx_http_special_response.c
……………… //省略部分内容
static u_char ngx_http_error_tail[] =
"
lzj " CRLF //注意与上两个文件中修改的lzj要一致
"
" CRLF "