Nginx Reload 背后的动作

其实每个人或多或少都知道,nginx reload后的步骤,1. nginx master进程接收到信号时,进行检查配置文件,当检查结束后,会产生新的worker进程,并且销毁没有使用的worker进程,这篇博客主要是再来验证该reload步骤。

机器:Linux WindowsXP 4.15.0-30deepin-generic #31 SMP Fri Nov 30 04:29:02 UTC 2018 x86_64 GNU/Linux

Nginx配置:nginx version: nginx/1.10.3

Goland版本:go version go1.10.5 linux/amd64

nginx是个多进程的服务器,通过fock master进程的方法来实现的,启动的时候,会启动两个类型的进程,一个是master进程和若干个worker进程

我们更改完毕后,reload做的事情是

  1. 向nginx master进程发送信号,HUP signal (kill -1 Nginx_Master_PID)   
    reload 可以使用2种方法来实现

      a. 使用nginx自带的reload来实现

      b. 去向master进程发送信道 (kill -1 PID),来使nginx进程被reload掉

  1. 主进程首先会去检查配置的语言是否有效
  2. 尝试使用新的配置 如果失败,则使用旧的配置,返回错误(也可能是记录在错误log文件中的),若成成功,则新增新的配置,若旧的进程已经处理完毕,则回收,若正在处理,等待处理完毕后回收。

  

实验:

准备环境 : nginx 服务器  goweb服务器

goweb 服务器

package main

import (
        "github.com/gin-gonic/gin"
        "github.com/labstack/gommon/log"
        "net/http"
        "time"
)

func GetVersion(c *gin.Context) {
        time.Sleep(30 * time.Second)
        c.String(200,"9090")
}

func main() {
        r := gin.Default()

        r.GET("/",GetVersion)

        //r.Run("0.0.0.0:9090")

        // 设置http服务器
        s := &http.Server{
                Addr: "0.0.0.0:9090",
                Handler: r,
                ReadTimeout: 36000 * time.Second ,
                WriteTimeout: 36000 * time.Second ,
                MaxHeaderBytes: 1 << 20 ,
        }

        log.Fatal(s.ListenAndServe())
}

nginx 配置

user nginx;
worker_processes 3;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;

events {
    worker_connections 1024;
}

http {
    log_format  main  ‘$remote_addr - $remote_user [$time_local] "$request" ‘
                      ‘$status $body_bytes_sent "$http_referer" ‘
                      ‘"$http_user_agent" "$http_x_forwarded_for"‘;

    access_log  /var/log/nginx/access.log  main;

    sendfile            on;
    tcp_nopush          on;
    tcp_nodelay         on;
    keepalive_timeout   65;
    types_hash_max_size 2048;

    include             /etc/nginx/mime.types;
    default_type        application/octet-stream;

    server {
        listen 80;
        server_name localhost;
        location / {
                proxy_read_timeout 300;
                proxy_pass http://127.0.0.1:9090;
        }
    }
}
# ps aux | grep nginx | grep -v grep
root      5669  0.0  0.4  56748  2060 ?        Ss   11:31   0:00 nginx: master process /usr/sbin/nginx
nginx     5725  0.0  0.4  57188  2028 ?        S    11:35   0:00 nginx: worker process
nginx     5726  0.0  0.4  57188  2028 ?        S    11:35   0:00 nginx: worker process
nginx     5727  0.0  0.4  57188  2028 ?        S    11:35   0:00 nginx: worker process
#
# ps aux | grep nginx | grep -v grep
root      5669  0.0  0.4  56748  2060 ?        Ss   11:31   0:00 nginx: master process /usr/sbin/nginx
nginx     5725  0.0  0.4  57188  2028 ?        S    11:35   0:00 nginx: worker process
nginx     5726  0.0  0.4  57188  2028 ?        S    11:35   0:00 nginx: worker process
nginx     5727  0.0  0.4  57188  2028 ?        S    11:35   0:00 nginx: worker process
#

原文地址:https://www.cnblogs.com/NoneID/p/12185306.html

时间: 2024-11-02 14:19:18

Nginx Reload 背后的动作的相关文章

nginx reload 报 nginx.pid 错误

