简介

当初次编译安装nginx时,http_ssl_module 模块默认是不编译进nginx的二进制文件当中,如果需要添加 ssl 证书。也就是使用 https协议。那么则需要添加 http_ssl_module 模块。假设你的nginx安装包目录在/home/johnson/nginx-1.17.5,下面会用到

小知识点:使用/home/johnson/nginx-1.17.5/configure --help 命令,可以看到很多 --with--without 开头的模块选项。

  • --with:默认是不编译进nginx的二进制文件当中
  • --without:默认编译进nginx的二进制文件当中
/home/johnson/nginx-1.17.5/configure --help
...
--with-http_ssl_module enable ngx_http_ssl_module
...
--without-http_gzip_module disable ngx_http_gzip_module
...

可以看到http_ssl_module 模块默认是不编译进nginx的二进制文件当中。

编译添加新模块

当需要添加http_ssl_module模块时,命令如下:

/home/johnson/nginx-1.17.5/configure --with-http_ssl_module

执行完该命令后,可以在/home/johnson/nginx-1.17.5/objs/ngx_modules.c文件中看到哪些模块要安装到nginx中。如下:

ngx_module_t *ngx_modules[] = {
&ngx_core_module,
...
&ngx_http_ssl_module,
...

可以看到http_ssl_module模块要安装到nginx当中,然后使用make命令,把http_ssl_module编译进nginx的二进制文件当中

cd /home/johnson/nginx-1.17.5
make

执行完上述命令后,/home/johnson/nginx-1.17.5/objs/nginx该文件就是编译后的nginx二进制文件,然后咱们就需要进行热部署升级了。

热部署

假设你的nginx安装目录在/usr/local/nginx当中。

  1. 备份正在使用的nginx二进制文件
cp /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.old
  1. 使用最新的nginx二进制文件替换掉正在使用的nginx二进制文件
cp -r /home/johnson/nginx-1.17.5/objs/nginx /usr/local/nginx/sbin/ -f
  1. 查看正在运行nginx的master进程
ps -ef | grep nginx
root 6503 1 0 Jun23 ? 00:00:00 nginx: master process nginx
ubuntu 26317 19063 0 07:39 pts/0 00:00:00 grep --color=auto nginx
nobody 31869 6503 0 Jun27 ? 00:00:00 nginx: worker process

可以看到,当前nginx的master进程号为 6503。

  1. 告知正在运行的nginx的master进程,需要进行nginx升级
kill -USR2 6503
ps -ef | grep nginx
root 6503 1 0 Jun23 ? 00:00:00 nginx: master process nginx
root 7128 6503 0 08:05 ? 00:00:00 nginx: master process nginx
nobody 7129 7128 0 08:05 ? 00:00:00 nginx: worker process
root 7140 30619 0 08:05 pts/0 00:00:00 grep --color=auto nginx
nobody 31869 6503 0 Jun27 ? 00:00:00 nginx: worker process

可以看到,执行完命令后会启动新的nginx的master进程,新的master进程是由旧的master进程启动的。如果没有启动,那么可以使用nginx -t查看配置文件是否正确,如果没有问题,那么一般是能够启动新的master进程。

  1. 告知旧的nginx master进程,请优雅的关闭所有旧的worker进程
kill -WINCH 6503
root@VM-0-13-ubuntu:/usr/local/nginx# ps -ef | grep nginx
root 6503 1 0 Jun23 ? 00:00:00 nginx: master process nginx
root 7128 6503 0 08:05 ? 00:00:00 nginx: master process nginx
nobody 7129 7128 0 08:05 ? 00:00:00 nginx: worker process
root 9431 30619 0 08:17 pts/0 00:00:00 grep --color=auto nginx

可以看到,旧的worker进程都已经关闭掉。如果发生了错误,则可以使用nginx -s reload命令回退到旧版本当中。

如果发现一切都正常,没有问题,那么你可以关闭掉旧的master进程。kill -9 6503,此时新的master进程的父进程(旧的master进程)被关闭后,那么会把他的父进程改成系统进程,系统进程的进程号为 1。

此时就完美添加了新模块和实现热部署了!!!

总结

因为初次编译nginx,可能没想到要用到其他模块,或许也可能删除某些模块。此时往往就需要使用到nginx的热部署。该文章的热部署命令参考了极客时间Nginx核心知识100讲: 第10讲

参考文章:极客时间Nginx核心知识100讲: 第10讲

个人博客网址: https://colablog.cn/

如果我的文章帮助到您,可以关注我的微信公众号,第一时间分享文章给您

nginx使用热部署添加新模块的更多相关文章

  1. 线上nginx 平滑添加新模块;如(--with-http_realip_module)

    nginx 添加模块1.查看当前nginx信息(配置文件路径,启动用户...) ps aux | grep nginx 2.查看当前nginx已启用的模块(记录模块信息,安装路径)./nginx -V ...

  2. [实战] 给现有的NGINX二进制RPM包加新模块

    [实战] 给现有的NGINX二进制RPM包加新模块 一.前言 在做 wiki 的镜像,这样以后文章就可以使用外链了(链接直接跳转墙内小站). 遇到的问题就是:我的 NGINX 包安装的时候图方便采用 ...

  3. thinkPHP5 添加新模块

    1. 修改build.php文件 , 添加新模块 2. cmd 运行命令 php think build --config build.php

  4. nginx之热部署,以及版本回滚

    热部署的概念:当从老版本替换为新版本的nginx的时候,如果不热部署的话,会需要取消nginx服务并重启服务才能替换成功,这样的话会使正在访问的用户在断开连接,所以为了不影响用户的体验,且需要版本升级 ...

  5. httpd添加新模块

    */ .hljs { display: block; overflow-x: auto; padding: 0.5em; color: #333; background: #f8f8f8; } .hl ...

  6. springboot~添加新模块的方法

    在springboot项目框架里,把一个项目两大模块,主项目main和测试项目test,而我们的测试项目根据功能又可以再分,比如可以有单元测试,集成测试,业务测试等等. 对于一个初学者来说,建立模块的 ...

  7. nginx添加新模块

    1.下载模块 git clone https://github.com/agentzh/echo-nginx-module 2.放入指定位置 mv echo-nginx-module-master / ...

  8. Nginx重新编译添加新模块

    找到nginx的安装包目录,如果没有的话去官网重新下载 查看ngixn版本极其编译参数 /usr/local/nginx/sbin/nginx -V 进入nginx源码目录,重新设置nginx ./c ...

  9. 03_Nginx添加新模块

     1 进入nginx安装目录,查看nginx版本及其编译参数: [root@localhost nginx]# ./nginx -V nginx version: nginx/1.8.0 buil ...

  10. yum安装的Nginx添加第三方模块支持tcp

    需求:生产有个接口是通过socket通信.nginx1.9开始支持tcp层的转发,通过stream实现的,而socket也是基于tcp通信. 实现方法:Centos7.2下yum直接安装的nginx, ...

随机推荐

  1. val()方法

    在jquery里面,用val()方法来获取元素的值.有参数就是设置元素的值,没有就是获取元素的值. 参数也可以是一个数组val(array),例如:$(":radio").val( ...

  2. Spring Framework------>Class RestTemplate----->

    org.springframework.web.client.RestTemplate 官方文档 学习心得: class RESTTemplate用于管理与客户端的HTTP连接

  3. canvas实践小实例一 —— 画板工具

    前面讲了一部分的canvasAPI的基础知识,光看API的介绍确实是很无趣乏味,需要一点可以激发内心的激情的东西来激励自己来学习,于是就了伴随canvasAPI学习的小实例,这样通过API的知识,结合 ...

  4. HAL中通过JNI调用java方法【转】

    转载请注明本文出处:http://www.cnblogs.com/xl19862005 作者:Xandy 由于工作的需要,最近一直在研究HAL.JNI.Java方法之间互调的问题,并做了如下一些记录和 ...

  5. IPHONE开发知识

    IPHONE开发知识http://www.cnblogs.com/valensoft/archive/2010/06/09/1754836.htmlhttp://www.cocoachina.com/ ...

  6. Swift 类和结构体的简单认识

    类和结构体的共同点: 定义属性用于存储值 定义方法用于提供功能 定义附属脚本用于访问值 通过拓展增加默认实现的功能 定义构造器用于生成初始化值 实现协议以提供某种标准功能 类是引用类型 结构体是值类型 ...

  7. SLB 权重问题

    <pre name="code" class="html">一般配置SLB的时候有个权重0到100,是如何选择数值的? 权重需要您根据后端机器的配置 ...

  8. KiKi&#39;s K-Number

    KiKi's K-Number Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tot ...

  9. Android Studio创建JAR/AAR库

    [时间:2017-09] [状态:Open] [关键词:Android,Android Studio,gradle,jar,aar,library] 0 引言 最近在工作中遇到了升级Android S ...

  10. 通过Application配置全局的Context

    我本来配置了全局变量,但是使用SharedPreferences时总是报空指针异常,报错如下: FATAL EXCEPTION: main Process: com.XXX.xxx, PID: 192 ...