nginx被停止(nginx -s stop)或者直接杀掉了进程(kill -9 nginx的进程号)后,调用命令(nginx -s reload 或者 nginx -s reopen)会报错:无法找到 "var/run/nginx.pid"文件 1.找到 /url/sbin 目录 2.运行 nginx -c /etc/nginx/nginx.conf    (/etc/nginx/nginx.conf    为nginx 安装的配置文件目录) 原文地址:https://www.cnb

nginx reload的原理

nginx启动时,会启动两个进程: 一个是Master进程和worker进程.改变配置后nginx做的事1)改变了nginx配置之后,HUP signal的信号需要发送给主进程.2)主进程首先会检测新配置的语法有效性.3)尝试应用新的配置 1.打开日志文件,并且新分配一个socket来监听.2.如果1失败,则回滚改变,还是会使用原有的配置.3.如果1成功,则使用新的配置,新建一个线程.新建成功后发送一个关闭消息给旧的进程.要求旧线程优雅的关闭.4.旧的线程 受到信号后会继续服务,当所有请求的客户

nginx reload和reopen

nginx被停止(nginx -s stop)或者直接杀掉了进程(kill -9 nginx的进程号)后,调用命令(nginx -s reload 或者 nginx -s reopen)会报错:无法找到 "var/run/nginx.pid"文件. 这句话中,有好几个知识点,也包含了一些错误,错误得把reload或者reopen当做了启动的命令.来依次总结一下: 1.nginx的常用命令 停止: 直接杀nginx进程.  ps aux|grep nginx 查看nginx的主进程号,

解决nginx reload失败

1. 失败提示信息 nginx: [error] open() "/usr/local/nginx/logs/nginx.pid" failed (2: No such file or directory) 2. 解决方法 /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf 使用nginx -c的参数指定nginx.conf文件的位置 提示:nginx: [emerg] bind() to 0.0.0.0:80

Nginx日常维护操作(3)

一.简明nginx常用命令 1. 启动 Nginx /sbin/nginx service nginx start 2. 停止 Nginx /sbin/nginx -s stop /sbin/nginx -s quit -s都是采用向 Nginx 发送信号的方式. 3. Nginx 重载配置 /sbin/nginx -s reload 上述是采用向 Nginx 发送信号的方式,或者使用service nginx reload 4. 指定配置文件 /sbin/nginx -c /usr/local

Nginx基础笔记

Nginx基础笔记 资源 安装 ubuntu下 编译安装 基本操作 HTTP基本配置 配置说明 配置文件目录结构 配置文件结构 模块 模块化 index模块 Log模块 Real IP模块 Access模块 Rewrite模块 Proxy模块 upstream模块 其他 配置静态化目录 负载均衡 控制页面缓存 nginx的内置变量 nginx小结 资源 资源 Nginx 官网 Nginx 官方下载地址 Nginx最佳实践配置项目 地址 Nginx Configuration wiki 教程 ag

nginx的几种常用配置

1. 设置默认虚拟主机 对没有匹配的Host值时,返回错误403到客户端 server {    listen       80 default_server;    server_name  _;    return       403;} 2. 用户认证 用户认证需要用到apache的htpasswd命令生成密码,如果没有安装apache,可以使用yum install httpd安装. 生成密码文件,创建用户 htpasswd -c /usr/local/nginx/conf/htpass

Nginx 企业级优化与防盗链

源代码编译安装Nginx: [[email protected] ~]# yum -y install pcre-devel zlib-devel openssl-devel gcc gcc-c++ make [[email protected] ~]# useradd -M -s /sbin/nologin nginx [[email protected] ~]# tar xf nginx-1.6.2.tar.gz -C /usr/src/ [[email protected] ~]# cd

nginx重启命令方法(linux,centos,ubuntu)总结

原文:http://www.111cn.net/sys/nginx/62915.htm 平滑重启 如果服务器正在运行的Nginx要进行升级.添加或删除模块时,我们需 要停掉服务器并做相应修改,这样服务器就要在一段时间内停止服务,Nginx可以在不停机的情况下进行各种升级动作而不影响服务器运行 平滑重启命令:kill -HUP 住进称号或进程号文件路径或者使用 /usr/nginx/sbin/nginx -s reload 注意,修改了配置文件后最好先检查一下修改过的配置文件是否正 确,以免重启后